Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exception handling 如何在ExceptionHandler中获取查询参数?_Exception Handling_Jsf 2_Navigation - Fatal编程技术网

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

Exception handling 如何在ExceptionHandler中获取查询参数?,exception-handling,jsf-2,navigation,Exception Handling,Jsf 2,Navigation,在我们的项目(JBoss 7.0.2,JSF 2)中,我们致力于一个解决方案,以捕获用户导航期间的所有异常,并将它们重定向到nice错误页面 我使用了一个异常处理程序,它的灵感来自于大量的在线测试 我成功地实现了重定向功能,没有太大的困难:在ExceptionHandler.handle()方法中,对于某些异常(过期的视图/会话、未经身份验证的用户请求被拒绝的页面等),我在登录页面上通过一个好的旧文件重定向用户 FacesContext.getCurrentInstance().getExter

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

我使用了一个
异常处理程序
,它的灵感来自于大量的在线测试

我成功地实现了重定向功能,没有太大的困难:在
ExceptionHandler.handle()
方法中,对于某些异常(过期的视图/会话、未经身份验证的用户请求被拒绝的页面等),我在登录页面上通过一个好的旧文件重定向用户

FacesContext.getCurrentInstance().getExternalContext().redirect(myRedirectPage);
使用包含原始url base64编码的附加查询参数,并在成功验证后,我使用相同的重定向机制将用户发送回其页面


问题在于JSF操作上的
ViewExpiredException
,例如,当用户在视图过期后单击带有action或actionListener、synchronous或ajax样式的任何按钮或链接时,例如

<h:commandButton action="#{myBean.myAction}" value="do that" />
并将它们包含在操作中,因此在绑定到按钮操作的方法中,我返回了

"myPage.xhtml?includeViewParams=true"
但它没有改变什么:-/

我做错什么了吗?我应该在哪里找到查询参数?它在里面吗

FacesContext.getCurrentInstance().getExternalContext().getRequest()
**更新**


正如评论中所说,视图参数在出现
ViewExpiredException
(事实上非常明显)后不再可用,因此参数将存储在其他位置(在请求范围内或通过cookie快速建议@BalusC)。

请求参数可由

请注意,这只返回当前请求的参数,而不是回发时的初始请求的参数

至于,如果JSF应用程序在servlet容器上运行,它将返回一个您需要强制转换的实例,但您很少需要获取它。在遵循Facade设计模式的同时,有许多方法将委托给底层原始HTTPservlet请求、会话和上下文。您最终希望在您的支持bean中实现零
javax.servlet
导入


更新根据您的评论,您实际上只想获取由
注册的视图参数。您可以通过传递当前的
UIViewRoot
来获取它们

Collection<UIViewParameter> viewParameters = ViewMetadata.getViewParameters(FacesContext.getCurrentInstance().getViewRoot());
// ...
集合viewParameters=ViewMetadata.getViewParameters(FacesContext.getCurrentInstance().getViewRoot()); // ...
是否只有在
ExternalContext.getRequestParameterMap()
中才能找到
viewParam
,因为如果我记得很清楚(当前无法测试),此映射包含所有参数?呃,您只想要视图参数吗?这与查询参数不完全相同。。。我将更新答案。从未听说过
viewmatadata
事实上:)无论如何,我设法从中获取viewParams,但它们为空。也许,当我将viewParam链接到
ViewScoped
bean属性,类似于
,并且当我的代码在
ViewExpiredException
之后到达时,我想做的可能是不可能的?我的意思是,viewParam值存储在一个ViewScope bean中,但是在我的视图过期之后,我可能无法再访问它了。这是真的吗?如果是,是否有一种方法来存储viewParam值,以便在视图过期后仍能获取它?噢,这绝对有道理!初始视图在
ViewExpiredException
期间不可用。您需要寻找其他方法,可能是基于请求或基于cookie的方法。好吧,我将寻找其他方法,目前此功能不是我们的首要任务。如果我发现一些整洁的东西,我会在这里回复并通知你。
FacesContext.getCurrentInstance().getExternalContext().getRequest()
Map<String, String> params = externalContext.getRequestParameterMap();
// ...
Map<String, String[]> params = externalContext.getRequestParameterValuesMap();
// ...
Collection<UIViewParameter> viewParameters = ViewMetadata.getViewParameters(FacesContext.getCurrentInstance().getViewRoot());
// ...