会话到期后在@ViewScoped bean中恢复请求参数

时间:2014-06-24 18:50:30

标签: jsf restore view-scope http-request-parameters viewexpiredexception

我的网页设置如下,网址为my.page.com/table.xhtml?id=123

+----------------------------------------------+
|Meta information                              |
|----------------------------------------------|
|           Search Fields           Submit btn |
|----------------------------------------------|
|                                              |
|                                              |
|            Big p:dataTable                   |
|                with rowExpansion             |
|                                              |
|----------------------------------------------|
|                   Pager                      |
+----------------------------------------------+

id=123是控制结果表中内容的请求参数。所有操作仅使用AJAX重新加载数据表。

id通过以下方式加载:

<f:metadata>
    <o:viewParam name="id" value="#{dataTable.id}" />
    <f:viewAction action="#{dataTable.initialize}" />
</f:metadata>

一切正常,直到会话到期。在这一点上,没有任何作用。我无法获取数据,因为我无法访问有问题的id,并且对获取数据的DAO类的调用没有这个。

通过&#34; 无法再访问id &#34;我的意思是:

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")

返回null。此外,来自我的支持bean的int id(通过o:viewParam中的f:metadata加载也遭受同样的命运。

我知道有一些方法可以捕获ViewExpiredException,但这不是我想要的。我需要页面只需使用request参数(在本例中为id)重新加载所有值,而无需用户知道。

我(我想)我需要一个@ViewScoped manage bean来控制这个复杂的表和所有参数等。

我对此感到茫然。我尝试构建自己的ViewHandler以尝试简单地重建(模仿刷新)页面,并尝试在其他解决方案中使用PrimeFaces ajaxExceptionHandler。但所有这些都会出错并显示出来。我只想从支持bean访问我的请求参数my.page.com/table.xhtml ?id=123

任何帮助都将不胜感激。

我正在竞选:

  • Tomcat 7
  • Mojarra 2.2.6
  • Omnifaces 1.8.1
  • Primefaces 5.0

2 个答案:

答案 0 :(得分:3)

至于通过完全重新创建它来绕过过期的视图,将<o:enableRestorableView>添加到元数据中:

<f:metadata>
    ...
    <o:enableRestorableView />
</f:metadata>

至于保留请求参数,要么在表单中添加一个纯HTML隐藏输入字段:

<h:form>
    ...
    <input type="hidden" name="id" value="#{dataTable.id}" />
</h:form>

<o:form>includeViewParams="true"includeRequestParams="true"useRequestURI="true"一起使用,具体取决于您是否要提交给JSF视图ID使用所有视图参数,或使用整个请求查询字符串的JSF视图ID,或整个请求URI(包括查询字符串):

<o:form includeViewParams="true">
    ...
</o:form>

至于在回溯到JSF生命周期的所有阶段之前重新初始化bean的状态,你需要通过手动抓取<o:viewParam><f:viewAction> @PostConstruct替换@PostConstruct public void initialize() { id = Faces.getRequestParameter("id"); // ... } 。 }:

{{1}}

答案 1 :(得分:0)

我尝试了以上所有这些并且没有在mojarra 2.2.5中工作

只需将mojara更改为mojarra 2.2.8即可在不添加任何代码的情况下解决