我想知道以下情况是否存在共同模式。
假设我有一个JSF页面支持一个请求范围的bean。 我想在用户进入此页面时从数据库表中填充所有数据行。 相同的JSF页面包含一个提供查询条件的表单。当用户提供查询条件并提交表单时,我也希望在同一页面上显示结果。
在页面条目处获取所有行的合适位置是@PostConstruct方法。这是一个很好的地方,因为此处已有其他(注入)请求参数,并且可以在查询中使用。但是,从表单提交的参数尚不可用。可以在操作方法中访问它们。
如果用户使用表单条件查询数据库表,则在这种情况下将查询数据库两次。将重新创建请求范围的bean,并且在表单操作方法获取用户想要的内容之前将调用获取所有行的@PostConstruct方法。
当然,我可以将表单结果重定向到另一个由不同bean支持的JSF页面,只有在action方法中才有DB查询。但有没有办法只获取一个JSF页面和一个托管bean所需的内容?
答案 0 :(得分: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>