论坛首页 Web前端技术论坛

三、DWR配置文件详解与bean转换

浏览 7252 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-03-04   最后修改:2009-03-04
DWR配置文件详解与bean转换

1、了解DWR内置配置文件
DWR内置配置文件提供了框架配置所需要的一些内容,框架加载的时候把这些信息加载到框架中。dwr内置配置文件也为dwr.xml,和我们在外面配置的dwr.xml是同一个dtd,但是为什么要内置?因为dwr在加载的时候会去加载这个默认的配置文件,目的是什么?我们先看一下,
<init>
    <creator id="jsf" class="org.directwebremoting.faces.JsfCreator"/>
    <creator id="none" class="org.directwebremoting.create.NullCreator"/>
    <creator id="new" class="org.directwebremoting.create.NewCreator"/>
    <creator id="pageflow" class="org.directwebremoting.beehive.PageFlowCreator"/>
    <creator id="spring" class="org.directwebremoting.spring.SpringCreator"/>
    <creator id="script" class="org.directwebremoting.create.ScriptedCreator"/>
    <creator id="struts" class="org.directwebremoting.struts.StrutsCreator"/>
    <creator id="ejb3" class="org.directwebremoting.create.Ejb3Creator"/>

    <converter id="null" class="org.directwebremoting.convert.NullConverter"/>
    <converter id="enum" class="org.directwebremoting.convert.EnumConverter"/>
    <converter id="primitive" class="org.directwebremoting.convert.PrimitiveConverter"/>
    <converter id="bignumber" class="org.directwebremoting.convert.BigNumberConverter"/>
    <converter id="string" class="org.directwebremoting.convert.StringConverter"/>
    <converter id="array" class="org.directwebremoting.convert.ArrayConverter"/>
    <converter id="map" class="org.directwebremoting.convert.MapConverter"/>
    <converter id="collection" class="org.directwebremoting.convert.CollectionConverter"/>
    <converter id="date" class="org.directwebremoting.convert.DateConverter"/>
    <converter id="dom" class="org.directwebremoting.convert.DOMConverter"/>
    <converter id="dom4j" class="org.directwebremoting.convert.DOM4JConverter"/>
    <converter id="jdom" class="org.directwebremoting.convert.JDOMConverter"/>
    <converter id="xom" class="org.directwebremoting.convert.XOMConverter"/>
    <converter id="servlet" class="org.directwebremoting.convert.ServletConverter"/>
    <converter id="bean" class="org.directwebremoting.convert.BeanConverter"/>
    <converter id="object" class="org.directwebremoting.convert.ObjectConverter"/>
    <converter id="hibernate2" class="org.directwebremoting.hibernate.H2BeanConverter"/>
    <converter id="hibernate3" class="org.directwebremoting.hibernate.H3BeanConverter"/>
    <converter id="url" class="org.directwebremoting.convert.URLConverter"/>
    <converter id="exception" class="org.directwebremoting.convert.ExceptionConverter"/>
    <converter id="miniException" class="org.directwebremoting.convert.MinimalistExceptionConverter"/>
  </init>
它有<init></init>初始化的标签。这个初始化的标签目的就是说在dwr的框架中呢,需要一些转换器生成器,这个转换器生成器说明因为我们需要在客户端调用后台的java业务逻辑,调用这些业务逻辑必须要实例化它,所以dwr为我们提供了很多的生成器,生成器负责生成我们后台的对应的业务逻辑对象的实例。通过这些实例来去调用它们的行为或者说是方法。配置文件中给我们提供了内置的8种生成器,常用的是new生成器,这是基本的创建对象的方式,其它的方式是通过整合其他的框架来生成的。看一下new生成器,一个是id,一个是class。id这个属性指定了它唯一的标识,class指定它对应的类org.directwebremoting.create.NewCreator。
默认配置文件提供了很多转换器,转换器的目的就是前台需要参数传递到后台,参数可以是基本的数据类型,也可以是我们自定义数据类型,也可以是我们其他框架所包装的一些类。这方面dwr做得很好,包括集合类型,jdom等一些指定框架下的对象的转换器都提供了。所以在这个默认的dwr.xml文件中是dwr被默认指定的生成器和转换器。
<converter id="null" class="org.directwebremoting.convert.NullConverter"/>
    <converter id="enum" class="org.directwebremoting.convert.EnumConverter"/>
    <converter id="primitive" class="org.directwebremoting.convert.PrimitiveConverter"/>
    <converter id="bignumber" class="org.directwebremoting.convert.BigNumberConverter"/>
    <converter id="string" class="org.directwebremoting.convert.StringConverter"/>
    <converter id="array" class="org.directwebremoting.convert.ArrayConverter"/>
    <converter id="map" class="org.directwebremoting.convert.MapConverter"/>
    <converter id="collection" class="org.directwebremoting.convert.CollectionConverter"/>
    <converter id="date" class="org.directwebremoting.convert.DateConverter"/>
    <converter id="dom" class="org.directwebremoting.convert.DOMConverter"/>
    <converter id="dom4j" class="org.directwebremoting.convert.DOM4JConverter"/>
    <converter id="jdom" class="org.directwebremoting.convert.JDOMConverter"/>
    <converter id="xom" class="org.directwebremoting.convert.XOMConverter"/>
    <converter id="servlet" class="org.directwebremoting.convert.ServletConverter"/>
    <converter id="bean" class="org.directwebremoting.convert.BeanConverter"/>
    <converter id="object" class="org.directwebremoting.convert.ObjectConverter"/>
    <converter id="hibernate2" class="org.directwebremoting.hibernate.H2BeanConverter"/>
    <converter id="hibernate3" class="org.directwebremoting.hibernate.H3BeanConverter"/>
    <converter id="url" class="org.directwebremoting.convert.URLConverter"/>
    <converter id="exception" class="org.directwebremoting.convert.ExceptionConverter"/>
    <converter id="miniException" class="org.directwebremoting.convert.MinimalistExceptionConverter"/>
转换器converter也有两个属性id和class。id指定转换器是针对哪一种类型的转换,class是指定转换器对应的类。init中为什么要指定生成器和转换器两种?这样理解:是双方向的,这点很重要。前台调用后台的时候,需要参数传递到后台,这种情况需要转换,后台处理完返回给前台或者是bean或者是基本数据类型也需要转换。所以说转换是双方向的,共有的。
dwr的作用就是前台的js可以直接访问后台的业务逻辑。实现前台直接访问后台的效果。后台方法使用前类必须要实例化,所以有creator;然后参数的传递需要转换所以有converter.所以dwr的默认配置文件里的init就是初始化生成器和转换器。注册进来以供后面我们使用。总结出一点,每一种框架都会有自生的配置文件。这也是框架的特性,所有的配置文件都有自身的配置信息。这些配置文件的作用 就是将配置的信息保存到框架有关的类对象中,然后把它们加载到内存里。通过这种方式在开发中就会应用这些配置的信息来完成我们的业务逻辑。所以这里的默认配置文件中的生成器和转换器是框架提供给我们的生成器和转换器。我们要自己实现自己的转换器也是可以的。这就体现了框架的扩展性。框架的目的就是给我们提供了一个平台上的平台。基于平台上的平台,我们可以在它上面开发一些项目。开发项目的时候可以提高开发项目的效率。通过框架给我们提供的规范约束,通过规范约束去扩展它。然后来做我们需要的操作。而不要去管它内部的执行流程。这种执行流程是框架给我们提供好的。没有必要去了解它的细节。开发中可以体现出一种高效率的方式。使用框架时注意一点,实现框架提供的接口,是扩展框架的良好方式。体现了框架的良好扩展性。dwr为我们提供了2个接口,对于creator提供了一个,对于convertor也提供了一个。creator这个接口和convertor这个接口就是为了我们以后扩展使用的。看一下这两个接口creator:
Interface Creator
All Known Implementing Classes: 
AbstractCreator, BeanCreator, Ejb3Creator, GuiceCreator, JsfCreator, NewCreator, NullCreator, PageFlowCreator, ScriptedCreator, SingletonCreator, 

SpringCreator, StrutsCreator 

--------------------------------------------------------------------------------

public interface CreatorA base class for all AllowedClasses 

我们自己如果要扩展,就去实现Creator接口,实现后配置在我们定义的dwr.xml文件中。也是通过init,采用默认dwr.xml文件的配置方式配置。
convertor接口:
Interface Converter
All Known Subinterfaces: 
NamedConverter 
All Known Implementing Classes: 
ArrayConverter, BaseV10Converter, BaseV20Converter, BasicObjectConverter, BeanConverter, BigNumberConverter, CharArrayConverter, 

CollectionConverter, ConstructorConverter, DateConverter, DOM4JConverter, DOMConverter, EnumConverter, ExceptionConverter, H2BeanConverter, 

H3BeanConverter, JDOMConverter, MapConverter, MinimalistExceptionConverter, NullConverter, ObjectConverter, PrimitiveConverter, ServletConverter, 

StringConverter, URLConverter, XOMConverter 

--------------------------------------------------------------------------------

public interface ConverterAn interface for converting types from a string to some other type. 
我们自己如果要扩展,就去实现Converter接口,实现后配置在我们定义的dwr.xml文件中。也是通过init,采用默认dwr.xml文件的配置方式配置。
dwr在初始化的时候,先加载默认的dwr.xml文件,加载完后,加载我们定义的web里面的dwr.xml文件。
下面看一下allow(允许)标签:
dwr中,我想用这个框架,必须允许做什么?inint仅仅是初始化框架中的信息,但是这些转换器生成器能不能在dwr中使用呢?就是在dwr中的allow指定的。如果没有allow,这个框架任何东西都是做不了的。
<allow>
    <convert converter="null" match="void"/>
    <convert converter="null" match="java.lang.Void"/>

    <convert converter="miniException" match="java.lang.Throwable"/>

    <convert converter="primitive" match="boolean"/>
    <convert converter="primitive" match="byte"/>
    <convert converter="primitive" match="short"/>
    <convert converter="primitive" match="int"/>
    <convert converter="primitive" match="long"/>
    <convert converter="primitive" match="float"/>
    <convert converter="primitive" match="double"/>
    <convert converter="primitive" match="char"/>
    <convert converter="primitive" match="java.lang.Boolean"/>
    <convert converter="primitive" match="java.lang.Byte"/>
    <convert converter="primitive" match="java.lang.Short"/>
    <convert converter="primitive" match="java.lang.Integer"/>
    <convert converter="primitive" match="java.lang.Long"/>
    <convert converter="primitive" match="java.lang.Float"/>
    <convert converter="primitive" match="java.lang.Double"/>
    <convert converter="primitive" match="java.lang.Character"/>

    <convert converter="bignumber" match="java.math.BigInteger"/>
    <convert converter="bignumber" match="java.math.BigDecimal"/>

    <convert converter="string" match="java.lang.String"/>
    <convert converter="date" match="java.util.Date"/>
    <convert converter="date" match="java.sql.Date"/>
    <convert converter="date" match="java.sql.Time"/>
    <convert converter="date" match="java.sql.Timestamp"/>
    <convert converter="date" match="java.util.Calendar"/>
    <convert converter="url" match="java.net.URL"/>

    <convert converter="array" match="[Z"/>
    <convert converter="array" match="[B"/>
    <convert converter="array" match="[S"/>
    <convert converter="array" match="[I"/>
    <convert converter="array" match="[J"/>
    <convert converter="array" match="[F"/>
    <convert converter="array" match="[D"/>
    <convert converter="array" match="[C"/>
    <convert converter="array" match="[L*"/>

    <!--
    The catch for the next 2 is that we really mean java.util.Collection<String>
    and java.util.Map<String, String> but we need to do more work before this
    syntax is enabled
    -->
    <convert converter="collection" match="java.util.Collection"/>
    <convert converter="map" match="java.util.Map"/>

    <convert converter="dom" match="org.w3c.dom.Node"/>
    <convert converter="dom" match="org.w3c.dom.Element"/>
    <convert converter="dom" match="org.w3c.dom.Document"/>
    <convert converter="dom4j" match="org.dom4j.Document"/>
    <convert converter="dom4j" match="org.dom4j.Element"/>
    <convert converter="dom4j" match="org.dom4j.Node"/>
    <convert converter="jdom" match="org.jdom.Document"/>
    <convert converter="jdom" match="org.jdom.Element"/>
    <convert converter="xom" match="nu.xom.Document"/>
    <convert converter="xom" match="nu.xom.Element"/>
    <convert converter="xom" match="nu.xom.Node"/>

    <convert converter="servlet" match="javax.servlet.ServletConfig"/>
    <convert converter="servlet" match="javax.servlet.ServletContext"/>
    <convert converter="servlet" match="javax.servlet.http.HttpServletRequest"/>
    <convert converter="servlet" match="javax.servlet.http.HttpServletResponse"/>
    <convert converter="servlet" match="javax.servlet.http.HttpSession"/>

  </allow>
allow提供了很多,convert转换,converter转换器是通过inint里指定的id来提供的。举例: <convert converter="null" match="void"/>里面的converter对应init里面id为null的converter.match匹配的是void,说明函数的返回值是void.其他的也为我们提供了各种的转换。

2、了解WEB应用中的dwr.xml文件和DWR中BEAN转换
WEB应用中的dwr.xml文件也就是我们在所建项目中创建的dwr.xml文件。现在先创建一个项目DWRBEAN:
创建后首先做的是把dwr.xml和它所需要的jar包放进去。
转换是双向的,前台传递参数到后台要转换,后台传到前台也要转换。前台可以用new的方式,在javascript总结里面讲过,这样就可以传递到后台,生成我们所需要的javabean。这种javabean处理完之后返回我们所需要的结果。现在仅仅要完成的功能是前台传递一个类似javabean的对象,然后通过转换器传递到后台的javabean,然后javabean处理后返回这个处理后的javabean给前台。前台获得后显示出结果。
javabean:
package com.lukuijun.bean;
public class User {
	private String userName;
	private String password;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}
业务逻辑:
package com.lukuijun.bean;
public class UserLogic {
	public User alterUser(User user){
		user.setUserName("lukuijun");
		user.setPassword("lukuijun");
		return user;
	}
}

配置dwr.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">
<dwr>
    <allow>
        <create creator="new" javascript="UserLogic"> <!-- javascript指定前台用的是UserLogic,产生UserLogic.js文件 -->
            <param name="class" value="com.lukuijun.UserLogic"/><!-- name指定类,value指定哪个类来生成 -->
            <include method="alterUser"/><!-- include表示在这个类中我允许那些方法暴露给客户端,允许客户端调用,注意一点,用了include就不能用

exclude,它们是互斥的。 -->
        </create>
        <convert match="com.lukuijun.bean.User" converter="bean"><!-- converter转换器用bean,match匹配返回类型com.lukuijun.bean.User -->
            <param name="include" value="userName,password"></param><!-- name指定属性,value指定属性的值,这里是包含属性,值userName,password可以

使用 -->
        </convert>
    </allow>
</dwr>
配置web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
      <servlet-name>dwr</servlet-name>
      <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>dwr</servlet-name>
      <url-pattern>/dwr/*</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
index.html页面:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<script type="text/javascript" src="dwr/engine.js"></script>
	<script type="text/javascript" src="dwr/util.js"></script>
	<script type="text/javascript" src="dwr/interface/UserLogic.js"></script>
	<script type="text/javascript">
	    function show(){
	        var userName=$("userName").value;
	        var password=$("password").value;
	        var obj={userName:userName,password:password};
	        UserLogic.alterUser(obj,function(data){
	            $("userName").value=data.userName;
	            $("password").value=data.password;
	        });
	    
	    }
	</script>
  </head>
  
  <body>
    userName:<input id="userName" type="text" value=""/><br>
    password:<input id="password" type="text" value=""/><br>
    <input type="button" value="alter" onclick="show()"/><br>
       
  </body>
</html>
分别输入123,123,点击alter显示lukuijun,lukuijun
这就是javabean的转换。
另一种创建对象的方式:
	<script type="text/javascript">
	    function show(){
	        var userName=$("userName").value;
	        var password=$("password").value;
	        var obj=new objBean(userName,password);
	        UserLogic.alterUser(obj,function(data){
	            $("userName").value=data.userName;
	            $("password").value=data.password;
	        });
	    
	    }
            function objBean(name,password){
                this.name=name;
                this.password=password;
            }
	</script>


论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics