jsf - session 过期后在@ViewScoped bean 中恢复请求参数

标签 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>

这一切正常,直到 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 。

任何帮助,将不胜感激。

我正在运行:
  • Tomcat 7
  • 莫哈拉 2.2.6
  • Omnifaces 1.8.1
  • Primefaces 5.0
  • 最佳答案

    至于通过完全重新创建它来绕过过期 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/

    相关文章:

    javascript - 奇怪的 jQuery 问题

    mysql - 恢复另一个版本的mysqldump文件

    java - 具有从父类(super class)继承的属性的托管 Bean

    serialization - 当客户端状态保存打开时,ViewScoped bean 是否序列化到页面?

    mysql - 使用 sqldump 生成的 sql 文件恢复 mariadb 抛出错误代码 22

    jsf - <p :fileUpload> recreates @ViewScoped bean on every request

    java - 同时保留两个实体

    jsf - 绕过 JSF2 中的 bean 验证?

    java - 通过id获取组件的值?

    database - 还原 Postgres 数据库时出现不重音问题