- •Обозначения и сокращения
- •введение
- •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. Защита приложения паролем
- •Заключение
- •Библиографический список
<h:inputHidden
value="#{citiesView.selected.idCity}"/>
</td>
</tr>
<tr>
<td><h:outputLabel value="Название: #{citiesView.selected.name}"/>
<h:inputHidden
value="#{citiesView.selected.name}!/>
</td>
</tr>
<tr>
<td><h:outputLabel value=!Население: #{citiesView.selected.population}"/>
<h:inputHidden
value="#{citiesView.selected.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>
Упражнение
Объясните назначение свойства selected, где и как оно используются.
20.6. Создание и просмотр отчетов
Пусть нам требуется найти всех персон, имеющих возраст в задаваемом клиен-
том диапазоне лет относительно текущей даты просмотра. Для этого потребуется соз-
дать форму для ввода диапазона лет и обработчик, который произведёт поиск нужных персон и подготовит набор для показа на странице отчёта. Потребуется разработать макет страницы отчёта для показа результатов клиенту.
258
Добавим в файл просмотра персон после ссылки для перехода на главную страницу фрагмент с командой:
<br/>
<h:form>
<h:commandLink action="queryAge"> <h:outputText value="Запрос по возрасту" />
</h:commandLink>
</h:form>
Добавим в класс вида для персон три свойства: ageMin — минимальный и ageMax — максимальный возраст; resAge — результирующий список поиска персон.
private int ageMin = 0; private int ageMax = 0; List<Persons> resAge;
.. . . .
//ageMin
public int getAgeMin() { return this.ageMin;
}
public void setAgeMin(int d) { this.ageMin = d;
}
//ageMax
public int getAgeMax() { return this.ageMax;
}
public void setAgeMax(int d) { this.ageMax = d;
}
Добавим в вид метод – обработчик диапазона возрастов, введённых клиен-
том на запрос формы ввода. Здесь формируется params: параметр – массив до-
пустимых возрастов персон для отбора методом фасада персон personsFacade. findRangeAge(params). Результат поиска будет храниться в resAge. Следующей страницей для клиента будет resQAge.xhtml, показывающая результаты запроса.
public String queryAge_yes() {
int[] params = new int[] {ageMin, ageMax}; //System.out.println(params);
resAge = personsFacade.findRangeAge(params); return "resQAge";
}
Метод на чтение для запроса свойства вида со страницы вывода результатов
поиска:
public List<Persons> getResAge() { return resAge;
}
259
В фасад персон добавим метод поиска персон в заданном интервале воз-
растов. Интервал дат рождения формируется с использованием классов Calendar и
GregorianCalendar пакета java.util.
public List<Persons> findRangeAge(int[] age) { Calendar age0 = new GregorianCalendar(); Calendar age1 = new GregorianCalendar();
age1.add(Calendar.YEAR, -age[0]); |
// максимальная дата |
age0.add(Calendar.YEAR, -age[1]); |
// минимальная дата |
Date birth0 = age0.getTime(); |
|
Date birth1 = age1.getTime(); |
|
//System.out.println(birth0); |
|
//System.out.println(birth1); |
|
return em.createQuery( |
|
"SELECT p FROM Persons p WHERE p.bDay BETWEEN :bd0 AND :bd1")
.setParameter("bd0", birth0)
.setParameter("bd1", birth1)
.getResultList();
}
Добавим страницу queryAge.xhtml с формой для запроса диапазона возрас-
тов. Форма содержит два поля ввода: idMin и idMax и пару кнопок «Принять» и «Отменить».
Файл queryAge.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>TODO supply a title</title> </head>
<body>
<f:view>
<h:form>
<h1><h:outputText value="Задайте возраст"/></h1> <h:panelGrid columns="2">
<h:outputLabel value="От:" for="idMin" /> <h:inputText id="idMin" value="#{personsView.ageMin}"
title="idMin"/>
<h:outputLabel value="До:" for="idMax" />
260
<h:inputText id="idMax" value="#{personsView.ageMax}" title="idMax"/>
</h:panelGrid>
<h:commandButton action="#{personsView.queryAge_yes}" value="Принять" />
<h:commandButton action="personsPage" value="Отменить" />
</h:form>
</f:view>
</body>
</html>
Добавим страницу resQAge.xhtml для показа результатов выполнения запроса.
Состав страницы совпадает со страницей просмотра всех персон и отличается источ-
ником данных personsView.resAge и командными ссылками на возможные продолже-
ния действий клиента.
Файл resQAge.xhtml
<?xml version="1.0" encoding="UTF-8"?> <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:outputLabel value="Персоны. Всего записей "/> <h:outputText value="#{personsView.resAge.size()}"/> </td>
</tr>
<tr>
<td>
<h:form>
<h:dataTable value="#{personsView.resAge}" var="person" border="1">
<h:column>
<f:facet name="header"> <h:outputText value="Ключ"/>
</f:facet>
<h:outputText value="#{person.idPerson}"/> </h:column>
<h:column>
<f:facet name="header"> <h:outputText value="Фамилия"/>
</f:facet>
261
<h:outputText value="#{person.family}"/> </h:column>
<h:column> <f:facet name="header">
<h:outputText value="Имя"/> </f:facet>
<h:outputText value="#{person.name}"/> </h:column>
<h:column>
<f:facet name="header"> <h:outputText value="Отчество"/>
</f:facet>
<h:outputText value="#{person.father}"/> </h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Дата рождения"/> </f:facet>
<h:outputText value="#{person.bday}"> <f:convertDateTime dateStyle="short" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header"> <h:outputText value="Город"/>
</f:facet>
<h:outputText value="#{person.cityId.name}"/> </h:column>
<h:column>
<f:facet name="header"> <h:outputText value="Операции"/>
</f:facet>
<h:commandLink
action="#{personsView.modPerson(person)}"> <h:outputText value="Заменить" />
</h:commandLink>
<h:commandLink
action="#{personsView.delPerson(person)}"> <h:outputText value="Удалить" />
</h:commandLink>
</h:column>
</h:dataTable>
</h:form>
</td>
</tr>
<tr>
<td>
<h:form>
<h:commandLink action="personsPage">
262
