-
Notifications
You must be signed in to change notification settings - Fork 3
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:
- JSF 2
- Rewrite
- Primefaces
Para facilitar o desenvolvimento das controladoras, foi desenvolvida a classe abstrata Controller, que possui uma série de métodos facilitadores.
Para utilizá-la basta que sua controladora estenda a classe Controller:
public class ListarPessoasController extends ControllerAo estender a classe Controller sua controladora poderá usufruir de métodos facilitadores como:
- Método invocado quando uma view é iniciada (sobreescreva!)
/**
* Acao invocada sempre que a tela for iniciada.
* Retorne nulo para seguir para a tela ou retorne uma viewId para redirecionar para outra tela
* @return
*/
@RequestAction
@Deferred
@IgnorePostback
public String requestAction()- Métodos para serem utilizados nas views
/**
* Util para saber se a controladora ja foi inicializada.
* Voce devera informar a inicializacao manualmente
* @return
*/
public boolean isInitialized()
/**
* Comparacao de strings com ignore case, util para dataTables com sort
* @param obj1
* @param obj2
* @return
*/
public int sortIgnoreCase(Object obj1, Object obj2)
/**
* Filtro de dados ignorando o caso, util para dataTables
* @param value
* @param filter
* @param locale
* @return
*/
public boolean filterIgnoreCase(Object value, Object filter, Locale locale)
/**
* Metodo para ser utilizado em acoes de cancelamento que exigem a limpeza de um form.
* Realiza, assim, a limpeza completa na arvore de componentes do JSF, do form que o botao se encontra.
* @param event
*/
public void resetForm(ActionEvent event)- Métodos auxiliares para serem utilizados na controladora
/**
* Retorna a referencia do FacesContext.
* @return FacesContext
*/
protected FacesContext getContext()
/**
* Retorna a referencia do FacesContext.
* @return ExternalContext
*/
protected ExternalContext getExternalContext()
/**
* Retorna a referencia para o HttpServletResponse atual.
* @return HttpServletResponse
*/
protected HttpServletResponse getResponse()
/**
* Retorna a referencia para o HttpServletRequest atual.
* @return HttpServletRequest
*/
protected HttpServletRequest getRequest()
/**
* Retorna a instancia atual do contexto ServletContext.
* @return ServletContext
*/
protected ServletContext getServletContext()
/**
* Retorna um parametro do Request HTTP (HttpServletRequest) sob a chave 'name'.
* @param name - chave do parametro no Request HTTP
* @return String - parametro do Request HTTP sob a chave 'name'
*/
protected String getParameter(String name)
/**
* Retorna a referencia para o HttpSession atual.
* @return HttpSession
*/
protected HttpSession getSession()
/**
* Retorna o contexto de Flash
* @return Flash
*/
protected Flash getFlash()
/**
* Adiciona uma mensagem no facesMessages com severidade info.
* @param msg
* @param params
*/
protected void addMsg(String msg, Object ... params)
/**
* Adiciona uma mensagem no facesMessages com severidade INFO, para o componente
* especificado
* @param compoenentId
* @param msg
* @param params
*/
protected void addMsgToComponent(String componenteId, String msg, Object... params)
/**
* Adiciona uma mensagem no facesMessages com severidade warn.
* @param msg
* @param params
*/
protected void addMsgWarn(String msg, Object... params)
/**
* Adiciona uma mensagem no facesMessages com severidade WARN, para o componente
* especificado.
* @param compoenentId
* @param msg
* @param params
*/
protected void addMsgWarnToComponent(String componenteId, String msg, Object... params)
/**
* Adiciona uma mensagem no facesMessages com severidade error.
* @param msg
* @param params
*/
protected void addMsgErro(String msg, Object... params)
/**
* Adiciona uma mensagem do bundle no facesMessages com severidade error, para o componente
* especificado.
* @param compoenentId
* @param msg
* @param params
*/
protected void addMsgErroToComponent(String componenteId, String msg, Object... params)
/**
* Lanca erro de validacao com a mensagem do bundle.
* @param key
* @throws ValidatorException
*/
protected void throwValidationException(String key) throws ValidatorException
/**
* Retorna a mensagem do arquivo properties default ("messages") formatada com os parametros passados.
*
* @param key
* @param params
* @return mensagem formatada
*/
protected String getMessageFromDefaultBundle(String key, Object ... params)
/**
* Retorna a mensagem do arquivo properties, que possui o nome passado como argumento, formatada com os parametros passados.
*
* @param bundleName
* @param key
* @param params
* @return mensagem formatada
*/
protected String getMessageFromBundle(String bundleName, String key, Object ... params)
/**
* Metodo para limpar o componente, na arvore jsf, cujo id informado.
* @param componentClientId
*/
protected void resetComponent(String componentClientId)Na versão atual do CDI e do JSF há o problema de que o escopo de View não é suportado pelo CDI. Para utilizar o escopo de View a sua controladora deverá ser uma ManageBean e não um bean gerenciado pelo CDI. O problema é que perde-se uma série de vantagens providas pelo CDI, como, por exemplo, interceptadores.
A arquitetura Suri-CDI corrige o problema (fonte DeltaSpike)! Logo, é possível criar a sua controladora da seguinte forma:
@Named
@ViewScoped
public class ListarPessoasController extends ControllerMas para facilitar um pouco a vida, provemos os seguintes esteriótipos:
-
- @ApplicationController
- É o mesmo que: @Named + @ApplicationScoped
- @SessionController
- É o mesmo que: @Named + @SessionScoped
- @ViewController
- É o mesmo que: @Named + @ViewScoped
- @RequestController
- É o mesmo que: @Named + @RequestScoped
Desta forma, sua controladora pode ser criada da seguinte forma:
@ViewController
public class ListarPessoasController extends Controller- @BusinessMessages
A classe suporte Controller já possui essa anotação, logo todas as controladoras que estendam de Controller já terão o interceptor ativado, não sendo necessário adicionar a anotação em sua controladora.
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
@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
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())
;
}
}© Copyright 2014 SURITTEC