一,DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样.
二,配置
1、拷贝dwr.jar文件
2、修改web.xml文件,添加dwr servlet配置:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>/
<!--以上用这个类也可以uk.ltd.getahead.dwr.DWRServlet--!>
<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><!--每一个文件在访问时,程序会自动加/dwr..-->
</servlet-mapping>
3、在web-inf下面添加dwr.xml配置文件
//作用:Java代码运行在WEB服务器端而且可以自由访问WEB 服务器的资源.出于安全的理由,WEB开发者必须适当地配置哪些Java类可以安全的被外部使用。
4、创建页面
需引入以下javascript:
<script src='dwr/interface/testClass.js'></script>//在配置文件中以怎么为对象就以怎么为命名,为dwr自动产生( <create creator="new" javascript="testClass.js">)
<script src='dwr/engine.js'></script>
<script src='dwr/util.js'></script>
其中TestClass.js是dwr根据配置文件自动生成的,engine.js和util.js是dwr自带的脚本文件。
与spring结合使用
<create creator="spring" javascript="Intro">
<param name="beanName" value="id" />//beanName为固定形式,id为bean中配置的<bean id=""..>
</create>
在jsp中对javascript调用函数时,function dwr()不能以dwr命名
基础部分:
dwr.util.getValue("id");//可以获取到值
1, object.method1(para1,para2,..,);//这种是进行赋参,2
2, object.method1(para1,function(data){
alert(data);//这个为返回值,自行处理
});
3, object.method1(para1,method2);
function method2(data){
alert(data);
}//2,3为两种不同的返回值 类型
dwr的配置文件详解(指明标签中包括可以暴露给javascript访问的东西。)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="T3">
<param name="class" value="com.wqy.DataBaseHandle"/>
<include method="testMethod1"/>//说明了这个T3在javaScrip中只能访问这个方法,没有声明时,代表全部可以。
<exclude method="testMethod2">//标签指定要防止被访问的方法。
</create>
<!--
<converter>标签则负责这些方法的参数和返回类型。convert元素的作用是告诉DWR在服务器端Java 对象表示和序列化的JavaScript之间如何转换数据类型。DWR自动地在Java和JavaScript表示之间调整简单数据类型。这些类型包括Java原生类型和它们各自的封装类表示,还有String、Date、数组和集合类型,
如当一个集合中加了User的自定义类对象,则要进行声明。bean是有getter setter类型,还有object类型
其他的array,list...是默认开放的。
-->
<convert converter="bean" match="com.wqy.User" javascript="user"/>
</allow>
</dwr>
2,进行传对象
//进行传一个Bean ,User(string username,string password)的对象
如以下:因满足条件,
1,必须要有set方法
2,必须在convert里面进行转化<convert match="com.wqy.User" converter="bean" ></convert>
3,java方法中void testMethod5(User user)相对应的传进来
Function callTestMethod5(){
//定义要传到java方法中的参数
var data;
//构造参数,data实际上是一个object
data1 = { username:"user", password:"password" }
testClass.testMethod5(data);
}
3,如果传的参数是数组、List
Function callTestMethod7(){
//定义要传到java方法中的参数
var data;
//构造参数,data实际上是一个object数组,即数组的每个元素均为object
data = [
{
username:"user1",
password:"password2"
},
{
username:"user2",
password:" password2"
}
];
testClass.testMethod7(data);
}
function callBackFortestMethod(data){
//其中data接收方法的返回值
for(var property in data){
var bean = data[property];
alert(bean.username);
alert(bean.password);
}
}
4,如果返回值为map的值/或者传的参数为Map
function test2(){
T5.hello(
function(datas){
//循环获取Map中的内容
for(var prop in datas){
alert("key="+prop+",value="+datas[prop]);
}
}
);
}、、可以以这种形式获取值
//可以以这种方式传map参数进去
如果java的方法的参数为Map(假设其key为String,value为TestBean),则在调用该方法的javascript函数中用如下方法构造要传递的参数:
function callTestMethod (){
//定义要传到java方法中的参数
var data;
//构造参数,date实际上是一个object,其属性名为Map的key,属性值为Map的value
data = {
"key1":{
username:"user1",
password:"password2"
},
"key2":{
username:"user2",
password:" password2"
}
};
testClass.testMethod(data);
}
并且在dwr.xml中增加如下的配置段
<signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(Map<String,TestBean>);
]]>
</signatures>
//标签是用来声明java方法中List、Set或者Map参数所包含的确切类,以便java代码作出判断。