使用JSF
,Primefaces
,eclipselink
运行的应用程序,不是一个小应用程序,大约100页/bean都可以正常运行
我在理解@ViewScoped
页面的工作方式时遇到了一些麻烦,我得到了select
UI组件,在我的bean中填充了一个简单的List<People>
和一个后端selectedPeople
// all getters, setters, JPA annotations, all good
public class People {
private String name;
private List<Car> cars;
}
@ManagedBean
@ViewScoped
public class PeopleBean {
@EJB
private Service sPeople;
private People selectedPeople;
private List<People> listPpl;
@PostConstruct
public void init(){
listPpl = sPeople.readAll(); // always good, same as DB values
}
public People getSelectedPeople(){
return selectedPeople;
}
public People setSelectedPeople(People p){ // p is an old element
selectedPeople = p; // BREAKPOINT
}
// getter for the list too
public void method(){
Logger.getAnoymousLogger().severe(selectedPeople.getCars()); // the one the old people, not the ne contained in the actual list
}
}
<p:selectOneMenu id="selectP" value="#{peopleBean.selectedPeople}" converted="#{genericSecuerdConverter}" >
<p:ajax event="change" partialSubmit="true" listener="#{peopleBean.method()}" />
<f:selectItems value="#{peopleBean.listPpl}" var="people" itemLabel="#{people.name}" itemValue="#{people}" />
</p:selectOneMenu>
使用和问题的顺序是(从调试中获取的信息):
peoplePage.xhtml
,列表元素的IDs
是#410, #411, #412
(3位)modif.xhtml
,更改第3个人(删除car
,保存在数据库中(在DB中检查))peoplePage.xhtml
,列表确定,调试中的IDs
是#650, #651, #652
null
)以选择一个人,并且在断点处,p
似乎是#412
元素,因此其汽车列表上的更改不可见,它不是来自listPpl
(因为包含只有有效的元素,并且对应于DB),这是一种缓存我试图将ecpliselink缓存禁用为EclipleLink cache状态
@Cacheable(false)
没有人起作用,也没有进入私有(private)导航,也没有清除浏览器缓存并返回页面,
p
元素从第一次加载到现在仍然是旧的我以为
@ViewScoped
允许每次都像是第一次一样打开页面,但似乎不行,无法弄清楚可以在哪里存储/缓存元素编辑我暂时使用了一种解决方法,但这显然是最好的解决方案
public People setSelectedPeople(People p){
if(p!=null)
selectedPeople = sPeople.read(p.getId());
}
最佳答案
您正在寻找的是@RequestScoped
。每当您执行适当的HTTP请求时,它将创建所有内容。否则,不能保证销毁@ViewScoped
bean。 Omnifaces文档中的一个示例:ViewScoped。
例如,当用户使用浏览器的后退和前进按钮时,此功能可用于帮助重新创建页面。
描述源:https://www.tutorialspoint.com/jsf/jsf_managed_beans.htm