Tags JSTL em Facelets funcionam?

Java EE, Java Server Faces 3 Comments »

Bom, já vi esta pergunta diversas vezes, e por diversos momentos eu também fiz a pergunta: porque o c:if não funciona corretamente, porque o c:forEach não executou minha lista?

Existe uma justificativa lógica para tal, que encontrei estes dias na seção de Faqs no WIKI do Facelets. Como eu já suspeitava tinha tudo a ver com o ciclo de execução das tags. Todas as tags JSTL em Facelets são rederizadas durante a restauração da view, ou seja, antes do processamento de ações, eventos e etc.

Este comportamento pode ser notado em tags do pacote core JSF, com exceção a tag f:verbatim. As tags facelets também são renderizadas durante a restauração da view, com exceção da ui:repeat.

Solução? Para substituir c:forEach use ui:repeat e para c:if crie um h:panelGroup controlando a visualização com o atributo rendered.

Jboss Seam - Getting started: Validação de formulário

Java, Java Server Faces, Jboss Seam No Comments »

O Jboss Seam tem um suporte bem útil para validação de formulários. Ele pode ser integrado com o Hibernate Validator. Esta integração trás vantagens e desvantagens. A vantagem é que simplifica o desenvolvimento, através de anotações nas entidades é possível que os valores da entidade sejam validados. Por outro lado a aplicação fica dependente do Hibernate Validator para validar os dados. Em casos de validação simples, atende perfeitamente, mas para casos complexos é necessário a validação em lógica de negócio, e a nível de design da aplicação não sei até onde usar o Hibernate Validator é vantajoso.

Para a utilização da validação das entidades dentro da página basta colocar a tag:


<s:validateAll>
<!-- Todo os os componentes JSF inseridos aqui
dentro serão validados -->
</s:validateAll>

Outro recurso é o suporte a templates do Facelets que facilitam a padronização de: Rótulos, Componente de Entrada (Caixa de Texto, Caixa de seleção, Botões, etc) e as mensagens relacionadas ao componente. A seguir segue um exemplo de template:


<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:s="http://jboss.com/products/seam/taglib">

<div>

<s:label styleClass="#{invalid?'msgErro':''}">
<ui:insert name="label"/>
<s:span styleClass="required" rendered="#{required}">*</s:span>
</s:label>

<span class="#{invalid?'msgErro':''}">
<s:validateAll>
<ui:insert name="Input"/>
</s:validateAll>
<h:graphicImage src="<font size="-1">#{facesContext.externalContext.request.contextPath}/</font>imagens/erro.gif" rendered="#{invalid}"/>
</span>

<s:message styleClass="msgErro"/>

</div>

</ui:composition>

Desta forma, todo campo obrigatório (atributo required=true) terá o * na frente do nome do componente. Caso contenha algum erro de validação, que deixa o componente com estado inválido, será mostrado o estilo: msgErro.

Para utilizar o template é necessário utiliza a tag s:decorate. Teremos que criar duas definições para o template: label e Input. Diversos exemplos do Jboss Seam não definem um nome para a parte relacionada ao Input, gerando duplicação de identificador de componentes quando estamos utilizando o recurso de templates do Facelets. O código ficaria semelhante ao abaixo:


<s:decorate id="NomeDecorator" template="/WEB-INF/templates/InputTemplate.xhtml">
<ui:define name="label">Nome:</ui:define>
<ui:define name="Input">
<h:inputText id="nome" value="#{meuBean.nome}" required="true">
<a:support event="onblur" reRender="NomeDecorator"/>
</h:inputText>
</ui:define>
</s:decorate>

Acima assumi que o template foi salvo com o nome InputTemplate.xhtml dentro do diretório templates dentro de web-inf. É importante salvar os templates dentro da pasta WEB-INF para proteger o acesso do usuário ao template.

Infelizmente o s:decorate não tem distinção aos tipos de mensagens JSF (Informação, Alerta, Erro, Fatal) das quais poderíamos colocar as mensagens de forma mais intuitiva para cada tipo de problema.

WP Theme & Icons by N.Design Studio
Assine Assine os comentarios