ViewExpiredException e JSF 1.2 – Solução definitiva
Por: Rômulo Augusto em 22 de outubro de 2010, categoria: Desenvolvimento
Esse é um post de utilidade pública! Finalmente, uma solução definitiva para o problema do ViewExpiredException pra quem usa JSF 1.2.
Vou contar o que aconteceu comigo esses dias… Num projeto novo que estou fazendo com uns colegas, estamos usando JSF 1.2, Facelets 1.1.14 e RichFaces 3.3.3. No primeiro momento, tínhamos uma tela que colocava um dado na sessão e, após a sessão expirar… adivinha: ViewExpiredException!!!
Normal até aí, todo mundo já sabe que isso ocorre mesmo. A solução foi implementar um PhaseListener com base no post desse cara: JSF Session Timeout Handling.
Resolvido o problema da sessão! Porém, me deparo com outro problema, esse agora ainda com a sessão ativa, e adivinhem novamente… ViewExpiredException!!!
Depois de pesquisar o Google inteiro sobre o ocorrido, me deparei com o um parâmetro mágico do Facelets: facelets.BUILD_BEFORE_RESTORE. Simples, configura pra "true" e tá tudo certo, o problema desaparece.
Realmente desaparece, mas outros aparecem, agora com o RichFaces (Build Before Restore Will Eat Your RichFaces).
Resumindo, tive que abrir a classe FaceletViewHandler pra saber o que tava havendo, até que cheguei à solução:
Criei uma nova classe, herdando de FaceletViewHandler, que sobrescreve o método createView. Confiram abaixo:
/** * *ViewHandlerque previne o problema de *ViewExpiredExceptionpara os casos onde a sessão * ainda está ativa. * * Basicamente utiliza oViewHandler"pai" * para restaurar a view. Caso ele não consiga * (UIViewRoot == null), recria a view. * * @author Rômulo Augusto */ public class PreventViewExpiredViewHandler extends FaceletViewHandler { private ViewHandler parent; public PreventViewExpiredViewHandler(ViewHandler parent) { super(parent); this.parent = parent; } @Override public UIViewRoot createView(FacesContext context, String viewId) { UIViewRoot viewRoot = this.parent.restoreView(context, viewId); if (viewRoot == null) { viewRoot = super.createView(context, viewId); } return viewRoot; } }
Resumão pra concluir:
- Coloque o parâmetro facelets.BUILD_BEFORE_RESTORE no web.xml como true;
- Use um PhaseListener para o caso de session timeout;
- Use a classe PreventViewExpiredViewHandler para os outros casos.
No caso do session timeout, é possível redirecionar para uma página específica ou atém mesmo se manter na mesma página e mostrar uma mensagem (e foi assim que eu fiz).
A classe PreventViewExpiredViewHandler apenas recria a view caso sua restauração não tenha sido possível. Usa o mesmo método da superclasse, FaceletViewHandler.
*Fiquem à vontade pra copiar, só lembrem de deixar os créditos! Valeu!
Novo site da Xbox Live
Por: Raphael Medeiros em 21 de outubro de 2010, categoria: Internet
Já encontra-se disponível a mais nova versão do site da Xbox Live, dá para notar que ficou mais limpo, seguindo a tendência da nova dashboard que será lançada o próximo mês.
Google Chrome 7
Por: Raphael Medeiros em 20 de outubro de 2010, categoria: Google
Já encontra-se disponível para download a nova versão do Google Chrome.
Não houve alterações na interface, mas o navegador recebeu, suporte ao AppleScript, para automatizar algumas interações de interface no MAC e houve uma melhora quanto ao desempenho do Chrome no momento de reproduzir elementos inseridos na página por meio do HTML 5. Além de parâmetros de áudio e vídeo nativo, esta versão ainda conta com o suporte a exibição de gráficos vetoriais SVG e MathML.
Fonte: Tecnoblog
Droid 2
Por: Raphael Medeiros em 14 de outubro de 2010, categoria: Mobile
Conheça o Droid 2 da Motorola, ele lembra algo? Sim, o R2-D2 de Star Wars, o smartphone roda Android 2.2 e possuí CPU de 1 GHz e teclado físico. Essa versão já esta sendo vendida nos EUA pela operadora Verizon ao preço de 250 dólares.
Fonte: Gadgets Info












