5.03. JavaServer Faces
JavaServer Faces
★ JavaServer Faces (JSF) – серверный фреймворк с открытым исходным кодом, предназначенный для построения пользовательских интерфейсов для веб-приложений на основе Java. Он следует паттерну MVC (Model-View-Controller) и предоставляет:
- компонентную модель UI;
- поддержку событий;
- управление состоянием;
- конвертацию и валидацию данных.
JSF работает по принципу жизненного цикла запроса, который состоит из следующих фаз:
- Restore View – восстановление представления (UI);
- Apply Request Values – обработка значений из запроса;
- Process Validations – проверка корректности введённых данных;
- Update Model Values – обновление модели (бина);
- Invoke Application – вызов бизнес-логики;
- Render Response – отправка ответа клиенту (рендеринг страницы).
Все эти фазы управляются FacesServlet, который является контроллером MVC.
★ Сервлеты (Servlets) — это Java-классы, которые обрабатывают HTTP-запросы и формируют HTTP-ответы на стороне сервера. Они работают внутри сервлет-контейнера (например, Tomcat), расширяя функциональность веб-сервера. Обычно используются для создания динамического контента, например, генерации HTML на лету или обработки форм. Сервлет реализует интерфейс javax.servlet.Servlet (чаще через HttpServlet) и переопределяет методы вроде doGet(), doPost(). Их жизненный цикл включает три ключевых этапа: инициализация (init() ), обработка запроса (service()/doX() ), уничтожение (destroy() ).
Сервлет обрабатывает HTTP-запросы, выполняет логику и генерирует динамический контент (например, HTML, JSON). Пример:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// Генерация ответа
}
}
JSF использует FacesServlet как точку входа вместо обычного сервлета.
JSP (JavaServer Pages) – технология создания динамических веб-страниц на основе HTML с внедрением Java-кода. Но начиная с JSF 2.0 рекомендуется использовать Facelets, а не JSP.
Facelets – современный механизм шаблонизации для JSF. Он поддерживает XHTML-файлы, компоненты JSF (<h:inputText>, <h:commandButton> и т.д.), шаблоны (<ui:insert>, <ui:define>), перезапись частей страницы без полной перезагрузки.
Рендеринг – процесс преобразования JSF-компонентов в HTML, который отправляется браузеру клиента. JSF использует рендереры, связанные с каждым компонентом, чтобы определить, как тот должен отображаться. Пример:
<h:inputText value="#{user.name}" />
<!-- Рендерится как <input type="text" name="..." /> -->
Facelets использует набор тегов для построения UI. Основные пространства имён:
- http://java.sun.com/jsf/html (h:) - HTML-компоненты;
- http://java.sun.com/jsf/core (f:) - ядро JSF (конвертеры, валидаторы, события);
- http://java.sun.com/jsp/jstl/core (c:) - JSTL (условия, циклы и т.д.);
- http://java.sun.com/jsf/facelets (ui:) - шаблонизация.
Рассмотрим типы тегов.
Теги для текстовых полей:
<h:inputText>- однострочное текстовое поле;<h:inputTextarea>- многострочное поле (textarea);<h:inputSecret>- поле для ввода пароля (скрытый ввод).
В теге <h:inputText> могут быть и атрибуты, к примеру, required="true" указывает, что поле обязательно к заполнению, а requiredMessage="..." это сообщение об ошибке, которое выводится, если поле не заполнено.
Пример:
<h:inputText value="#{user.login}" />
<h:inputSecret value="#{user.password}" />
<h:inputTextarea value="#{user.description}" />
<h:inputText value="#{user.email}" required="true"
requiredMessage="Пожалуйста, введите email" />
Теги для конвертации используются для преобразования типов:
<f:convertDateTime>- преобразование даты и времени;<f:convertNumber>- преобразование чисел (формат валюты, процентов и т.д.);<f:converter>- кастомный конвертер.
Пример:
<h:outputText value="#{now}">
<f:convertDateTime pattern="dd/MM/yyyy HH:mm" />
</h:outputText>
Тег <h:form> используется для создания HTML-формы, которая может взаимодействовать с JSF. Обеспечивает передачу данных на сервер, поддерживает AJAX-запросы через <f:ajax>, и обязателен для всех JSF-вводных компонентов.
Пример:
<h:form>
<h:inputText value="#{user.name}" />
<h:commandButton value="Отправить" action="#{user.save}" />
</h:form>
Событие – это действие, происходящее в приложении, например, нажатие кнопки, выбор элемента, изменение значения поля. В JSF есть несколько типов событий:
- ActionEvent – при нажатии на кнопку или ссылку;
- ValueChangeEvent – при изменении значения поля;
- PhaseEvent – на каждой фазе жизненного цикла запроса.
Класс-слушатель – это объект, который ожидает наступления события и реагирует на него. Можно реализовать интерфейсы: ActionListener, ValueChangeListener, PhaseListener.
Пример:
public class MyActionListener implements ActionListener {
public void processAction(ActionEvent event) {
System.out.println("Кнопка нажата!");
}
}
Так, JSF нужен для чистого разделения логики и представления, переиспользования UI-элементов, динамического обновления части страницы (благодаря поддержке AJAX), автоматической проверки и преобразования данных, упрощения создания сложных UI, и поддерживается многими IDE.