听说dwr不错,想学学,网上教程啊资料啊 铺天盖地 俺觉得学东西的最好办法就是先做出来,于是俺就百度(也Google)了下,抄来个例子,竟然调试到半夜!
今天想来,觉得应该把这过程记录下来,然后在后面的学习中,多回头看看。
下载dwr的war包,放到tomcat下解开,然后找到dwr.jar包,将其放到我们的web工程的WEB-INF/lib,现在需要做的是将dwr配置到工程。
修改web.xml,添加dwr的servlet:
<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>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
然后在WEB-INF下新建dwr自己的配置文件dwr.xml,内容如下:
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="dwrdemo">
<param name="class" value="com.xsoft.dwr.DwrDemo" />
</create>
</allow>
</dwr>
下一步就是将dwr.xml引用的DwrDemo类实现。
java代码:
package com.xsoft.dwr;
public class DwrDemo {
public String getSomething(String name)
{
return "Hi, "+name;
}
}
现在来说应该已经可以debug测试一下dwr是否可用了。OK,部署到tomcat,启动正常,访问工程进入welcome页面。这时候 肯定没问题,否则是web工程本身的问题(现在还完全跟dwr不搭嘎)。现在在工程名后面直接加上dwr,然后继续访问,正确的话是可以进入dwr的页面,但是 oh,my lady gaga!
提示:找不到类定义,logging的类定义。
好吧,我们继续到dwr(dwr.war解压包)中去找到这个jar(commons-logging-1.0.4.jar),好了copy到我们工程的lib下。重新发布一下我们的工程,再来访问,首先welcome页面正常,见证奇迹的时刻,url路径添加dwr,回车(url路径后面的index页面是我敲回车自己定位的,与我无关):
好了,进入dwrdemo验证我们的java类是否正常工作:
OK,可以了。
那下面就是写我们的jsp页面吧。
这里就要注意了,我们在页面使用dwr,显然是要引入JavaScript包的,引入什么包呢,上面验证的步骤,如果细心的话,已经看到了最上面提示:To user this class in your javascript you will need the following script includes…… OK,将我们需要的js包引入吧。
<head>
<title>First-DWR</title>
<script type='text/javascript' src='/DwrSSH/dwr/interface/dwrdemo.js'></script>
<script type='text/javascript' src='/DwrSSH/dwr/engine.js'></script>
<script type='text/javascript' src='/DwrSSH/dwr/util.js'></script>
<script type='text/javascript'>
function inputtext(){
var username = document.all.username.value;
dwrdemo.getSomething(username,callBackH);
}
function callBackH(data){
alert(data);
}
</script>
</head>
<body>
This is my JSP page.
<br>
<input type="text" name="username">
<input type="button" name="button2" value="输入测试" οnclick="inputtext()" />
</body>
jsp页面完成之后,可以访问页面试验了:
完成了。
现在想来好像很简单,但是刚开始的时候,的确是满头的包啊。
第一点,logging的jar包问题,我想dwr广泛用于web工程,现在很多web工程使用struts的框架,struts框架是包含了这个包的(经验证两个包是相同的),所有没有dwr默认工程里存在这个包,但是我的例子是没有任何框架的,所有需要手动加入这个包。
第二点,页面脚本错误,提示dwrdemmo为定义,dwrdemo.js是dwr自动为每个dwr.xml配置里使用到JavaScript标记的变量生成的。所以在验证的时候,上面会有提示“you need……”,把这些js包引入jsp页面就可以了。
第三点,dwr直接跟后台的java类交互了,java直接获取前台数据并对数据处理,处理之后呢?还是要返回前台的,这时候就需要回调(callback),于是在dwr使用java类的方法(getSomething)要比java多一个参数,这个参数就是要回调前台页面的JavaScript方法名,然后这个方法定义时候包含一个参数(data),这个参数代表java回传给前台的数据。