Templates são layouts de páginas que podem ser reaproveitadas, podemos criar uma página padrão (template) para o sistema e depois apenas alterar as áreas dessa página que for necessária, por exemplo: podemos criar um template com um cabeçalho, menu e conteúdo (como imagem a seguir) e podemos definir que estas três áreas podem ser alteradas por qualquer outra página que siga este template.
Na versão 2.0 do JSF foi incorporado o projeto Facelets que possui tags para criação de templates, para utilizá-lo basta importar a biblioteca de tags http://java.sun.com/jsf/facelets, exemplo:
Normalmente a tag do facelets ganha um alias (apelido) chamado ui, para através dele usar as tags desta biblioteca. O facelets possui as seguintes bibliotecas: component, composition, debug, decorate, define, fragment, include, insert, param, remove e repeat.
ui:insert
Para delimitar uma área do template que pode ser alterada pelas páginas que utilizarem este template iremos utilizar a tag insert, exemplo:
Neste exemplo criamos uma página com três áreas que podem ser alteradas, para cada área que definimos com a tag insert precisamos definir também um nome para que possamos informar na página que irá usar este template qual a parte da página deve ser alterada.
ui:composition
Quando criamos uma página que irá seguir um template precisamos especificar qual será o arquivo que possui o template, para isto iremos utilizar a tag composition, exemplo:
Quando utilizamos um template não há necessidade de especificar novamente as tags h:head, h:body ou qualquer outra tag que já tem no template, pois está página agora terá as mesmas tags para montar seu layout.
ui:define
Dentro da página que segue o template podemos alterar qualquer área especificada pelas tags insert, para isto iremos utilizar a tag define e informar qual o nome da tag insert deve ser alterado, exemplo:
Exemplo:
Vamos criar uma aplicação simples que possui uma tela principal, esta tela será composta por um cabeçalho com o título da página, um menu com a opção de cadastrar usuários e uma área de conteúdo:
E também vamos criar uma página que possui o cadastro de usuário e um menu para voltar para a página inicial:
Crie uma aplicação web chamada TemplateWeb e utilize o framework JavaServer Faces 2.0.
Na página index.xhtml vamos criar o template (modelo) que será seguido depois pela página usuario.xhtml:
Note que importamos a biblioteca do facelets e definimos as áreas que podem ser alteradas.
Agora vamos criar a página que seguirá o template e terá o cadastro de usuário, para isto primeiro vamos criar uma classe para representar o Usuário:
E também vamos criar uma classe que será o ManagedBean que controlara as ações da página de cadastro do usuário.
Agora vamos criar a página de cadastro chamada usuario.xhtml:
Note que alteramos o conteúdo das áreas menu e conteudo através da tag define.
Para se divertir um pouco:
Se for necessário alterar o titulo da página que aparece no navegador, de acordo com a página atual como seria? Altere esta aplicação e teste.
Qual a vantagem de ter usado o h:form no template?
Será que se os campos do formulário na página de cadastrado fossem obrigatórios (required=true) o link para a página inicial iria funcionar?