1.DWR簡介
DWR(Direct Web Remoting)是一個Ajax的開源框架,用於改善web頁面與Java類交互的遠程服務器端的交互體驗,可以幫助開發人員開發包含AJAX技術的網站。它可以允許在瀏覽器裏的代碼使用運行在WEB服務器上的JAVA函數,就像它就在瀏覽器裏一樣。
2.開發流程
編寫業務代碼,該代碼是和dwr無關的。
確認業務代碼中哪些類、哪些方法是要由javascript直接訪問的。
編寫dwr組件,對步驟2的方法進行封裝。
配置dwr組件到dwr.xml文件中,如果有必要,配置convert,進行java和javascript類型互轉。
通過反射機制,dwr將步驟4的類轉換成javascript代碼,提供給前臺頁面調用。
編寫網頁,調用步驟5的javascript中的相關方法(間接調用服務器端的相關類的方法),執行業務邏輯,將執行結果利用回調函數返回。
在回調函數中,得到執行結果後,可以繼續編寫業務邏輯的相關javascript代碼。
3.簡單樣例
3.1.樣例說明
參照DWR源碼自帶樣例,完成一個sayHello功能,通過此樣例熟悉dwr的運行原理和編寫規範。
3.2.下載資源
從DWR官網下載最新版本的jar包,地址:
http://directwebremoting.org/dwr/downloads/index.html
將jar包放入WEB-INF的lib文件夾下。同時,dwr依賴於commons-logging.jar這個包,所以必須將這個jar包也放入到WEB-INF的lib文件夾下。
3.3.web.xml文件
首先是配置dwr的環境:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
3.4.dwr.xml文件
從官網的jar.war文件中利用winRAR等軟件提取出dwr.xml文件,並將其放入到WEB-INF文件夾下。
dwr.xml是dwr的核心配置文件,主要的標籤有:<converter>、<convert>、<create>這三個標籤。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="Demo">
<param name="class" value="com.agileai.test.simpletext.Demo"/>
</create>
</allow>
</dwr>
其中,creator和javascript是必須屬性,其他可以忽略。creator包含有以下幾個值:
new:Java用“new”關鍵字創造對象
none:它不創建對象 (v1.1+)
scripted:通過BSF使用腳本語言創建對象,例如BeanShell或Groovy
spring:通過Spring框架訪問Bean
struts:使用Struts的FormBean (v1.1+)
jsf:使用JSF的Bean (v1.1+)
pageflow:訪問Weblogic或Beehive的PageFlow (v1.1+)
ejb3:使用EJB3session bean (v2.0+)
3.5.Html文件
<html>
<head>
<title>簡單文本生成樣例</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<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/Demo.js'> </script>
<script type="text/javascript">
function update() {
var name = dwr.util.getValue("demoName");
Demo.sayHello(name, function(data) {
dwr.util.setValue("demoReply", data);
});
}
</script>
</head>
<body>
姓名:
<input type="text" id="demoName"value="Joe"/>
<input value="發送" type="button"onclick="update()"/><br/>
回覆:
<span id="demoReply"></span>
</body>
</html>
其中engine.js必須要,如果需要用到dwr提供的一些方便的工具要引用util.js,然後是dwr自動生成的js文件,名字必須和dwr.xml中create標籤的javascript屬性值一樣,且是dwr/interface開頭的目錄。
3.6.Java文件
package com.agileai.test.simpletext;
publicclassDemo {
public String sayHello(Stringname) {
return"Hello, "+ name;
}
}
3.7.運行原理
當你點擊瀏覽器調用的“發送”按鈕onclick事件,調用update()函數。
在服務器上,DWR調用Demo.sayHello()的Java方法。
該方法返回的時候,DWR調用回調函數,設置回覆值。