使用Primefaces 5.0,JSF 2.2.7,部署在EAP 6.1上。
我在下面有这个Managed Bean。
import hh.bean.Service;
import hh.dao.ServiceDao;
import hh.dao.impl.ServiceDaoImpl;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class View1 implements Serializable {
private static final long serialVersionUID = 1L;
private ServiceDao serviceDao = new ServiceDaoImpl();
@PostConstruct
public void init() {
System.out.println(View1.class.getName() + ": init() " + this);
}
public List<Service> getServices(){
return serviceDao.getAllServices();
}
}
我从下面的xhtml中调用它。
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Home Web</title>
<f:facet name="first">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" />
<meta name="viewport"
content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0" />
<meta name="apple-mobile-web-app-capable" content="yes" />
</f:facet>
</h:head>
<h:body>
<h:outputStylesheet library="css" name="newcss.css" />
<p:dataTable var="service" value="#{view1.services}">
<p:column style="width:16px">
<p:rowToggler />
</p:column>
<p:column headerText="Id">
<h:outputText value="#{service.id}" />
</p:column>
<p:column headerText="xxxx">
<h:outputText value="#{service.description}" />
</p:column>
<p:rowExpansion>
<p:dataTable var="sv" value="#{view1.services}">
<p:column headerText="Id">
<h:outputText value="#{sv.id}" />
</p:column>
</p:dataTable>
</p:rowExpansion>
</p:dataTable>
</h:body>
</html>
我注意到每次扩展行时都会调用init()
。当请求停留在同一页面上时,我认为@ViewScoped
仍然存在。
当我切换到@SessionScoped
时,在展开行时不会调用init()
。
编辑1:将整个xhtml放入,指定jsf version / impl
修改2 :通过p:dataTable
围绕h:form
来解决此问题。不知道为什么修复它......
答案 0 :(得分:7)
通过用h:form包围p:dataTable来解决这个问题。不确定为什么修复它......
JSF视图状态由javax.faces.ViewState
的{{1}}隐藏输入字段维护。如果您不使用<h:form>
,则PrimeFaces将无法找到该隐藏的输入字段,以便将其值与jQuery ajax请求一起传递。
如果(ajax)请求中缺少此信息,那么JSF将只创建一个全新的视图,并且本质上也是与之关联的所有视图范围内的bean。