- •Обозначения и сокращения
- •введение
- •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. Защита приложения паролем
- •Заключение
- •Библиографический список
Пример использования аннотации управления в классе выглядит следующим образом:
@ManagedBean
@SessionScoped
public class DukesBday{
...
}
Вышеуказанный фрагмент кода создает бин, который управляется сервером
JavaServer Faces и доступен на протяжении сеанса работы приложения. Вам не нуж-
но конфигурировать managed-bean в файле faces-config.xml. Таким образом, аннота-
ции облегчают задачу конфигурации управления бином, значительно сокращая объем кода приложения.
Вы можете также определить область видимости бина внутри файла класса,
как показано в примере выше. Это средство пригодно для бина с объявленной обла-
стью видимости request, session или application , но не областью view.
Все аннотации классов будут сканироваться при запуске приложения. Если в файле faces-config.xml не указан элемент <faces-config>, то будет установлен атрибут
<metadata-complete> в true.
Аннотации также доступны для других артефактов, как например, компоненты,
преобразователи, проверки и генераторы кода для использования вместо их описания
в файлах конфигурации приложения.
9.5. Регистрация сообщений об ошибках как пакет ресурса
Если вы создаете пользовательские сообщения об ошибках (которые отображаются тегами message и messages) для ваших преобразователей или проверок, нужно
сделать их доступными во время запуска приложения. Это делается одним из двух
способов: организацией очереди сообщений в экземпляре FacesContext программно или регистрацией сообщения с использованием файла конфигурации приложения.
Пример регистрации сообщения для приложения:
<application> <message-bundle>
com.sun.bookstore6.resources.ApplicationMessages </message-bundle>
<locale-config> <default-locale>en</default-locale> <supported-locale>es</supported-locale> <supported-locale>de</supported-locale> <supported-locale>ru</supported-locale>
</locale-config> </application>
Этот набор элементов позволит вашему приложению использовать сообщения,
которые содержатся в сответствующем пакете ресурсов.
Элемент message-bundle представляет набор локализованных сообщений. Он
должен содержать полный путь в пакет ресурсов, содержащий локализованные со-
общения (в данном случае resources.ApplicationMessages).
97
Элемент locale-config включает языковый регион по умолчанию и другие возможные регионы. Он позволяет системе находить правильный регион, основанный на
установках языковых параметров в браузере клиента.
Теги supported-locale и default-locale принимают двухсимвольный код на ниж-
нем регистре, определённый в рекомендации ISO 639 (см. http://www.ics.uci.edu/pub/ ietf/http/related/iso639.txt). Убедитесь, что ваш пакет ресурса действительно содержит сообщения для локальных зон, которые вы определяете этими тегами. Чтобы иметь
доступ к локализованному сообщению, прикладной разработчик просто ссылается на
код сообщения из пакета ресурсов.
Регистрация локализованного статического текста (Custom Localized StaticText)
Чтобы иметь доступ к тексту, любой локализованный статический текст, который не загружается на страницу с использованием тега loadBundle, должен быть зареги-
стрирован приложением с помощью элемента resource-bundle в файле конфигурации
приложения. Аналогичным образом любые ваши сообщения об ошибках, на которые
ссылаются атрибуты converterMessage, requiredMessage или validatorMessage тега
компонента ввода, должны также быть доступными для приложения посредством тега loadBundle или элемента resource-bundle файла конфигурации.
Вот часть файла, который регистрирует несколько сообщений об ошибках для
приложения guessNumber:
<application>
...
<resource-bundle> <base-name>
guessNumber.ApplicationMessages </base-name> <var>customMessages</var>
</resource-bundle>
...
</application>
Аналогично для тега loadBundle значение подэлемента base-name определяет
полное имя класса ResourceBundle, расположенного в пакете ресурсов приложения. Таким же образом в атрибуте var тега loadBundle подэлемент var элемента resourcebundle является псевдонимом для класса ResourceBundle. Этот псевдоним использу-
ется тегами на странице, чтобы идентифицировать пакет ресурса.
Элемент locale-config, описанный в п. 9.4.4, также относится к сообщениям, а
статический текст идентифицируется элементом resource-bundle. Как и в случае иден-
тификации пакета ресурсов элементом message-bundle, убедитесь, что пакет ресурса, идентифицированный элементом resource-bundle, действительно содержит сообще-
ния для локальных зон, которые вы определяете элементом locale-config.
9.6. Проверка по умолчанию
(Default Validator)
Дополнительно к проверкам, которые вы объявляете в компонентах пользовательского интерфейса (UI), можно также определить ноль или более проверок по
умолчанию в файле конфигурации приложения. Проверка по умолчанию относится ко всем экземплярам UIInput вида или компонентного дерева и добавляется после опре-
98
деления локальных проверок. Пример проверки по умолчанию, зарегистрированной в файле конфигурации:
<faces-config> <application>
<default-validators> <validator-id>javax.faces.Bean</validator-id>
</default-validators> <application/>
</faces-config>
9.7.Конфигурирование правил навигации (Navigation Rules)
Навигация задаётся набором инструкций для выбора следующей страницы, которую нужно отображать после того, как кнопка или ссылка будут нажаты клиентом.
Правила навигации определяются в файле конфигурации.
Каждое правило навигации определяет способ перехода от одной страницы к
набору других страниц. Сервер JavaServer Faces выбирает соответствующие правила навигации в зависимости от того, какая страница к настоящему времени отображена. После того как соответствующие правила навигации будут найдены, выбор следующей страницы зависит от двух факторов:
•метода action, который вызывается, когда компонент был нажат;
•логического результата, на который ссылается тег компонента, или возвращаемого из метода action.
Логический результат может быть выбран самим разработчиком, но в табл. 9.3
перечислены результаты, обычно используемые в веб-приложениях.
|
Таблица 9.3 |
|
Возвращаемые строки-результаты |
|
|
Выход |
Назначение |
success |
Все в порядке, перейти на следующую страницу |
failure |
Есть проблемы, перейти на страницу ошибок |
logon |
Необходимо перейти на страницу регистрации пользователя |
no results |
Поиск ничего не нашел, повторить поиск |
Обычно метод action выполняет некоторую обработку данных формы текущей страницы. Например, метод мог бы проверить, действительны ли имя пользователя и
пароль при входе, сопоставив их с БД. Если они совпадают, метод возвращает резуль-
тат success. В противном случае он возвращает результат failure, как это демонстри-
руется в примере. Оба использованных метода действия обрабатывают и возвращают
результат, необходимый для определения соответствующей страницы, чтобы потом перейти к ней. Здесь использованы правила навигации, аналогичные только что опи-
санным:
<navigation-rule> <from-view-id>/logon.jsp</from-view-id> <navigation-case>
<from-action>#{LogonForm.logon}</from-action> <from-outcome>success</from-outcome>
99
<to-view-id>/storefront.jsp</to-view-id> </navigation-case>
<navigation-case> <from-action>#{LogonForm.logon}</from-action> <from-outcome>failure</from-outcome> <to-view-id>/logon.jsp</to-view-id>
</navigation-case> </navigation-rule>
Эти правила навигации определяют возможные пути перехода из страницы logon.jsp. Каждый элемент navigation-case определяет один возможный путь перехода
из logon.jsp. Первый navigation-case сообщает: если метод LogonForm.logon возвращает
результат success, то доступна страница storefront.jsp. Второй navigation-case сообщает,
что нужно перейти к logon.jsp, если метод бина LogonForm.logon возвратит failure.
Каждый элемент правила навигации navigation-rule соответствует одной странице компонентного дерева, определённого дополнительным элементом from-view-id.
Это означает, что при наличии from-view-id каждое правило определяет возможные
пути перехода для одной конкретной страницы приложения. Если нет элемента from- view-id, то правила навигации, определённые элементом navigation-rule, относятся ко
всем страницам в приложении. Элемент navigation-rule также допускает шаблоны. В
следующем примере элемент from-view-id сообщает, что правила навигации применимы ко всем страницам в директории books:
<from-view-id>/books/*</from-view-id>
Как показано в примере правила навигации, элемент navigation-rule может содержать нуль или более элементов navigation-case. Элемент navigation-case определяет набор критериев сопоставления. Когда эти критерии выполняются, приложение будет переходить на страницу, определённую элементом to-view-id, содержащимся в
том же элементе navigation-case.
Критерии навигации определены дополнительными элементами from-outcome и from-action. Элемент from-outcome определяет логический результат, например, success. Элемент from-action использует выражение-метод, чтобы ссылаться на метод действия, который возвращает строку – логический результат. Метод выполняет
некоторую логику, чтобы вычислить и возвратить результат.
Элементы navigation-case сверяются с результатом или выражением-методом в
следующем порядке:
•если определены оба значения from-outcome и from-action, то оба эти эле-
мента могут быть использованы в том случае, если метод action возвращает
разные результаты в зависимости от выполняемой обработки;
•если определено только значение from-outcome, то элемент должен соответствовать результату, определённому атрибутом действия компонента
UICommand или результату метода, указанного компонентом UICommand;
•если определено только значение from-action, то значение должно соответствовать выражению action, определённому тегом компонента.
Когда встречается любой из этих вариантов, компонентное дерево, определённое элементом to-view-id, будет выбрано для показа.
Используя NetBeans IDE, вы можете сконфигурировать правила навигации сле-
дующим образом.
1.После открытия вашего проекта в NetBeans IDE раскройте узел проекта в подокне проектов.
100