2011-07-14 90 views
2

我一直在使用JSF 1.2用的ViewHandler在这个答案说明:IceFaces Session Expiry causes an exception这是非常有用的,因为当异常发生时页面会自动再生,有利于促进公共页面。问题是它与JSF 2.0不兼容。有没有人有一个想法如何使它在JSF 2.0或更换工作?JSF 2.0 ViewExpiredException

编辑:

我发现这个解决方案:Stateless JSF,但仍然不知道是否有什么办法由ViewHandler要做得像我在JSF 1.2做。这里是我的JSF 2.0当前的代码:

public class AutoRegeneratorViewHandler extends GlobalResourcesViewHandler 
{ 
    public AutoRegeneratorViewHandler(ViewHandler viewHandler) 
    { 
     super(viewHandler); 
    } 

    @Override 
    public UIViewRoot restoreView(FacesContext p_oContext, String p_sViewID) 
    { 
     UIViewRoot oViewRoot = super.restoreView(p_oContext,p_sViewID); 

     try 
     { 
      if(oViewRoot == null) 
      {   
       initView(p_oContext); 

       oViewRoot = createView(p_oContext,p_sViewID); 
       p_oContext.setViewRoot(oViewRoot); 

       try 
       { 
        renderView(p_oContext,oViewRoot); 
       } 
       catch(IOException e) 
       { 
        e.printStackTrace(); 
       } 

       System.out.println("Created : " + p_sViewID); 
      } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

     return oViewRoot; 
    } 
} 

此代码摆脱ViewExpiredException但加载页面时,我出现没有登录的。

测试用例:

  • 打开网站
  • 等待超过当前会话过期时间(从web.xml
  • 输入用户名/密码,
  • 命中登录按钮
  • 页面重载用登录表单为空
  • 重新载入页面
  • Page show欢迎和登录表单未显示(预期行为)
+0

为什么不能迁移到JSF 2.0应用程序? http://stackoverflow.com/questions/4441713/migrating-from-jsf-1-2-to-jsf-2-0 – sfrj

+0

我已经迁移到JSF 2.0,但我在1.2的解决方案不工作了! –

回答

1

我认为JSF2的方式是提供您自己的异常处理程序。

在异常处理程序,可以循环所有未处理的异常,请检查ViewExpiredException,并删除它。

一个偶数填充请求参数并导航到一个特定的facelet,它可以使正确的和翔实的页面,使得使用从异常处理程序填充这些请求参数的。如果需要,甚至可以导航到登录屏幕。

这里有这样一个article描述了如何实现它。

+0

当然,这是一种好方法,但在登录屏幕的上下文中,只有在浏览器中打开的时间超过了超时时间,当您填写用户名/密码框并点击登录按钮时,它会变成ViewExpiredException。 .. –