数据库操作后如何更新JSF页面?

时间:2016-11-09 20:45:19

标签: jsf primefaces jsf-2.2

我有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>

0 个答案:

没有答案