Skip to content
llins edited this page Oct 3, 2014 · 54 revisions

Table of Contents

Faces

O módulo Faces representa a camada de apresentação, com a definição de que a tecnologia JSF deverá ser utilizada.

Neste módulo são utilizadas as tecnologias:

Rewrite

Vemos no framework Rewrite um potencial e facilidades que consideramos essenciais para o desenvolvimento de qualquer aplicação web. Hoje em dia é muito comum o uso de urls amigáveis devido a série de vantagens e melhor usabilidade para o usuário.

Request Action
Para facilitar a utilização do framework, implementamos na classe Controller o método requestAction, que já possui as anotações necessárias para chamada quando uma view for iniciada. Além disso, possui as anotações para correta integração com os escopos do bean. Para utilizar o método basta sobrescrevê-lo e retorna nulo se quiser continuar na navegação, ou retornar a viewId para ir para outra página. Veja um exemplo de utilização desse método:


@Override
public String requestAction() {
	try{
		if("nova".equals(idPessoa)){
			pessoa = new Pessoa();
			return null;
		}
		
		Long id = Long.parseLong(idPessoa);
		pessoa = pessoaService.findBy(Pessoa.class, id);
		if(pessoa == null) throw new NumberFormatException();
		return null;
	}catch(NumberFormatException nfe){
		addMsgErro(messages.globalRegistroNaoEncontrado());
		return Navigate.to(ListarPessoasController.class).withoutRedirect().build();
	}
}

Não se esqueça de que os parâmetros injetados em seu bean também deve possuir a anotação @Deferred para que a injeção siga o escopo correto do bean. Exemplo:

@Parameter
@Deferred
private String idPessoa;


SecureHttpConfigurationProvider
Outro suporte que a arquitetura fornece é a classe SecureHttpConfigurationProvider que ajuda na configuração do Rewrite provendo uma melhor segurança para as aplicações.


Caso o usuário tente navegar para uma url que não está mapeada pelo Rewrite, o status 404 será retornado. Para que ainda seja possível o mapeamento de urls via anotação, nessa classe foi informado a prioridade 101, pois as anotações possuem prioridade 100.

Desta forma, caso o usuário tente navegar para uma url que não foi definida nem nas anotações e nem via provider, o status 404 será retornado.

Para utilizar a classe é necessário estendê-la. Confira:

@RewriteConfiguration
public class RewriteConfigurationProvider extends SecureHttpConfigurationProvider {

	@Override
	public ConfigurationBuilder getConfigurationBuilder(final ServletContext context) {
		return ConfigurationBuilder.begin()
				
				.addRule(Join.path("/").to("/view/home.xhtml"))
				.addRule(Join.path("/403").to("/view/403.xhtml").withInboundCorrection())
				.addRule(Join.path("/404").to("/view/404.xhtml").withInboundCorrection())
				.addRule(Join.path("/500").to("/view/500.xhtml").withInboundCorrection())
				
		;
	}

}

Assim, o usuário não poderá navegar para as páginas diretamente (http://localhost:8080/example/view/home.xhtml), apenas via url amigável.

Conversores

A arquitetura traz uma série de conversores que são comumente criados no desenvolvimento das aplicação, principalmente brasileiras. Praticamente todos os conversores criados são utilizados em componentes que a arquitetura provê, logo não precisariam ser utilizados diretamente, mas sim, via componente.

Entretanto, será demonstrado como utilizá-los independentemente, sem ser via componente.

Conversor de CNPJ
@FacesConverter("br.com.surittec.suricdi.faces.converter.CnpjConverter")
public class CnpjConverter implements Converter
Utilização
<f:converter converterId="br.com.surittec.suricdi.faces.converter.CnpjConverter"/>
Conversor de CPF
@FacesConverter("br.com.surittec.suricdi.faces.converter.CpfConverter")
public class CpfConverter implements Converter
Utilização
<f:converter converterId="br.com.surittec.suricdi.faces.converter.CpfConverter"/>
Conversor de Data
Utilize o componente, será bem mais fácil para utilizar todos os recursos!
@FacesConverter("br.com.surittec.suricdi.faces.converter.DateConverter")
public class DateConverter implements Converter
Utilização
<f:attribute name="DateConverter.PATTERN_ATTR" value="dd/MM/yyyy"/>
<f:converter converterId="br.com.surittec.suricdi.faces.converter.DateConverter"/>
Conversor de Strings vazias para null
Não há a necessidade de fazer nada!
@FacesConverter(forClass = String.class)
public class EmptyToNullConverter implements Converter
Conversor de Enumerações
@FacesConverter("br.com.surittec.suricdi.faces.converter.EnumConverter")
public class EnumConverter implements Converter
Utilização
<f:converter converterId="br.com.surittec.suricdi.faces.converter.EnumConverter"/>
Conversor de Numéricos
Utilize o componente, será bem mais fácil para utilizar todos os recursos!
@FacesConverter("br.com.surittec.suricdi.faces.converter.NumberConverter")
public class NumberConverter implements Converter
Utilização
<f:converter converterId="br.com.surittec.suricdi.faces.converter.NumberConverter" />
<f:attribute name="locale" value="#{locale}"/>
<f:attribute name="integerDigits" value="#{integerDigits}"/>
<f:attribute name="fractionDigits" value="#{fractionDigits}"/>
<f:attribute name="convertionType" value="#{convertionType}"/>
Conversor de Objetos
@FacesConverter("br.com.surittec.suricdi.faces.converter.SimpleObjectConverter")
public class SimpleObjectConverter implements Converter
Utilização
<f:converter converterId="br.com.surittec.suricdi.faces.converter.SimpleObjectConverter"/>

Validadores

A arquitetura traz uma série de validadores que são comumente criados no desenvolvimento das aplicação, principalmente brasileiras. Praticamente todos os validadores criados são utilizados em componentes que a arquitetura provê, logo não precisariam ser utilizados diretamente, mas sim, via componente.

Entretanto, será demonstrado como utilizá-los independentemente, sem ser via componente.

Validador de CNPJ
@FacesValidator("br.com.surittec.suricdi.faces.validator.CnpjValidator")
public class CnpjValidator implements Validator
Utilização
<f:validator validatorId="br.com.surittec.suricdi.faces.validator.CnpjValidator"/>
Validador de CPF
@FacesValidator("br.com.surittec.suricdi.faces.validator.CpfValidador")
public class CpfValidador implements Validator
Utilização
<f:validator validatorId="br.com.surittec.suricdi.faces.validator.CpfValidador"/>
Validador de Data
Utilize o componente, será bem mais fácil para utilizar todos os recursos!
@FacesValidator("br.com.surittec.suricdi.faces.validator.DateValidator")
public class DateValidator implements Validator
Utilização
<f:validator validatorId="br.com.surittec.suricdi.faces.validator.DateValidator"/>
<f:attribute name="beforeThen" value="#{beforeThen}"/>
<f:attribute name="beforeThenMessage" value="#{beforeThenMessage}"/>
<f:attribute name="afterThen" value="#{afterThen}"/>
<f:attribute name="afterThenMessage" value="#{afterThenMessage}"/>
Validador de Email
@FacesValidator("br.com.surittec.suricdi.faces.validator.EmailValidator")
public class EmailValidator implements Validator
Utilização
<f:validator validatorId="br.com.surittec.suricdi.faces.validator.EmailValidator"/>
Validador de Comparação de Campos
Utilize o componente, será bem mais fácil para utilizar todos os recursos!
@FacesValidator("br.com.surittec.suricdi.faces.validator.MatchValidator")
public class MatchValidator implements Validator
Utilização
<f:validator validatorId="br.com.surittec.suricdi.faces.validator.MatchValidator"/>
<f:attribute name="with" value="#{with}"/>
<f:attribute name="message" value="#{message}"/>

Componentes

Para facilitar o uso dos conversores e dos validadores a arquitetura provê uma série de componentes facelets que podem ser usados em conjunto com os diversos componentes (JSF, Primefaces e etc) de forma harmoniosa e não intrusiva.

Além disso, alguns componentes já incluem máscaras jquery em campos que necessitam, como cpf, cnpj, data e numérico. Ainda sobre máscaras, o componente InputMask do Primefaces foi sobrescrito para utilização com máscaras jquery do meiomask, que possuem um poder muito maior que as máscaras padrões do Primefaces.

Veja como utilizar máscaras meiomask em componentes Primefaces:

<p:inputMask id="cnpj" value="#{controller.cnpj}" mask="mask:'99.999.999/9999-99'"/>

Para utilização dos componentes da arquitetura é necessário que, primeiramente, o namespace seja definido:

xmlns:s="http://www.surittec.com.br/jsf/ui"
xmlns:sf="http://www.surittec.com.br/jsf/fn"


CNPJ
Insere automaticamente no campo o conversor de cnpj, o validador de cnpj e a máscara de cnpj.
Deve ser utilizado com o inputMask do Primefaces!
<p:inputMask id="cnpj" value="#{controller.cnpj}">
    <s:cnpj />
</p:inputmask>
Informações
Opções Required Default Descrição
autoTab false false True: pula automaticamente para o próximo campo quando preenchido


CPF
Insere automaticamente no campo o conversor de cpf, o validador de cpf e a máscara de cpf.
Deve ser utilizado com o inputMask do Primefaces!
<p:inputMask id="cpf" value="#{controller.cpf}">
    <s:cpf />
</p:inputmask>
Informações
Opções Required Default Descrição
autoTab false false True: pula automaticamente para o próximo campo quando preenchido


Data
Insere automaticamente no campo o conversor de data, o validador de data e a máscara de data.
Deve ser utilizado com o inputMask do Primefaces!
<p:inputMask id="data" value="#{controller.data}">
    <s:date />
</p:inputmask>
Informações
Opções Required Default Descrição
autoTab false false True: pula automaticamente para o próximo campo quando preenchido
pattern false dd/MM/yyyy Pattern da data
mask false 39/19/9999 Máscara da data para o pattern informado e acordo com o meiomask
beforeThen false Valida se o componente e anterior ao componente informado. Pode ser informado "today", "tomorrow" ou "yesterday" para validar a data.
beforeThenMessage false Mensagem caso a validação beforeThen falhe.
afterThen false Valida se o componente e posterior ao componente informado. Pode ser informado "today", "tomorrow" ou "yesterday" para validar a data.
afterThenMessage false Mensagem caso a validação afterThen falhe.


Email
Insere automaticamente no campo o validador de email.
<h:inputText id="email" value="#{controller.email}">
    <s:email />
</h:inputtext>


Enum
Insere automaticamente no campo o conversor de enum.
<h:selectOneMenu id="tipoPessoa" value="#{controller.tipoPessoa}">
   <s:enum noSelectionLabel="#{messages['global.selecione']}"/>
   <f:selectItems value="#{controller.tipos}" var="t" itemLabel="#{t.descricao}" />
</h:selectonemenu>
Informações
Opções Required Default Descrição
noSelectionLabel false Label para opção vazia.


Match
Insere automaticamente no campo o validador de comparação de campos.
Coloque sempre no segundo campo, devido a ordem de validação de campos no JSF.
Validará apenas se o primeiro e o segundo campos forem válidos.
<h:inputText id="email" value="#{controller.email}">
   <s:email />
</h:inputtext>

<h:inputText id="emailConfirm" value="#{controller.emailConfirm}">
   <s:email />
   <s:match with="email"/>
</h:inputtext>
Informações
Opções Required Default Descrição
with true Componente que será comparado com este.
message false Mensagem caso a validação falhe.


Number
Insere automaticamente no campo o conversor de números e a máscara numérica.
Deve ser utilizado com o inputMask do Primefaces!
<p:inputMask id="valor" value="#{controller.valor}">
   <s:number />
</p:inputmask>
Informações
Opções Required Default Descrição
autoTab false false True: pula automaticamente para o próximo campo quando preenchido.
alowNegative false false True: Permite números negativos no campo.
convertionType false Pode ser informado para qual tipo o campo deverá ser convertido. Exemplo: java.lang.Short
integerDigits false 12 Número de dígitos inteiros
fractionDigits false 2 Número de dígitos decimais
locale false View root locale Locale


Object
Insere automaticamente no campo o conversor de objetos.
<h:selectOneMenu id="pessoa" value="#{controller.pessoa}">
   <s:object noSelectionLabel="#{messages['global.selecione']}"/>
   <f:selectItems value="#{controller.pessoas}" var="p" itemLabel="#{p.nome}" />
</h:selectonemenu>
Informações
Opções Required Default Descrição
noSelectionLabel false Label para opção vazia.


Utilitários

Clone this wiki locally