我有primefaces p:tree元素。在我的支持bean中,我有一个字段' root'它拥有所有的树形结构。我填充了这个' root' init方法中的字段,使用@PostConstruct注释进行注释。当我执行一些CRUD操作时,例如向树中添加新元素并提交表单,页面不会更新新信息。 JSF bean是@ViewScoped。问题是,p:tree的getter在页面刷新后被调用,但我不能将更新逻辑放在那里,因为它是非常昂贵的DB操作,并且getter在JSF生命周期中被调用太多次。 init方法只调用一次,不更新树结构。即使我制作bean @RequestScope,它也无法解决问题。首先调用@PostConstruct方法,然后调用数据库方法addCategory(),然后呈现具有旧信息的树。 @RequestScope只是让一切变得缓慢,就像在UI中选择树节点一样。我怎样才能解决这个问题,最好不要使用ajax?我正在使用JSF 2.2和Primefaces。我想这不是JSF的行为,而且我的项目配置可能有问题吗?
豆:
@ManagedBean(name="menuBean")
@ViewScoped
public class MenuBean {
private TreeNode root;
private TreeNode selectedNode;
private UiElement category = new CategoryElement();
@PostConstruct
public void init() {
root = new DefaultTreeNode("root", null);
List<UiElement> rootElements = menuElementDao.getRootElements();
for (UiElement element : rootElements) {
if (element.isActive() || admin) {
createNodeWithChildren(element, root, admin);
}
}
}
public void addCategory() {
if (selectedNode != null) {
category.setParent((UiElement) selectedNode.getData());
}
menuElementDao.addElement(category);
category.clear();
}
public void setRoot(TreeNode root) {
this.root = root;
}
public TreeNode getRoot() {
return root;
}
}
的index.xhtml:
<h:form id="categoryForm">
<h:panelGrid id="categoryFormGrid" columns="2" style="border:1px solid black" styleClass="controlVisibility">
<h:outputLabel for="categoryName" value="Category name: "/>
<h:inputText id="categoryName" value="#{menuBean.category.name}">
<p:ajax/>
</h:inputText>
<h:commandButton value="Add Category" action="#{menuBean.addCategory()}"/>
<h:outputText/>
</h:panelGrid>
</h:form>
<h:form>
<p:tree value="#{menuBean.root}" var="node" selectionMode="single" selection="#{menuBean.selectedNode}" dynamic="true">
<p:ajax event="select" update="controlButtons"/>
<p:ajax event="unselect" update="controlButtons"/>
<p:treeNode>
<h:outputText value="#{node.render()}"/>
</p:treeNode>
</p:tree>
</h:form>