Код, приведенный в листинге 10.5, является XHTML-страницей Facelets, которая использует теги JSF (xmlns: h="http://xmlns.jcp.org/jsf/html") для отображения формы с двумя полями ввода (ISBN и название книги) и кнопки. Эта страница состоит из нескольких JSF-компонентов. Некоторые из них не имеют внешнего вида, как и те, что используются для объявления заголовка (), тела () или формы (). Другие компоненты можно увидеть, они представляют собой метку (), текстовое поле () или кнопки (). Обратите внимание, что чистые HTML-теги также могут быть использованы на странице (, ,
и т. д.).
Листинг 10.5. Фрагмент страницы JSF, использующей сочетание компонентов JSF и HTML
>
>·········"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
>
>
>··Создать новую книгу
>
>
>··Создать новую книгу
>··
>··
>····>······>········ |
>········ |
>······
>······>········ |
>········ |
>······
>····
>····
>··············action="#{bookController.doCreateBook}" styleClass="submit"/>
>··
>··
>··APress — Изучаем Java EE 7
>
>
Одной из причин создания JSF было намерение повторно использовать JSP (JavaServer Page) в качестве основного PDL, поскольку он уже был частью Java EE. JSP использовал JSTL и EL (JSP Standard Tag Library — стандартная библиотека тегов JSP), так что идея заключалась в том, чтобы задействовать все эти технологии в рамках JSF. JSP — это язык страниц, а JSF — это слой компонентов, располагающийся над ним. Тем не менее жизненные циклы JSP и JSF не совсем подходят друг другу. Теги в JSP обрабатываются один раз сверху вниз, чтобы сформировать ответ. JSF имеет более сложный жизненный цикл, в котором генерация дерева компонентов и отрисовка происходят в разных фазах. Именно здесь приходит на помощь Facelets, чтобы соответствовать жизненному циклу JSF.
Facelets начал свое существование как альтернатива JSP с открытым исходным кодом. В отличие от JSP, EL и JSTL он не имел JSR и не был частью Java EE. Facelets стал заменой JSP и предоставил альтернативу на основе XML (XHTML) для всех страниц JSF-приложений. Facelets был разработан на основе JSF, именно поэтому он представляет собой простую модель программирования. Из-за этого Facelets был указан в JSF 2.0 и сегодня предоставляется в Java EE 7 в качестве предпочтительного PDL для JSF.
JSF поддерживает две модели программирования для отображения компонента: непосредственную и делегированную реализации. При использовании прямой модели компоненты должны декодировать и закодировать себя в графическое представление. При использовании модели делегирования эти операции делегируются отрисовщику, который позволяет компоненту не зависеть от технологии отрисовки (браузер, переносное устройство и т. д.) и иметь несколько графических представлений.
Отрисовщик отвечает за отображение компонента и перевод пользовательского ввода в значение компонента. Рассматривайте отрисовщик как транслятор между клиентом и сервером: он декодирует запрос пользователя, чтобы установить значения компонентов, и кодирует ответ для создания представления компонента, который клиент понимает и может отобразить.
Отрисовщики располагаются в наборах отрисовки, которые сосредотачиваются на конкретном типе вывода. Для обеспечения переносимости приложения JSF включает поддержку стандартного комплекта отрисовщиков и связанных с ним отрисовщиков для HTML 4.01. Реализации JSF могут сформировать собственный комплект отрисовщиков для создания языка разметки для беспроводных устройств (WML), масштабируемой векторной графики (SVG) и т. д.
Преобразователи и валидаторы
Как только страница отрисована, пользователь может взаимодействовать с ней для ввода данных. Поскольку не существует никаких ограничений типов, отрисовщик не может знать заранее, как отобразить объект. Здесь в игру вступают преобразователи: они преобразуют объект (он может иметь тип Integer, Date, Boolean и т. д.) в строку для отображения и из входной строки обратно в объект. JSF поставляется с набором преобразователей для общих типов (в пакете javax.faces.convert), но вы можете разработать свой собственный или включить сторонние преобразователи.
Иногда эти данные также должны быть подтверждены перед обработкой на сервере. Валидаторы отвечают за то, чтобы значение, введенное пользователем, было корректным. С одним компонентом могут быть связаны один или несколько валидаторов. Вместе с JSF поставляется несколько валидаторов (LengthValidator, RegexValidator и т. д.). Он также позволяет вам создать свой собственный валидатор с помощью аннотированных классов. Когда при преобразовании или проверке корректности появляется ошибка, сообщение для отображения отправляется ответу. С JSF 2.0 проверка может быть делегирована Bean Validation (это показано в главе 3).
Наш сайт использует куки для сбора анонимной статистики.