4

我有一个页面,其设置如下,网址如下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。此外,int id来自我的支持 bean(o:viewParam通过f:metadata加载)也遭受了同样的命运。

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

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

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

任何帮助,将不胜感激。

我正在运行:

  • 雄猫 7
  • 莫哈拉 2.2.6
  • 全方位 1.8.1
  • Primefaces 5.0
4

2 回答 2

4

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

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

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

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

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

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

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

@PostConstruct
public void initialize() {
    id = Faces.getRequestParameter("id");
    // ...
}
于 2014-06-24T21:24:37.347 回答
0

我在上面尝试了所有这些,但在 mojarra 2.2.5 中没有工作

只需将mojara更改为mojarra 2.2.8即可解决,无需添加任何代码

于 2014-11-24T08:28:14.243 回答