实现E3树形结构的总结

tcgjz 2009-06-16
说明:
   我从我业务角度出发总结下我实现E3树形结构的过程和步骤,到最后我在总结下我在此过程碰到的问题。我实现的是复选框样式。

-------------------------------------------------操作步骤开始------------------------------------------------------------------
   步骤一:

   找到e3最新jar包
    1.从http://e3.group.iteye.com/ 中找到 “E3样例下载” 此事列中找到e3.jar包
    2.或者通过加入 E3平台联盟③群 群号63787587 在其群共享里找最新e3.jar包。
    下载最新e3.jar包后 添加到工程lib文件夹下。

   步骤二: 配置web.xml文件
    
   把下面配置加入到 web.xml文件中(此处是根据E3平台联盟1群黄小勇的帮助下得到的)

        <filter>
<filter-name>e3/resource</filter-name>
<filter-class>
net.jcreate.e3.resource.impl.ResourceFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>e3/resource</filter-name>
<url-pattern>/e3/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>e3/resource</filter-name>
<url-pattern>/net/jcreate/e3/*</url-pattern>
</filter-mapping>


    步骤三: 创建业务对象

       public class DistributeOrgsInfor {

/**
* 这个ID 复选框的values值
*/
private String id;
/**
* (父亲id)根目录此属性应该为空
*/
private String parentid;
/**
* 页面显示项
*/
private String name;


public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getParentid() {
return parentid;
}
public void setParentid(String parentid) {
this.parentid = parentid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

}

  步骤三: 创建Dao得到树形结构的数据

       public class DistributeStrategyDao
       {
       private void rs2Bean(ResultSet rs, DistributeOrgsInfor dispatch)
throws java.sql.SQLException {
if (dispatch == null) {
return;
}
dispatch.setId(rs.getString("id"));// 节点ID
dispatch.setParentid(rs.getString("parentid"));// 父节点id
dispatch.setName(rs.getString("name"));// 名称
      }
        (说明:下面的说明我只把和e3树形结构有关系的代码留下,无关紧要我都省略了)
public static List getOrgs() {
List result = new ArrayList();
String sql = " select  v.A as id,v.B as parentid,v.C as name from  XXXX表 v "

  ..................此处代码省略...........................
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
DistributeOrgsInfor dispatch = new DistributeOrgsInfor();
rs2Bean(rs, dispatch);
result.add(dispatch);
}
} catch (Exception e) {
  .....省略 ......
} finally {
try {
.....省略 ......

} catch (SQLException e) {

.....省略 ......
}

}
return result;
}

       }

      步骤四: 创建action,以及在action中如何调用e3的api
        (说明:此action 我用的struts2)

      --------------代码开始----------------------
      package 此action的包路径;
     
      import ----一系列e3包和相关对象包--------
    
       public class TreeAction extends ActionSupport
       {
         private List orgs = new ArrayList();// 存放树形组织结构信息
         public List getOrgs() {
return orgs;
}
public void setOrgs(List orgs) {
this.orgs = orgs;
}
//此方法和展现树形结构的访问路径有关系,等我在说明访问路径你会看到
        public String index(){
this.showTree;
return "success";
}
       
        public void showTree(List list,List orgs,final String name)
{
                List list=DistributeStrategyDao.getOrgs();//得到dao中树形结构数据

HttpServletRequest pRequest = ServletActionContext.getRequest();
              //-----------------这里是我根据我的业务要求来处理下根目录--------------------------------
for(int i=0;i<list.size();i++){
DistributeOrgsInfor dispatch=new DistributeOrgsInfor();
dispatch=(DistributeOrgsInfor)list.get(i);
if(dispatch.getName().equals("根目录名称")){//如果是根目录 此为根目录,父亲节点应该设置为空
dispatch.setParentid(null);//null所以此节点应该设置为空;
}
orgs.add(dispatch);
}
               //------------------------------------------------------

//业务数据解码器,从业务数据中分解出id和parentid
UserDataUncoder orgUncoder = new UserDataUncoder(){
public Object getID(Object pUserData) throws UncodeException {
DistributeOrgsInfor dispatch = (DistributeOrgsInfor)pUserData;
return dispatch.getId();
}
public Object getParentID(Object pUserData) throws UncodeException {
DistributeOrgsInfor dispatch = (DistributeOrgsInfor)pUserData;
return dispatch.getParentid();
}
};

//Tree模型构造器,用于生成树模型
AbstractWebTreeModelCreator treeModelCreator =
new AbstractWebTreeModelCreator(){
//该方法负责将业务数据映射到树型节点
protected Node createNode(Object pUserData, UserDataUncoder pUncoder) {
DistributeOrgsInfor dispatch = (DistributeOrgsInfor)pUserData;
WebTreeNode result = new WebTreeNode(dispatch.getName(), "dispatch" + dispatch.getId());
//下面注销掉的是手动设置节点图片和展开节点图片
//result.setIcon(this.getUrl("e3/tree/xtree/images/foldericon.png"));
//result.setOpenIcon(this.getUrl("/e3/tree/xtree/images/openfoldericon.png"));

result.setValue(dispatch.getId());
//action是点击按纽执行的方法.可以是url,或者javascript函数
result.setAction("javascript:alert(' " + dispatch.getName() + "')");
return result;
}
};
treeModelCreator.init(pRequest);

TreeModel treeModel = treeModelCreator.create(orgs,orgUncoder);
TreeDirector director = new DefaultTreeDirector();//构造树导向器
//WebTreeBuilder treeBuilder = new CheckXTreeBuilder();//构造树Builder
PrvCheckXTreeBuilder treeBuilder = new PrvCheckXTreeBuilder();
treeBuilder.init(pRequest);
director.build(treeModel, treeBuilder);//执行构造
String treeScript = treeBuilder.getTreeScript();//获取构造树的脚本
pRequest.setAttribute("treeScript", treeScript);//保存到request,以便页面使用
}
       }


步骤五: 创建jsp--tree.jsp
       
<%@ page contentType="text/html; charset=utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<script>

function openURL(pURL){
parent.rightFrame.location.href = pURL;
}
function showSelectedNode(){
alert(getCheckValues());//得到选中的值
(说明:getCheckValues()方法得到的不是一个组合字符串而是一个数组这里一定要注意,
我一开始迷糊了后来在黄云辉的帮助下终于明白了,这里就不多说了,我在出现的问题中会仔细说明下)
}
</script>

<HEAD>
<META http-equiv=Content-Type content="text/html; charset=utf-8">

</HEAD>
<BODY> 
<input type="button" value="确定" onclick="showSelectedNode()"/>
<%= request.getAttribute("treeScript") %>//此处是显示树形结构的代码
</BODY>
</HTML>

步骤六: 设置访问路径在struts.xml中
     <action name="showTree_*"  method="{1}" class="----路径省略------------.TreeAction">
            <result name="success">
                --路径省略--/tree.jsp
            </result>
        </action>
 
步骤七: 访问路径
      http://127.0.0.1:8080/工程名/showTree_index.action
      (此index即就是我在action中为什么要index方法的原因,便于访问时找到访问action中的那个方法)

------------------------------操作步骤开始结束
huangyh 2009-06-17
谢谢 分享
linkboyhot 2009-07-22
对于卡片树,如果服务器比较慢,连续点击节点,页面被锁住,不知道是怎么回事(在IE6.0上)。
复选框树是不是不能自定义图标,因为定义的图标的路径显示的是绝对路径,并且在有些机器上看不到图标。
huangyh 2009-08-16
卡片树把动画效果禁用应该会好些,builder.setAnimal(false);
自定义图标肯定可以,自己参考样例处理
刘盼盼 2009-08-21
怎么没有右键菜单的操作哦?
sunshineparasol 2010-04-19
ok,好了
sunshineparasol 2010-04-19
ok,好了!!
tcgjz 2010-08-11
没事我再回来看看
tcgjz 2010-08-11
Global site tag (gtag.js) - Google Analytics