- •Обозначения и сокращения
- •введение
- •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. Защита приложения паролем
- •Заключение
- •Библиографический список
9.Отредактировать файл web.xml, чтобы заменить имя страницы приветствия
на greeting.html.
10.Сделать щелчок правой клавишей мыши по узлу проекта. Выбрать Build из меню, чтобы компилировать и сформировать приложение.
11.Сделать щелчок правой клавишей мыши по проекту. Выбрать Deploy, чтобы
развернуть приложение на сервере Sun GlassFishTM v3.
12.Для доступа к приложению напечатать следующий URL в окне просмотра: http://localhost:8080/guessNumber.
4.3.Использование шаблонов
JavaServer Faces 2.0 обеспечивает инструментальные средства для работы с
легко расширяемыми и многократно используемыми интерфейсами пользователя. Templating — полезное средство, доступное вместе с Facelets, позволяющее создать
страницу, которая станет базой или шаблоном для других страниц в приложении.
Используя шаблоны, можно многократно использовать код и избегать повторного соз-
дания аналогичных страниц. Templating также помогает поддерживать стандартный
вид приложений со многими страницами.
Теги Facelets, которые используются для работы с шаблонами, и их функциональное назначение описаны в табл. 4.2
|
Таблица 4.2 |
|
Теги Facelets Templating |
|
|
Тег |
Функция |
ui:component |
Определяет компонент, который создан и добавлен к компонентному дереву |
ui:composition |
Определяет страничную композицию, дополнительно используемую |
|
шаблоном. Содержимое вне этого тега игнорируется |
ui:debug |
Определяет отладочный компонент дерева |
|
|
ui:define |
Определяет содержимое, которое включено на страницу шаблона |
ui:decorate |
Подобен тегу композиции, но не игнорирует содержимое за пределами |
|
этого тега |
ui:fragment |
Подобен компонентному тегу, но не игнорирует содержимое за пределами |
|
этого тега |
ui:include |
Инкапсулирует и использует многократно содержимое для многих страниц |
ui:insert |
Включает содержимое в шаблон. |
ui:param |
Используется, чтобы передавать параметры во включенный файл |
|
|
ui:repeat |
Используется как альтернатива для тегов цикла, как, например, c:forEach |
|
или h:dataTable |
ui:remove |
Удаляет содержимое со страницы |
Библиотека тегов Facelets включает основной тег <ui:insert>. Страница шаблона создается этим тегом. Он допускает определять структуру по умолчанию для страницы. Страница шаблона может повторно использоваться как шаблон для создания
другой страницы, обычно именуемой страницей клиента.
51
Пример шаблона с именем template.xhtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="./resources/css/default.css" rel="stylesheet" type="text/css" />
<link href="./resources/css/cssLayout.css" rel="stylesheet" type="text/css" />
<title>Facelets Template</title> </h:head>
<h:body>
<div id="top" class="top">
<ui:insert name="top">Top Section</ui:insert> </div>
<div>
<div id="left">
<ui:insert name="left">Left Section</ui:insert> </div>
<div id="content" class="left_content">
<ui:insert name="content">Main Content</ui:insert> </div>
</div>
</h:body>
</html>
Данный пример определяет типичную страницу HTML, которая подразделена на три секции: верхняя, левая и основная. Секции имеют связанные с ними таблицы стилей (stylesheets). Эта структура может быть использована повторно для других страниц приложения.
Страница клиента вызывает шаблон, используя тег <ui:composition>. В следую-
щем примере страница клиента с именем templateclient.xhtml включает в свой состав страницу шаблона из предыдущего примера с именем template.xhtml. Страница клиента позволяет включить внутреннее содержимое с помощью тега <ui:define>.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
<ui:composition template="./template.xhtml"> <ui:define name="top">
Welcome to Template Client Page </ui:define>
<ui:define name="left">
<h:outputLabel value="You are in the Left Section"/>
52
</ui:define>
<ui:define name="content"> <h:graphicImage
value="#{resource[’images:wave.med.gif’]}"/> <h:outputText value="You are in the Main Content
Section"/>
</ui:define>
</ui:composition>
</h:body>
</html>
Составные компоненты
JavaServer Faces поддерживает концепции составных компонентов Facelets.
Составной компонент может считаться специальным типом шаблона, который действует как один компонент.
Любой компонент по существу является частью многократно используемого
кода, который выполняет определённую функцию. Например, компонент inputText спо-
собен принимать ввод пользователя. Компонент также может иметь прикреплённые к
нему проверки, преобразователи и слушатели, чтобы выполнять нужные операции.
Составной компонент состоит из набора тегов разметки и других существующих компонентов. Это многократно используемый, созданный пользователем компонент, который можно изменять по желанию программиста. Он имеет определённую функци-
ональность и может иметь связанные с ним проверки, преобразователи и слушатели,
подобно любому другому компоненту JavaServer Faces.
С помощью технологии Facelets любая страница XHTML, которая включает разметку и другие компоненты, может быть преобразована в составной компонент. Используя ресурсы, составной компонент можно загрузить в библиотеку, которая до-
ступна для приложения.
Наиболее используемые общие составные теги и их функции содержатся в табл. 4.3.
|
Таблица 4.3 |
|
Теги составных компонент |
|
|
Тег |
Функция |
composite:interface |
Объявляет интерфейс для использования составного |
|
компонента. Составной компонент может быть использован |
|
как единственный компонент, для которого набор |
|
характеристик является объединением характеристик, |
|
объявленных в интерфейсе |
composite:implementation |
Определяет реализацию составного компонента. Если |
|
появляется элемент <composite:interface>, то должен быть |
|
соответствующий <composite:implementation> |
composite:attribute |
Объявляет атрибут, который может быть задан составному |
|
компоненту, в котором этот тег объявлен |
composite:insertChildren |
Любой дочерний компонент или текст шаблона внутри тега |
|
составного компонента в использованной странице будет |
|
потомком составного компонента в точке размещения тега |
|
в пределах секции composite:implementation |
53
|
Окончание табл. 4.3 |
|
|
Тег |
Функция |
composite:valueHolder |
Объявляет составной компонент, чей интерфейс определен |
|
в composite:interface, в котором этот элемент вложен, нужно |
|
показывать как реализацию ValueHolder целевого объекта в |
|
используемой странице |
composite:editableValueHolder |
Объявляет составной компонент, чей интерфейс объявлен |
|
в composite:interface, в котором этот элемент вложен. Нужно |
|
показывать как реализацию EditableValueHolder целевого |
|
объекта в используемой странице |
composite:actionSource |
Объявляет составной компонент, чей интерфейс объявлен |
|
в composite:interface, в котором этот элемент вложен. Нужно |
|
показывать как реализациюActionSource2 целевого объекта |
|
в используемой странице |
С более подробным и полным списком составных этикеток Facelets можно озна-
комиться по адресу http://java.sun.com/javaee/javaserverfaces/2.0/docs/pdldocs/facelets/ index.html.
Следующий пример показывает составной компонент, который принимает ввод адреса email:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:composite="http://java.sun.com/jsf/composite" xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>This content will not be displayed </title> </h:head>
<h:body>
<composite:interface>
<composite:attribute name="value" required="false"/> </composite:interface>
<composite:implementation>
<h:outputLabel value="Email id: "> </h:outputLabel> <h:inputText value="#{cc.attrs.value}"> </h:inputText>
</composite:implementation>
</h:body>
</html>
Обратите внимание на использование cc.attrs.value при определении компо-
нента inputText. Слово «cc» в JavaServer Faces — резервное слово для составных
компонентов. Выражение #{cc.attrs.ATTRIBUTE_NAME} используется, чтобы иметь до-
ступ к атрибутам, определённым для интерфейса составного компонента, в данном случае, для размещения там принятого значения.
Предыдущее содержимое примера хранится в файле email.xhtml, в папке resources/emcomp в корневом директории веб-приложения. Эта директория считается библиотекой JavaServer Faces, и UIcomponent может быть доступен из такой библиотеки.
54
Страница веб, которая использует этот составной компонент, обычно называется использующей страницей. Использующая страница включает ссылку в деклараци-
ях xml namespace на составной компонент:
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:em="http://java.sun.com/jsf/composite/emcomp/"> <h:head>
<title>Using a sample composite component</title> </h:head>
<body>
<h:form>
<em:email value="Enter your email id" /> </h:form>
</body>
</html>
Локальная библиотека составных компонент определена в xml namespace де-
кларацией xmlns:em="http://java.sun.com/jsf/composite/emcomp. Этот компонент досту-
пен с помощью тега em:email. Предыдущее содержимое примера может быть загружено как веб-страница emuserpage.xhtml в корневом директории. Когда приложение скомпилировано и развёрнуто на сервере, оно может быть доступно следующему
URL: http://localhost:8080/<application_name>/faces/emuserpage.xhtml.
Ресурсы
Ресурсы ссылаются на любые файлы, требуемые приложению для соответствующего представления. Они включают рисунки, файлы сценария и любые созданные пользователями компонентные библиотеки. Согласно JavaServer Faces 2.0, ресурсы должны быть собраны в стандартной папке, которая может быть одной из следующих:
•ресурс, упакованный в корень приложения веб, должен быть в поддиректории
ресурсов: resources/<идентификатор>;
•ресурс, упакованный в classpath приложения, должно быть в поддиректории
META-INF/resources в пределах веб-приложения:
META-INF/resources/<идентификатор>.
JavaServer Faces во время прогона ищет ресурсы в указанных выше позициях
в том же порядке.
Идентификаторы ресурса являются уникальными строками, которые соответствуют следующему формату:
[localePrefix/][libraryName/][libraryVersion/]resource name[/resourceVersion].
Элементы идентификатора ресурса в квадратных скобках ([ ]) необязательны.
Необходимым элементом является только имя ресурса — обычное имя файла.
Любой объект, подобно составному компоненту или шаблону, который загружен
в директорию ресурсов, становится доступным в других компонентах приложения, которое может использовать их, чтобы создавать экземпляр ресурса.
55