如何在ExceptionHandler中获取查询参数?

时间:2012-02-02 17:27:00

标签: exception-handling jsf-2 navigation

在我们的项目( JBoss 7.0.2 JSF 2 )中,我们致力于在用户导航期间捕获所有异常的解决方案,并将它们重定向到漂亮的错误页面。

我使用了ExceptionHandler,受到很多examplestutorials在线的启发。

我设法做了一个重定向功能没有太大的困难:在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快速建议)。

1 个答案:

答案 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());
// ...