- •Обозначения и сокращения
- •введение
- •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. Защита приложения паролем
- •Заключение
- •Библиографический список
</table>
</f:view>
</body>
</html>
Упражнения
1. Создайте страницу ввода с использованием палитры (кнопка «Палитра» справа вверху окна). Выберите JSF Form From Entity и отбуксируйте левой кнопкой в нужную точку формируемой страницы. Заполните поля Entity и Manage Bean Property, выбирая из списка нужные классы и свойства. Вставляемый фрагмент выглядит так:
<h:form>
<h1><h:outputText value="Create/Edit"/></h1> <h:panelGrid columns="2">
<h:outputLabel value="IdCity:" for="idCity" /> <h:inputText id="idCity" value="#{citiesView.city.idCity}"
title="IdCity" required="true" requiredMessage="The IdCity field is required."/>
<h:outputLabel value="Name:" for="name" /> <h:inputText id="name" value="#{citiesView.city.name}"
title="Name" required="true" requiredMessage="The Name field is required."/>
<h:outputLabel value="Population:" for="population" /> <h:inputText id="population"
value="#{citiesView.city.population}" title="Population" required="true" requiredMessage="The Population field is required."/>
</h:panelGrid>
</h:form>
Отредактирйте генерированный текст нужным образом. Обратите внимание на использование тега
<h:panelGrid columns="2"> . . . . . </h:panelGrid>
В чем отличие от использованных в основном тексте приемов форматирования строк? Измените атрибут columns. Что делает атрибут for?
2.Чем отличается использование в командах атрибута action со значением строки и метода экземпляра вида?
18.8.Страница редактирования записей о городах
При редактировании имеющейся записи клиенту необходимо предоставить
форму ввода реквизитов города и две командные кнопки на подтверждение записи
введенных данных и отмену записи. При отмене записи нужно вернуться к обзорной таблице,создаваемойфайломcitiesPage.xhtml. Приподтверждениисохранениявбазе данных нужно вызвать метод-обработчик citiesView.mod_yes_City, который вызовом
метода фасада edit сохранит объект как запись в базе данных.
Структура файла аналогична предыдущему. Отличие заключается в том, что поле ключа обрабатывается скрытым тегом inputHidden, что не позволяет клиенту его изменять при корректировке данных. Убирать ключевое поле из формы тоже нельзя,
228
это приведет к добавлению измененной записи в таблицу, а не к замене существующей
(проверьте!). Возвращаемая после редактирования запись должна быть полностью
комплектной, содержать все поля, включая ключевое. Это обусловлено правилами формирования нового экземпляра объекта на основе данных формы, принятые в тех-
нологии JSF. Если вы не желаете использовать скрытые поля, то потребуется сохра-
нение редактируемого объекта в сессии с последующим слиянием редактированных и
сохраненных свойств объекта. Пример такого решения приведён в учебнике [2].
Файл city_mod.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates and open the template in the editor.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Изменение атрибутов города</title> </head>
<body>
<f:view>
<table border="1" width="100%"> <tr>
<td>
<h:form>
<table>
<tr>
<td> <h:outputLabel value="Ключ:#{citiesView.city.idCity}"/> </td>
<td> <h:inputHidden value="#{citiesView.city.idCity}"/> </td>
</tr>
<tr>
<td><h:outputLabel value="Название:"/> </td> <td><h:inputText
value="#{citiesView.city.name}"/> </td> </tr>
<tr>
<td><h:outputLabel value="Население:"/></td> <td><h:inputText
value="#{citiesView.city.population}"/></td>
</tr>
<tr>
<td>
<h:commandButton
229
action="#{citiesView.mod_yes_City}" value="Заменить" />
<h:commandButton
action="citiesPage" value="Отменить" />
</td>
</tr>
</table>
</h:form>
</td>
</tr>
</table>
</f:view>
</body>
</html>
Упражнения
1.Создайтестраницуредактированиясиспользованиемпалитры(кнопка«Палитра» справа вверху окна). Выберите JSF Form From Entity и отбуксируйте левой кнопкой в нужную точку формируемой страницы. Заполните поля Entity и Manage Bean Property, выбирая из списка нужные классы и свойства. Отредактирйте сгенерированный текст нужным образом.
2.Почему требуется наличие всех полей записи на форме ввода и редактирования свойств объекта?
3.Проанализируйте работу страницы редактирования записи БД без наличия на форме ключевого поля записи. Для этого закомментируйте фрагмент тегами <!-- и -->, обращая внимание на подсказки среды.
18.9.Страница удаления записей о городах
Страница удаления мало отличается от страницы редактирования записей.
В ней все поля формы — скрытые. Обработчиком команды подтверждения удаления записи является метод citiesView.del_yes_City.
Файл city_del.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates and open the template in the editor.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
230
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Удаление записи</title> </head>
<body>
<f:view>
<table border="1" width="100%"> <tr>
<td>
<h:form>
<table>
<tr>
<td> <h:outputLabel
value="Ключ: #{citiesView.city.idCity}"/> <h:inputHidden
value="#{citiesView.city.idCity}"/>
</td>
</tr>
<tr>
<td><h:outputLabel
value="Название: #{citiesView.city.name}"/> <h:inputHidden value="#{citiesView.city.name}"/>
</td>
</tr>
<tr>
<td><h:outputLabel
value="Население: #{citiesView.city.population}"/> <h:inputHidden value="#{citiesView.city.population}"/>
</td>
</tr>
<tr>
<td>
<h:commandButton action="#{citiesView.del_yes_City}" value="Удалить" />
<h:commandButton
action="citiesPage" value="Отменить"= />
</td>
</tr>
</table>
</h:form>
</td>
</tr>
</table>
</f:view>
</body>
</html>
231