【问题标题】:Restoring request parameters in @ViewScoped bean after session expires会话过期后在@ViewScoped bean 中恢复请求参数
【发布时间】:2014-08-15 03:48:52
【问题描述】:

我有一个页面,其设置如下,网址如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 类的调用没有这个。

无法再访问id”我的意思是:

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

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

我知道有一些方法可以捕获ViewExpiredException,但这不是我想要的。我需要页面在用户不知情的情况下使用请求参数(在本例中为 id)简单地重新加载所有值。

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

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

任何帮助将不胜感激。

我正在运行:

  • 雄猫 7
  • Mojarra 2.2.6
  • Omnifaces 1.8.1
  • Primefaces 5.0

【问题讨论】:

  • “不再有权访问相关 id”是什么意思?
  • @EJP 更新了问题,提供了有关您所遇到问题的更多详细信息。
  • 发生这种情况是因为 Ajax 调用。会话到期与请求参数无关。使用 c:set 将其存储在视图或 bean 中。

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


【解决方案1】:

至于通过完全重新创建来绕过过期视图,请将&lt;o:enableRestorableView&gt; 添加到元数据中:

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

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

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

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

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

至于在 bean 经历 JSF 生命周期的所有阶段之前在回发时重新初始化它的状态,您需要通过手动抓取它来替换 &lt;o:viewParam&gt;,并用 @PostConstruct 替换 &lt;f:viewAction&gt;

@PostConstruct
public void initialize() {
    id = Faces.getRequestParameter("id");
    // ...
}

【讨论】:

  • 按照上述操作,并说在寻呼机上单击commandLink,错误被隐藏并显示页面,但我丢失了所有数据。数据未刷新,actionListener 从未调用过。我最终丢失了所有数据——基本上是updated。
  • 更新让我走上了正轨。我需要做一些额外的事情,但这是我要完成的更具体的功能/逻辑。谢谢!
  • 我没有得到正确的答案我尝试了 ...
    ...
    我也试过
    但问题是我在页面中有多个表单但没有嵌套那些没有为我解决问题
【解决方案2】:

我在上面尝试了所有这些,但在 mojarra 2.2.5 中不起作用

只要把mojara改成mojarra 2.2.8就可以解决,不加任何代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 2020-04-06
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2015-12-03
    相关资源
    最近更新 更多