9

当我有 javax.faces.application.ViewExpiredException 时,我想将用户发送到登录页面。

web.xml

...
    <context-param>
        <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name>
        <param-value>true</param-value>
    </context-param>
...
 <error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/errors/sessionExpired.jsf</location>
 </error-page>

sessionExpired.jsf

....
<c:redirect url="/index.jsf" />

但是 enableRestoreView11Compatibility 是 JSF 1.1 中使用的方法,JSF 1.2 的解决方案是什么?

4

1 回答 1

14

com.sun.faces.enableRestoreView11Compatibility是一个 JSF 1.2 设置,它告诉 JSF 1.2 的行为类似于 JSF 1.1。

com.sun.faces.enableRestoreView11Compatibility==true表示“不要抛出ViewExpiredException; 相反,如果旧视图已过期,只需创建一个新视图。”

IBM关于 JSF 1.1 行为的注释说:

这可能会产生不利的行为,因为它是一个新视图,并且通常在视图中的项目(例如状态)不再存在。

默认的 JSF 1.2 行为在规范中定义如下:

如果请求是回发,则调用ViewHandler.restoreView(),传递FacesContext当前请求的实例和视图标识符,并UIViewRoot为恢复的视图返回 a。如果 return fromViewHandler.restoreView()为 null,则抛出ViewExpiredException带有适当错误消息的 a。is a必须抛出javax.faces.application.ViewExpiredException FacesException` 以向应用程序发出未返回视图标识符的预期视图的信号。应用程序可以选择基于此异常执行某些操作。

ViewExpiredException在视图过期时抛出,请删除com.sun.faces.enableRestoreView11Compatibility参数或将其设置为false.


The com.sun namespace suggests that the parameter is a Sun/Mojarra and derived implementation-specific setting, so it probably will not work with all JSF implementations.

于 2009-11-11T16:46:49.347 回答