# Facelets

Em computação, Facelets é um sistema de template Web de código aberto sob a licença Apache e a tecnologia de processador de visões padrão (também conhecido como a linguagem de declaração de visão) para o JavaServer Faces (JSF). A linguagem requer documentos XML de entrada válidos para funcionar. Facelets suporta todos os componentes de IU do JSF e se concentra totalmente na construção da árvore de componentes JSF, refletindo a visão para uma aplicação JSF. É baseado no padrão de projeto de Visão Composta. Isto significa que seções de uma página ou mesmo as próprias páginas podem ser reutilizadas por outras páginas.
Um Facelet pode ser definido como uma seção reutilizável de conteúdo ou uma sub-árvore de componentes em uma página JSF que pode ser por si mesma composta de outros Facelets. Neste sentido, um Facelet é um elemento de uma visão composta que pode ser facilmente combinado com outros Facelets para construir uma visão JSF que será apresentada ao usuário.
Apesar das tecnologias JSF e JSP terem sido melhorados para funcionarem melhor em conjunto, Facelets elimina os problemas observados no artigo de Hans Bergsten "Melhorando o JSF retirando o JSP".
O Facelets baseia-se em algumas das idéias do Apache Tapestry, e é semelhante o suficiente para fazer uma comparação. O projeto é conceitualmente similar ao Tapestry, que trata blocos de elementos HTML como componentes do framework apoiados por classes Java. Facelets também tem algumas semelhanças com o framework Apache Tiles no que diz respeito a suportar templates, bem como composição.
Facelets foi originalmente criado por Jacob Hookom em 2005 como uma linguagem de declaração de visão alternativa separada para o JSF 1.1 e JSF 1.2, as quais utilizavam o JSP como a linguagem de declaração de visão padrão. A partir do JSF 2.0, Facelets foi promovido pelo grupo de peritos JSF para ser a linguagem de declaração de visão padrão. JSP se tornou obsoleta como um legado que caiu em desuso.

## Conversão de elemento

Em Facelets, tags de templates de uma biblioteca de tags podem ser inseridos em duas formas: diretamente como um elemento xml qualificado ou indiretamente, através do atributo jsfc em um elemento arbitrário não qualificado. Neste último caso, o compilador Facelet ignorará o elemento real e processará o elemento como se ele fosse fornecido pelo atributo jsfc.
O exemplo a seguir mostra o uso direto de tags qualificadas:
Usando o atributo jsfc, o mesmo código também pode ser expressado como o exemplo fornecido abaixo:
O código acima pode ser visualizado em um navegador, e editado com as ferramentas de projeto WYSIWYG convencionais. Isso não é possível quando usa-se diretamente as tags qualificados. No entanto, usar diretamente as tags qualificados é a forma mais popular de usar Facelets na prática e é o estilo mais usado em livros e exemplos.

## Modelos (templating)

Facelets oferece facilidades para a modelagem (templating). Um arquivo Facelets pode referenciar um modelo (ou template) mestre e fornecer conteúdo para os espaços reservados que este modelo mestre define. O arquivo que faz referência a um tal modelo é chamado de cliente de modelo (template client). Os próprios clientes de modelo, podem novamente ser utilizados como um modelo para outros clientes de modelo e, desta forma, uma hierarquia de modelos pode ser criada.
A seguir é mostrado um exemplo de um modelo mestre simples:
templates / master_template.xhtml
O código acima contém um 'frame' HTML padrão e um único espaço reservado chamado body_content. Um cliente de modelo pode usar este modelo como se segue:
template_client.xhtml
O código acima faz uso do modelo /templates/master_template.xhtml e fornece conteúdo para o espaço reservado nesse modelo. O resultado final será uma página chamada template_client.xhtml, que tem o conteúdo de /templates/master_template.xhtml mas com <ui:insert name="body_content"/> substituído por 'Esta é uma página de cliente de modelo que usa o modelo mestre.'.

## Componentes compostos

Além de incluir o conteúdo diretamente, Facelets fornece o mecanismo de componente composto que torna o conteúdo disponível como um componente de primeira classe JSF. Componentes compostos não precisam ser declarados em um arquivo Taglib, mas têm que ser colocados em um diretório especial. Por convenção, o conteúdo é, então, atribuído automaticamente um espaço de nomes e um nome de tag. O espaço de nomes é construído da cadeia fixa 'http://java.sun.com/jsf/composite/' concatenada com o nome do diretório no qual o arquivo de conteúdo reside relativo ao diretório 'resources'. O nome da tag torna-se o nome do arquivo sem o sufixo .xhtml.
O seguinte mostra um exemplo disso:
resources/my/spacer.xhtml
O Facelet acima está automaticamente disponível como um componente no espaço de nomes 'http://java.sun.com/jsf/composite/my' e o nome da tag 'spacer'.