我编写了一个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;
}
}
它正常工作 - 它分类和分页。 我可以使用带有RequestScoped bean的primefaces数据表从数据库中获取值吗?
答案 0 :(得分:1)
如果您将视图范围bean的属性绑定到标记处理程序的属性,则会发生这种情况,这会导致在每个HTTP请求上重新创建视图范围bean。标记处理程序是JSTL标记,例如<c:if>
,<c:forEach>
等,而Facelets UI标记没有rendered
属性,如<ui:include>
,<ui:composition>
等, JSF核心组件,如<f:attribute>
,<f:validator>
等。您需要确保不将视图范围bean的属性绑定到那些标记处理程序。您需要寻找一种JSF UI组件方法,或者将这些属性拆分为另一个请求范围的bean。
不相关具体问题,虽然在getter中延迟加载绝对不会形成问题,但最好在构造辅助bean期间(post)构建问题。虽然类名DataBaseConnector
和静态方法调用并没有让我强烈感觉到你正在以正确的方式处理数据库。
答案 1 :(得分:0)
它可以工作,但如果指令
则更好 animals = DataBaseConnector.getLastAnimals();
位于使用@PostConstruct分配的方法内。
我认为最好的选择是在你的情况下使用View scoped bean。 我以前做过,效果很好。
答案 2 :(得分:0)
所涉及的课程的一些描述在这里会有所帮助。
@Named
@ViewScoped
public class MyBean implements Serializable {
private List<Animal> animals = null;
public List<Animal> getAnimals() {
if(animals == null) {
animals = (new MyBean()).getLastAnimals();
}
return animals;
}
}
如果您使用DatabaseConnector的源更新问题,您将获得所需的答案。可能你需要在DatabaseConnector中有一个MyBean实例。组合,在该DatabaseConnector中有一个MyBean。
美元到甜甜圈DatabaseConnector目前与MyBean没有“has-a”关系(组合)。或者,如果是,则DatabaseConnector.getLastAnimals()方法不使用它。