我编写了一个 JSF 2 页面,用于可视化数据库中的数据。
当我使用 Primefaces 数据表与 ViewScoped 或 RequestScoped bean 从数据库获取值时,它无法正常工作 - 无法排序且无法分页。例如:
@ManagedBean
@ViewScoped
public class MyBean implements Serializable {
private List<Animal> animals;
public List<Animal> getAnimals() {
if(animals == null) {
animals = DataBaseConnector.getLastAnimals();
}
return animals;
}
}
当我使用 SessionScoped 更改 ViewScoped 时,效果很好,但我想将它与 RequestScope 和 ViewScope 一起使用。 当我使用相同的 bean 并添加静态值时,如下所示:
@ManagedBean
@ViewScoped
public class MyBean implements Serializable {
private List<Animal> animals = new ArrayList<Animal>() {{
add(new Animal("John", 7, new Timestamp(2436343516841235621L)));
add(new Animal("Holly ", 15, new Timestamp(52343332153212142L)));
add(new Animal("Betty", 3, new Timestamp(2346236232151232L)));
}};
public List<Animal> getAnimals() {
return animals;
}
}
它工作正常 - 它可以排序和分页。 我可以使用 primefaces 数据表和 RequestScoped bean 从数据库获取值吗?
最佳答案
如果您将 View 作用域 bean 的属性绑定(bind)到标记处理程序的属性,就会发生这种情况,这将导致在每个 HTTP 请求上重新创建 View 作用域 bean。标签处理程序是 JSTL 标签,例如 <c:if>
, <c:forEach>
等以及没有 rendered
的 Facelets UI 标签属性如 <ui:include>
, <ui:composition>
等以及 JSF 核心组件,如 <f:attribute>
, <f:validator>
等等。您需要确保不将 View 作用域 bean 的属性绑定(bind)到这些标记处理程序。您需要寻找 JSF UI 组件方法,或者将这些属性拆分到不同的请求作用域 bean 中。
另请参阅:
<小时/>与具体问题无关,虽然 getter 中的延迟加载绝对不会形成问题,但最好在支持 bean 的(后)构造期间这样做。虽然类名DataBaseConnector
并且静态方法调用并没有给我一种强烈的感觉,让我觉得你正在以正确的方式做数据库的事情。
关于java - Primefaces 数据表无法与 ViewScoped 或 RequestScoped bean 正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9942614/