节点树表素数消失
node treetable primefaces disappearing
我正在 Liferay 中使用 Primefaces 开发一个应用程序,我需要使用 p:treeTable 组件,碰巧点击 p:commandButton 时节点消失了。我相信它与ajax有关,如果将代码放在@PostConstruct的managedBean中,它可以正常工作
这是我的 .xhtml
<h:body>
<h:form id="form">
<p:layout style="min-width:1050px;height:700px" styleClass="semBorda">
<p:layoutUnit position="west" size="900" minSize="40" maxSize="310"
styleClass="semBorda">
<p:panelGrid columns="2" style="width:300px">
<f:facet name="header">
<h:outputText value="Campos" />
</f:facet>
<h:outputText value="Cidade" />
<p:selectCheckboxMenu value="#{relatorioBean.selectedCidades}"
label="Cidades" filter="true">
<f:selectItems value="#{relatorioBean.cidades}" />
</p:selectCheckboxMenu>
<!-- <h:outputText value="Ramal" /> -->
<!-- <p:selectBooleanCheckbox value="" /> -->
<!-- <h:outputText value="Tipo de Ramal" /> -->
<!-- <p:selectBooleanCheckbox value="" /> -->
<!-- <h:outputText value="Suborgao" /> -->
<!-- <p:selectBooleanCheckbox value="" /> -->
<!-- <h:outputText value="Situação" /> -->
<!-- <p:selectBooleanCheckbox value="" /> -->
<h:outputText value="Polo" />
<p:selectBooleanCheckbox value="#{relatorioBean.polo}" />
<!-- <h:outputText value="Categoria Diurna" /> -->
<!-- <p:selectBooleanCheckbox value="" /> -->
<!-- <h:outputText value="Categoria Noturna" /> -->
<!-- <p:selectBooleanCheckbox value="" /> -->
<h:outputText value="Teste" />
<p:inputText value="#{relatorioBean.teste}" />
</p:panelGrid>
<p:panelGrid columns="1" style="margin-left:200px; margin-top:10px">
<p:commandButton actionListener="#{relatorioBean.montarRaiz}"
value="Consultar" update="tree" styleClass="semB" />
</p:panelGrid>
</p:layoutUnit>
<p:layoutUnit position="center" styleClass="">
<p:treeTable value="#{relatorioBean.raiz}" var="ramal" id="tree">
<p:column headerText="Name">
<h:outputText value="#{ramal}" />
</p:column>
</p:treeTable>
</p:layoutUnit>
</p:layout>
</h:form>
</h:body>
我的 managedBean
package br.jus.tjpe.infosistelecom.controle;
import br.jus.tjpe.infosistelecom.dao.OrgaoDao;
import br.jus.tjpe.infosistelecom.dao.RamalDao;
import br.jus.tjpe.infosistelecom.factory.OrgaoDaoFactory;
import br.jus.tjpe.infosistelecom.factory.RamalDaoFactory;
import br.jus.tjpe.infosistelecom.modelo.Ramal;
import java.io.Serializable;
import java.util.ArrayList;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import org.primefaces.event.NodeCollapseEvent;
import org.primefaces.event.NodeExpandEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
@ManagedBean
@RequestScoped
public class RelatorioBean implements Serializable {
private ArrayList<Ramal> ramais;
private ArrayList<String> cidades;
private String[] selectedCidades;
private TreeNode root = new DefaultTreeNode("Root Node", null);;
private boolean polo;
private String teste;
public String getTeste() {
return teste;
}
public void setTeste(String teste) {
this.teste = teste;
}
public boolean getPolo() {
return polo;
}
public void setPolo(boolean polo) {
this.polo = polo;
}
public String[] getSelectedCidades() {
return selectedCidades;
}
public void setSelectedCidades(String[] selectedCidades) {
this.selectedCidades = selectedCidades;
}
public ArrayList<String> getCidades() {
return cidades;
}
public void setCidades(ArrayList<String> cidades) {
this.cidades = cidades;
}
public TreeNode getRaiz() {
return root;
}
public void setRaiz(TreeNode raiz) {
this.root = raiz;
}
public ArrayList<Ramal> getRamais() {
return ramais;
}
public void setRamais(ArrayList<Ramal> ramais) {
this.ramais = ramais;
}
@PostConstruct
public void init() {
cidades = new ArrayList<String>();
OrgaoDao daoOrgao = OrgaoDaoFactory.createOrgaoDao();
cidades = daoOrgao.listarCidades();
// ramais = new ArrayList<Ramal>();
// RamalDao daoRamal = RamalDaoFactory.createRamalDao();
// ramais = daoRamal.listarTudo();
// DefaultTreeNode no = new DefaultTreeNode("hgshdgs", this.root);
// DefaultTreeNode no1 = new DefaultTreeNode("hgssdsdshdgs", this.root);
// DefaultTreeNode no2 = new DefaultTreeNode("hgshdnjhsdghjdagjhggs", no1);
// DefaultTreeNode no3 = new DefaultTreeNode("hgshdnjhsdghjdagjhggs", this.root);
// DefaultTreeNode no24= new DefaultTreeNode("hgshdnjhsdghjdagjhggs", no3);
}
public void montarRaiz() {
//System.out.println("diuyfuidyfuidyfuidy");
// root = new DefaultTreeNode("Root Node", null);
// ramais = new ArrayList<Ramal>();
// RamalDao daoRamal = RamalDaoFactory.createRamalDao();
// ramais = daoRamal.listarTudo();
// DefaultTreeNode no = new DefaultTreeNode(ramais.get(0), raiz);
// DefaultTreeNode no1 = new DefaultTreeNode(ramais.get(1), raiz);
//
// for (Ramal ramal : ramais) {
//
// new DefaultTreeNode(ramal, this.root);
//
// }
//
DefaultTreeNode no = new DefaultTreeNode("hgshdgs", this.root);
DefaultTreeNode no1 = new DefaultTreeNode("hgssdsdshdgs", this.root);
DefaultTreeNode no2 = new DefaultTreeNode("hgshdnjhsdghjdagjhggs", no1);
DefaultTreeNode no3 = new DefaultTreeNode("hgshdnjhsdghjdagjhggs", this.root);
DefaultTreeNode no24= new DefaultTreeNode("hgshdnjhsdghjdagjhggs", no3);
// System.out.println(selectedCidades[0]);
// System.out.println(selectedCidades[1]);
}
}
我确实尝试过解决它,但没有成功。
尝试将 ManagedBean 的范围更改为 @ViewScoped
(BalusC discussing scopes) 由于此 bean 当前定义为 @RequestScoped
,每个请求都会创建和销毁一个新实例。我只是在这里猜测,但是当您的 commandButton 通过 ajax 发布时,JSF 意识到它必须在 "RESTORE_VIEW" 阶段重建 ManagedBean,但是这个 不知何故 没有实际上并没有调用构造函数,因为它正在处理 ajax 请求。尽管如此,根据您的发现,JSF 必须 在此 "RESTORE_VIEW" 阶段调用 @PostConstruct
方法,无论请求是否为 ajax .
也就是说,treeTable从页面上消失了,因为当时服务器端不存在它。
我正在 Liferay 中使用 Primefaces 开发一个应用程序,我需要使用 p:treeTable 组件,碰巧点击 p:commandButton 时节点消失了。我相信它与ajax有关,如果将代码放在@PostConstruct的managedBean中,它可以正常工作
这是我的 .xhtml
<h:body>
<h:form id="form">
<p:layout style="min-width:1050px;height:700px" styleClass="semBorda">
<p:layoutUnit position="west" size="900" minSize="40" maxSize="310"
styleClass="semBorda">
<p:panelGrid columns="2" style="width:300px">
<f:facet name="header">
<h:outputText value="Campos" />
</f:facet>
<h:outputText value="Cidade" />
<p:selectCheckboxMenu value="#{relatorioBean.selectedCidades}"
label="Cidades" filter="true">
<f:selectItems value="#{relatorioBean.cidades}" />
</p:selectCheckboxMenu>
<!-- <h:outputText value="Ramal" /> -->
<!-- <p:selectBooleanCheckbox value="" /> -->
<!-- <h:outputText value="Tipo de Ramal" /> -->
<!-- <p:selectBooleanCheckbox value="" /> -->
<!-- <h:outputText value="Suborgao" /> -->
<!-- <p:selectBooleanCheckbox value="" /> -->
<!-- <h:outputText value="Situação" /> -->
<!-- <p:selectBooleanCheckbox value="" /> -->
<h:outputText value="Polo" />
<p:selectBooleanCheckbox value="#{relatorioBean.polo}" />
<!-- <h:outputText value="Categoria Diurna" /> -->
<!-- <p:selectBooleanCheckbox value="" /> -->
<!-- <h:outputText value="Categoria Noturna" /> -->
<!-- <p:selectBooleanCheckbox value="" /> -->
<h:outputText value="Teste" />
<p:inputText value="#{relatorioBean.teste}" />
</p:panelGrid>
<p:panelGrid columns="1" style="margin-left:200px; margin-top:10px">
<p:commandButton actionListener="#{relatorioBean.montarRaiz}"
value="Consultar" update="tree" styleClass="semB" />
</p:panelGrid>
</p:layoutUnit>
<p:layoutUnit position="center" styleClass="">
<p:treeTable value="#{relatorioBean.raiz}" var="ramal" id="tree">
<p:column headerText="Name">
<h:outputText value="#{ramal}" />
</p:column>
</p:treeTable>
</p:layoutUnit>
</p:layout>
</h:form>
</h:body>
我的 managedBean
package br.jus.tjpe.infosistelecom.controle;
import br.jus.tjpe.infosistelecom.dao.OrgaoDao;
import br.jus.tjpe.infosistelecom.dao.RamalDao;
import br.jus.tjpe.infosistelecom.factory.OrgaoDaoFactory;
import br.jus.tjpe.infosistelecom.factory.RamalDaoFactory;
import br.jus.tjpe.infosistelecom.modelo.Ramal;
import java.io.Serializable;
import java.util.ArrayList;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import org.primefaces.event.NodeCollapseEvent;
import org.primefaces.event.NodeExpandEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
@ManagedBean
@RequestScoped
public class RelatorioBean implements Serializable {
private ArrayList<Ramal> ramais;
private ArrayList<String> cidades;
private String[] selectedCidades;
private TreeNode root = new DefaultTreeNode("Root Node", null);;
private boolean polo;
private String teste;
public String getTeste() {
return teste;
}
public void setTeste(String teste) {
this.teste = teste;
}
public boolean getPolo() {
return polo;
}
public void setPolo(boolean polo) {
this.polo = polo;
}
public String[] getSelectedCidades() {
return selectedCidades;
}
public void setSelectedCidades(String[] selectedCidades) {
this.selectedCidades = selectedCidades;
}
public ArrayList<String> getCidades() {
return cidades;
}
public void setCidades(ArrayList<String> cidades) {
this.cidades = cidades;
}
public TreeNode getRaiz() {
return root;
}
public void setRaiz(TreeNode raiz) {
this.root = raiz;
}
public ArrayList<Ramal> getRamais() {
return ramais;
}
public void setRamais(ArrayList<Ramal> ramais) {
this.ramais = ramais;
}
@PostConstruct
public void init() {
cidades = new ArrayList<String>();
OrgaoDao daoOrgao = OrgaoDaoFactory.createOrgaoDao();
cidades = daoOrgao.listarCidades();
// ramais = new ArrayList<Ramal>();
// RamalDao daoRamal = RamalDaoFactory.createRamalDao();
// ramais = daoRamal.listarTudo();
// DefaultTreeNode no = new DefaultTreeNode("hgshdgs", this.root);
// DefaultTreeNode no1 = new DefaultTreeNode("hgssdsdshdgs", this.root);
// DefaultTreeNode no2 = new DefaultTreeNode("hgshdnjhsdghjdagjhggs", no1);
// DefaultTreeNode no3 = new DefaultTreeNode("hgshdnjhsdghjdagjhggs", this.root);
// DefaultTreeNode no24= new DefaultTreeNode("hgshdnjhsdghjdagjhggs", no3);
}
public void montarRaiz() {
//System.out.println("diuyfuidyfuidyfuidy");
// root = new DefaultTreeNode("Root Node", null);
// ramais = new ArrayList<Ramal>();
// RamalDao daoRamal = RamalDaoFactory.createRamalDao();
// ramais = daoRamal.listarTudo();
// DefaultTreeNode no = new DefaultTreeNode(ramais.get(0), raiz);
// DefaultTreeNode no1 = new DefaultTreeNode(ramais.get(1), raiz);
//
// for (Ramal ramal : ramais) {
//
// new DefaultTreeNode(ramal, this.root);
//
// }
//
DefaultTreeNode no = new DefaultTreeNode("hgshdgs", this.root);
DefaultTreeNode no1 = new DefaultTreeNode("hgssdsdshdgs", this.root);
DefaultTreeNode no2 = new DefaultTreeNode("hgshdnjhsdghjdagjhggs", no1);
DefaultTreeNode no3 = new DefaultTreeNode("hgshdnjhsdghjdagjhggs", this.root);
DefaultTreeNode no24= new DefaultTreeNode("hgshdnjhsdghjdagjhggs", no3);
// System.out.println(selectedCidades[0]);
// System.out.println(selectedCidades[1]);
}
}
我确实尝试过解决它,但没有成功。
尝试将 ManagedBean 的范围更改为 @ViewScoped
(BalusC discussing scopes) 由于此 bean 当前定义为 @RequestScoped
,每个请求都会创建和销毁一个新实例。我只是在这里猜测,但是当您的 commandButton 通过 ajax 发布时,JSF 意识到它必须在 "RESTORE_VIEW" 阶段重建 ManagedBean,但是这个 不知何故 没有实际上并没有调用构造函数,因为它正在处理 ajax 请求。尽管如此,根据您的发现,JSF 必须 在此 "RESTORE_VIEW" 阶段调用 @PostConstruct
方法,无论请求是否为 ajax .
也就是说,treeTable从页面上消失了,因为当时服务器端不存在它。