Extjs3.2+Json lib动态树与GridPanel简单展现

阅读更多

最近项目中要用到Extjs,网上搜了写文档看了之后,写了个小Demo。

Demo描述:

将部门信息用树展示出来,点击树节点的某个部门之后,弹出一个窗口,该窗口中展示这个部门中员工的列表。

 

首先,到http://www.sencha.com/products/js/download.php下载Extjs3.2的发布包,因为要用到json lib,所以还要到http://sourceforge.net/projects/json-lib/files/json-lib/下载json lib。

 

mysql数据库脚本:

 

view plain copy to clipboard print ?
  1. DROP TABLE IF EXISTS `dept`;  
  2. CREATE TABLE `dept` (  
  3.   `deptno` int(11) NOT NULL AUTO_INCREMENT,  
  4.   `deptname` varchar(255) NOT NULL DEFAULT '',  
  5.   `parentno` int(11) NOT NULL DEFAULT '0',  
  6.   PRIMARY KEY (`deptno`)  
  7. ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;  
  8. LOCK TABLES `dept` WRITE;  
  9. /*!40000 ALTER TABLE `dept` DISABLE KEYS */;  
  10. INSERT INTO `dept` VALUES (1,'管理部',0);  
  11. INSERT INTO `dept` VALUES (2,'销售部',0);  
  12. INSERT INTO `dept` VALUES (3,'人力资源部',0);  
  13. INSERT INTO `dept` VALUES (4,'开发部',0);  
  14. INSERT INTO `dept` VALUES (5,'后勤部',0);  
  15. INSERT INTO `dept` VALUES (6,'软件开发部',4);  
  16. INSERT INTO `dept` VALUES (7,'增值开发部',4);  
  17. INSERT INTO `dept` VALUES (8,'增值销售部',2);  
  18. INSERT INTO `dept` VALUES (9,'产品销售部',2);  
  19. INSERT INTO `dept` VALUES (10,'人妖部',3);  
  20. /*!40000 ALTER TABLE `dept` ENABLE KEYS */;  
  21. UNLOCK TABLES;  
  22. DROP TABLE IF EXISTS `emp`;  
  23. CREATE TABLE `emp` (  
  24.   `empno` int(11) NOT NULL AUTO_INCREMENT,  
  25.   `empname` varchar(255) NOT NULL DEFAULT '',  
  26.   `gender` int(11) NOT NULL DEFAULT '0',  
  27.   `job` varchar(255) NOT NULL DEFAULT '',  
  28.   `deptno` int(11) NOT NULL DEFAULT '0',  
  29.   PRIMARY KEY (`empno`),  
  30.   KEY `fk_deptno` (`deptno`)  
  31. ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;  
  32. LOCK TABLES `emp` WRITE;  
  33. INSERT INTO `emp` VALUES (1,'陈一',1,'staff boss',1);  
  34. INSERT INTO `emp` VALUES (2,'黄二',1,'technical boss',1);  
  35. INSERT INTO `emp` VALUES (3,'张三',0,'human resouce',3);  
  36. INSERT INTO `emp` VALUES (4,'李四',1,'developer leader',6);  
  37. INSERT INTO `emp` VALUES (5,'王五',1,'clerk',10);  
  38. INSERT INTO `emp` VALUES (6,'赵六',1,'clerk',6);  
  39. INSERT INTO `emp` VALUES (7,'钱七',1,'executor',6);  
  40. INSERT INTO `emp` VALUES (8,'孙八',1,'super man',6);  
  41. INSERT INTO `emp` VALUES (9,'方九',0,'oh, god',6);  
  42. INSERT INTO `emp` VALUES (10,'无名氏',0,'无语',6);  
  43. UNLOCK TABLES;  
  44. ALTER TABLE `emp`  
  45. ADD CONSTRAINT `fk_deptno` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`);  

 

 

 

下面建立web工程:

分别新建DeptModel,EmpModel,TreeModel和PageModel

DeptModel.java:

 

view plain copy to clipboard print ?
  1. public class DeptModel {  
  2.     private int deptno;  
  3.     private String deptname;  
  4.     private int parentno;  
  5.          ...  
  6. }  

 

 

EmpModel.java:

 

view plain copy to clipboard print ?
  1. public class EmpModel {  
  2.     private Integer empno;  
  3.     private String empname;  
  4.     private String gender;  
  5.     private String job;  
  6.     private Integer deptno;  
  7.          ...  
  8. }  

 

 

TreeModel.java,用于生成部门树的模型:

 

view plain copy to clipboard print ?
  1. public class TreeModel {  
  2.     private int id;  
  3.     private String text;  
  4.     private boolean leaf;  
  5.     private List children = new ArrayList(0);  
  6.     public TreeModel(){  
  7.           
  8.     }  
  9.     /** 
  10.      * 根据部门列表获取形如 [{id:"",text:"",leaf:,children:[]},{...},...]的JSON字符串 
  11.      * @param models 部门列表List 
  12.      * @return JSON格式的字符串,用于生成ext树 
  13.      */  
  14.     public String getJsonTreeModelString(List models){  
  15.         List lst = new ArrayList(0);  
  16.         for(DeptModel dm : models){  
  17.             if(dm.getParentno()==0){  
  18.                 TreeModel root = new TreeModel();  
  19.                 root.setId(dm.getDeptno());  
  20.                 root.setText(dm.getDeptname());  
  21.                 List children = getChildren(models,root);  //递归获取子集   
  22.                 if(children.size()>0){  
  23.                     root.setLeaf(false);  
  24.                     root.setChildren(children);  
  25.                 }else{  
  26.                     root.setLeaf(true);  
  27.                     root.setChildren(new ArrayList(0));  
  28.                 }  
  29.                 lst.add(root);  
  30.             }  
  31.         }  
  32.         JsonConfig config = new JsonConfig();  
  33.         config.setExcludes(new String[]{"models"});  
  34.         config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);     
  35.         return JSONArray.fromObject(lst,config).toString();  
  36.     }  
  37.     /** 
  38.      * 递归获取节点的子集的方法 
  39.      * @param models 部门列表 
  40.      * @param parentModel 根节点,即deptno=0的根节点部门 
  41.      * @return List 树模型列表 
  42.      */  
  43.     public List getChildren(List models,TreeModel parentModel){  
  44.         List lst = new ArrayList(0);  
  45.         for(DeptModel dm : models){  
  46.             if(parentModel.getId() == dm.getParentno()){  
  47.                 TreeModel tm = new TreeModel();  
  48.                 tm.setId(dm.getDeptno());  
  49.                 tm.setText(dm.getDeptname());  
  50.                 List children = getChildren(models,tm);  
  51.                 if(children.size()>0){  
  52.                     tm.setLeaf(false);  
  53.                     tm.setChildren(children);  
  54.                 }else{  
  55.                     tm.setLeaf(true);  
  56.                     tm.setChildren(new ArrayList(0));  
  57.                 }  
  58.                 lst.add(tm);  
  59.             }  
  60.         }  
  61.         return lst;  
  62.     }  
  63.          //省略getter,setter方法...   
  64. }  

 

 

PageModel.java,用于分页的模型:

 

view plain copy to clipboard print ?
  1. public class PageModel {  
  2.     private int total;  
  3.     private List lst;  
  4.          ...  
  5. }  

 

 

 

下面添加工程对Extjs3.2的支持:

解压ext-3.2.0.zip到某个路径,复制adapter、pkgs、resource文件夹、ext-3.2.0/src/locale/ext-lang-zh_CN.js和ext-3.2.0/ext-all.js到WebRoot/js下面,这样就完成了对Extjs功能的支持。

 

接下来完成从数据库获取部门信息和人员信息并转换成JSON格式:

deptProcessor.jsp:

 

view plain copy to clipboard print ?
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <%@ page import="com.model.TreeModel" %>  
  3. <%@ page import="com.model.DeptModel" %>  
  4. <%@ page import="java.sql.*,java.util.*" %>  
  5.     <%  
  6.         Class.forName("com.mysql.jdbc.Driver");  
  7.         java.sql.Connection conn = java.sql.DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");  
  8.         PreparedStatement pstmt = conn.prepareStatement("select * from dept");  
  9.         ResultSet rs = pstmt.executeQuery();  
  10.         List models = new ArrayList();  
  11.         while(rs.next()){  
  12.             DeptModel model = new DeptModel();  
  13.             model.setDeptno(rs.getInt("deptno"));  
  14.             model.setDeptname(rs.getString("deptname"));  
  15.             model.setParentno(rs.getInt("parentno"));  
  16.             models.add(model);  
  17.         }  
  18.         String jsonTreeModelString = new TreeModel().getJsonTreeModelString(models);  
  19.         out.println(jsonTreeModelString);  
  20.     %>  

 

 

 

empProcessor.jsp:

 

view plain copy to clipboard print ?
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <%@ page import="com.model.EmpModel" %>  
  3. <%@ page import="com.model.PageModel" %>  
  4. <%@ page import="net.sf.json.JSONObject" %>  
  5. <%@ page import="java.sql.*,java.util.*" %>  
  6.     <%  
  7.         Integer deptno = -1;  
  8.         Integer start = 0;  
  9.         Integer limit = 0;  
  10.         if(request.getParameter("deptno") != null){  
  11.             deptno = Integer.parseInt(request.getParameter("deptno").toString());  
  12.         }  
  13.         if(request.getParameter("start") != null){  
  14.             start = Integer.parseInt(request.getParameter("start").toString());  
  15.         }  
  16.         if(request.getParameter("limit") != null){  
  17.             limit = Integer.parseInt(request.getParameter("limit").toString());  
  18.         }  
  19.         Class.forName("com.mysql.jdbc.Driver");  
  20.         java.sql.Connection conn = java.sql.DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");  
  21.         PreparedStatement pstmt = conn.prepareStatement("select * from emp where deptno=? limit ? ,?");  
  22.         pstmt.setInt(1,deptno);  
  23.         pstmt.setInt(2,start);  
  24.         pstmt.setInt(3,limit);  
  25.         ResultSet rs = pstmt.executeQuery();  
  26.         List models = new ArrayList();  
  27.         while(rs.next()){  
  28.             EmpModel model = new EmpModel();  
  29.             model.setEmpno(rs.getInt("empno"));  
  30.             model.setEmpname(rs.getString("empname"));  
  31.             model.setGender(rs.getInt("gender")==1?"男":"女");  
  32.             model.setJob(rs.getString("job"));  
  33.             model.setDeptno(rs.getInt("deptno"));  
  34.             models.add(model);  
  35.         }  
  36.         pstmt = conn.prepareStatement("select count(*) from emp where deptno=?");  
  37.         pstmt.setInt(1,deptno);  
  38.         rs = pstmt.executeQuery();  
  39.         int total = 0;  
  40.         if(rs.next()){  
  41.             total = rs.getInt(1);  
  42.         }  
  43.         PageModel pageModel = new PageModel();  
  44.         pageModel.setTotal(total);  
  45.         pageModel.setLst(models);  
  46.         String jsonEmpModelString = JSONObject.fromObject(pageModel).toString();  
  47.         out.println(jsonEmpModelString);  
  48.     %>  

 

 

 

最后列用Extjs提供的TreePanel和Window,GridPanel分别显示部门和人员信息:

tree.jsp:

 

view plain copy to clipboard print ?
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. "-//W3C//DTD HTML 4.01 Transitional//EN">  
  3.   
  4.     
  5.     Extjs Tree Demo  
  6.     "pragma" content="no-cache">  
  7.     "cache-control" content="no-cache">  
  8.     "expires" content="0">      
  9.     "keywords" content="keyword1,keyword2,keyword3">  
  10.     "description" content="This is my page">  
  11.     "stylesheet" type="text/css" href="js/extjs/resources/css/ext-all.css" mce_href="js/extjs/resources/css/ext-all.css" />  
  12.     "js/extjs/adapter/ext/ext-base.js" mce_src="js/extjs/adapter/ext/ext-base.js">  
  13.     "js/extjs/ext-all.js" mce_src="js/extjs/ext-all.js">  
  14.     "js/extjs/ext-lang-zh_CN.js" mce_src="js/extjs/ext-lang-zh_CN.js">  
  15.     "text/javascript">   
  16.   
  17. "padding:30px 20px" mce_style="padding:30px 20px">  
  18. "treecontainer" style="height:300px; width:200px;">
  
  •   
  •      
  •  

     

     

    在浏览器中输入 http://127.0.0.1:8080/Extjs/tree.jsp 测试,效果如下:Extjs3.2+Json lib动态树与GridPanel简单展现_第1张图片

    哈哈,很简单吧。。。

    你可能感兴趣的:(EXT,Java,json,JSP,入门)