我有一个页面,其设置如下,网址如 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>
这一切正常,直到 session 过期。在这一点上,没有任何作用。我无法获取数据,因为我无法再访问
id
有问题并调用 DAO
获取数据的类没有这个。通过“ 不再可以访问
id
”我的意思是:FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")
返回
null
.另外,int id
从我的支持 bean(通过 o:viewParam
中的 f:metadata
加载)遭受同样的命运。我知道有一些方法可以捕获
ViewExpiredException
,但这不是我想要的。我需要页面在用户不知道的情况下使用请求参数(在本例中为 id
)简单地重新加载所有值。我(认为我)需要一个
@ViewScoped
管理 bean 来控制这个复杂的表和所有参数等。对此,我不知所措。我试过建立自己的
ViewHandler
尝试让它简单地重建(模拟刷新)页面,并尝试使用 PrimeFaces
ajaxExceptionHandler
在其他解决方案中。但是所有这些都会出错并显示出来。我只想访问我的请求参数 my.page.com/table.xhtml
?id=123
从支持 bean 。任何帮助,将不胜感激。
我正在运行:
最佳答案
至于通过完全重新创建它来绕过过期 View ,添加 <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"
,这取决于您是要提交给带有所有 View 参数的 JSF View ID,还是提交给带有整个请求查询字符串的 JSF View ID,或者提交给整个请求 URI(包括查询字符串):<o:form includeViewParams="true">
...
</o:form>
至于在通过 JSF 生命周期的所有阶段之前在回发时重新初始化 bean 的状态,您需要替换
<o:viewParam>
通过手动抓取它和 <f:viewAction>
来自 @PostConstruct
:@PostConstruct
public void initialize() {
id = Faces.getRequestParameter("id");
// ...
}
关于jsf - session 过期后在@ViewScoped bean 中恢复请求参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24394142/