`
zhaohaolin
  • 浏览: 1004010 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

把DWR的配置写到Spring的配置文件里(Spring2 新特性-自定义schema初体验)[转]

    博客分类:
  • JAVA
 
阅读更多

要读懂我这篇文章估计需要一些前期知识:
你要知道Spring是什么,并且要知道Spring已经出了2.0的版本了。
你要知道DWR是什么,并且要知道DWR也要出2.0的版本了。

呵呵,开个玩笑……。这年头在BlogJava上混的,估计没几个不知道上面这两个项了。

好了,现在言归正传。DWR本身就提供对Spring的支持,可以直接把Spring中的Bean暴露给客户端浏览器的Javascript调用。在dwr.xml中的写法是这样的:

< dwr >
    
< allow >
        
< create  creator ="spring"  javascript ="AjaxPortalService" >
            
< param  name ="beanName"  value ="AjaxPortalService" />
            
< include  method ="changeWondowState" />
            
< include  method ="changeWorkbenchState" />
            
< include  method ="changeWindowOrder" />
        
</ create >
    
</ allow >
</ dwr >


这 样写到也没什么,只是把项目分模块以后,虽有的配置都写到一个dwr.xml文件里面维护起来比较麻烦,尤其再遇到版本管理中的代码合并。所以曾经我扩展 了DWR,让它可以从多个文件读取配置信息。然后每个模块自己一个配置文件,跟着source一起走。这样做也有问题,就是现在Java应用程序的配置文 件太多啦!Spring的配置,WebWork的配置,Hibernate的配置,DWR的配置,再加上一些杂七杂八的xml和properties。看 着这些配置文件简直要疯掉了。

正在此时,spring2横空出世,现在你可以把一些配置文件合并到一起了。正好趁此机会体验一下Spring2的自定义schema特性。

目标:
把DWR的配置写成这样:

<? xml version="1.0" encoding="GBK" ?>
< beans  xmlns ="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx
="http://www.springframework.org/schema/tx"
    xmlns:aop
="http://www.springframework.org/schema/aop"
    xmlns:dwr
="http://www.devside.org/schema/spring/dwr"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
           http://www.devside.org/schema/spring/dwr http://www.devside.org/schema/spring/dwr.xsd"

    default-autowire
="byName" >
    
    
< bean  id ="departmentDao"  class ="cn.com.legendapl.hellostruts2.dao.DepartmentDao" />
    
< bean  id ="employeeDao"  class ="cn.com.legendapl.hellostruts2.dao.EmployeeDao" />
    
< bean  id ="companyService"  class ="cn.com.legendapl.hellostruts2.service.CompanyService" />
    
    
< aop:config >
        
< aop:pointcut  id ="companyServiceOperation"  expression ="execution(* cn.com.legendapl.hellostruts2.service.ICompanyService.*(..))"   />
        
< aop:advisor  advice-ref ="txAdvice"  pointcut-ref ="companyServiceOperation"   />
    
</ aop:config >     
    
    
< bean  id ="ajaxCompanyProxy"  class ="cn.com.legendapl.hellostruts2.ajax.AjaxCompanyProxy" />
    
    
< dwr:allow  id ="ajaxCompanyProxyAllow" >
        
< dwr:create  beanName ="ajaxCompanyProxy"  javascript ="CompanyProxy" >
            
< dwr:include  method ="findEmployeeById" />
        
</ dwr:create >
        
< dwr:convert  converter ="bean"  match ="cn.com.legendapl.hellostruts2.entity.*" />
    
</ dwr:allow >
</ beans >


重点在这里:
    < dwr:allow  id ="ajaxCompanyProxyAllow" >
        
< dwr:create  beanName ="ajaxCompanyProxy"  javascript ="CompanyProxy" >
            
< dwr:include  method ="findEmployeeById" />
        
</ dwr:create >
        
< dwr:convert  converter ="bean"  match ="cn.com.legendapl.hellostruts2.entity.*" />
    
</ dwr:allow >

好了现在动手开始做。

原理其实很简单,现在看张图。画的不好,敬请原谅!



spring-dwr.png

从这样图中我们可以看出我们要做如下工作:
1、做一个dwr.xsd,定义spring配置文件中的dwr这部分配置的schema。
   要做这个需要有一定xml和xsd的知识,我也是现学现用啦!

<? xml version="1.0" encoding="UTF-8" ?>
< xsd:schema  xmlns ="http://www.devside.org/schema/spring/dwr"
    xmlns:xsd
="http://www.w3.org/2001/XMLSchema"
    xmlns:beans
="http://www.springframework.org/schema/beans"
    targetNamespace
="http://www.devside.org/schema/spring/dwr"  
    elementFormDefault
="qualified"     
    attributeFormDefault
="unqualified" >

    
< xsd:import  namespace ="http://www.springframework.org/schema/beans"  schemaLocation ="http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" />
    
    
< xsd:element  name ="allow" >
        
< xsd:complexType >
            
< xsd:complexContent >
                
< xsd:extension  base ="beans:identifiedType" >
                    
< xsd:sequence >
                        
< xsd:element  name ="create"  type ="createType"  minOccurs ="0"  maxOccurs ="unbounded" />                 
                        
< xsd:element  name ="convert"  type ="convertType"  minOccurs ="0"  maxOccurs ="unbounded" />                 
                    
</ xsd:sequence >   
                
</ xsd:extension >
            
</ xsd:complexContent >
        
</ xsd:complexType >
    
</ xsd:element >     
    
< xsd:complexType  name ="createType" >         
        
< xsd:sequence >
            
< xsd:element  name ="auth"  type ="authType"  minOccurs ="0"  maxOccurs ="unbounded" />
            
< xsd:element  name ="include"  type ="includeType"  minOccurs ="0"  maxOccurs ="unbounded" />
            
< xsd:element  name ="exclude"  type ="excludeType"  minOccurs ="0"  maxOccurs ="unbounded" />                             
        
</ xsd:sequence >
        
< xsd:attribute  name ="beanName"  type ="xsd:string"  use ="required" />
        
< xsd:attribute  name ="javascript"  type ="xsd:string"  use ="required" />                                                 
    
</ xsd:complexType >    
    
    
< xsd:complexType  name ="convertType" >
        
< xsd:attribute  name ="converter"  type ="xsd:string"  use ="required" />
        
< xsd:attribute  name ="match"  type ="xsd:string"  use ="required" />
    
</ xsd:complexType >   
    
    
< xsd:complexType  name ="authType" >
        
< xsd:attribute  name ="method"  type ="xsd:string"  use ="required" />
        
< xsd:attribute  name ="role"  type ="xsd:string"  use ="required" />
    
</ xsd:complexType >
    
< xsd:complexType  name ="includeType" >
        
< xsd:attribute  name ="method"  type ="xsd:string"  use ="required" />
    
</ xsd:complexType >
    
< xsd:complexType  name ="excludeType" >
        
< xsd:attribute  name ="method"  type ="xsd:string"  use ="required" />
    
</ xsd:complexType >
</ xsd:schema >

2、 我们要做一个DWRNamespaceHandler来处理DWR的配置信息,其实里面就做一件事把AllowBeanDefinitionParser 注册给allow节点。因为我们dwr的配置部分根节点就一个标签allow,所以我们就做一个用于解析allow标签的 AllowBeanDefinitionParser解析器就行。如果我们的根节点还有其他的标签,同样也要做相应的解析器。

public   class  DWRNamespaceHandler  extends  NamespaceHandlerSupport {

    
public   void  init() {
        
// 把AllowBeanDefinitionParser注册到allow节点
        registerBeanDefinitionParser( " allow " new  AllowBeanDefinitionParser());
    }

}


其实难点是做AllowBeanDefinitionParser,这里你需要一些DOM模型的知识,来操作配置节点的内容。然后根据内容进行处理。在这里我们,需要做三件事:
   [1]  把配置节点的内容转换成对象模型,即AllowBean(其实就是一些POJO罢了)。
   [2]  把这个AllowBean注册给Spring的Context,这一步是可选的。因为我们主要是把这个Bean给DWR,当然顺道给Spring一份也没什么问题。
   [3] 把这个AllowBean注册到AllowBeanHolder。

3、AllowBeanHolder。
   其实这就是个简单的singleton类,整个运行期只有一个实例。它就像一个容器,AllowBeanDefinitionParser往里放,DWR的Configuration再从这里取。

4、扩展DWR的DefaultConfiguration,我们做一个SpringConfiguration。DWR的DefaultConfiguration是负责读取配置信息的。我们在其中加入从AllowBeanHolder读取配置信息的功能即可。

5、扩展DWR的DWRServlet,我们做一个SpringDWRServlet,原来的DWRServlet加载的是DefaultConfiguration,我们的Serlvet加载我们自己的SpringConfiguration即可。

6、万事俱备,只欠东风啦。就是让Spring知道我们干了这些!
   在META-INF目录下(如果没有在src目录下创建一个)加入spring.handlers和spring.schemas两个文件。
   spring.handlers中的内容:
   http\: // www.devside.org/schema/spring/dwr=org.devside.core.support.dwr.DWRNamespaceHandler
   spring.schemas中的内容:
   http\://www.devside.org/schema/spring/dwr.xsd=org/devside/core/support/dwr/dwr.xsd
   
  
注意不要写错字哦,我一开始就写错一个字母,结果怎么调试都不能成功,还以为Spring2有问题呢。

ok了,下面我们就可以写一个spring的配置文件来试试喽。

下面提供两个源码包,一个是spring-dwr的源码,一个是hellosturts2,一个struts2+spring2+hibernate3.2的例子,其中有用到spring-dwr的例子。

为了减小容量,我把jar都去掉了,lib目录下提供了一个列表,你可以自己去找相关的jar包。

http://www.blogjava.net/Files/mstar/HelloStruts2.zip

http://www.blogjava.net/Files/mstar/spring-dwr.zip

分享到:
评论

相关推荐

    将dwr集成到spring mvc(dwr的配置是基于xml)

    2. **配置DWR**:在Spring MVC中,DWR的配置通常是基于XML的。你需要在`src/main/resources/META-INF/spring`目录下创建一个名为`dwr-servlet.xml`的文件,定义DWR的Servlet配置。例如: ```xml ...

    Spring 2中整合DWR 2

    4. **设置DWR访问路径**:在Spring的配置文件中设置DWR的访问路径,这样客户端才能通过特定URL访问到DWR提供的服务。例如: ```xml &lt;bean id="dwrConfig" class="org.directwebremoting.spring....

    在Struts2与Spring2.5结合DWR2配置使用方法.doc

    ### 在Struts2与Spring2.5结合DWR2配置使用方法 #### 一、概述 本文档将详细介绍如何在Struts2与Spring2.5框架的基础上集成DWR(Direct Web Remoting)来简化Ajax应用的开发过程。通过这种方式,可以有效降低前端...

    spring整合dwr

    在Spring的XML配置文件中,我们需要引入DWR的命名空间,并配置相关的DWR bean。首先,添加DWR的命名空间声明: ```xml &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/...

    spring使用annotation整合dwr笔记

    ### Spring使用Annotation整合DWR知识点解析 #### 一、概览 在现代Web开发中,Direct Web Remoting(简称DWR)是一种简化Ajax应用开发的技术,它允许JavaScript直接调用服务器端的Java方法,而无需编写复杂的XML...

    李君老师JavaEE笔记-Spring中集成Dwr

    1. **整合Spring与DWR配置**:在原有的Spring配置文件中添加DWR相关的命名空间,并指定DWR配置的Schema位置,这使得Spring和DWR的配置可以无缝结合。 2. **DWR配置简化**:使用XML Schema配置方式,可以简化配置,...

    Struts、Spring、Hibernate整合开发、DWR集成

    ### Struts、Spring、Hibernate整合开发与DWR集成知识点详解 #### 一、概述 本文档旨在介绍如何在Struts、Spring、Hibernate(通常简称SSH)框架基础上集成DWR(Direct Web Remoting),以实现前后端更为流畅的...

    springMVC整合DWR3.0 实例

    4. **熟悉DWR的基本概念**:了解DWR是如何简化JavaScript调用Java方法的过程,以及DWR的配置文件结构。 #### 三、整合步骤 下面我们将按照以下步骤来完成SpringMVC与DWR3.0的整合: ##### 1. 配置项目web.xml文件 ...

    springMVC集成DWR

    从给定的部分内容中可以看出,配置主要涉及到 Spring MVC 的 DispatcherServlet 的设置,以及对 DWR 的 URL 映射。 ```xml &lt;servlet-mapping&gt; &lt;servlet-name&gt;springhibernate&lt;/servlet-name&gt; &lt;url-pattern&gt;*.do...

    ssha 最新 最完整 配置信息

    本文档旨在提供一套详细的配置指南,用于整合Struts1.x、Spring2.x、Hibernate3.x以及DWR2.x等技术栈。通过本指南,开发者可以更好地理解如何将这些框架有效结合,以构建稳定、高效的Java Web应用。 #### 文档约定 ...

    javaSSH框架搭建配置

    - `&lt;context-param&gt;`定义了Spring配置文件的位置,这里使用通配符`*`来匹配多个配置文件。 **2. 字符编码过滤器** 为了确保Web应用中数据的一致性和正确性,还需要配置字符编码过滤器。 ```xml &lt;!--Spring字符...

    Spring攻略(第二版 中文高清版).part2

    6.5 将Spring与DWR集成 232 6.5.1 问题 232 6.5.2 解决方案 232 6.5.3 工作原理 233 6.6 小结 236 第7章 Spring Web Flow 238 7.1 用Spring Web Flow管理简单的UI流程 238 7.1.1 问题 238 7.1.2 ...

    Spring攻略(第二版 中文高清版).part1

    6.5 将Spring与DWR集成 232 6.5.1 问题 232 6.5.2 解决方案 232 6.5.3 工作原理 233 6.6 小结 236 第7章 Spring Web Flow 238 7.1 用Spring Web Flow管理简单的UI流程 238 7.1.1 问题 238 7.1.2 ...

    Ext+Spinrg dwr hibernate struts

    在“ExtSSHD2”这个压缩包中,可能包含了项目的所有源代码、配置文件、数据库脚本等,供学习者参考和实践。通过对这个项目的研究,开发者可以学习到如何在实际项目中集成并有效利用这些技术,提升自己的Web开发能力...

    271个java需要用的jar包

    activation-1.1.jar antlr-2.7.2.jar aopalliance-1.0.jar ...xmlschema-core-2.0.3.jar xpp3_min-1.1.4c.jar xstream-1.3.jar xstream-1.4.2.jar xwork-core-2.3.15.3.jar xwork-core-2.3.31.jar ZXing-core.jar

    ibatis 一个简单的项目详解

    - **DWR for Struts2**:dwr4struts2.jar - **Freemarker模板引擎**:freemarker-2.3.8.jar - **JSON处理**:jsonplugin-0.31.jar - **ibatis核心库**:ibatis-2.3.0.677.jar - **Spring框架**:spring.jar - **...

    业余框架整合-SSHD-(1)-整体概述(2011-12-03更新)

    标题中的“业余框架整合-SSHD-(1)-整体概述”指的是一个关于集成SSH(Spring、Struts、Hibernate)与SSHD(Secure Shell Daemon)框架的教程。SSH是Java Web开发中常用的三大框架,用于构建MVC模式的应用程序,而...

Global site tag (gtag.js) - Google Analytics