`
minnanlin88
  • 浏览: 27943 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

JSF树动态加载数据的实现

    博客分类:
  • JSF
阅读更多

      使用t:tree2(x:tree2同)可以帮我们完成树的展现,但是对于数据量较大(如超过1万条)的树,一次性加载到客户端将很慢,因此通常做法是(这里举例银行机构)初次读取总行及一级分行,当用户想查看某一分行(如浙江行)所辖的二级分行时,再取出浙江行所辖的二级行,这个过程读取和传送的数据量是很小的。

      但是t:tree2本身不提供动态加载数据的功能,而且由于程序员无法捕捉点击+及-事件。但是我们可以试着通过替换树的+和-,并使用自己的+和-以捕捉到用户的请求。具体做法如下:

注意:需要使用x:saveState保存树的状态    

<x:tree2  value="#{deptTreeBean.deptRoot}" id="client-tree" var="node"
   varNodeToggler="t" clientSideToggle="false" showNav="false"
    showLines="false" showRootNode="false">
 <f:facet name="DEPT">
  <h:panelGroup>
   <f:facet name="expand">
   </f:facet>
   <f:facet name="collapse">
   </f:facet>
     <h:panelGrid columns="3" id="panel">
      <h:commandLink immediate="true" onclick="getId(this.id);" action="#{t.toggleExpanded}"
        rendered="#{!t.nodeExpanded && node.haschild}" actionListener="#{deptTreeBean.findSubUnitBySuperUnitId}">
                 <x:updateActionListener property ="#{deptTreeBean.superUnitTreeNode}" value="#{node}" />
                 <x:graphicImage value="/images/nav-plus.gif" border="0"/>
            </h:commandLink>
            <h:commandLink immediate="true" onclick="getId(this.id);" action="#{t.toggleExpanded}" rendered="#{t.nodeExpanded && node.haschild}">
                 <x:graphicImage value="/images/nav-minus.gif" border="0"/>
            </h:commandLink>
           
            <h:outputText value="" rendered="#{!node.haschild}" style="width:19px"/>
            <h:panelGroup>
                 <h:commandLink id="link" value=""/>

                 <h:outputText value="#{node.description}" />
             </h:panelGroup>
     </h:panelGrid>
  </h:panelGroup>
 </f:facet>
</x:tree2>

 

如上面代码所示,属性showNav=false时,系统不显示+和-(收缩图标),然后,我们自己将图标放上去,并捕捉点击事件即可。蓝色部分的代码是为了保证子节点相对于父节点有缩进,使得树形结构清晰。

     对应的backingbean代码示例如下:

 

     其中:UnitTreeNode 需要extends TreeNodeBase,且至少增加两个属性:(1)、added属性:boolean,表示该节点是否已经在加载过其子节点。(2)、haschild属性:boolean ,表示是否有子节点

 

 

 /**
 * 部门单选树
 *
 * @author minnanlin88
 *
 */
public class DeptTreeBean extends BaseBean {

 // 部门树根节点
 private UnitTreeNode deptRoot;

 // 点中的节点
 private UnitTreeNode superUnitTreeNode;

 

 

 

  /*  其它代码略 */

 

 

  /**
  * 监听事件:当有节点被展开时,取该节点的所有直接下级子节点
  */
 public String findSubUnitBySuperUnitId(ActionEvent e) {
  try {
   if (superUnitTreeNode != null) {
    // 已经加载过了,不去去数据库
    if (superUnitTreeNode.isAdded()) {
     return null;
    }
   }
   String currDeptId = superUnitTreeNode.getIdentifier().trim();
   // 找到直接下级
   List juniorOrgs = yourService.getDirectSubOrg(
     currDeptId);
   if (juniorOrgs != null && !juniorOrgs.isEmpty()) {
    // 根据需要进行排序
    UnitComparator com = new UnitComparator();
    Collections.sort(juniorOrgs, com);

   

    // 遍历,并将子节点加进来

    Iterator it = juniorOrgs.iterator();

     while (it.hasNext()) {
     Unit unit = (Unit) it.next();
       UnitTreeNode treeNode = new UnitTreeNode("DEPT", unit
        .getUnitId(), unit.getUnitName(), false, "");

      // 置刚加进来的子节点的added值为false,表示他们都没有加载子节点
      treeNode.setAdded(false);
      int sub_count= yourservices.getAllSubCount(unit.getUnitId());
      if (sub_count=0)
       treeNode.setHaschild(false);
      else
       treeNode.setHaschild(true);

     // 添加子节点到树的数据模型中
      this.superUnitTreeNode.getChildren().add(treeNode);

     // 置当前节点已加载过子节点
      this.superUnitTreeNode.setAdded(true);

    }
   }

   if (this.superUnitTreeNode.getChildCount() == 0) {
    this.superUnitTreeNode.setHaschild(false);
   }
  } catch (Exception ex) {
   this.handleException(ex);
  }
  return null;
 } 

}

 

      【另】由于点击后,页面刷新,所以往往在查看位置处在比较底下的分行的所辖二级行时,页面一旦刷新,用户不能定位到该分行,还要再次寻找,造成使用上的不便,因此建议加上自动定位功能(或使用ajax,未验证,不知道可否),这里采用的是再每个节点增加一个链接,点击节点时记录该节点的位置,刷新完后,系统自动重新找到该节点并显示。做法是:

在节点前加上<h:commandLink id="link" value=""/> 系统自动点击link即可定位到该节点,onclick="getId(this.id);"  的作用就是取得节点的位置,存放在隐藏域里。

 

   页面加载时执行init()方法:

   function init()
  {
      // 自动定位
      var pre_id=document.getElementById("form1:id").value;
      document.getElementById("goto2").href="#"+pre_id+":link";
      document.getElementById("goto2").click();

  }

 

   // 获取ID的前缀,由于JSF的render所产生的id是有规律可循的,如当前树节点的ID是

   //  form1:client-tree:_id25:_id01那么,在其前面的链接link的ID必然为form1:client-tree:_id25:link

  

  function getId(str)
  {
      var arr=str.split(":");
      var newstr="";
      if(arr.length>1)
      {
       for(var i=0;i<arr.length-1;i++)
       {
        if(i==0)
         newstr=arr[i];
        else
            newstr+=":"+arr[i];
       }
      }
      document.getElementById("form1:id").value=newstr;
  }

2
0
分享到:
评论

相关推荐

    PrimeFaces学习教程

    2.12.8 Resizable 给任何JSF组件添加可调整大小的行为。 74 2.12.9 RequestContext : 75 3 TouchFaces 76 3.1.1 移动UI工具 76 3.1.2 Ajax Push/Comet 77 3.1.3 几分钟实现聊天应用: 78 4 附录 79 4.1 全部UI组件...

    JAVA上百实例源码以及开源项目源代码

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java开源包3

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包4

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    JAVA程序开发大全---上半部分

    7.2.8 编辑和清除数据表中的数据 112 7.2.9 创建和删除数据表 112 7.2.10 创建和删除外键 113 7.2.11 自动生成SQL语句 113 7.3 JDBC应用实例:登录系统 114 7.4 本章小结 116 第8章 Struts框架的开发及应用 117 8.1 ...

    Xpage学习笔记

    但是,如果要将拖放的结果保存起来,也就是说要改变树的模型并将模型数据保存,那么应该编写onDndDrop的处理函数(通过增加jsId获得dndController会出现this.avaria is null 错误,所以下面通过小部件初始化时将...

    java开源包1

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    JAVA上百实例源码以及开源项目

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java开源包11

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包2

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包6

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包5

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包10

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包8

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包7

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包9

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    Java经典入门教程pdf完整版

    就是JSF。 2:Java微缩版:JME( Java Micro edition) JE(Java, Micro edition)是对标准版JSE进行功能缩减后的版本,于199年6月 由 Sun Microsystems第一次推向Java团体。它是一项能更好满足Java开发人员不同需求 的广泛...

Global site tag (gtag.js) - Google Analytics