DWR是一個開源的類庫,可以幫助開發人員開發包含AJAX技術的網站.它可以允許在瀏覽器里的代碼使用運行在WEB服務器上的JAVA函數,就像它就在瀏覽器里一樣.
DWR允許使用客戶端Javascript來與服務端Java程序進行交互,他實際上是幫助開發者隱藏了很多的開發細節。不用辛苦的去使用XMLHTTP,DWR是客戶端-服務端的AJAX比較好的解決方案。
它包含兩個主要的部分:允許JavaScript從WEB服務器上一個遵循了AJAX原則的Servlet(小應用程序)中獲取數據.另外一方面一個JavaScript庫可以幫助網站開發人員輕松地利用獲取的數據來動態改變網頁的內容.
DWR采取了一個類似AJAX的新方法來動態生成基于JAVA類的JavaScript代碼.這樣WEB開發人員就可以在JavaScript里使用Java代碼就像它們是瀏覽器的本地代碼(客戶端代碼)一樣;但是Java代碼運行在WEB服務器端而且可以自由訪問WEB 服務器的資源.出于安全的理由,WEB開發者必須適當地配置哪些Java類可以安全的被外部使用.
這個從JAVA到JavaScript的遠程功能方法給DWR的用戶帶來非常像傳統的RPC機制,就像RMI或者SOAP一樣,而且擁有運行在WEB上但是不需要瀏覽器插件的好處.
DWR不認為瀏覽器/WEB服務器協議是重要的,而更樂于保證編程界面的簡單自然.對此最大的挑戰就是把AJAX的異步特性和正常JAVA方法調用的同步特性相結合.在異步模式下,結果數據在開始調用之后的一段時間之后才可以被異步訪問獲取到.DWR允許WEB開發人員傳遞一個回調函數,來異步處理Java函數調用過程
DWR Javascript庫中常用函數的使用
設置異步/同步模式
默認情況下,DWR以異步的方式跟服務器通信,即可以同時向服務器發送請求,如果想要改為同步的方式,可以調用:dwr.engine.setAsync(false);
獲得對某個頁面元素對象的引用
$(“元素的ID或名稱”)
對列表元素的支持
dwr.util.removeAllOptions()
dwr.util.addOptions()
dwr.util.getValue()
dwr.util.setValue()
Dwr的一個應用:
官方網址: 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知道在運行的時候應該給哪些JavaBean生成相應的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="test1">
<param name="class" value="com.dwr.Test1"/>
</create>
</allow>
</dwr>
這個配置的意思是,要創建的是Test1對象的javascript庫,而且這個庫的名字叫test1,同時,這也是我們在JSP頁面上調用這個對象的時候所使用的名稱,請看下面的JavaBean代碼和JSP實例:
4、下面是Test1這個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>
讓我們簡單看一下這個JSP文件:首先引入DWR中的兩個核心javascript庫:engine.js和util.js,它們分別是dwr中的核心引擎庫和輔助工具函數庫!
第三個引入的dwr/interface/test1.js,實際上這個文件并不存在,這是由dwr在運行的時候動態生成的!test1這個名稱,跟dwr.xml文件中配置的對應對象的javascript屬性一致!
而且,我們在使用的時候,直接使用test1這個名稱,作為這個對象的引用。直接調用這個對象的方法:sayHello,這個方法的名稱必須與JavaBean中的方法名稱一致!
sayHello方法有一個參數,同時返回一個值。我們可以直接傳遞參數,同時指定一個javascript函數來處理這個返回值(如上例所示)。
如何傳遞參數
如果要調用的方法有參數,則將參數放在前面
如何處理返回值
定義一個函數來處理返回值,這個函數有一個參數,就是JavaBean方法的返回值