一份完整的Spring Hibernate DWR extJs的生成树及下拉comBoboTree
来源:百度文库 编辑:神马文学网 时间:2024/04/29 03:19:18
在各种论坛上看了很久,没见到完整extJs树的生成代码。研究了很久终于实现了Spring+Hibernate+DWR+extJs的生成树及下拉comBoboxTree。
不敢独享收获 ,借javaeye这一平台将我的成果和大家分享。不足和错误之处敬请批评指正。有疑问欢迎联系我。qq:446702119 msn: wh_aq@hotmail.com
废话少说,还是从生成树开始吧。
一、树的对象模型。
Java代码
二、树结构的数据库(mySql)DDL
Java代码
三、对象模型到数据库的Hibernate映射关系
Java代码
四、用Spring框架来管理和支撑持久层、业务逻辑层和展示层
【一】持久层采用了DAO模式 。具体设计了一个类型安全的泛型DAO。由于这不是我要讲的重点部分,感兴趣的朋友可以
查阅有关文档。要生成一个树,必须要从后台数据库中按一定类型(我用了适配器模式)取出java对象--TreeNode 对象 。及要实现方法 public List listRegionByParent(Region parent)。
TreeNode类型为:
Java代码
具体生成树的泛型DAO实现是:
Java代码
从上面java代码中可以看到:DWR需要解析的是 List 类型的对象。
【二】业务逻辑层主要采用一个实现类BusinessServiceImp 。将所有的业务逻辑放在一个类中,一是便于spring中bean好管理,二是方便权限控制。BusinessServiceImp 中的一个很重要的属性是: private IRegionDAO regionDAO; regionDAO的生命周期依赖于spring容器,在spring中管理和维护。逻辑层的代码如下:
Java代码
【三】Spring容器的配置主要是通过xml方式体现。
一是:web.xml的配置如下:
Java代码
二是:bean生成的配置。model-config.xml
Java代码
三是:servlet配置 dispatcherServlet-servlet.xml
Java代码
有了这些xml的配置。Spring能将三层很好地组合起来。以上是java部分。还没有讲到extJs。extJs可以接受asp、php、java等服务器端生成的json格式的对象。就java来说 ,extJs能接受三种方式的json对象,一是servlet中拼接json对象;其次是引用json lib 包;三是DWR方式,绕过Controller(就Spring来说)或servlet,在javascript中 直接调用java业务逻辑层中的方法(通过DWR引擎),利用dwr代理或者javascript 回调函数返回json对象并在页面展示。
本人采用了第三种DWR方式实现ExtJs生成树。要使用dwr 就的要在以上几个配置文件中配置DWR(已配)。具体的下次再说吧。
今天就写到这里吧。不知写的怎么样?有朋友关注这一块?若支持,请鼓励一下;写的不好、不对或不懂的地方,请拍砖。(续)
抱歉啊,这几天忙着考驾照,把这事给耽搁啊。书接上回吧。
【四】基于Spring方式的DWR配置说明。
一、首先在WEB.xml中配置dwr拦截器 代码如下(节选):
Java代码
二、dwr.xml的配置。这里将Spring管理的bean映射成javascipt操作的对象。更直观的说法就是使得页面中javascript能直接使用java中对象的方法。代码如下:
Java代码
从上面的代码可以看出,javascript使用treeBusinessService.getAllChildren 方法就能够直接取出 Spring维持的业务逻辑层定义的bean----- businessService。从而完成了DWR的功能。这里当然存在安全问题,在这里暂时没有讨论,关于如何在DWR中进行安全控制,大家可以参考有关文档。本文暂不考虑。
【五】ext和服务器端交互的机制和具体实现
一般说来,按照上面DWR的配置,就已经实现了在页面中使用java的方法。但java方法执行后生成的List 传回到页面还需要靠回调函数实现。例如下面代码就是包含了回调函数的测试页。
Java代码
现在分析一下上面页面主要代码:
Java代码
这句中的treeBusinessService就是DWR.xml中定义的Java代码
下面两句是使用DWR所必需的,原样加上即可。
Java代码
有了上面的这些DWR配置,就能够以DWR的方式使用java的方法啦:
Java代码
function(ret)就是回调函数。因为treeBusinessService.getAllChildren执行的结果是List类型,DWR解析List到页面应该是javascript的对象数组,所以ret应该是个数组,ret.length是这个数组的长度。
上面的例子只不过是原理性的介绍,帮助我们理解javascript如何和后台进行的交互。真正要实现DWRTree 还需要专门的DWRTreeLoader代理。下面这段代码很是重要,参考了ext官方bbs上的代码,并做了修改。先提供如下:
Java代码
上面的代码可以直接在项目中使用,无需修改。
【六】最终DWRTree的实现包括 tree.js和 tree.html
tree.js完整代码如下:
Java代码
提个醒:这句Java代码
tree.html是这样的:
Java代码
好了,基于Spring+hibernate+dwr+EXTJs的DWRTreeLoader的实现就是这样。本想提供完整代码下载。但想来想去还是让读者自己结合我的文章边做边体会比较好。说不定还能优化我的代码呢。你说是吗?
还有comBoboxTree的实现没有写。也不知大家感兴趣没?还是欢迎大家多提意见吧。
不敢独享收获 ,借javaeye这一平台将我的成果和大家分享。不足和错误之处敬请批评指正。有疑问欢迎联系我。qq:446702119 msn: wh_aq@hotmail.com
废话少说,还是从生成树开始吧。
一、树的对象模型。
Java代码
- package com.ssgly.model;
- import java.util.List;
- import java.util.Set;
- public class Region {
- private Long id;
- private String name;
- private String code;
- private Region parent;
- private Set
children = new java.util.HashSet (); - public Region() {}
- public Region(String name, String code, Region parent) {
- this.name = name;
- this.code = code;
- if(parent!=null) parent.addChild(this);
- }
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getCode() {
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
- public Region getParent() {
- return parent;
- }
- public void setParent(Region parent) {
- this.parent = parent;
- }
- public Set
getChildren() { - return children;
- }
- public void setChildren(Set
children) { - this.children = children;
- }
- }
package com.ssgly.model;import java.util.List;import java.util.Set;public class Region {private Long id;private String name;private String code;private Region parent;private Setchildren = new java.util.HashSet ();public Region() {}public Region(String name, String code, Region parent) {this.name = name;this.code = code;if(parent!=null) parent.addChild(this);}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public Region getParent() {return parent;}public void setParent(Region parent) {this.parent = parent;}public Set getChildren() {return children;}public void setChildren(Set children) {this.children = children;}}
二、树结构的数据库(mySql)DDL
Java代码
- CREATE TABLE `region` (
- `id` bigint(20) NOT NULL,
- `name` varchar(100) default NULL,
- `code` varchar(100) default NULL,
- `parent_id` bigint(20) default NULL,
- PRIMARY KEY (`id`),
- KEY `FK91AD1314568C1D72` (`parent_id`),
- CONSTRAINT `FK91AD1314568C1D72` FOREIGN KEY (`parent_id`) REFERENCES `region` (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `region` (`id` bigint(20) NOT NULL,`name` varchar(100) default NULL,`code` varchar(100) default NULL,`parent_id` bigint(20) default NULL,PRIMARY KEY (`id`),KEY `FK91AD1314568C1D72` (`parent_id`),CONSTRAINT `FK91AD1314568C1D72` FOREIGN KEY (`parent_id`) REFERENCES `region` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
三、对象模型到数据库的Hibernate映射关系
Java代码
- "1.0" encoding="UTF-8"?>
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <class name="com.ssgly.model.Region" table="region" >
-
"id" column="id" type="java.lang.Long"> -
class="assigned" /> -
"code" column="code" type="java.lang.String" /> -
"name" column="name" type="java.lang.String" /> -
"parent" column="parent_id" cascade="save-update" /> -
"children" inverse="true" cascade="save-update" lazy="false"> -
"parent_id" > -
class="com.ssgly.model.Region"> - class>
四、用Spring框架来管理和支撑持久层、业务逻辑层和展示层
【一】持久层采用了DAO模式 。具体设计了一个类型安全的泛型DAO。由于这不是我要讲的重点部分,感兴趣的朋友可以
查阅有关文档。要生成一个树,必须要从后台数据库中按一定类型(我用了适配器模式)取出java对象--TreeNode 对象 。及要实现方法 public List
TreeNode类型为:
Java代码
- package com.ssgly.model;
- ublic class TreeNode {
- private String id;
- private String Text;
- private boolean leaf;
- private String cls="";
- private Region region;
- public TreeNode(Region region)
- {
- this.region=region;
- }
- public String getId() {
- return region.getId().toString();
- }
- public boolean getLeaf() {
- return region.getChildren().size()<1;
- }
- public String getText() {
- return region.getName();
- }
- public String getCls() {
- return region.getChildren().size()<1?"file":"folder";
- }
package com.ssgly.model;public class TreeNode {private String id;private String Text;private boolean leaf;private String cls="";private Region region;public TreeNode(Region region){this.region=region;}public String getId() {return region.getId().toString();}public boolean getLeaf() {return region.getChildren().size()<1;}public String getText() {return region.getName();}public String getCls() {return region.getChildren().size()<1?"file":"folder";}}
具体生成树的泛型DAO实现是:
Java代码
- package com.ssgly.dao;
- import java.io.IOException;
- import java.sql.SQLException;
- import java.text.SimpleDateFormat;
- import java.util.List;
- import com.ssgly.model.Region;
- import com.ssgly.model.Page;
- public class RegionDAOImpl extends GenericHibernateDAOCrud
implements IRegionDAO { - public RegionDAOImpl(){
- super(Region.class);
- }
- public void deleteRegion(Region region) {
- hibernateTemplate.delete(region);
- }
- public void deleteRegion(Long id) {
- hibernateTemplate.delete(hibernateTemplate.get(Region.class, id));
- }
- public Region getRegion(Long id) {
- return (Region)hibernateTemplate.get(Region.class, id);
- }
- public Long saveRegion(Region region) {
- hibernateTemplate.save(region);
- return region.getId();
- }
- public void updateRegion(Region region) {
- hibernateTemplate.saveOrUpdate(region);
- }
- /**
- * 查询父节点的所有子节点
- * @param parent 父节点
- * @return 该父节点对应的子节点
- *
- *
- **/
- public List
listRegionByParent(Region parent) { - if (parent==null){
- return (List
)hibernateTemplate.find("from Region as r where r.parent is null"); - }else{
- return (List
)queryForLists("from Region as r where r.parent=?" - ,new Object[]{parent});
- }
- }
- }
package com.ssgly.dao;import java.io.IOException;import java.sql.SQLException;import java.text.SimpleDateFormat;import java.util.List;import com.ssgly.model.Region;import com.ssgly.model.Page;public class RegionDAOImpl extends GenericHibernateDAOCrudimplements IRegionDAO {public RegionDAOImpl(){super(Region.class);}public void deleteRegion(Region region) {hibernateTemplate.delete(region);}public void deleteRegion(Long id) {hibernateTemplate.delete(hibernateTemplate.get(Region.class, id));}public Region getRegion(Long id) {return (Region)hibernateTemplate.get(Region.class, id);}public Long saveRegion(Region region) {hibernateTemplate.save(region);return region.getId();}public void updateRegion(Region region) {hibernateTemplate.saveOrUpdate(region);}/*** 查询父节点的所有子节点* @param parent 父节点* @return 该父节点对应的子节点****/public List listRegionByParent(Region parent) {if (parent==null){return (List )hibernateTemplate.find("from Region as r where r.parent is null");}else{return (List )queryForLists("from Region as r where r.parent=?",new Object[]{parent});}}}
从上面java代码中可以看到:DWR需要解析的是 List
【二】业务逻辑层主要采用一个实现类BusinessServiceImp 。将所有的业务逻辑放在一个类中,一是便于spring中bean好管理,二是方便权限控制。BusinessServiceImp 中的一个很重要的属性是: private IRegionDAO regionDAO; regionDAO的生命周期依赖于spring容器,在spring中管理和维护。逻辑层的代码如下:
Java代码
- package com.ssgly.business.impl;
- import java.io.IOException;
- import java.io.Serializable;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import com.ssgly.model.*;
- import com.ssgly.util.Hzxs;
- import com.ssgly.business.BusinessService;
- import com.ssgly.dao.*;
- public class BusinessServiceImpl implements BusinessService {
- private IRegionDAO regionDAO;
- public void setRegionDAO(IRegionDAO regionDAO) {
- this.regionDAO = regionDAO;
- }
- public List
getAllChildren(Long parentId) throws IOException, - SQLException {
- List
listRegion=regionDAO.listRegionByParent(regionDAO.getRegion(parentId)); - List
listTreeNode=new ArrayList (); - for(Region region:listRegion){
- System.out.println(">>"+region.getName());
- listTreeNode.add(new TreeNode(region));
- }
- //System.out.println("List
getAllChildren 方法已执行!"); - return listTreeNode;
- }
- }
package com.ssgly.business.impl;import java.io.IOException;import java.io.Serializable;import java.sql.SQLException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import com.ssgly.model.*;import com.ssgly.util.Hzxs;import com.ssgly.business.BusinessService;import com.ssgly.dao.*;public class BusinessServiceImpl implements BusinessService {private IRegionDAO regionDAO;public void setRegionDAO(IRegionDAO regionDAO) {this.regionDAO = regionDAO;}public ListgetAllChildren(Long parentId) throws IOException,SQLException {List listRegion=regionDAO.listRegionByParent(regionDAO.getRegion(parentId));List listTreeNode=new ArrayList ();for(Region region:listRegion){System.out.println(">>"+region.getName());listTreeNode.add(new TreeNode(region));}//System.out.println("List getAllChildren 方法已执行!");return listTreeNode;}}
【三】Spring容器的配置主要是通过xml方式体现。
一是:web.xml的配置如下:
Java代码
- "1.0" encoding="UTF-8"?>
- "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd">
-
-
contextConfigLocation -
- /WEB-INF/dispatcherServlet-servlet.xml,
- /WEB-INF/model-config.xml
-
-
log4jConfigLocation -
/WEB-INF/log4j.properties -
-
encodingFilter -
class>com.ssgly.web.filter.EncodingFilter class> -
-
encoding -
utf-8 -
-
encodingFilter -
* -
-
class> - org.springframework.web.util.Log4jConfigListener
- class>
-
-
class> - org.springframework.web.context.ContextLoaderListener
- class>
-
-
dispatcherServlet -
class>org.springframework.web.servlet.DispatcherServlet class> -
0 -
-
dispatcherServlet -
*.do -
-
dwr-invoker -
class>org.directwebremoting.servlet.DwrServlet class> -
-
debug -
true -
-
classes -
java.lang.Object -
100 -
-
dwr-invoker -
/dwr/* -
-
30
contextConfigLocation /WEB-INF/dispatcherServlet-servlet.xml,/WEB-INF/model-config.xml log4jConfigLocation /WEB-INF/log4j.properties encodingFilter com.ssgly.web.filter.EncodingFilter encoding utf-8 encodingFilter * org.springframework.web.util.Log4jConfigListener org.springframework.web.context.ContextLoaderListener dispatcherServlet org.springframework.web.servlet.DispatcherServlet 0 dispatcherServlet *.do dwr-invoker org.directwebremoting.servlet.DwrServlet debug true classes java.lang.Object 100 dwr-invoker /dwr/* 30
二是:bean生成的配置。model-config.xml
Java代码
- "1.0" encoding="UTF-8"?>
- "-//SPRING/DTD BEAN/EN"
- "http://www.springframework.org/dtd/spring-beans.dtd">
-
-
"propertyConfigurer" - class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
-
"locations"> -
-
/WEB-INF/jdbc.properties -
"myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> -
"driverClassName" value="${jdbc.driver}" /> -
"url" value="${jdbc.url}" /> -
"username" value="${jdbc.username}" /> -
"password" value="${jdbc.password}" /> -
"sessionFactory" - class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" destroy-method="close">
-
"dataSource"> - "myDataSource" />
-
"mappingResources"> -
-
com/ssgly/model/Region.hbm.xml -
"hibernateProperties"> -
-
"connection.characterEncoding">utf-8 -
"hibernate.dialect">org.hibernate.dialect.MySQLDialect -
"hibernate.jdbc.batch_size">50 -
"hibernate.show_sql">true -
"hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory -
"transactionManager" - class="org.springframework.orm.hibernate3.HibernateTransactionManager">
-
"sessionFactory"> - "sessionFactory"/>
-
"hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> -
"sessionFactory"> "sessionFactory"/> -
"regionDao" class="com.ssgly.dao.RegionDAOImpl"> -
"hibernateTemplate"> - "hibernateTemplate"/>
-
"businessService" class="com.ssgly.business.impl.BusinessServiceImpl"> -
"regionDAO">"regionDao" /> -
"todoSsglyService" class="com.ssgly.ext.ToDoImpl"> -
"businessServiceImpl"> - "businessService"/>
/WEB-INF/jdbc.properties
com/ssgly/model/Region.hbm.xml utf-8 org.hibernate.dialect.MySQLDialect 50 true org.hibernate.hql.classic.ClassicQueryTranslatorFactory
三是:servlet配置 dispatcherServlet-servlet.xml
Java代码
- "1.0" encoding="utf-8"?>
- "-//SPRING/DTD BEAN/EN"
- "http://www.springframework.org/dtd/spring-beans.dtd">
-
"beanNameUrlMapping" - class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
-
"alwaysUseFullPath" value="true" /> -
"viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> -
"contentType"> text/html;charset=GBK -
"velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> -
"configLocation" value="/WEB-INF/velocity.properties" /> -
"resourceLoaderPath" value="/" /> -
"treeRegionServlet" name="/treeRegionServlet.do" class="com.ssgly.web.TreeRegionServlet"> -
"businessService"> - "businessService"/>
text/html;charset=GBK
有了这些xml的配置。Spring能将三层很好地组合起来。以上是java部分。还没有讲到extJs。extJs可以接受asp、php、java等服务器端生成的json格式的对象。就java来说 ,extJs能接受三种方式的json对象,一是servlet中拼接json对象;其次是引用json lib 包;三是DWR方式,绕过Controller(就Spring来说)或servlet,在javascript中 直接调用java业务逻辑层中的方法(通过DWR引擎),利用dwr代理或者javascript 回调函数返回json对象并在页面展示。
本人采用了第三种DWR方式实现ExtJs生成树。要使用dwr 就的要在以上几个配置文件中配置DWR(已配)。具体的下次再说吧。
今天就写到这里吧。不知写的怎么样?有朋友关注这一块?若支持,请鼓励一下;写的不好、不对或不懂的地方,请拍砖。(续)
抱歉啊,这几天忙着考驾照,把这事给耽搁啊。书接上回吧。
【四】基于Spring方式的DWR配置说明。
一、首先在WEB.xml中配置dwr拦截器 代码如下(节选):
Java代码
-
-
dwr-invoker -
class>org.directwebremoting.servlet.DwrServlet class> -
-
debug -
false -
-
classes -
java.lang.Object -
100 -
-
dwr-invoker -
/dwr/*
dwr-invoker org.directwebremoting.servlet.DwrServlet debug false classes java.lang.Object 100 dwr-invoker /dwr/*
二、dwr.xml的配置。这里将Spring管理的bean映射成javascipt操作的对象。更直观的说法就是使得页面中javascript能直接使用java中对象的方法。代码如下:
Java代码
- "1.0" encoding="utf-8"?>
- "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
- "http://getahead.ltd.uk/dwr/dwr20.dtd">
-
-
"bean" match="com.ssgly.model.*"/> -
"map" match="org.directwebremoting.convert.MapConverter"/> -
"spring" javascript="treeBusinessService"> - "beanName" value="businessService"/>
-
"getAllChildren" />
从上面的代码可以看出,javascript使用treeBusinessService.getAllChildren 方法就能够直接取出 Spring维持的业务逻辑层定义的bean----- businessService。从而完成了DWR的功能。这里当然存在安全问题,在这里暂时没有讨论,关于如何在DWR中进行安全控制,大家可以参考有关文档。本文暂不考虑。
【五】ext和服务器端交互的机制和具体实现
一般说来,按照上面DWR的配置,就已经实现了在页面中使用java的方法。但java方法执行后生成的List 传回到页面还需要靠回调函数实现。例如下面代码就是包含了回调函数的测试页。
Java代码
- "Content-Type" content="text/html; charset=utf-8">
ExtJS-树示例 - "stylesheet" type="text/css" href="ext2/resources/css/ext-all.css" />
class=java name="code">
- "tree-div">
ExtJS-树示例 Java代码
现在分析一下上面页面主要代码:
Java代码
这句中的treeBusinessService就是DWR.xml中定义的Java代码
"spring" javascript="treeBusinessService">
下面两句是使用DWR所必需的,原样加上即可。
Java代码
有了上面的这些DWR配置,就能够以DWR的方式使用java的方法啦:
Java代码
function(ret)就是回调函数。因为treeBusinessService.getAllChildren执行的结果是List类型,DWR解析List到页面应该是javascript的对象数组,所以ret应该是个数组,ret.length是这个数组的长度。
上面的例子只不过是原理性的介绍,帮助我们理解javascript如何和后台进行的交互。真正要实现DWRTree 还需要专门的DWRTreeLoader代理。下面这段代码很是重要,参考了ext官方bbs上的代码,并做了修改。先提供如下:
Java代码
- Ext.tree.DWRTreeLoader = function(config) {
- Ext.tree.DWRTreeLoader.superclass.constructor.call(this, config);
- };
- Ext.extend(Ext.tree.DWRTreeLoader, Ext.tree.TreeLoader, {
- args:[],
- requestData : function(node, callback) {
- if (this.fireEvent("beforeload", this, node, callback) !== false) {
- var callParams = new Array();
- var success = this.handleResponse.createDelegate(this, [node, callback], 1);
- var error = this.handleFailure.createDelegate(this, [node, callback], 1);
- callParams.push(node.id);
- callParams.push({callback:success, errorHandler:error});
- //todo: do we need to set this to something else?
- this.transId=true;
- this.dataUrl.apply(this, callParams);
- } else {
- // if the load is cancelled, make sure we notify
- // the node that we are done
- if (typeof callback == "function") {
- //alert(callback);
- callback();
- }
- }
- },
- processResponse : function(response, node, callback){
- try {
- for(var i = 0; i < response.length; i++){
- var n = this.createNode(response[i]);
- if(n){
- node.appendChild(n);
- }
- }
- if(typeof callback == "function"){
- callback(this, node);
- }
- }catch(e){
- this.handleFailure(response);
- }
- },
- handleResponse : function(response, node, callback){
- this.transId = false;
- this.processResponse(response, node, callback);
- this.fireEvent("load", this, node, response);
- },
- handleFailure : function(response, node, callback){
- this.transId = false;
- this.fireEvent("loadexception", this, node, response);
- if(typeof callback == "function"){
- callback(this, node);
- }
- }
- });
Ext.tree.DWRTreeLoader = function(config) {Ext.tree.DWRTreeLoader.superclass.constructor.call(this, config);};Ext.extend(Ext.tree.DWRTreeLoader, Ext.tree.TreeLoader, {args:[],requestData : function(node, callback) {if (this.fireEvent("beforeload", this, node, callback) !== false) {var callParams = new Array();var success = this.handleResponse.createDelegate(this, [node, callback], 1);var error = this.handleFailure.createDelegate(this, [node, callback], 1);callParams.push(node.id);callParams.push({callback:success, errorHandler:error});//todo: do we need to set this to something else?this.transId=true;this.dataUrl.apply(this, callParams);} else {// if the load is cancelled, make sure we notify// the node that we are doneif (typeof callback == "function") {//alert(callback);callback();}}},processResponse : function(response, node, callback){try {for(var i = 0; i < response.length; i++){var n = this.createNode(response[i]);if(n){node.appendChild(n);}}if(typeof callback == "function"){callback(this, node);}}catch(e){this.handleFailure(response);}},handleResponse : function(response, node, callback){this.transId = false;this.processResponse(response, node, callback);this.fireEvent("load", this, node, response);},handleFailure : function(response, node, callback){this.transId = false;this.fireEvent("loadexception", this, node, response);if(typeof callback == "function"){callback(this, node);}}});
上面的代码可以直接在项目中使用,无需修改。
【六】最终DWRTree的实现包括 tree.js和 tree.html
tree.js完整代码如下:
Java代码
- Ext.onReady(function(){
- Ext.tree.DWRTreeLoader = function(config) {
- Ext.tree.DWRTreeLoader.superclass.constructor.call(this, config);
- };
- Ext.extend(Ext.tree.DWRTreeLoader, Ext.tree.TreeLoader, {
- args:[],
- requestData : function(node, callback) {
- if (this.fireEvent("beforeload", this, node, callback) !== false) {
- var callParams = new Array();
- var success = this.handleResponse.createDelegate(this, [node, callback], 1);
- var error = this.handleFailure.createDelegate(this, [node, callback], 1);
- callParams.push(node.id);
- callParams.push({callback:success, errorHandler:error});
- //todo: do we need to set this to something else?
- this.transId=true;
- this.dataUrl.apply(this, callParams);
- } else {
- // if the load is cancelled, make sure we notify
- // the node that we are done
- if (typeof callback == "function") {
- //alert(callback);
- callback();
- }
- }
- },
- processResponse : function(response, node, callback){
- try {
- for(var i = 0; i < response.length; i++){
- var n = this.createNode(response[i]);
- if(n){
- node.appendChild(n);
- }
- }
- if(typeof callback == "function"){
- callback(this, node);
- }
- }catch(e){
- this.handleFailure(response);
- }
- },
- handleResponse : function(response, node, callback){
- this.transId = false;
- this.processResponse(response, node, callback);
- this.fireEvent("load", this, node, response);
- },
- handleFailure : function(response, node, callback){
- this.transId = false;
- this.fireEvent("loadexception", this, node, response);
- if(typeof callback == "function"){
- callback(this, node);
- }
- }
- });
- var myTree = new Ext.tree.TreePanel({
- el:Ext.getBody(),
- autoScroll:true,
- animate:true,
- width:'300px',
- height:'800px',
- enableDD:true,
- containerScroll: true,
- root:new Ext.tree.AsyncTreeNode({
- text: '单位',
- draggable:false,
- id:'1' }),
- loader:new Ext.tree.DWRTreeLoader({
- dataUrl:treeBusinessService.getAllChildren,
- listeners : {
- 'beforeload' : function( node) {
- myTree.getLoader().args[0]=(node.id!='root'?node.id:"1");
- }
- }
- })
- });
- myTree.render();
- });
Ext.onReady(function(){Ext.tree.DWRTreeLoader = function(config) {Ext.tree.DWRTreeLoader.superclass.constructor.call(this, config);};Ext.extend(Ext.tree.DWRTreeLoader, Ext.tree.TreeLoader, {args:[],requestData : function(node, callback) {if (this.fireEvent("beforeload", this, node, callback) !== false) {var callParams = new Array();var success = this.handleResponse.createDelegate(this, [node, callback], 1);var error = this.handleFailure.createDelegate(this, [node, callback], 1);callParams.push(node.id);callParams.push({callback:success, errorHandler:error});//todo: do we need to set this to something else?this.transId=true;this.dataUrl.apply(this, callParams);} else {// if the load is cancelled, make sure we notify// the node that we are doneif (typeof callback == "function") {//alert(callback);callback();}}},processResponse : function(response, node, callback){try {for(var i = 0; i < response.length; i++){var n = this.createNode(response[i]);if(n){node.appendChild(n);}}if(typeof callback == "function"){callback(this, node);}}catch(e){this.handleFailure(response);}},handleResponse : function(response, node, callback){this.transId = false;this.processResponse(response, node, callback);this.fireEvent("load", this, node, response);},handleFailure : function(response, node, callback){this.transId = false;this.fireEvent("loadexception", this, node, response);if(typeof callback == "function"){callback(this, node);}}});var myTree = new Ext.tree.TreePanel({el:Ext.getBody(),autoScroll:true,animate:true,width:'300px',height:'800px',enableDD:true,containerScroll: true,root:new Ext.tree.AsyncTreeNode({text: '单位',draggable:false,id:'1' }),loader:new Ext.tree.DWRTreeLoader({dataUrl:treeBusinessService.getAllChildren,listeners : {'beforeload' : function( node) {myTree.getLoader().args[0]=(node.id!='root'?node.id:"1");}}})});myTree.render();});
提个醒:这句Java代码
- myTree.getLoader().args[0]=(node.id!='root'?node.id:"1");
myTree.getLoader().args[0]=(node.id!='root'?node.id:"1");不能错哦,它是和 DWRTreeLoader耦合的。
tree.html是这样的:
Java代码
- "Content-Type" content="text/html; charset=utf-8">
ExtJS-树示例 - "stylesheet" type="text/css" href="ext2/resources/css/ext-all.css" />
ExtJS-树示例
好了,基于Spring+hibernate+dwr+EXTJs的DWRTreeLoader的实现就是这样。本想提供完整代码下载。但想来想去还是让读者自己结合我的文章边做边体会比较好。说不定还能优化我的代码呢。你说是吗?
还有comBoboxTree的实现没有写。也不知大家感兴趣没?还是欢迎大家多提意见吧。
一份完整的Spring Hibernate DWR extJs的生成树及下拉comBoboTree
Struts+Spring+Hibernate的技術實現
struts2+spring +Hibernate的思想
Struts Spring Hibernate练习(完整)
学习Struts spring hibernate的笔记
Spring Hibernate Acegi 的初次体验
Spring,hibernate,struts的面试笔试题
Struts+Spring+Hibernate的技術實現1
Struts+Spring+Hibernate的技術實現123
Struts+Spring+Hibernate的技術實現44
Struts+Spring+Hibernate的技術實現5
Struts+Spring+Hibernate的技術
Hibernate/Spring/Struts架构使用OpenSessionInView的...
DWR的学习文档(Hello World,类型转换,Spring,Annotation)
DWR的学习文档(Hello World,类型转换,Spring,Annotation)
使用Hibernate的一个完整例子
实例学习Spring和Hibernate的一点点体会
struts+spring+hibernate之间的关系与差别
Spring Hibernate在AOP方面的配置冲突解决之道
KehuiCMS文档-: 学习Struts spring hibernate的笔记 -可慧...
Struts2、Spring、Hibernate三者整合的过程示例1
Struts2、Spring、Hibernate三者整合的过程
Struts2与Spring、Hibernate三者整合的过程示例*
Struts2、Spring、Hibernate三者整合的过程示例123