DWR2学习笔记(一)

目录:

一.    DWR2HelloWorld入门

二.    dwr.xml文件分析

三.    服务器启DWR初始化,并引出dwr.xml文件多种配置方式

四.    DWR处理用户请求流程分析

 

一.    DWR2HelloWorld入门

功能描述:类似于一个简单的登陆页面,用户输入用户名+密码,如果参数有误,则提示错误信息,

                   如果登陆成功,提示用户信息。

                   引发异常情景:用户对象为空、用户名为空、密码为空、非法用户名:bye

1.        下载dwr.jar,这里我用的是dwr2.jar,将其它添加到WEB-INF/lib目录下,并配置我们的web.xml文件

<servlet>

    <servlet-name>dwr-invoker</servlet-name>

    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>

    <init-param>

        <param-name>debug</param-name>

        <param-value>true</param-value>

    </init-param>

    <load-on-startup>9</load-on-startup>

</servlet>

<servlet-mapping>

    <servlet-name>dwr-invoker</servlet-name>

    <url-pattern>/dwr/*</url-pattern>

</servlet-mapping>

Debug = true表示可以在浏览器中输入:http://localhost:8080/%5bWEB-APP%5d/dwr

然后就可以测试我们自己所写的dwr程序了。

如果为false,则不能访问这个地址的。

2.        WEB-INF目录下新建一个dwr.xml文件(默认情况下DWR会在启动时加载这个文件)

3.        定义一个POJO用户类User,它有2个属性:username,password,并提供setter/getter方法,

代码略

4.        定义一个普通异常类,继承自 RuntimeException

public class ParameterException extends RuntimeException{

    public ParameterException() {

       super();

    }

    public ParameterException(String message) {

       super(message);

    }

}

5.        编写我们的HelloWorld类,

package helloWorld;

public class HelloWorld {

    public HelloWorld(){

       System.out.println("------------构造函数初始化------------");

    }

    public String sayHello(User userInfo){

       if(userInfo == null){

           throw new ParameterException("用户信息不能为空!!!");

       }

       String username = userInfo.getUsername();

       String password = userInfo.getPassword();

       if(username == null || username.length() <= 0){

           throw new ParameterException("用户名不能为空!!!");

       }

       if(password == null || password.length() <= 0){

           throw new ParameterException("密码不能为空!!!");

       }

       if("bye".equals(username)){

           throw new ParameterException("非法用户名:"+username+"!!!");

       }

       return "Hello, your name is "+username+", password is "+password+"!!!";

    }

}

6.        dwr.xml中配置我们的HelloWorld,让jsp页面可以访问我们的HelloWorld.sayHello(…)方法

    <allow>

       <!-- 生成器:生成所需要的业务逻辑对象 -->

       <create creator="new" javascript="HelloWorld" scope="session">

           <param name="class" value="helloWorld.HelloWorld" />

           <!-- 指定客户端可以访问哪些个方法,默认可以访问所有 -->

           <include method="sayHello" />

       </create>

       <!-- 转换器 -->

       <convert converter="bean" match="com.dwr.bean.User">

           <!-- 指定转换时可以给哪些参数赋值(调用其set方法),默认可以给所有参数赋值 -->

           <param name="include" value="username,password" />

       </convert>

       <!-- 当发生以下异常时,返回异常详细信息到前台,否则只返回字符串:Error -->

       <convert match="com.dwr.bean.ParameterException" converter="exception" />

    </allow>

(1)javascript="HelloWorld",表示页面需要像这样引入js:

<script type='…' src="/dwr/interface/HelloWorld.js"></script>

并且要像这样调用方法:HelloWorld.sayHello(…);

(2)scope="session",表示这个HelloWorld的作用范围,默认是page

(3)<convert converter="bean" match="com.dwr.bean.User">

指定当jsp页面传递一个对象过来时,怎样将给对象赋值给后台的User对象

(4) 

7.        编写jsp页面:

<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/HelloWorld.js"></script>

<script type="text/javascript">

    function commit(){

       var username = document.getElementById("username").value;

       var password = document.getElementById("password").value;

       var user = {

           username : username,

           password : password

       };

       // 调用服务器端方法

       HelloWorld.sayHello(user, {

           callback : function(data){

              alert('成功:'+data);

           },

           exceptionHandler : function(data){

              alert('异常:'+data);

           }

       }); }

</script>

</head>

<body>

    用户名:

<input type='text' name="username" id="username" /><br>

    &nbsp;&nbsp;&nbsp;&nbsp;码:

<input type='text' name="password" id="password" />

    <input type='button' value="提交" onclick="commit();" />

</body>

(1)     这里必须引入的js: engine.js , util.js , HelloWorld.js

它们是从org.directwebremoting包中加载的,加载的时候会给js中一些参数赋值

其中enjine.js提供了客户端 服务器 交互的细节方法,

Util.js提供了一些常用的工具方法,例如:取值、设值

HelloWorld.js,名称是根据dwr.xmljavascript属性来定的,

当访问HelloWorld.js时,服务器会生成调用HelloWorld.sayHello()方法的方式,

8.        测试。

(1)     什么也不输入,提示:异常:用户名不能为空!!!

(2)     用户名:bye,密码:123,提示:异常:非法用户名:bye!!!

(3)     改变调用参数HelloWorld.sayHello(null,…),提示:异常:用户信息不能为空

(4)     用户名:zhangxd,密码:123,提示:成功:Hello,your name is zhangxd…

 

二.    dwr.xml文件分析

1. 服务器启动时,DwrServlet.java会将dwr.xml加载到内存中,这里共有2dwr.xml,

1个是在dwr.jar包中(系统dwr.xml)1个是我们自己编写的(用户dwr.xml),放在WEB-INF目录下。

2. 系统dwr.xml中有一些默认的:

(1) 对象生成器(<creator id=’’ class=’’/>),用户dwr.xml可以使用这些构造器来生成对象,例如:

<create creator="new" javascript="HelloWorld" scope="session">

它使用了系统中的new对象生成器,来生成我们的HelloWorld对象,

当然系统dwr.xml也定义了其它的对象生成器,如:spring,struts…

(2) 参数转换器(<converter id=’’ class=’’/>),用户dwr.xml可以使用这些参数转的确器,将页面传递过来的参数转换成我们java方法所需要的参数,例如:

Java方法:public String sayHello(User userInfo)

用户dwr.xml<convert converter="bean" match="com.dwr.bean.User">

页面参数:var user = {username : username, password : password}

这里使用了bean参数转换器,它调用User类的setter方法,将页面对象赋值给user对象

(2)     默认允许的参数转换方式

<allow>

            <convert converter="string" match="java.lang.String"/>

<convert converter="date" match="java.util.Date"/>

    …

</allow>

如果java方法需要的参数是:StringDate类型的,就不用我们手工去用户dwr.xml配置参数转换器了,直接用系统默认的这个参数转换方式就可以了。

posted on 2009-12-19 22:53  TroyZ  阅读(997)  评论(0编辑  收藏  举报