Home Templates e Tags com Facelets - Jakarta EE
Post
Cancelar

Templates e Tags com Facelets - Jakarta EE

Baseado nos cursos da Softblue

Facelets

• Facelets é a tecnologia de visualização padrão a partir do JSF 2.x

– Substituiu o JSP, utilizado em versões anteriores do JSF

• Um dos principais usos do facelets é a criação de templates de páginas de uma aplicação JSF

Templates

• Aplicações web são normalmente compostas por várias páginas, que compartilham um modelo comum (template)

• Com facelets, é possível criar estes templates

Criando um Template

• O primeiro passo é criar uma página que vai representar o template

layout.xhtml

1
2
3
4
5
6
7
8
9
10
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"><!-- Referencia as tags do facelets -->
<body>
  <table border="1" width="30%">
    <tr><td align="center">
      <h1><ui:insert name="titulo" /></h1></td>
    </tr>
    <tr><td><ui:insert name="texto" /></td></tr><!-- Conteúdo que será substituído -->
  </table>
</body>
</html>

Criando uma Página

• Páginas que usam um template devem definir o conteúdo a ser substituído

page.xhtml

1
2
3
4
5
6
7
8
9
10
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<body>
  <ui:composition template="/layout.xhtml">
    <ui:define name="titulo">Título da Página</ui:define>
    <ui:define name="texto"><!-- Define a subsituição a ser feita nas tags ui:insert do template -->
      Este é um texto que será utilizado na página
    </ui:define>
  </ui:composition>
</body>
</html>

• Quando uma tag ui:composition que referencia um template é encontrada na página, o facelets remove todas as tags externas ao ui:composition

1
2
3
4
5
6
7
8
<ui:composition template="/layout.xhtml">
  <ui:define name="titulo">
    Título da Página
  </ui:define>
  <ui:define name="texto">
    Este é um texto que será utilizado na página
  </ui:define>
</ui:composition>

Incluindo páginas

• Uma página JSF pode incluir outras páginas através da tag ui:include

1
2
3
4
5
<body>
  <h1>
    <ui:include src="/titulo.xhtml" /><!-- Inclui o conteúdo da página titulo.xhtml neste local -->
  </h1>
</body>

titulo.xhtml

1
2
3
4
5
6
7
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<body><!-- Neste caso, não é fornecido um template -->
  <ui:composition><!-- Apenas o que está dentro da tag ui:composition é incluído -->
    Título da Página
  </ui:composition>
</body>
</html>

Decorators

• Decorators são utilizados para aplicar um padrão sobre determinado conteúdo

1
2
3
4
5
6
<body>
  <ui:decorate template="/decorator.xhtml"><!-- Define um template usado para decorar o conteúdo da página -->
    <h:commandButton value="Processar"
      action="#{bean.processar}" />
  </ui:decorate>
</body>

decorator.xhtml

1
2
3
4
5
6
7
8
9
<body>
  <ui:composition>
    <table>
      <tr>
        <td bgcolor="#ACACAC"><ui:insert /></td><!-- Insere o conteúdo a ser decorado -->
      </tr>
    </table>
  </ui:composition>
</body>

Parâmetros para Templates

• Templates podem receber parâmetros das páginas que os incluem

– Isto vale para as tags ui:composition e ui:decorate

1
2
3
4
5
<ui:decorate template="/decorator.xhtml">
  <ui:param name="color" value="#CCCCCC" /><!-- O parâmetro color é passado para o template -->
  <h:commandButton value="Processar" 
    action="#{bean.processar}" />
</ui:decorate>

decorator.xhtml

1
2
3
4
5
6
7
8
9
<h:body>
  <ui:composition>
    <table>
      <tr>
        <td bgcolor="#{color}"><ui:insert /></td><!-- Expressão EL para leitura do parâmetro -->
      </tr>
    </table>
  </ui:composition>
</h:body>

Tags Customizadas com Facelets

• O facelets permite a criação de tags customizadas

• Ao utilizar uma tag desse tipo, o conteúdo da página é substituído por outro

• A tag é definida em um arquivo .xhtml

Criando o Arquivo da Tag

/WEB-INF/tags/foto.xhtml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://xmlns.jcp.org/jsf/core"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<body>
  <ui:composition>
    <center>
      <h:graphicImage library="images" name="#{imagem}" />
      <br />
      <h3>#{legenda}</h3>
    </center>
  </ui:composition>
</body>
</html>

Arquivo de Definição da Tag

• Para que as suas tags sejam reconhecidas pelo JSF, é necessário criar um arquivo de definição de tags

• Este arquivo normalmente fica em /WEB-INF

• Define um namespace para as tags, bem como nome e local de cada tag criada

mytags.taglib.xml

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
  <namespace>http://mytags/facelets</namespace>
  <tag>
    <tag-name>foto</tag-name>
    <source>tags/foto.xhtml</source>
  </tag>
</facelet-taglib>

Configuração no web.xml

• O JSF precisa saber a respeito do arquivo de definição de tags, caso contrário não saberá que ele existe

• A configuração é feita no arquivo web.xml

1
2
3
4
<context-param>
  <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
  <param-value>/WEB-INF/mytags.taglib.xml</param-value>
</context-param>

Para múltiplos arquivos, a separação é feita com “;”

Utilizando Tags Customizadas

1
2
<html xmlns:my="http://mytags/facelets"><!-- Referencia a tag pelo namespace e usa o prefixo my -->
  <my:foto imagem="duke.png" legenda="Duke, o mascote do Java"/><!-- Passa os parâmetros necessários -->
Esta postagem está licenciada sob CC BY 4.0 pelo autor.