Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2013_1 / КСТ / Разработка веб-приложений.pdf
Скачиваний:
252
Добавлен:
23.02.2015
Размер:
2.74 Mб
Скачать

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

Соседние файлы в папке КСТ