JSF - Componentes Compostos

O JSF fornece aos desenvolvedores um recurso poderoso para definir seus próprios componentes personalizados, que podem ser usados ​​para renderizar conteúdos personalizados.

Definir componente personalizado

Definir um componente personalizado no JSF é um processo de duas etapas.

Degrau Descrição
1a

Crie uma pasta de recursos.

Crie um arquivo xhtml na pasta de recursos com um namespace composto.

1b

Use as tags compostas composto: interface, composto: atributo e composto: implementação, para definir o conteúdo do componente composto. Use cc.attrs em composite: deployment para obter a variável definida usando composite: attribute em composite: interface .

Etapa 1a: Crie um componente personalizado: loginComponent.xhtml

Crie uma pasta tutorialspoint na pasta de recursos e crie um arquivo loginComponent.xhtml nela.

Use namespace composto no cabeçalho html.

<html xmlns = "http://www.w3.org/1999/xhtml"   
   xmlns:h = "http://java.sun.com/jsf/html"
   xmlns:f = "http://java.sun.com/jsf/core"
   xmlns:composite = "http://java.sun.com/jsf/composite">
...
</html>

Etapa 1b: Use Tags compostas: loginComponent.xhtml

A tabela a seguir descreve o uso de tags compostas.

S.Não Tag e descrição
1

composite:interface

Declara valores configuráveis ​​a serem usados ​​em composto: implementação.

2

composite:attribute

Os valores de configuração são declarados usando esta tag.

3

composite:implementation

Declara o componente JSF. Pode acessar os valores configuráveis ​​definidos em composite: interface usando a expressão # {cc.attrs.attribute-name}.

<composite:interface>
   <composite:attribute name = "usernameLabel" />
   <composite:attribute name = "usernameValue" />
</composite:interface>

<composite:implementation>
<h:form>
   #{cc.attrs.usernameLabel} : 
   <h:inputText id = "username" value = "#{cc.attrs.usernameValue}" />
</h:form>

Usar componente personalizado

Usar um componente personalizado no JSF é um processo simples.

Degrau Descrição
2a Crie um arquivo xhtml e use o namespace do componente personalizado. O namespace será o http://java.sun.com/jsf/ <folder-name> onde folder-name é a pasta no diretório de recursos que contém o componente personalizado
2b Use o componente personalizado como tags JSF normais

Etapa 2a: use o namespace personalizado: home.xhtml

<html xmlns = "http://www.w3.org/1999/xhtml"   
   xmlns:h = "http://java.sun.com/jsf/html"
   xmlns:ui = "http://java.sun.com/jsf/facelets">
   xmlns:tp = "http://java.sun.com/jsf/composite/tutorialspoint">

Etapa 2b: usar tag personalizada: home.xhtml e passar valores

<h:form>
   <tp:loginComponent 
      usernameLabel = "Enter User Name: " 
      usernameValue = "#{userData.name}" />
</h:form>

Aplicação de exemplo

Vamos criar um aplicativo JSF de teste para testar o componente personalizado no JSF.

Degrau Descrição
1 Crie um projeto com o nome helloworld sob um pacote com.tutorialspoint.test conforme explicado no capítulo JSF - Primeira Aplicação .
2 Crie a pasta de recursos em src → pasta principal .
3 Crie a pasta tutorialspoint em src → principal → pasta de recursos .
4 Crie o arquivo loginComponent.xhtml na pasta src → principal → recursos → tutorialspoint .
5 Modifique o arquivo UserData.java conforme explicado abaixo.
6 Modifique home.xhtml conforme explicado abaixo. Mantenha o resto dos arquivos inalterados.
7 Compile e execute o aplicativo para garantir que a lógica de negócios esteja funcionando de acordo com os requisitos.
8 Por fim, construa o aplicativo na forma de um arquivo war e implante-o no Apache Tomcat Webserver.
9 Inicie seu aplicativo da web usando o URL apropriado, conforme explicado a seguir na última etapa.

loginComponent.xhtml

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns = "http://www.w3.org/1999/xhtml"   
   xmlns:h = "http://java.sun.com/jsf/html"
   xmlns:f = "http://java.sun.com/jsf/core"
   xmlns:composite = "http://java.sun.com/jsf/composite">
   
   <composite:interface>
      <composite:attribute name = "usernameLabel" />
      <composite:attribute name = "usernameValue" />
      <composite:attribute name = "passwordLabel" />
      <composite:attribute name = "passwordValue" />
      <composite:attribute name = "loginButtonLabel" />
      <composite:attribute name = "loginButtonAction" 
         method-signature = "java.lang.String login()" />
   </composite:interface>
   
   <composite:implementation>
      <h:form>
         <h:message for = "loginPanel" style = "color:red;" />
         
         <h:panelGrid columns = "2" id = "loginPanel">
            #{cc.attrs.usernameLabel} : 
            <h:inputText id = "username" value = "#{cc.attrs.usernameValue}" />
            #{cc.attrs.passwordLabel} : 
            <h:inputSecret id = "password" value = "#{cc.attrs.passwordValue}" />
         </h:panelGrid>
         
         <h:commandButton action = "#{cc.attrs.loginButtonAction}" 
            value = "#{cc.attrs.loginButtonLabel}"/>
      </h:form>
   </composite:implementation>
</html>

UserData.java

package com.tutorialspoint.test;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean(name = "userData", eager = true)
@SessionScoped
public class UserData implements Serializable {
   private static final long serialVersionUID = 1L;
   private String name;
   private String password;
   
   public String getName() {
      return name;
   }
   
   public void setName(String name) {
      this.name = name;
   }
   
   public String getPassword() {
      return password;
   }
   
   public void setPassword(String password) {
      this.password = password;
   }	
   
   public String login() {
      return "result";
   }	
}

home.xhtml

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns = "http://www.w3.org/1999/xhtml"   
   xmlns:h = "http://java.sun.com/jsf/html"
   xmlns:f = "http://java.sun.com/jsf/core"
   xmlns:tp = "http://java.sun.com/jsf/composite/tutorialspoint">
   
   <h:head>
      <title>JSF tutorial</title>		     
   </h:head>
   
   <h:body> 
      <h2>Custom Component Example</h2>
      
      <h:form>
      <tp:loginComponent 
         usernameLabel = "Enter User Name: " 
         usernameValue = "#{userData.name}" 
         passwordLabel = "Enter Password: " 
         passwordValue = "#{userData.password}"
         loginButtonLabel = "Login" 
         loginButtonAction = "#{userData.login}" />
      </h:form>
   </h:body>
</html>

Assim que você estiver pronto com todas as mudanças feitas, vamos compilar e rodar a aplicação como fizemos no capítulo JSF - Primeira Aplicação. Se tudo estiver bem com sua aplicação, isso produzirá o seguinte resultado.