欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最简单的richfaces tree使用方式

程序员文章站 2022-07-15 16:38:11
...

richfaces tree提供的示例都是一次全部构造出树,对于节点很多的树来说希望是按需获取,switchType="ajax"只是组件树按需构造,不是树节点按需构造的,需要对TreeNodeImpl的实现进行扩展才能实现树节点的按需构造。

 

 功能特点:

1)业务代码不需要实现TreeNode,只需提供获取业务对象列表方法 loadChild()或 loadAllChild(),方法名是任意的。

2)提供了一次构造树和ajax方式构造树两种方式。

3)提供了树的选择功能。

 

核心代码在seamBasic.jar包中(内附源码),只需将该包放入classpath即可使用。

 

以下是树的使用方式。

 

欢迎交流讨论,qq:351956368

页面

<h:form> 
  <h:selectBooleanCheckbox value="#{tree1.treeChecked}">
   <a4j:support event="onclick" action="#{tree1.clickChecked(tree1.root)}" reRender="treeid" />
  </h:selectBooleanCheckbox>全选
  <rich:tree id="treeid" value="#{tree1.root}" var="var"  treeNodeVar="node"
       adviseNodeOpened="#{tree1.adviseAllNodeSelected}" switchType="ajax">
     <rich:treeNode>
     <h:selectBooleanCheckbox value="#{tree1.checkedNodes[var]}">
      <a4j:support event="onclick" action="#{tree1.clickChecked(node)}" reRender="treeid" />
     </h:selectBooleanCheckbox>
     <h:outputText  value="#{var.name}"/>
     </rich:treeNode>
   </rich:tree>
  #{tree1.allChecked.size()}tree1.allChecked获取全部选中的节点
  <br/>
  <h:commandButton />
 </h:form>

在类中使用树对象

@Name("ClassA")

class ClassA{

 

@In TreeComponent tree1;

//获取选中的树节点

public List getAllChecked(){

return tree1.getAllChecked();

}

 

组件定义

<!-- 一次全部构造出树-->

 <component class="seam.basic.richface.tree.TreeComponent" name="tree1" scope="conversation">
  <property name="loadAllNodesFlag">true</property>
  <property name="loadAllMethod">#{tableDAO.loadAllChild}</property>
 </component>
<!-- 按需构造-->
 <component class="seam.basic.richface.tree.TreeComponent" name="tree1" scope="conversation">
  <property name="loadChildMethod">#{tableDAO.loadChild}</property>
 </component>

 

scope可以是任何一种,都能获得同样的效果,但数据查询不同,even作用域每个页面操作都要重新查询,page、conversation、session、application都只需查询一次数据。

数据获取

如果业务对象没有实现TreeNodeIdentifier接口,就要对取得的list进行封装,使得业务对象变成TreeNodeIdentifier。

可以使用代理模式包装业务对象成TreeNodeIdentifier。

@Name("tableDAO")
public class TableDAO {
 @In private EntityManager em;

//按需载入子节点,会被多次调用
 public List<Table1> loadChild(){
  TreeNodeIdentifier node=(TreeNodeIdentifier) Contexts.getEventContext().get(TreeComponent.TreeNodeIdentifierVar);//已由框架在之前设置进去。
  List<Table1> lt;
  if(node==null){//载入顶层节点
   lt=em.createQuery(
              "select t from TableNode t where t.pid=0")
              .getResultList();
   
  }else{//载入指定节点下的子节点
   lt=em.createQuery(
            "select t from TableNode t where t.pid=:pid").setParameter("pid", node.getTreeNodeId())
            .getResultList();
   
  }
  return lt;
 }

 

//获取全部树节点,只被调用一次
 @SuppressWarnings("unchecked")
 public List<TableNode> loadAllChild(){
  //还需要告知这些节点的跟节点是什么
  TableNode top=new TableNode("0","","");//根节点是“0”
  List<TableNode> lt=em.createQuery("select t from TableNode t").getResultList();
  lt.add(0, top);
  return lt;
 }

}

实体对象

节点上绑定的业务对象,需要实现TreeNodeIdentifier接口。

如果不能实现TreeNodeIdentifier接口就要在数据获取层(上面的dao里)封装成TreeNodeIdentifier对象。

@Entity(name="TableNode")
public class TableNode implements TreeNodeIdentifier, Serializable{

 @Id
 @Column
 private String id;
 @Column
 private String pid;
 @Column
 private String name;
 @Column
 private String path;

。。。。。

 @Override
 public Serializable getTreeNodeId() {
  return id;
 }
 @Override
 public Serializable[] treeNodePath() {
  return null;//一般情况下不需要
 }
 @Override
 public Serializable getTreeNodePid() {
  return pid;
 }

  • 最简单的richfaces tree使用方式
            
    
    博客分类: seam richfacesSeamAjaxQQDAO 
  • 大小: 16 KB