【问题标题】:@PostConstruct and commandButton/commandLink parameters case@PostConstruct 和 commandButton/commandLink 参数大小写
【发布时间】:2011-12-23 10:22:15
【问题描述】:

我想知道以下场景是否有一个共同的模式。

假设我有一个由一个请求范围 bean 支持的 JSF 页面。 当用户进入此页面时,我想从数据库表中获取所有数据行。 同一个 JSF 页面包含一个提供查询条件的表单。当用户提供查询条件并提交表单时,我也想在同一页面上显示结果。

在页面入口处获取所有行的合适位置是@PostConstruct 方法。这是一个很好的地方,因为额外的(注入的)请求参数已经在这里可用并且可以在查询中使用。但是,从表单提交的参数尚不可用。可以在 action 方法中访问它们。

如果用户使用表单条件查询数据库表,在这种情况下数据库将被查询两次。将重新创建请求范围的 bean,并在表单操作方法获取用户想要的内容之前调用获取所有行的 @PostConstruct 方法。

当然,我可以将表单结果重定向到另一个 JSF 页面,该页面由不同的 bean 支持,仅在 action 方法中使用 DB 查询。但是有没有办法只获取一个 JSF 页面和一个托管 bean 所需的内容?

【问题讨论】:

    标签: jsf parameters commandlink postconstruct


    【解决方案1】:

    您应该使用 ViewScoped 托管 bean 和 ajax 引擎的组合。您使用@PostConstruct 方法获取数据表的所有初始行是正确的。来自您的查询表单的任何进一步请求都不会再次触发此方法。相反,您只需要进行 ajax 调用来整理数据表中的条目并在调用结束时对其进行更新。应该是这样的:

    <h:dataTable id="myTable">
       ...
    </h:dataTable>
    
    <h:form>
       ...
       <h:commandButton actionListener="#{viewScopedBean.sortEntries}">
           <f:ajax render="myTable" execute="myForm" />
       </h:commandButton>
    </h:form>
    

    【讨论】:

    • 谢谢!那应该做的工作。 ViewScoped bean 的唯一问题是,据我所知,您不能对它们使用 GET 请求参数。但是可以使用 commandLink/Button setPropertyActionListener 传递所有附加参数。
    • &lt;f:viewParam&gt; 绝对可以使用 GET 参数,这比 @ManagedProperty 处理 GET 参数要好得多。另见stackoverflow.com/questions/4888942/…
    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 2016-08-10
    • 1970-01-01
    • 2012-02-19
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多