在我们的项目( JBoss 7.0.2 , JSF 2 )中,我们致力于在用户导航期间捕获所有异常的解决方案,并将它们重定向到漂亮的错误页面。
我使用了ExceptionHandler
,受到很多examples和tutorials在线的启发。
我设法做了一个重定向功能没有太大的困难:在ExceptionHandler.handle()
方法中,对于一些例外(过期的视图/会话,未经身份验证的用户询问被拒绝的页面,...)我将用户重定向到登录页面通过一个好旧的
FacesContext.getCurrentInstance().getExternalContext().redirect(myRedirectPage);
使用包含原始url base64编码的附加查询参数,并且在成功进行身份验证后,我使用相同的重定向机制将用户发送回其页面。
问题在于ViewExpiredException
关于JSF操作,例如当用户在任何按钮或带有action或actionListener,同步或ajax样式的链接上的视图过期后单击时,例如
<h:commandButton action="#{myBean.myAction}" value="do that" />
或
<h:commandLink value="do that too">
<f:ajax render=":aZone" execute="@form" listener="#{myBean.myOtherAction}" />
</h:commandLink>
我无法通过ExceptionHandler.handle()
方法获取查询参数。
我尝试将参数放在f:metadata
部分,例如
<f:metadata>
<f:viewParam name="myParam" value="#{myBean.myParam}" />
</f:metadata>
并将它们包含在动作中,因此在绑定到按钮动作的方法中我返回了
"myPage.xhtml?includeViewParams=true"
但它没有改变: - /
我做错了吗?我应该在哪里找到查询参数?是在
FacesContext.getCurrentInstance().getExternalContext().getRequest()
**更新**
正如评论中所述,在ViewExpiredException
之后看来params不再可用(事实上非常明显),因此params将被存储在其他地方(@BalusC在请求范围或通过cookie快速建议)。
答案 0 :(得分:0)
请求参数由ExternalContext#getRequestParameterMap()
提供。
Map<String, String> params = externalContext.getRequestParameterMap();
// ...
或者,如果您的应用程序使用具有多个值的相同参数名称(<h:selectManyXxx>
组件通常就是这种情况),请改用ExternalContext#getRequestParameterValuesMap()
Map<String, String[]> params = externalContext.getRequestParameterValuesMap();
// ...
请注意,这仅返回当前请求的参数,而不是回发时的初始请求的参数。
对于ExternalContext#getRequest()
,如果JSF应用程序在servlet容器上运行,则需要返回HttpServletRequest
的实例,但是你应该很少需要它。 ExternalContext
在遵循Facade设计模式的同时,有许多方法委托给底层的原始HTTP servlet请求,会话和上下文。您最终希望最终在您的支持bean中导入零 javax.servlet
。
更新,您实际上只想获得<f:viewParam>
注册的视图参数。您可以通过ViewMetadata#getViewParameters()
获取它们,其中您传递了当前的UIViewRoot
。
Collection<UIViewParameter> viewParameters = ViewMetadata.getViewParameters(FacesContext.getCurrentInstance().getViewRoot());
// ...