此DEMO 建立在 Struts +Hibernate
建立2张表 person ,department


定义2个类 person.java ,department.java
建立person.hbm.xml , department.hbm.xml
department.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.bkx.oa.vo.Department" table="department" catalog="bkxoa">
<id name="deptid" type="java.lang.Integer">
<column name="deptid" />
<generator class="native"></generator>
</id>
<property name="dparentid" type="java.lang.Integer">
<column name="dparentid" />
</property>
<property name="dleaf" type="java.lang.Integer">
<column name="dleaf" />
</property>
<property name="dchild" type="java.lang.Integer">
<column name="dchild" />
</property>
<property name="dname" type="java.lang.String">
<column name="dname" length="32" />
</property>
<property name="dloc" type="java.lang.String">
<column name="dloc" length="32" />
</property>
<property name="dbusiness" type="java.lang.String">
<column name="dbusiness" length="32" />
</property>
<set name="persons" inverse="true" cascade="all" lazy="false">
<key>
<column name="deptid" />
</key>
<one-to-many class="com.bkx.oa.vo.Person" />
</set>
</class>
</hibernate-mapping>
person
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.bkx.oa.vo.Person" table="person" catalog="bkxoa">
<id name="pid" type="java.lang.String">
<column name="pid" length="32" />
<generator class="assigned"></generator>
</id>
<many-to-one name="department" class="com.bkx.oa.vo.Department">
<column name="deptid" />
</many-to-one>
<property name="pname" type="java.lang.String">
<column name="pname" length="32" />
</property>
<property name="page" type="java.lang.Integer">
<column name="page" />
</property>
<property name="psex" type="java.lang.String">
<column name="psex" length="4" />
</property>
</class>
</hibernate-mapping>
建立一个Action OrgTreeJsonDataAction
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.bkx.oa.struts.action;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.bkx.oa.factory.DaoFactory;
import com.bkx.oa.vo.Department;
import com.bkx.oa.vo.Person;
/**
* MyEclipse Struts
* Creation date: 11-01-2008
*
* XDoclet definition:
* @struts.action validate="true"
*/
public class OrgTreeJsonDataAction extends Action {
/*
* Generated Methods
*/
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
private String JosnString;
private String person;
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
int parentid = Integer.parseInt(request.getParameter("parentid"));
try {
if(parentid==-100){
parentid=0;
}
List<Department> list = DaoFactory.getDepartmentInstance().queryByDeptid(parentid);
Iterator<Department> iter = list.iterator();
if (list != null && !list.isEmpty()) {
int i = 0;
int last = list.size();
String person = "";
while (iter.hasNext()) {
Department de = new Department();
de = iter.next();
if(de.getPersons().size()>0){
person=" ,"+this.getPersonname(de.getPersons());
}
//如果只有一行
if(last==1){
this.setJosnString("[{\"text\" :\""
+ de.getDname().toString()
+ "\" ,\"id\" :\"" + de.getDeptid()
+ "\" ,\"cls\" :\"folder\"" +
person+ "}] ");
//如果有多行显示第一行
}else if (i == 0) {
this.setJosnString("[{\"text\" :\""
+ de.getDname().toString()
+ "\" ,\"id\" :\"" + de.getDeptid()
+ "\" ,\"cls\" :\"folder\"" +
person+ "} ");
//判断是不是最后一行
} else if (i == (last - 1)) {
this.setJosnString(this.getJosnString()
+ ",{\"text\" :\""
+ de.getDname().toString()
+ "\" ,\"id\" :\""
+ de.getDeptid() + "\" ,\"cls\" :\"folder\"" +
person+ "}]");
//显示中间部分
} else {
this.setJosnString(this.getJosnString()
+ ",{\"text\" :\""
+ de.getDname().toString()
+ "\" ,\"id\" :\""
+ de.getDeptid() + "\" ,\"cls\" :\"folder\"" +
person+ "}");
}
i++;
}
} else {
this.setJosnString("");
}
//System.out.print(this.getJosnString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.print(this.getJosnString());
request.setAttribute("treenote", this.getJosnString());
return mapping.findForward("tree");
}
public String getPersonname(Set<Person> p){
this.setPerson(" ");
if(p!=null&& !p.isEmpty()){
Iterator<Person> iter = p.iterator();
int i=0;
int last = p.size();
while(iter.hasNext()){
Person person = new Person();
person =iter.next();
if(last==1){
this.setPerson(this.getPerson()+"\"children\" :[{\"text\" :\""+person.getPname()+"\" ,\"id\" :\""+person.getPid()+"\" ,\"leaf\" :\"true\"}] ");
}else if(i==0){
this.setPerson(this.getPerson()+"\"children\" :[{\"text\" :\""+person.getPname()+"\" ,\"id\" :\""+person.getPid()+"\" ,\"leaf\" :\"true\"}");
}else if(i==last-1){
this.setPerson(this.getPerson()+",{\"text\" :\""+person.getPname()+"\" ,\"id\" :\""+person.getPid()+"\" ,\"leaf\" :\"true\"}] ");
}else {
this.setPerson(this.getPerson()+",{\"text\" :\""+person.getPname()+"\" ,\"id\" :\""+person.getPid()+"\" ,\"leaf\" :\"true\"}");
}
i++;
}
}else{
this.setPerson("");
}
return this.getPerson();
}
public String getJosnString() {
return JosnString;
}
public void setJosnString(String josnString) {
JosnString = josnString;
}
public String getPerson() {
return person;
}
public void setPerson(String person) {
this.person = person;
}
}
建立一个JS文件
Ext.onReady(function() {
var Tree = Ext.tree;
var tree = new Tree.TreePanel( {
el : 'tree-div',//目标div容器
autoScroll : true,
animate : true,
enableDD : true,
containerScroll : true,
loader : new Tree.TreeLoader( {
dataUrl : 'orgTreeJsonData.do'// OrgTreeJsonData.action就是要动态载入数据的请求地址,这里请求时会提交一个参数为node的值,值为root即new Tree.AsyncTreeNode()对象的id值
})
});
var root = new Tree.AsyncTreeNode( {
text : '组织机构树',
draggable : false,
id : '-100'//默认的node值:?node=-100
});
tree.setRootNode(root);
tree.on('beforeload', function(node){
tree.loader.dataUrl = 'orgTreeJsonData.do?parentid='+node.id;
});
tree.setRootNode(root);
//为树上的节点添加事件
tree.on('click',function(node){
Ext.Msg.alert(' 您点击的是: ',node.text);
});
tree.render();
root.expand();
});
Struts-config.xml

建立一个HTML页面
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" />
<script type="text/javascript" src="ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext/js/ext-all.js"></script>
<script type="text/javascript" src="org.js"></script>
</HEAD>
<BODY>
<div id="tree-div" style="overflow:auto; height:350px;width:300px;border:2px solid #c3daf9;"></div>
</BODY>
</HTML>
最后结果

本文介绍如何使用Struts和Hibernate搭建一个组织结构树应用,包括定义部门和个人类,配置Hibernate映射文件,创建Struts Action处理JSON数据,并通过Ext JS实现前端树状展示。

1911

被折叠的 条评论
为什么被折叠?



