0

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

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

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

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

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

4

1 回答 1

3

您应该使用 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>
于 2011-12-23T11:04:49.773 回答