- •Обозначения и сокращения
- •введение
- •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. Защита приложения паролем
- •Заключение
- •Библиографический список
15.Связывание ресурсов
15.1.Ресурсы и служба имен JNDI
Враспределённом приложении компонентам нужно иметь доступ к другим компонентам и ресурсам (например, к базам данных). Например, сервлет может вызы-
вать удаленные методы в бинах, которые извлекают информацию из базы данных. На платформе Java EE служба имен Java Naming and Directory InterfaceTM (JNDI) предо-
ставляет компоненты для размещения других компонентов и ресурсов.
Ресурс является программным объектом, который обеспечивает связи в системе, например, с серверами баз данных и с системой обмена сообщениями. Ресурс Java DataBase Connectivity (JDBCTM) иногда называется источником данных. Каждый объект ресурса идентифицируется уникальным именем, называемым JNDI-именем.
Например, ресурс JDBC для базы данных JavaDB, которая поставляется с сер-
вером Sun GlassFishTM Enterprise Server v3, имеет имя JNDI jdbc/__default.
Администратор создает ресурсы в пространстве имен (namespace) JNDI. На сервере вы можете использовать административную консоль или команды asadmin,
чтобы создать ресурсы. Приложения затем используют аннотации, чтобы внедрять
ресурсы. Если приложение использует инъекцию ресурса, сервер вызывает JNDI API,
и самому приложению не требуется ничего другого делать. Тем не менее, приложение также может делать прямые вызовы JNDI API.
Объект ресурса и имя JNDI связываются вместе службой присваивания имен и службой директорий. Для того, чтобы создать новый ресурс, вводится новая связь имени с объектом в JNDI. Вы получаете ресурсы, используя аннотации @Resource в
приложении.
Можно использовать дескриптор развертывания, чтобы перекрыть отображение ресурса, которое определили в аннотации. Использование дескриптора развертывания позволяет изменять приложение, переупаковывая, а не перекомпилируя исходные файлы. Тем не менее, для большинства приложений дескриптор развертывания
может отсутствовать.
15.2. Объекты DataSource и пулы соединений (Connection Pools)
Для того чтобы хранить, просматривать и извлекать данные, большинство при-
ложений используют реляционную базу данных. Компоненты Java EE 6 могут иметь
доступ к реляционным базам данных через JDBC API. С информацией о JDBC API
можно ознакомиться по адресу http://java.sun.com/javase/technologies/database/.
ВJDBC API базыданныхдоступныприпомощиобъектовDataSource.DataSource
имеет набор свойств, которые идентифицируют и описывают реальный источник дан-
ных, который он представляет. Эти свойства включают информацию, как например,
расположение сервера базы данных, имя базы данных, используемый сетевой протокол для связи с сервером и так далее. В Sun GlassFish источник данных называется
ресурсом JDBC.
Приложения имеют доступ к источнику данных, используя соединение и объект
DataSource, который понимается как инструмент для связи с конкретным источником.
180
В основной реализации DataSource вызов метода getConnection возвращает объект связи, который является физической связью с источником данных.
Если объект DataSource зарегистрирован в службе имен JNDI, то приложение может использовать JNDI API, чтобы иметь к нему доступ, а объект DataSource может быть использован, чтобы подключаться к источнику данных, который он представляет. DataSource реализуетсоединениечерезпулсконкретнымисточникомданных,который представляет класс DataSource. Объект связи, возвращаемый методом getConnection, является ссылкой на объект PooledConnection, а не физической связью. Пул соединений не виден прикладному коду, за исключением того, что соединение должно всегда закрываться явно. Когда приложение закрывает соединение, оно возвращается в пул для повторного многократного использования. Поскольку механизм пула соединений не всегда создает новую физическую связь каждый раз, когда она требуется, приложения могут работать значительно быстрее.
Пул соединений JDBC является группой многократно используемых соединений для конкретной базы данных. Поскольку каждое создание новой физической связи требует времени, сервер поддерживает пул доступных соединений, чтобы ускорить исполнение. Когда приложение запрашивает связь, оно получает ее из пула. Когда приложение закрывает связь, связь возвращается в пул.
Приложения, которые используют язык Persistence API, определяют объект
DataSource, который они используют в элементе jta-data-source файла persistence.xml.
<jta-data-source>jdbc/MyOrderDB</jta-data-source>
Обычно это единственная ссылка на объект JDBC для устройства хранения. Прикладной код сам не ссылается на объекты JDBC.
15.3. Внедрение ресурсов
Аннотации класса javax.annotation.Resource используются, чтобы объявить ссылку на ресурс. Аннотация @Resource может декорировать класс, поле или метод. Контейнер подключит ресурс, на который ссылается аннотация @Resource, в компонент или в период исполнения, или когда компонент инициализирован, в зависимости от использования поля/метода или экземпляра класса. Для инъекции поля или метода контейнер внедрит ресурс, когда приложение будет инициализировано. Для инъекции класса ресурс отыскивается при исполнении приложения.
Аннотация @Resource имеет следующие элементы:
•name — имя JNDI-ресурса;
•type — тип языка Java для ресурса;
•authenticationType — тип аутентификации для ресурса;
•shareable указывает на совместное использование ресурса;
•mappedName — зависящее от реализации непортируемое имя, на которое ресурс должен быть отображен;
•description — описание ресурса.
Элемент name является JNDI-именем ресурса, факультативным для внедрения («инъекции») на базе поля или метода. Для внедрения на базе поля по умолчанию имя является именем поля, заданным с именем класса. Для инъекции на базе метода по умолчанию имя является именем свойства JavaBeans, квалифицированным именем
класса. Элемент имени должен быть определён в инъекции на базе класса.
181
Тип ресурса определен одним из следующих способов:
•типом поля в аннотации ресурса @Resource декорируют инъекции на базе поля;
•типом свойства JavaBeans в аннотации @Resource декорируют инъекции на базе метода;
•элементом type аннотации @Resource. Элемент type требуется для инъек-
ции на базе класса.
Элемент authenticationType (например, ресурсы коннекторов, также называе-
мые адаптерами ресурсов или источниками данных) используется только фабрикой соединений. Этот элемент может быть установлен в одно из значений перечисле-
ния javax.annotation.Resource.AuthenticationType: CONTAINER (по умолчанию) или
APPLICATION.
Элемент shareable используется только экземплярами ресурса Object Resource
Broker (ORB) или фабрикой соединений ресурсов. Он указывает возможность разделения ресурса между этим и другими компонентами и может быть установлен в true
(по умолчанию) или в false.
Элемент mappedName — непортируемое, зависящее от реализации имя, на
которое ресурс должен быть отображен. Поскольку элемент name, когда он определен явно или по умолчанию, локализован в приложении, многие серверы Java EE обеспечивают путь к этому ресурсу посредством установки элемента mappedName.
Элемент description является описанием ресурса, обычно по умолчанию на язы-
ке системы, на которой приложение развернуто для того, чтобы помогать разработчи-
кам идентифицировать и выбирать правильный ресурс.
15.3.1. Внедрение ресурсов на базе поля
Для того чтобы использовать инъекции на базе поля, объявите поле и укажите
аннотацию @Resource. Контейнер сам задаст имя и тип ресурса, если элементы name и type не определены. Если вы определяете элемент type, это должно соответствовать декларации типа поля.
package com.example; public class SomeClass {
@Resource
private javax.sql.DataSource myDB;
...
}
В данном коде контейнер задаёт имя ресурса, основанное на имени класса и имени поля: com.example.SomeClass/myDB. Вычисленный тип ресурса будет javax.sql.
DataSource.class.
package com.example; public class SomeClass {
@Resource(name="customerDB") private javax.sql.DataSource myDB;
...
}
В этом коде имя JNDI — customerDB, а найденный тип — javax.sql.DataSource.
class.
182
15.3.2. Инъекция на основе метода (Method-based)
Для того чтобы использовать инъекцию на основе метода, объявите включение
метода с аннотацией @Resource. Контейнер задаст имя и тип ресурса, если элементы
имени и типа не определены. Метод setter должен следовать соглашениям JavaBeans
об именах свойств: имя метода должно начаться с set, иметь тип void и только один
параметр. Если вы определяете элемент типа, он должен соответствовать декларации типа поля.
package com.example; public class SomeClass {
private javax.sql.DataSource myDB;
...
@Resource
private void setMyDB(javax.sql.DataSource ds) { myDB = ds;
}
...
}
В приведённом фрагменте кода, контейнер строит имя ресурса, основанное на
имени класса и имени поля: com.example.SomeClass/myDB. Созданный тип является javax.sql.DataSource.class.
package com.example; public class SomeClass {
private javax.sql.DataSource myDB;
...
@Resource(name="customerDB")
private void setMyDB(javax.sql.DataSource ds) { myDB = ds;
}
...
}
В этом коде имя JNDI — customerDB, а тип — javax.sql.DataSource.class.
15.3.3. Инъекция на основе класса (Class-based)
Для того чтобы сделать инъекцию для класса, используется аннотация @Resource и при необходимости элементы name и type.
@Resource(name="myMessageQueue",
type="javax.jms.ConnectionFactory") public class SomeMessageBean {
...
}
Объявление нескольких ресурсов
Аннотацию @Resource можно использовать, чтобы сгруппировать вместе не-
сколько деклараций ресурсов для инъекции на базе класса.
Resources({
@Resource(name="myMessageQueue",
type="javax.jms.ConnectionFactory"),
@Resource(name="myMailSession",
183