1.dwr的配置
①引入两个jar,commons-logging-1.1.1和dwr

②配置dwr servlet,即修改web.xml,添加以下内容

<servlet>
  <display-name>DWR Servlet</display-name>
  <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>
③自己写一个dwr.xml,放在WEB-INF下,实例如下

<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
    "http://getahead.org/dwr/dwr30.dtd">

<dwr>
  <allow><!-- 与struts2的action类似 -->
    <create creator="new" javascript="ccc">
      <param name="class" value="com.bjsxt.test.DwrHello" />
    </create>
  </allow>
</dwr>
其中,<allow>标签中包括暴露出来可以给javascript访问的内容。<create>标签中指定js可以访问的java类,creator="new"指定java类实例的生成方式,new表示dwr应该调用类的无参构造函数来获得实例。其它的还有spring方式。

<include>标签指定要公开给js的方法,不指定的话就公开所有方法。
<exclude>标签指定要防止被访问的方法。
include和exclude不能同时存在。

④在jsp页面引入两个js,一个是自定义的,另一个是engine.js

<script type='text/javascript' src='/dwr_001/dwr/interface/ccc.js'></script>
<script type='text/javascript' src='/dwr_001/dwr/engine.js'></script>
<!--dwr_001是项目名称,注意dwr_001前边的斜杠不能丢,否则访问不到-->
实际上这两个js文件是dwr servlet响应回来的(因为dwr servlet中拦截的是/dwr/*,访问http://localhost:8080/dwr_001/dwr可以得到这两个js),项目中实际并不存在这些路径,没有dwr这个文件夹。

在jsp页面可以写一个js方法

function check(){
	//dwr 在js中直接调用java代码
	ccc.add(1,2,function(result){
	//所有dwr代理类对象的方法最后一个参数都是获取返回值的callback(回调)函数
	//这解释了为什么DwrHello中add方法定义了两个参数,而dwr使用时加了一个函数
		alert(result);
		})
}
//在js中,check可以直接调用DwrHello的add方法,而没有通过ajax向后台获取该方法,这就是js中直接调用java代码的含义所在。使用ajax就比较麻烦,需要写url,path等
这个回调函数callback是怎么回事?
如DwrHello中的add方法为

public int add(int a,int b){
	return a+b;
}
//那么callback就表示再次调用add方法,而这个add方法会返回一个数值。result就表示返回的值。
2.dwr是easy ajax for java,可以在js中直接调用java.本质上就是ajax和反射机制。它可以将java对象和json对象互相转换,而不再需要json,简化了很多。

3.dwr触发一个函数调用时,会发送一个ajax请求,并且每次请求后台的java类都会创建一个新的对象(可以看出不是单例),在jsp中导入两个js文件,其中/interface路径下的js文件是和后台的java类相似的json对象,这js不是我们所写,而是由dwr生成。

4.用dwr进行简单的用户名重复验证,如下用简单例子说明,用户名只要不是zs,都可以注册

public int checkName(String name){
	if("zs".equals(name)){
		return 0;
	}else{
		return 1;
	}
}
而在jsp页面可以这么写

function check(name){
	ccc.checkName(name.value,function(flag){ 
		<!--先定义一个js函数,然后在该js函数内调用java方法,该处扔使用了回调函数-->
		var msg = document.getElementById("flag");
		if(flag==0){
			msg.innerHTML = "该用户名不可用";
		}else if(flag==1){
			msg.innerHTML = "该用户名可用";
		}

	})
}
<input type="text" οnclick="check(this);"><font id="flag" color="red"></font>
从而达到验证目的。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐