- •Обозначения и сокращения
- •введение
- •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. Защита приложения паролем
- •Заключение
- •Библиографический список
5. Унифицированный язык записи выражений
Унифицированный язык выражений (EL) был введён в версии JSP 2.1, в полном
объёме поддерживается версией JSP 2.0 и представляет собой объединение языка
выражения JSP 2.0 и языка выражений для технологии JavaServer Faces. Язык выражений JSP 2.0 позволяет авторам использовать простые выражения, чтобы динамиче-
ски считывать данные из компонентов JavaBeans.
Технология JavaServer Faces представляет собой многофазный жизненный
цикл разработки и поддерживает интеллектуальную компонентную модель UI, кото-
рая включает в себя преобразование и проверку компонентных данных, передачу компонентных данных в объекты и обработку компонентных событий. Для того чтобы
облегчить эти функции, технология JavaServer Faces использует собственный язык
выражения, обеспечивающий следующую функциональность:
отложенную оценку выражений,
способность задавать и получать данные,
способность вызывать методы.
Это позволило обеспечить сосуществование программ, написанных в различ-
ных технологиях JSP и JSF.
EL определяетдвародавыражений:выражения-значенияивыражения-методы. Выражения-значения (value expression) могут вычислять как одиночные данные, так и наборы данных. Выражения-методы (method expression) ссылаются на вызываемые методы, которые могут возвращать значение.
Немедленная и отложенная оценка выражений
Выражения-значения могут быть двух категорий: rvalue и lvalue. Значения rvalue можно только читать, но нельзя записывать. Выражения lvalue можно как читать, так
и записывать.
Синтаксис ${...} используется для задания только выражений rvalue. Синтаксис #{...} используется для задания выражений как rvalue, так и lvalue.
Немедленная оценка выражений производится сервером при первой генерации страницы. Отложенная оценка предполагает использование средств вычисления на
поздних стадиях жизненного цикла страницы, когда это необходимо.
Выражения, которые оцениваются немедленно, используют синтаксис ${}, вве-
дённый языком выражения JSP 2.0. Пример:
<fmt:formatNumber value=”${sessionScope.cart.total}”/>
где sessionScope определяет область видимости объектов в период всей сессии кли-
ента от регистрации до выключения браузера; cart — имя экземпляра бина; total — имя свойства бина.
Выражения с отложенной оценкой используют синтаксис #{}, который был вве-
ден технологией JavaServer Faces. Пример:
<h:inputText id=”name” value=”#{customer.name}” />
где customer — имя бина; name — имя свойства объекта customer.
Различают выражения-значения и выражения-методы. Выражения-значения
предполагают доступ на чтение и запись свойств объектов. Выражения с немедленной оценкой всегда допускают только чтение значения, а отложенные выражения в
технологии JSF разрешают и запись значений.
56
Выражения могут ссылаться на различные объекты, их свойства и атрибуты.
Такими объектами могут быть:компоненты JavaBeans,
коллекции Collections,
перечислительные типы Java SE enumerated types,
предопределённые объекты Implicit objects.
Веб-контейнер оценивает переменные в выражении, используя метод
PageContext.findAttribute(String), где аргумент-строка задаёт имя переменной. Если
переменной с таким именем нет, то возвращается значение null.
При использовании ссылки на перечисления в описании объекта Suit это вы-
глядит следующим образом:
public enum Suit {hearts, spades, diamonds, clubs}
Использование Suit.hearts предполагает использование значения hearts.
Контейнер автоматически приводит константы к нужному типу, например: ${mySuit == "hearts"}
Доступ к свойствам объектов производится с использованием скобочной нотации, например, ${customer.address[«street»]}, или традиционной точечной нотации,
например, ${customer.address.street}. При записи строк-имен свойств можно использовать двойные и одиночные кавычки, например, ${customer. address['street']}.
Для доступа к элементу массива используется традиционная скобочная запись,
например, ${customer.orders[2]}.
Арифметические выражения и константы записываются в традиционной форме, например:
${"literal"},${customer.age + 20},${true},
${57}.
Обычно результат вычисления выражения подставляется вместо его самого в соответствующий контекст, предварительно преобразованный в ожидаемое в данном контексте представление.
Примеры использования выражений в различных контекстах
1.В статическом тексте:
<some:tag>
some text ${expr} some text
</some:tag>
2.В значениях атрибута вызываемого тега:
<some:tag value="${expr}"/> <another:tag value="#{expr}"/>
<some:tag value="some${expr}${expr}text${expr}"/> <another:tag value="some#{expr}#{expr}text#{expr}"/>
В выражениях отложенного типа разрешается использование методов, возвра-
щающих значения (функций), например:
<h:form>
<h:inputText
id="name"
value="#{customer.name}"
validator="#{customer.validateName}"/>
57
<h:commandButton
id="submit" action="#{customer.submit}" />
</h:form>
Тег inputText отображает поле для ввода текста на форме у пользователя. Метод validateName вызывается для проверки правильности заполнения поля пользовате-
лем при нажатии им кнопки submit и относится к отложенным вычислениям.
Подобно выражениям-значениям, выражения-методы могут использовать как
точечный, так и скобочный синтаксис. Вызовы #{object.method} и #{object["method"]}
эквивалентны.
Важно! Выражения-методы могут использоваться только в атрибутах тегов JSF.
Для включения символов ${ и #{ в текстовые строки их необходимо экраниро-
вать символом \, например, some text \#{ some more\${ text.
Примеры EL-выражений приведены в табл. 5.1.
Таблица 5.1
Значения выражений |
|
Выражение |
Результат |
${1 > (4/2)} |
false |
${4.0 >= 3} |
true |
${100.0 == 100} |
true |
${(10*10) ne 100} |
false |
${’a’ < ’b’} |
true |
${’hip’ gt ’hit’} |
false |
${4 > 3} |
true |
${1.2E4 + 1.4} |
12001.4 |
${3 div 4} |
0.75 |
${10 mod 4} |
2 |
${!empty param.Add} |
False если request параметр с именемAdd |
|
есть null или пустая строка |
${pageContext.request. contextPath} |
Путь контекста |
${sessionScope.cart.numberOfItems} |
Значение свойства |
${param[’mycom.productId’]} |
Значение параметра |
${header[«host»]} |
Хост в заголовке |
${departments[deptName]} |
Значение сущности deptName |
|
в коллекции departments |
${requestScope[’javax.servlet.forward. |
Значение атрибута javax.servlet. forward. |
servlet_path’]} |
servlet_path в области request-scoped |
#{customer.aName} |
Запрос свойства aName объекта customer |
#{cutomer.calcTotal} |
Возвращает значение метода calcTotal |
|
объекта customer |
58
6. Использование
технологии JavaServer Faces
Страницы представляют слой представления (виды) для веб-приложений.
Процесс создания веб-страниц JavaServer Faces в приложении включает задачи до-
бавления компонентов на страницу и связывания их с бинами, проверками, преобразователями и другими объектами на стороне сервера.
Типичная страница состоит из следующих элементов:
•задание деклараций namespace, которые объявляют библиотеки тегов
JavaServer Faces;
•дополнительный тег HTML заголовка (h:head) и тела страницы (h:body);
•тег формы (h:form), предоставляющий место для размещения компонентов
ввода данных от пользователя.
Чтобы разместить компоненты JavaServer Faces на странице, нужно обеспе-
чить доступ к двум стандартным библиотекам тегов JavaServer Faces: html и core.
Стандартная библиотека тегов HTML определяет теги, которые представляют общий интерфейс компонентов пользователя. Базовые теги предназначены для выполнения основных действий.
Чтобы использовать теги Faces JavaServer, нужно включить подходящие директивы в атрибутах заголовка каждой страницы, определяющие библиотеки тегов. Например, при создании страницы Facelets XHML включите директивы namespace следующим образом:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core">
Префиксы тегов используются для того, чтобы различать теги, принадлежащие разным библиотекам. Можно использовать другие префиксы вместо стандартных h или f. Тем не менее, включая тег в страницу, вы должны использовать префикс, который выбрали для этой библиотеки тегов. Например, тег формы должен ссылаться на префикс h, поскольку библиотечная директива задаёт префикс h для библиотеки тегов
HTML: <h:form ...>.
6.1.Добавление компонент библиотеки HTML на страницу
Теги JavaServer Faces, определённые стандартной библиотекой HTML, представляют компоненты формы и других основных элементов HTML. Эти компоненты отображают данные или принимают данные от пользователя. Эти данные содержат значения всех элементов ввода формы и передаются на сторону сервера, когда поль-
зователь щелкает кнопку передачи. Теги компонент показаны в табл. 6.1.
59
|
Теги компонент библиотеки HTML |
Таблица 6.1 |
|
|
|
||
|
|
|
|
Тег |
Функция |
Генерирует код |
Изображение |
column |
Колонка данных |
Колонка |
Колонка в таблице |
|
компонента Data |
в HTML-таблице |
|
commandButton |
Передача данных |
Элемент <input |
Кнопка |
|
|
type=type> |
|
commandLink |
Ссылка |
Элемент <a href> |
Ссылка |
|
на другую страницу |
|
|
dataTable |
Таблица |
Элемент <table> |
Динамическая |
|
|
|
таблица |
form |
Форма |
Элемент <form> |
Не отображается |
|
для ввода данных |
|
явно |
graphicImage |
Рисунок |
Элемент <img> |
Рисунок |
inputHidden |
Скрытая переменная |
Элемент <input |
Не отображается |
|
|
type=hidden> |
|
inputSecret |
Поле ввода паролей |
Элемент <input |
При вводе символы |
|
|
type=password> |
заменяются |
|
|
|
на заполнители |
inputText |
Поле для ввода строки |
Элемент <input |
Текстовое поле |
|
|
type=text> |
|
inputTextarea |
Поле для ввода |
Элемент <textarea> |
Многострочный |
|
нескольких строк |
|
текст |
message |
Локализованное |
Тег <span> |
Строка текста |
|
сообщение |
|
|
messages |
Локализованные |
Тег <span> |
Строка текста |
|
сообщения |
|
|
outputFormat |
Локализованные |
Сплошной текст |
Строка текста |
|
сообщения |
|
|
outputLabel |
Этикетка |
Элемент <label> |
Текст |
|
для поля ввода |
|
|
outputLink |
Ссылка на другую |
Элемент <a> |
Ссылка |
|
страницу |
|
|
outputText |
Строка текста |
Сплошной текст |
Текст |
panelGrid |
Таблица |
Элемент <table> с |
Таблица |
|
|
<tr> и <td> |
|
panelGroup |
Группа компонент |
Элемент <div> или |
Строка в таблице |
|
|
<span> |
|
selectBooleanCheckbox |
Переключатель |
Элемент <input |
Переключатель |
|
|
type=checkbox> |
|
selectItem |
Элемент |
Элемент <option> |
Не отображается |
|
одиночного выбора |
|
|
selectItems |
Список |
Список элементов |
Не отображается |
|
элементов выбора |
<option> |
|
selectManyCheckbox |
Группа |
Группа элементов |
Группа |
|
переключателей |
<input type=checkbox> |
переключателей |
selectManyListbox |
Множественный выбор |
Элемент <select> |
Список выбора |
|
из списка |
|
|
60
|
|
|
Окончание табл. 6.1 |
|
|
|
|
|
|
Тег |
Функция |
Генерирует код |
|
Изображение |
selectManyMenu |
Множественный выбор |
Элемент <select> |
|
Комбинированный |
|
из списка |
|
|
список |
selectOneListbox |
Список для выбора |
Элемент <select> |
|
Список выбора |
|
одного элемента |
|
|
|
selectOneMenu |
Список для выбора |
Элемент <select> |
|
Комбинированный |
|
одного элемента |
|
|
список |
selectOneRadio |
Радио кнопки выбора |
Элемент <input |
|
Набор кнопок |
|
|
type=radio> |
|
|
Атрибуты интерфейсных тегов
Большинство тегов компонент имеют несколько общих атрибутов:
•id — уникальный идентификатор компонента;
•immediate — если установлен в true, то означает, что некоторое событие, про-
верка и преобразование, связанное с тегом, будет работать при
анализе значений последующих фаз;
•rendered — задаёт условие визуализации тега;
•style — задаёт таблицу каскадных стилей для тега (CSS);
•styleClass — задаёт класс CSS, содержащий определения стилей;
•value — задаёт связь значения компонента с внешними данными;
•binding — задаёт связь данных внешнего объекта с атрибутами компонента.
Атрибут id не является необходимым для тега компонента за исключением случая, когда другой компонент или внешний класс должны ссылаться на этот компонент. Если вы не включаете атрибут id, то сервер JSF автоматически генерирует свой ID. В отличие от
большинства других атрибут id использует только непосредственный синтаксис ${}.
Атрибут immediate задаёт фазу для обработки значения тега. Если он установ-
лен в true, то обработка будет происходить при анализе значений перед последующими фазами. Авторам страниц нужно тщательно рассчитывать комбинацию immediate и значений командного компонента с немедленной оценкой значений, учитывая, что случится, когда командный компонент будет активизирован.
Атрибут rendered задаёт логическое условие видимости компонента на стра-
нице. Например:
<h:commandLink id="check"
...
rendered="#{cart.numberOfItems > 0}"> <h:outputText
value="#{bundle.CartCheck}"/>
</h:commandLink>
Здесь компонент commandLink будет отображаться, если свойство numberOfItems (число позиций объекта cart ) больше нуля.
Атрибуты style и styleClass задают каскадные таблицы стилей для использования при визуализации компонент. Например:
<h:dataTable id="books"
...
styleClass="list-background" value="#{bookDBAO.books}" var="book">
61
