- •Обозначения и сокращения
- •введение
- •1. Установка и настройка инструментальных средств
- •1.1. Установка и подготовка к работе операционной системы
- •1.2. Установка программного обеспечения
- •1.3. Создание таблиц в базе данных
- •2. Основы Java EE 6
- •2.1. Распределенные многоуровневые приложения
- •2.2. Контейнеры Java EE
- •2.3. Сервер GlassFish v3
- •2.4. Структура приложения
- •2.5. Конфигурирование приложений
- •2.6. Задание ссылок на ресурсы
- •4. Введение в компоненты Facelets
- •4.1. Веб-страницы
- •4.2. Разработка простого приложения Facelets
- •4.3. Использование шаблонов
- •5. Унифицированный язык записи выражений
- •6.1. Добавление компонент библиотеки HTML на страницу
- •6.2. Использование компонент для таблиц баз данных
- •6.3. Использование тегов библиотеки Core
- •7. Использование конвертеров, слушателей и проверок
- •7.1. Использование стандартных преобразователей
- •7.2. Регистрация слушателей для компонентов
- •8. Внешние объекты (JavaBeans)
- •8.1. Создание класса внешних объектов
- •8.2. Описание свойств бинов
- •8.3. Написание методов внешних бинов
- •8.4. Проверка бинами
- •9.1. Файл конфигурации ресурсов приложения
- •9.2. Упорядочение ресурсов конфигурации приложения
- •9.3. Конфигурирование состояния проекта
- •9.4. Выбор конфигурации бина
- •9.5. Регистрация сообщений об ошибках как пакет ресурса
- •9.7. Конфигурирование правил навигации (Navigation Rules)
- •9.8. Основные требования приложения JavaServer Faces
- •10. Технология Java Servlet
- •11. Введение в Java Persistence API
- •11.1. Требования к классам сущностей
- •11.3. Внедряемые классы в сущностях
- •11.4. Наследование сущностей
- •11.5. Стратегии наследования сущностей с отображением
- •11.6. Управление сущностями
- •11.7. Запросы сущностей
- •12. Примеры хранимых сущностей
- •12.1. Приложение order
- •12.2. Пример получения схемы отношений на основе таблиц БД
- •13.1. Терминология языка запросов
- •13.3. Упрощенный синтаксис языка запросов
- •13.4. Примеры запросов
- •13.5. Запросы с навигацией связанных сущностей
- •13.6. Запросы с другими условными выражениями
- •13.7. Изменение и удаление группы сущностей
- •13.8. Полный синтаксис языка запросов
- •14. Язык запросов Criteria API
- •14.3. Корни запроса
- •14.4. Использование объединения в запросе
- •14.5. Навигация путей в запросах
- •14.6. Ограничения на результаты запроса
- •14.7. Управление результатами запросов
- •14.8. Исполнение запросов
- •15. Связывание ресурсов
- •15.1. Ресурсы и служба имен JNDI
- •15.2. Объекты DataSource и пулы соединений (Connection Pools)
- •15.3. Внедрение ресурсов
- •15.4. Адаптеры ресурсов
- •15.5. Аннотации метаданных
- •16. Безопасность веб-приложений
- •16.1. Краткий обзор
- •16.2. Механизмы обеспечения безопасности
- •16.3. Безопасность сервера предприятия
- •16.4. Использование защищенного соединения SSL
- •18. Пример приложения
- •18.1. Создание проекта веб-приложения
- •18.3.Структура приложения JavaEE 6
- •18.4. Программирование вида для объектов
- •18.5. Дизайн главной страницы
- •18.6. Страница просмотра записей таблицы городов
- •18.7. Страница добавления записей о городах
- •18.8. Страница редактирования записей о городах
- •18.9. Страница удаления записей о городах
- •19. Обработка связей внешних ключей
- •19.1. Разработка класса для вида сущности
- •19.2. Доработка вида для городов
- •19.3. Разработка обзорной страницы
- •19.5. Страница для редактирования записей с внешними ключами
- •20. Дополнительные функции
- •20.1. Сортировка записей таблицы
- •20.2. Контроль за удалением связанных записей
- •20.3. Контроль ввода наименований
- •20.4. Запросы к БД на языке Java Persistence Query Language
- •20.5. Управление страницами при просмотре таблицы
- •20.6. Создание и просмотр отчетов
- •20.7. Использование шаблонов и стилей
- •20.8. Защита приложения паролем
- •Заключение
- •Библиографический список
Чтобы установить отображение ошибок в NetBeans IDE, нужно сделать следующее:
1)открыть проект;
2)распахнуть узел проекта в окне Projects;
3)распахнуть узел Web Pages и WEB-INF;
4)дважды щелкнуть по web.xml;
5)кликнуть Pages в редакторе;
6)распахнуть узел Error Pages;
7)кликнуть Add;
8)в диалоге Add Error Page:
•кликнуть Browse для размещения страницы обработки ошибок;
•ввести код статуса HTTP для выбора открываемой страницы в поле Error
Code;
•ввести исключение для вызова страницы в поле Exception Type;
•кликнуть OK.
2.6. Задание ссылок на ресурсы
Если веб-компонент использует объекты как, например, бины, источники данных или сервисы веб, вы применяете аннотации Java EE, чтобы включить эти ресурсы в ваше приложение. Аннотации заменяют типичный код и элементы конфигурации, которых требовали предшествующие версии Java EE. Хотя инъекция ресурсов с использованием аннотаций может быть более удобной формой для разработчика, есть
некоторые ограничения на их использование в веб-приложениях. Вы можете внедрить
ресурсы только в управляемые контейнером объекты. Дело в том, что контейнер должен проконтролировать создание компонента, чтобы он смог выполнить внедрение («инъекцию») в компонент. Поэтому вы не можете внедрить ресурсы в объекты как, например, простые компоненты JavaBeans. Тем не менее, JavaServer Faces управ-
ляет бинами через управление контейнера; следовательно, они могут воспринимать
инъекции ресурса.
Компоненты, которые могут принять инъекции ресурса, указаны в табл. 2.2.
Таблица 2.2
Компоненты для работы с внедрением ресурсов
Компонент |
Интерфейс/Класс |
Servlets |
javax.servlet.Servlet |
Servlet Filters |
javax.servlet.ServletFilter |
|
javax.servlet.ServletContextListener |
|
javax.servlet.ServletContextAttributeListener |
|
javax.servlet.ServletRequestListener |
Event Listeners |
javax.servlet.ServletRequestAttributeListener |
|
javax.servlet.http.HttpSessionListener |
|
javax.servlet.http.HttpSessionAttributeListener |
|
javax.servlet.http.HttpSessionBindingListener |
Taglib Listeners |
Подобные вышеприведённым |
Taglib TagHandlers |
javax.servlet.jsp.tagext.JspTag |
Managed Beans |
Plain Old Java Objects (POJO) |
38
2.6.1. Объявление ссылок на ресурсы
Аннотация @Resource используется, чтобы объявить ссылку на ресурс, как на-
пример, источник данных, бин или переменная среды.
Аннотация @Resource может использоваться в классе, методе или поле.
Контейнер, ответственный за инъекции ресурсов, объявленные в аннотации @Resource, отображает её в соответствующие ресурсы JNDI. В следующем примере
аннотация @Resource используется, чтобы внедрить источник данных в компонент
при использовании технологии JDBC для доступа к реляционной базе данных:
@Resource javax.sql.DataSource catalogDS; public getProductsByCategory() {
// get a connection and execute the query Connection conn = catalogDS.getConnection();
..
}
Контейнер внедряет этот источник данных для компонента прежде, чем он станет доступным для приложения. Источник данных отображается JNDI на основе име-
ни области catalogDS и типа источника javax.sql.DataSource.
Если есть несколько ресурсов, которые нужно внедрить в один компонент, вам нужно использовать аннотацию, как показано в следующем примере:
@Resources ({
@Resource (name="myDB" type=java.sql.DataSource), @Resource(name="myMQ" type=javax.jms.ConnectionFactory)
})
Приведённые примеры веб-приложений используют Java Persistence API,
чтобы иметь доступ к реляционным базам данных. Этот API не требует от вас явно создавать связи в источником данных. Следовательно, примеры не используют аннотации @Resource, чтобы внедрять источник данных. Этот API поддерживает аннотации @PersistenceUnit и @PersistenceContext, чтобы внедрять экземпляры
EntityManagerFactory и EntityManager соответственно в фасадах сущностей.
2.6.2. Объявление ссылки на веб-сервисы
Аннотация @WebServiceRef обеспечивает ссылки на сервисы веб. Следующий пример показывает использование аннотации @WebServiceRef, чтобы объявить ссыл-
ку на сервис веб. WebServiceRef использует атрибут wsdlLocation, чтобы определять
URI файла WSDL развертывания сервисов:
....
import javax.xml.ws.WebServiceRef;
...
public class ResponseServlet extends HTTPServlet { @WebServiceRef(wsdlLocation=
"http://localhost:8080/helloservice/hello?wsdl") static HelloService service;
39
3. Технология
JavaServer Faces TM (JSF)
Технология JavaServer Faces является интерфейсом серверной части компо-
нентной среды для веб-приложения Java.
Основные компоненты технологии JavaServer Faces следующие:
yyAPI для представления UI-компонентов и управления их состоянием, обра-
ботки событий, выполнения проверок и преобразования данных на стороне сервера, поддержки страничной навигации, интернационализации и доступа;
обеспечение расширяемости для всех этих средств.
yyБиблиотеки тегов для добавления компонентов на страницы и для связывания компонентов с объектами на сервере.
Хорошо определённые модели программирования и библиотеки тегов значи-
тельно упрощают проблемы построения интерфейсов пользователя веб-приложений
на стороне сервера. С минимальными усилиями вы можете: yyсоздавать страницы;
yyперемещать компоненты на страницу добавлением тегов компонент; yyсвязывать компоненты на странице с серверными данными; yyсоздавать компонентные события в коде приложения на сервере;
yyсохранять и восстанавливать состояние приложения на протяжении жизни запроса;
yyсоздавать многократно используемые и расширяемые компоненты.
Основным преимуществом JSF является полное разделение функциональности и представления приложения.
В общем случае JSF-приложение включает следующие части: yyнабор страниц, в которых расположены компоненты; yyнабор тегов для добавления компонент на страницы;
yyнабор внешних объектов JavaBeans, имеющих свойства и методы для компонент на странице;
yyдескриптор развёртывания (web.xml);
yyдополнительные файлы конфигурирования ресурсов приложения, задающие правила навигации и настройки бин-объектов и других пользовательских компонентов;
yyдругие объекты, созданные разработчиком и включающие проверки, преобразователи или обработчики;
yyнабор пользовательских тегов для представления объектов на странице.
На рис. 3.1 приведён типичный регламент взаимодействия клиента и сервера
для типичного приложения JSF. В ответе на запрос клиента контейнером, реализую-
щим JSF-технологию, генерируется страница. Страница myfacelet.xhtml построена с
использованием тегов компонент JSF. В дополнение к компонентам страница может ссылаться на следующие объекты:
yyслушатели событий, конвертеры, зарегистрированные для компонентов;
yyкомпоненты JavaBeans для работы с данными и реализации бизнес-
процессов.
40
Рис. 3.1. Взаимодействие клиента и сервера
Самым большим достоинством JSF-технологии является разделение между бизнес-логикой и представлением приложения на экране дисплея. Приложение направляет запрос связанному с событием обработчику и управляет хранимыми объектами на стороне сервера. Это позволяет приблизить поведение веб-приложения к традиционным приложениям «клиент-сервер» с графическим интерфейсом пользователя. Технология позволяет разрабатывать бизнес-логику и дизайн приложения с минимальными взаимодействиями между разработчиками.
Разработка JSF-приложения
Последовательность разработки JSF-приложения включает следующие шаги: yyразработка внешних бинов;
yyдобавление деклараций управления бинами; yyсоздание страниц с использованием тегов компонент; yyзадание соответствия экземпляров FacesServlet .
1. Разработка внешних бинов
Внешний бин является объектом JavaBean, управляемым JavaServer Faces. Компоненты на странице связаны с внешними бинами, которые обеспечивают прикладную логику. Например, внешний бин, helloWorld.java, содержит следующий код:
package Hello;
import javax.faces.bean.ManagedBean; @ManagedBean
public class Hello {
final String world = "Hello World!"; public String getWorld()
{ return world; }
}
Пример бина устанавливает переменную world в "Hello World!" и позволяет запрашивать свойство word со страниц приложения. Аннотация @ManagedBean регистрирует внешний бин как ресурс на сервере JavaServer Faces.
41
2.Создание веб-страницы
Втипичном приложении Facelets веб-страницы создаются в формате XHTML.
Страница beanhello.xhtml — простая страница XHTML. Она содержит следующее:
<html xmlns="http://www.w3.org/1999/xhtml"> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>JavaServer Faces Hello World Application</title> </head>
<body>
#{hello.world}
</body>
</html>
Страница подключается ко внешнему бину через унифицированный язык вы-
ражения (Unified Expression Language — EL) выражением #{hello.world}, которое из-
влекает значение свойства world из внешнего бина hello. Отметьте использование
имени hello для ссылки на экземпляр внешнего класса Hello. Если в аннотации
@ManagedBean не определено имя, внешний бин будет доступен с первым символом в имени класса в НИЖНЕМ регистре (запомните это правило).
3. Отображение экземпляра Faces Servlet
Необходимо выполнить отображение Faces Servlet в дескрипторе развертывания (web.xml). Типичное отображение Faces Servlet выглядит следующим образом:
<servlet>
<servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
Вышеуказанный сегмент файла представляет часть типичного дескриптора раз-
вертывания JavaServer Faces.
Дескриптор развёртывания веб может также содержать и другие сведения,
важные для конфигурации приложения JavaServer Faces, но эта информация здесь
не показана. Отображение выполняется автоматически при использовании сервера
Java EE 6, как, например, Sun GlassFish Enterprise Server v3.
4. Жизненный цикл приложения
Каждое веб-приложение имеет жизненный цикл (lifecycle). Общие задачи обра-
ботки поступающих запросов, декодирования параметров, модификации и сохранения состояния, формирование веб-страницы для просмотра выполняются полностью
в течение жизненного цикла веб-приложения. Некоторые среды веб-приложений прячут от вас детали жизненного цикла, тогда как другие требуют, чтобы вы управляли ими вручную.
42
По умолчанию, JavaServer Faces обрабатывает большинство операций жизнен-
ного цикла автоматически. Но это позволяет вам в других частях запроса модифицировать или выполнять другие действия, если приложения этого требуют. Для на-
чинающего программиста нет необходимости понимать жизненный цикл приложения
JavaServer Faces, но эта информация может быть полезной для создания более слож-
ных приложений.
Жизненный цикл JavaServer Faces приложения начинается и заканчивается следующей последовательностью действий: клиент делает запрос на веб-страницу и
сервер отвечает страницей. Цикл состоит из двух основных фаз: выполнение и фор-
мирование образа страницы.
В течение фазы выполнения могут произойти следующие действия: вид страни-
цы приложения может быть создан или восстановлен из предыдущего образа, могут быть применены значения параметров запроса, выполнены преобразования и про-
верки для возвращаемых значений компонентов, скорректированы свойства внешних
бинов значениями, поступившими от компонентов формы, и вызвана бизнеслогика
приложения. Для первого запроса (initial) создаётся только вид. Для последующих за-
просов (postback) могут производиться все эти или другие действия.
На фазе формирования образа (Rendering) запрошенный вид формируют как
ответ клиенту. Формирование — обычный процесс генерации выхода в формате HTML
или XHTML, который может быть прочитан клиентом (обычно окном просмотра).
Ниже приведен пример жизненного цикла приложения JavaServer Faces и показаны действия, которые происходят с видами на экране браузера.
1.Когда приложение helloWorld создано и развёрнуто на сервере, приложение находится в пассивном состоянии.
2.Когда клиент делает первый запрос (initial) для веб-страницы hello.xhtml,
компилируется Facelets-приложение helloWorld.
3.Скомпилированное Facelets-приложение выполняется, создается новое дерево компонент (UIViewRoot) для приложения helloWorld и сохраняется в
Faces Context.
4.Дерево компонент сопровождает компонент и возвращаемые значения
связываются со свойствами внешних бинов (представленными в EL-
выражении #{hello.world}).
5.Создаётся новый вид на основе дерева компонент.
6.Вид предоставляется запрашивающему клиенту как ответ.
7.Компонентное дерево автоматически уничтожается.
8.При последующих запросах (postback) восстанавливается компонентное дерево и используется его сохранённое состояние.
43