Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Модель компонентов пользовательского интерфейса

Помимо описания жизненного цикла обзор архитектуры JavaServer Faces обеспечивает лучшее понимание технологии.

Компоненты JavaServer Faces являются строительными блоками представления JavaServer Faces. Компонент может быть компонентом пользовательского интерфейса (UI) или компонентом не-UI.

Компоненты пользовательского интерфейса JavaServer Faces — это настраиваемые, повторно используемые элементы, которые составляют пользовательские интерфейсы приложений JavaServer Faces. Компонент может быть простым, например кнопка, или составным, например таблица, состоящая из нескольких компонентов.

JavaServer Faces предоставляет богатую, гибкую компонентную архитектуру, которая включает в себя следующее:

  • Набор классов javax.faces.component.UIComponent для указания состояния и поведения компонентов пользовательского интерфейса

  • Модель отрисовки, которая определяет различные способы отрисовки компонента.

  • Модель конвертации, которая определяет, как регистрировать конвертеры данных в компоненте.

  • Модель события и слушателя, которая определяет, как обрабатывать события компонента

  • Модель валидации, которая определяет, как регистрировать валидаторы в компоненте

В этом разделе кратко описывается каждый из этих архитектурных компонентов.

Классы компонентов пользовательского интерфейса

JavaServer Faces предоставляет набор классов компонентов пользовательского интерфейса и связанных поведенческих интерфейсов, которые задают все функциональные возможности компонента пользовательского интерфейса, такие как сохранение состояния компонента, поддержку ссылки на объекты, управление обработкой событий и отрисовкой для набора стандартных компонентов.

Классы компонентов полностью расширяемы, что позволяет разработчику создавать свои собственные кастомные компоненты. См. главу 15 «Создание кастомных компонентов пользовательского интерфейса и других кастомных объектов» для получения дополнительной информации.

Абстрактный базовый класс для всех компонентов — javax.faces.component.UIComponent. Классы компонентов пользовательского интерфейса JavaServer Faces расширяют класс UIComponentBase(дочерний класс UIComponent), который определяет состояние и поведение компонента по умолчанию. Следующий набор классов компонентов включён в JavaServer Faces.

  • UIColumn: представляет один столбец данных в компоненте UIData.

  • UICommand: представляет элемент управления, который запускает действия при активации.

  • UIData: представляет привязку к коллекции данных, представленной объектом javax.faces.model.DataModel.

  • UIForm: представляет форму ввода для отображения пользователю. Его дочерние компоненты представляют (среди прочего) поля ввода, которые должны быть включены при отправке формы. Этот компонент аналогичен тегу form в HTML.

  • UIGraphic: отображает изображение.

  • UIInput: принимает данные от пользователя. Этот класс является дочерним классом UIOutput.

  • UIMessage: отображает локализованное сообщение об ошибке.

  • UIMessages: отображает набор локализованных сообщений об ошибках.

  • UIOutcomeTarget: отображает ссылку в виде ссылки или кнопки.

  • UIOutput: отображает вывод данных на странице.

  • UIPanel: управляет макетом его дочерних компонентов.

  • UIParameter: представляет параметры замещения.

  • UISelectBoolean: позволяет пользователю установить значение boolean для элемента управления выбором или отменой выбора. Этот класс является дочерним классом UIInput.

  • UISelectItem: представляет отдельный элемент выбора в списке элементов.

  • UISelectItems: представляет весь список элементов выбора.

  • UISelectMany: позволяет пользователю множественный выбора из группы элементов. Этот класс является дочерним классом UIInput.

  • UISelectOne: позволяет пользователю выбрать один элемент из группы элементов. Этот класс является дочерним классом UIInput.

  • UIViewParameter: представляет параметры в запросе. Этот класс является дочерним классом UIInput.

  • UIViewRoot: представляет корень дерева компонентов.

В дополнение к расширению UIComponentBase классы компонентов также реализуют один или несколько поведенческих интерфейсов, каждый из которых задаёт определённое поведение для набора компонентов, чьи классы реализуют интерфейс.

Эти поведенческие интерфейсы, определённые в пакете javax.faces.component, если не указано иное, являются следующими.

  • ActionSource: указывает, что компонент может инициировать событие действия. Этот интерфейс предназначен для использования с компонентами на основе JavaServer Faces 1.1_01 и более ранних версий. Этот интерфейс считается устаревшим в JavaServer Faces 2.

  • ActionSource2: расширяет ActionSource и, следовательно, предоставляет те же функциональные возможности. Однако он позволяет компонентам использовать язык выражений (EL), когда те ссылаются на методы, которые обрабатывают события действия.

  • EditableValueHolder: расширяет ValueHolder и задаёт дополнительные функции для редактируемых компонентов, такие как валидация и отправка событий изменения значения.

  • NamingContainer: требует, чтобы каждый расширяющий его компонент имел уникальный идентификатор.

  • StateHolder: обозначает, что компонент имеет состояние, которое должно быть сохранено между запросами.

  • ValueHolder: указывает, что компонент поддерживает локальное значение, а также возможность доступа к данным слоя модели.

  • javax.faces.event.SystemEventListenerHolder: поддерживает список объектов javax.faces.event.SystemEventListener для каждого типа javax.faces.event.SystemEvent, определённого этим классом.

  • javax.faces.component.behavior.ClientBehaviorHolder: добавляет возможность вложения объектов javax.faces.component.behavior.ClientBehavior, таких как повторно используемый скрипт.

UICommand реализует ActionSource2 и StateHolder. UIOutput и классы компонентов, которые расширяют UIOutput, реализуют StateHolder и ValueHolder. UIInput и классы компонентов, которые расширяют UIInput, реализуют EditableValueHolder, StateHolder и ValueHolder. UIComponentBase реализует StateHolder.

Только составители компонентов должны будут напрямую использовать классы компонентов и поведенческие интерфейсы. Авторы страниц и разработчики приложений будут использовать стандартный компонент, включая тег, который представляет его на странице. Большинство компонентов могут отображаться на странице различными способами. Например, компонент UICommand может быть отображен как кнопка или ссылка.

В следующем разделе объясняется, как работает модель отрисовки и как разработчики могут выбирать компоненты для отрисовки, применяя соответствующие теги.

Модель отрисовки компонентов

Компонентная архитектура JavaServer Faces спроектирована таким образом, что функциональность компонентов определяется классами компонентов, тогда как их отрисовка может быть определена отдельным классом. Эта конструкция имеет следующие преимущества.

  • Компоненты записи могут определять поведение компонента один раз, но создавать несколько отрисовщиков, каждый из которых определяет свой способ отрисовки компонента одному и тому же клиенту или разным клиентам.

  • Разработчики могут изменить внешний вид компонента на странице, выбрав тег, который представляет соответствующую комбинацию компонента и отрисовщика.

Инструмент отрисовки устанавливает соответствие классов компонентов и тегов компонентов, которые подходят для конкретного клиента. JavaServer Faces включает стандартный комплект отрисовки HTML для клиентов HTML.

Инструмент отрисовки определяет набор классов javax.faces.render.Renderer для каждого компонента, который он поддерживает. Каждый класс Renderer определяет свой способ отрисовки конкретного компонента в вывод, определённый инструментом отрисовки. Например, компонент UISelectOnen имеет три разных отрисовщика. Один из них отображает компонент как группу параметров. Другой отрисовывает компонент как поле с выпадающим списком. Третий отрисовывает компонент в виде списка. Аналогично, компонент UICommand может быть отображен как кнопка или ссылка, используя тег h:commandButton или h:commandLink. Часть command каждого тега соответствует классу UICommand, определяющему функциональность, которая должна выполняться в ответ на действие. Часть Button или Link каждого тега соответствует отдельному классу Renderer, который определяет, как компонент отображается на странице.

Каждый кастомный тег, определённый в стандартном инструменте отрисовки HTML, состоит из функциональных возможностей компонента (определённых в классе UIComponent) и атрибутов отрисовки (определённых в классе Renderer).

В разделе Добавление компонентов на страницу с использованием библиотеки тегов HTML перечислены все поддерживаемые теги компонентов и показано, как использовать их в примере.

JavaServer Faces предоставляет пользовательскую библиотеку тегов для отображения компонентов в HTML.

Модель конвертации

Приложение JavaServer Faces может при желании связать компонент с данными серверного объекта. Этот объект является компонентом JavaBeans, например Managed-бином. Приложение получает и устанавливает данные объекта для компонента, вызывая соответствующие свойства объекта для этого компонента.

Когда компонент связан с объектом, приложение имеет два представления данных компонента.

  • Представление модели, в котором данные представлены в виде типов данных, таких как int или long.

  • Представление даёт возможность пользователю считывать и изменять модель. Например, java.util.Date может быть представлен в виде текстовой строки в формате mm/dd/yy или в виде набора из трёх текстовых строк.

JavaServer Faces автоматически преобразует данные компонента между этими двумя представлениями, когда свойство компонента, связанное с компонентом, относится к одному из типов, поддерживаемых данными компонента. Например, если компонент UISelectBoolean связан со свойством бина типа java.lang.Boolean, JavaServer Faces автоматически преобразует данные компонента из String в Boolean. Кроме того, некоторые данные компонента должны быть привязаны к свойствам определённого типа. Например, компонент UISelectBoolean должен быть связан со свойством типа boolean или java.lang.Boolean.

Иногда вам может потребоваться конвертировать данные компонента в тип, отличный от стандартного, или изменить формат данных. Для облегчения этой задачи JavaServer Faces позволяет зарегистрировать реализацию javax.faces.convert.Converter в компонентах UIOutput и его дочерних классах. Если вы зарегистрируете реализацию Converter в компоненте, эта реализация Converter будет конвертировать данные компонента между двумя представлениями.

Вы можете использовать стандартные конвертеры, поставляемые с JavaServer Faces, или создать свой кастомный конвертер. Создание кастомного конвертера описано в главе 15 «Создание кастомных компонентов пользовательского интерфейса и других кастомных объектов».

Модель событий и слушателей

Модель событий и слушателей JavaServer Faces похожа на модель событий JavaBeans тем, что она имеет строго типизированные классы событий и интерфейсы слушателей, которые приложение может использовать для обработки событий, генерируемых компонентами.

Спецификация JavaServer Faces определяет три типа событий: события приложения, системные события и события модели данных.

События приложения связаны с конкретным приложением и генерируются UIComponent. Они представляют стандартные события, доступные в предыдущих версиях JavaServer Faces.

Объект события идентифицирует компонент, сгенерировавший событие, и хранит информацию о событии. Чтобы получить уведомление о событии, приложение должно предоставить реализацию класса слушателя и зарегистрировать его в компоненте, который генерирует событие. Когда пользователь активирует компонент, например кликом кнопки, происходит событие. Это заставляет JavaServer Faces вызывать метод слушателя, который обрабатывает событие.

JavaServer Faces поддерживает два вида событий приложения: события действия и события изменения значения.

Событие действия (класс javax.faces.event.ActionEvent) происходит, когда пользователь активирует компонент, который реализует ActionSource. Это кнопки и ссылки.

Событие изменения значения (класс javax.faces.event.ValueChangeEvent) происходит, когда пользователь изменяет значение компонента, представленного UIInput или одним из его дочерних классов. Например, выбор независимого переключателя (check box) является действием, которое приводит к изменению значения компонента на true. Типы компонентов, которые могут генерировать события этих типов, — это компоненты UIInput, UISelectOne, UISelectMany и UISelectBoolean. События изменения значения запускаются только в том случае, если не было обнаружено ошибок валидации.

В зависимости от значения свойства immediate (см. Атрибут immediate) компонента, генерирующего событие, события действия могут быть обработаны в фазе вызова приложения или применения значений параметров запроса. События изменения значения могут быть обработаны в фазе валидации процесса или применения значений параметров запроса.

Системные события генерируются Object-ом, а не UIComponent-ом. Они генерируются во время выполнения приложения в заранее определённое время. Они применимы ко всему приложению, а не к конкретному компоненту.

Событие модели данных происходит, когда выбирается новая строка компонента UIData.

Есть два способа заставить ваше приложение реагировать на события действия или события изменения значения, которые генерируются стандартным компонентом:

  • Реализуйте класс слушателя события для обработки события и зарегистрируйте слушателя в компоненте, вложив тег f:valueChangeListener или тег f:actionListener в тег компонента.

  • Реализуйте метод Managed-бина для обработки события и обратитесь к методу с выражением метода из соответствующего атрибута тега компонента.

Смотрите Реализация слушателя событий для получения информации о том, как реализовать слушатель событий. Смотрите Регистрация слушателей в компонентах для получения информации о том, как зарегистрировать слушателя в компоненте.

Смотрите Пишем метод-обработчик действия и Пишем метод-обработчик изменения значения для получения информации о том, как реализовать методы Managed-бина, которые обрабатывают эти события.

Смотрите Ссылка на метод Managed-бина для получения информации о том, как ссылаться на метод Managed-бина из тега компонента.

При генерации событий кастомными компонентами необходимо реализовать соответствующий класс событий и вручную поставить событие в очередь в дополнение к реализации класса слушателя событий или метода Managed-бина, который обрабатывает событие. Обработка событий для кастомных компонентов объясняет, как это сделать.

Модель валидации

JavaServer Faces поддерживает механизм валидации локальных данных редактируемых компонентов (таких как текстовые поля). Эта валидация происходит перед обновлением соответствующих данных модели в соответствии с локальным значением.

Как и модель конвертации, модель валидации определяет набор стандартных классов для выполнения общих проверок данных. Базовая библиотека тегов JavaServer Faces также определяет набор тегов, которые соответствуют стандартным реализациям javax.faces.validator.Validator. Смотрите Использование стандартных валидаторов для получения списка всех стандартных классов валидации и соответствующих тегов.

Большинство тегов имеют набор атрибутов для настройки свойств валидатора, таких как минимальные и максимальные допустимые значения для данных компонента. Автор страницы регистрирует валидатор в компоненте, вкладывая тег валидатора в тег компонента.

В дополнение к валидаторам, которые зарегистрированы в компоненте, вы можете объявить валидатор по умолчанию, который зарегистрирован во всех компонентах UIInput в приложении. Для получения дополнительной информации о валидаторах по умолчанию см. Использование валидаторов по умолчанию.

Модель валидации также позволяет вам создать свой кастомный валидатор и соответствующий тег для выполнения кастомной валидации. Модель валидации предоставляет два способа реализации кастомной валидации.

  • Реализуйте интерфейс Validator, который выполняет валидацию.

  • Реализуйте метод Managed-бина, который выполняет валидацию.

Если вы реализуете интерфейс Validator, вы также должны сделать следующее.

  • Зарегистрируйте реализацию Validator в приложении.

  • Создайте кастомный тег или используйте тег f:validator для регистрации средства валидации в компоненте.

В ранее описанной стандартной модели валидации валидатор определяется для каждого компонента ввода на странице. Модель Bean Validation позволяет применять валидатор ко всем полям на странице. См. главу 23 «Введение в валидацию бинов и главу 24 «Валидация бинов: дополнительные темы» для получения дополнительной информации о валидации бинов.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)