DWR是一個(gè)開(kāi)源的類庫(kù),可以幫助開(kāi)發(fā)人員開(kāi)發(fā)包含AJAX技術(shù)的網(wǎng)站.它可以允許在瀏覽器里的代碼使用運(yùn)行在WEB服務(wù)器上的JAVA函數(shù),就像它就在瀏覽器里一樣.
DWR允許使用客戶端Javascript來(lái)與服務(wù)端Java程序進(jìn)行交互,他實(shí)際上是幫助開(kāi)發(fā)者隱藏了很多的開(kāi)發(fā)細(xì)節(jié)。不用辛苦的去使用XMLHTTP,DWR是客戶端-服務(wù)端的AJAX比較好的解決方案。
它包含兩個(gè)主要的部分:允許JavaScript從WEB服務(wù)器上一個(gè)遵循了AJAX原則的Servlet(小應(yīng)用程序)中獲取數(shù)據(jù).另外一方面一個(gè)JavaScript庫(kù)可以幫助網(wǎng)站開(kāi)發(fā)人員輕松地利用獲取的數(shù)據(jù)來(lái)動(dòng)態(tài)改變網(wǎng)頁(yè)的內(nèi)容.
DWR采取了一個(gè)類似AJAX的新方法來(lái)動(dòng)態(tài)生成基于JAVA類的JavaScript代碼.這樣WEB開(kāi)發(fā)人員就可以在JavaScript里使用Java代碼就像它們是瀏覽器的本地代碼(客戶端代碼)一樣;但是Java代碼運(yùn)行在WEB服務(wù)器端而且可以自由訪問(wèn)WEB 服務(wù)器的資源.出于安全的理由,WEB開(kāi)發(fā)者必須適當(dāng)?shù)嘏渲媚男㎎ava類可以安全的被外部使用.
這個(gè)從JAVA到JavaScript的遠(yuǎn)程功能方法給DWR的用戶帶來(lái)非常像傳統(tǒng)的RPC機(jī)制,就像RMI或者SOAP一樣,而且擁有運(yùn)行在WEB上但是不需要瀏覽器插件的好處.
DWR不認(rèn)為瀏覽器/WEB服務(wù)器協(xié)議是重要的,而更樂(lè)于保證編程界面的簡(jiǎn)單自然.對(duì)此最大的挑戰(zhàn)就是把AJAX的異步特性和正常JAVA方法調(diào)用的同步特性相結(jié)合.在異步模式下,結(jié)果數(shù)據(jù)在開(kāi)始調(diào)用之后的一段時(shí)間之后才可以被異步訪問(wèn)獲取到.DWR允許WEB開(kāi)發(fā)人員傳遞一個(gè)回調(diào)函數(shù),來(lái)異步處理Java函數(shù)調(diào)用過(guò)程
DWR Javascript庫(kù)中常用函數(shù)的使用
設(shè)置異步/同步模式
默認(rèn)情況下,DWR以異步的方式跟服務(wù)器通信,即可以同時(shí)向服務(wù)器發(fā)送請(qǐng)求,如果想要改為同步的方式,可以調(diào)用:dwr.engine.setAsync(false);
獲得對(duì)某個(gè)頁(yè)面元素對(duì)象的引用
$(“元素的ID或名稱”)
對(duì)列表元素的支持
dwr.util.removeAllOptions()
dwr.util.addOptions()
dwr.util.getValue()
dwr.util.setValue()
Dwr的一個(gè)應(yīng)用:
官方網(wǎng)址: http://getahead.org/dwr
下載dwr.jar,將其加入web-inf/lib目錄
修改web.xml文件,添加DWRServlet的映射
<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>
配置dwr,即在WEB-INF目錄下,添加dwr.xml文件,讓dwr知道在運(yùn)行的時(shí)候應(yīng)該給哪些JavaBean生成相應(yīng)的javascript庫(kù)!
<?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="test1">
<param name="class" value="com.dwr.Test1"/>
</create>
</allow>
</dwr>
這個(gè)配置的意思是,要?jiǎng)?chuàng)建的是Test1對(duì)象的javascript庫(kù),而且這個(gè)庫(kù)的名字叫test1,同時(shí),這也是我們?cè)贘SP頁(yè)面上調(diào)用這個(gè)對(duì)象的時(shí)候所使用的名稱,請(qǐng)看下面的JavaBean代碼和JSP實(shí)例:
4、下面是Test1這個(gè)JavaBean的源代碼:
package com.dwr;
public class Test1 {
public String sayHello(String name){
return "你好,"+name;
}
}
5、在JSP中的使用
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<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/test1.js"></script>
<title>Insert title here</title>
<script type="text/javascript">
function sayHello(){
test1.sayHello("李四ddd",
function(data){
alert(data);
}
);
}
</script>
</head>
<body>
<a href="#" onclick="sayHello()">Test1</a>
</body>
</html>
讓我們簡(jiǎn)單看一下這個(gè)JSP文件:首先引入DWR中的兩個(gè)核心javascript庫(kù):engine.js和util.js,它們分別是dwr中的核心引擎庫(kù)和輔助工具函數(shù)庫(kù)!
第三個(gè)引入的dwr/interface/test1.js,實(shí)際上這個(gè)文件并不存在,這是由dwr在運(yùn)行的時(shí)候動(dòng)態(tài)生成的!test1這個(gè)名稱,跟dwr.xml文件中配置的對(duì)應(yīng)對(duì)象的javascript屬性一致!
而且,我們?cè)谑褂玫臅r(shí)候,直接使用test1這個(gè)名稱,作為這個(gè)對(duì)象的引用。直接調(diào)用這個(gè)對(duì)象的方法:sayHello,這個(gè)方法的名稱必須與JavaBean中的方法名稱一致!
sayHello方法有一個(gè)參數(shù),同時(shí)返回一個(gè)值。我們可以直接傳遞參數(shù),同時(shí)指定一個(gè)javascript函數(shù)來(lái)處理這個(gè)返回值(如上例所示)。
如何傳遞參數(shù)
如果要調(diào)用的方法有參數(shù),則將參數(shù)放在前面
如何處理返回值
定義一個(gè)函數(shù)來(lái)處理返回值,這個(gè)函數(shù)有一個(gè)參數(shù),就是JavaBean方法的返回值