我一直在使用JSF 1.2和本回答中描述的ViewHandler:IceFaces Session Expiry causes an exception它非常有用,因为当异常发生时,页面会自动重新生成,适用于公共页面。问题是它与JSF 2.0不兼容。有没有人知道如何使它在JSF 2.0或替代品中工作?
修改:
我找到了这个解决方案: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
)答案 0 :(得分:1)
我认为JSF2的方式是提供自己的异常处理程序。
在异常处理程序中,可以循环所有未处理的异常,检查ViewExpiredException并将其删除。
一个偶数填充请求参数并导航到特定的facelet,它可以呈现正确且信息丰富的页面,该页面利用从异常处理程序填充的那些请求参数。如果需要,甚至可以导航到登录屏幕。
这是一个描述如何实现它的article。