DWR2学习笔记(一)
目录:
二. dwr.xml文件分析
三. 服务器启动DWR初始化,并引出dwr.xml文件多种配置方式
功能描述:类似于一个简单的登陆页面,用户输入用户名+密码,如果参数有误,则提示错误信息,
如果登陆成功,提示用户信息。
引发异常情景:用户对象为空、用户名为空、密码为空、非法用户名: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> 密 码: <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.xml中javascript属性来定的,
当访问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加载到内存中,这里共有2个dwr.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方法需要的参数是:String、Date类型的,就不用我们手工去用户dwr.xml配置参数转换器了,直接用系统默认的这个参数转换方式就可以了。