Статьи

JSF 2.2 Создание пользовательского компонента Hello World за 30 секунд

Давайте сразу перейдем к интересным вещам и скажем, что в JSF 2.0 авторы страниц сделали пользовательский компонент доступным, настроив его в библиотеке тегов Facelet ( *taglib.xml ). Более того, когда компонент отображается в JAR, необходима специальная запись в web.xml , указывающая на файл *taglib.xml . Начиная с JSF 2.2, эти файлы нам больше не нужны. Простой пользовательский компонент JSF 2.2 содержит один класс, и он может выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
@FacesComponent(value = "components.HelloWorldComponent", createTag = true)
public class HelloWorldComponent extends UIComponentBase {
 
 @Override
 public String getFamily() {
  return "hello.world.component";
 }
 
 @Override
 public void encodeBegin(FacesContext context) throws IOException {
  ResponseWriter writer = context.getResponseWriter();
  writer.write("Hello World!");
 }
}

Большая часть тяжелой работы выполняется аннотацией javax.faces.component.FacesComponent ( javax.faces.component.FacesComponent ). Все, что нам нужно сделать, это установить для элемента createTag значение true , и JSF должен создать для нас тег. Кроме того, мы можем легко использовать наши пользовательские компоненты, как показано в следующем коде:

01
02
03
04
05
06
07
08
09
10
11
12
13
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:t="http://xmlns.jcp.org/jsf/component">
 <h:head>
  <title></title>
 </h:head>
 <h:body>
  <t:helloWorldComponent/>
 </h:body>
</html>

Примечание. Обратите внимание, что пространство имен компонента по умолчанию: http://xmlns.jcp.org/jsf/component . Это верно для всех компонентов, которые не имеют явного пространства имен.

@FacesComponent список элементов, поддерживаемых JSF 2.2 @FacesComponent выглядит следующим образом:

  • createTag : это может быть установлено в true или false . Когда для него установлено значение true, JSF сгенерирует для нас тег (точнее, JSF создаст во время выполнения обработчик тега Facelet, расширяющий ComponentHandler ). Этот элемент может использоваться только в JSF 2.2.
  • tagName : Это позволяет нам указать имя тега. Когда для createTag задано значение true , JSF будет использовать это имя для сгенерированного тега. Этот элемент может использоваться только в JSF 2.2.
  • namespace : Это позволяет нам указать пространство имен тега. Когда для createTag задано значение true , JSF будет использовать это пространство имен для сгенерированного тега. Если пространство имен не указано, JSF будет использовать http://xmlns.jcp.org/jsf/ пространство имен компонента. Этот элемент может использоваться только в JSF 2.2.
  • value : этот элемент взят из JSF 2.0 и указывает тип компонента. Тип компонента может использоваться в качестве аргумента метода Application.createComponent(java.lang.String) для создания экземпляров класса Component . Начиная с JSF 2.2, если элемент value отсутствует или имеет значение null , JSF получит его, вызвав метод getSimpleName() класса, к которому присоединен @FacesComponent и @FacesComponent первый символ в нижний регистр.