- •Обозначения и сокращения
- •введение
- •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. Защита приложения паролем
- •Заключение
- •Библиографический список
18.4.Программирование вида для объектов
После создания заготовки вида (см. п. 1.4.4.3) автор приложения должен до-
полнить описания необходимых дизайнеру свойств и методов. Их состав зависит от потребностей в информации и функциях страниц, отправляемых клиенту на браузер.
Обычно это обзорная таблица со всеми полями записей, форма для ввода и коррек-
тировки полей, для удаления записей, форма для ввода задания на поиск и другие.
Рассмотрим потребности дизайна для работы с сущностями на примере простых та-
блиц нашего демонстрационного приложения. Напомним, что для автоматического форматирования и вставки выражений импорта необходимых пакетов нужно исполь-
зовать команды меню «Исходный код – Формат» и «Исходный код – Исправить вы-
ражения импорта».
Первое, что нам будет нужно — обеспечить дизайнера доступом к свойствам
сущности. Для вида сущности класса Cities нужно создать описание его свойства со всеми методами get/set. Для этого нам требуется описание приватного поля экземпля-
ра сущности и соответствующие методы, которые будут выглядеть так:
private Cities city; |
// |
Поле экземпляра города |
public Cities getCity() { |
// |
Метод получения свойства city |
return this.city; |
|
|
} |
|
|
Для создания экземпляра города в конструктор вида добавим строку, получив:
public CitiesView() { // Конструктор вида без параметров this.city = new Cities(null, "", 0);
}
Параметры вызова конструктора Cities(null, " ", 0) для города имеют следующий смысл:
•null — неопределённое значение ключа,
•" " — пустое название города,
•0 — численность населения.
Таким образом, свойство city нашего вида будет иметь ссылку на «живой» экземпляр сущности Cities с указанными атрибутами. Они будут использоваться на странице добавления нового города.
Свойство city необходимо дизайнеру для доступа к полям сущности при разра-
ботке формы для ввода данных от клиента при добавлении, редактировании и удале-
нии записи. Доступ на чтение этого свойства обеспечивает метод:
public Cities getCity() { return this.city;
}
Для подсчета числа записей в таблице городов (пусть об этом попросил дизай-
нер) создадим вычисляемое (не хранимое) свойство с именем numberOfCities с досту-
пом только на чтение методом getNumberOfCities:
public int getNumberOfCities() { return citiesFacade.findAll().size();
}
219
Для получения списка всех сущностей из базы данных добавим объявление свойства allOfCities вычисляемого методом getAllOfCities:
public List<Cities> getAllOfCities() { return citiesFacade.findAll();
}
Обратите внимание на тип возвращаемого значения — типизированный список
List<Cities> объектов класса Cities. Это то, что нужно будет дизайнеру для организа-
ции просмотра всех записей таблицы городов.
Для приема от клиента и обработки команды на запись в БД добавляемого го-
рода включим в состав класса вида метод без параметров saveCity, который с исполь-
зованием метода фасада create передаст на сохранение в БД содержимое приватного объекта city, хранящего значение свойства нашего вида city. Сохранив объект в БД,
метод вернет навигационную строку, указывающую, какую страницу нужно показать
клиенту следующей. Имя страницы нужно согласовать с дизайнером, в нашем случае
это citiesPage.xhtml.
public String saveCity() { this.citiesFacade.create(city); return "citiesPage";
}
Аналогичный смысл имеют методы для модификации и удаления записей. Метод modCity будет вызываться как обработчик команды редактирования сущности из обзорной таблицы. Он просто сохраняет передаваемый параметром редакти-
руемый экземпляр сущности в свойстве this.city и вызывает страницу city_mod.xhtml
с формой для редактирования.
public String modCity(Cities city) { this.city = city;
return "city_mod";
}
Метод mod_yes_City будет обработчиком командной кнопки Submit — «Принять» данные с формы редактирования для сохранения изменений в БД средствами фасада.
public String mod_yes_City() { this.citiesFacade.edit(city); return "citiesPage";
}
Аналогичный смысл методов для обработки задания на удаление и получения
подтверждения на удаление со страницы запроса.
public String delCity(Cities city) { this.city = city;
return "city_del";
}
public String del_yes_City() { this.citiesFacade.remove(this.city); return "citiesPage";
}
220
Файл CitiesView.java
/*
*To change this template, choose Tools | Templates
*and open the template in the editor.
*/
package Views;
import Entities.Cities; import Facades.CitiesFacade; import java.util.List; import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped; import javax.faces.bean.ManagedBean;
/**
*
* @author cyx */
@ManagedBean(name = "citiesView") @SessionScoped
public class CitiesView {
@EJB
private CitiesFacade citiesFacade; private Cities city;
/** Creates a new instance of CitiesView */ public CitiesView() {
this.city = new Cities(null, "", 0);
}
public Cities getCity() { return this.city;
}
public int getNumberOfCities() { return citiesFacade.findAll().size();
}
public List<Cities> getAllOfCities() { return citiesFacade.findAll();
}
public String saveCity() { this.citiesFacade.create(city); return “citiesPage”;
}
public String modCity(Cities city) { this.city = city;
221
return "city_mod";
}
public String mod_yes_City() { this.citiesFacade.edit(this.city); return "citiesPage";
}
public String delCity(Cities city) { this.city = city;
return "city_del";
}
public String del_yes_City() { this.citiesFacade.remove(this.city); return "citiesPage";
}
}
Упражнения
1.Зачем в описании класса вида присутствует объект фасада сущности?
2.Почему в описании вида нет вызова конструктора фасада сущности? За счет чего устанавливается связь экземпляров фасада и вида?
3.Можно ли в фасаде для города запросить объекты другого класса, например, персоны?
4.Можно ли в виде для города использовать фасад для персон?
18.5. Дизайн главной страницы
При создании проекта была сгенерирована пустая главная страница index.xhtml.
Дизайнер должен наполнить ее содержанием, отвечающим задачам проекта. В нашем
случае требуется организовать работу клиента с тремя таблицами: города, люди, рабочие места. Разместим на странице три ссылки и поясняющий текст. Ссылки будут вызывать соответствующие страницы для обзора содержимого соответствующих та-
блиц. Для доступа к библиотекам тегов их необходимо указать в атрибутах xmlns тега html. Ссылки выполняются тегом commandLink с атрибутом action, задающим нави-
гационную строку с именем следующей страницы (без расширения). Вложенный тег outputText определяет текст ссылки.
Файл index.xhtml
<?xml version=’1.0’ encoding=’UTF-8’ ?>
<!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:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<h:head>
222
