利用一個傳入的姓名,然後給該姓名說“你好,XXX”的程序來測試基本環境的搭建。
1、下載DWR.zip後將其解壓。
2、在eclipse的WebContent下的WEB-INF下的lib文件夾下拷入dwr.jar(該jar文件在解壓後的DWR根目錄下)。
3、在eclipse的WebContent下建立一個js文件夾,然後從解壓後的DWR根文件夾下的java\org\directwebremoting下的util.js和engine.js兩個文件拷貝到該js文件夾下。
4、下載在項目的src目錄下建立一個類:
public class SayHello {
public SayHello() {
}
public String say(String name) {
return "Hello," + name;
}
}
5、在WEB-INF目錄下與web.xml文件同級目錄下創建一個dwr.xml(該文件從解壓後的DWR根文件夾下的web\WEB-INF文件夾下拷貝dwr.xml文件到此處後進行修改)。
修改後爲:
<dwr>
<allow>
<create javascript="sayHello" creator="new">
<param name="class" value="dwr01.service.SayHello"></param>
</create>
</allow>
</dwr>
6、在WebContent文件夾下創建一個index.jsp。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/dwr/util.js"></script>
<script type="text/javascript" src="js/dwr/engine.js"></script>
//此處必須是dwr/interface開頭,sayHello.js的文件名必須和dwr.xml文件中配置的create標籤的javascript屬性名字相同
<script type="text/javascript" src="dwr/interface/sayHello.js"></script>
<script type="text/javascript" src="js/service/sayHello/sayHello_say.js"></script>
</head>
<body>
<input type="text" name="userName" id="userName" />
<input type="button" value="點擊我吧......" id="sayButton" />
</body>
</html>
最後引入的sayHello_say.js是自己創建的一個調用第4步SayHello類中say()方法的一個js文件。
內容爲:
$(document).ready(function() {
var $sayButton = $("#sayButton");
$sayButton.click(function() {
say($("#userName").val());
});
});
function say(userName) {
sayHello.say(userName,callBackSay);//調用SayHello類中say()方法
}
//調用完say()方法後執行的回調函數傳入參數data爲該方法返回的值
function callBackSay(data) {
alert(data);
}
7、現在來配置關鍵的web.xml文件。
在其中配置一個Servlet,虛擬路徑爲dwr/*。
內容爲:
<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>
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>allowScriptTagRemoting</param-name>
<param-value>true</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>
參數crossDomainSessionSecurity默認值爲true,在默認時同時參數allowScriptTagRemoting未設置是,在調用完類的方法後回調函數不會執行,日誌會打出:
org.directwebremoting.util.CommonsLoggingOutput error
嚴重: A request has been denied as a potential CSRF attack.
解決這個問題的辦法是:將參數crossDomainSessionSecurity設爲false。表示其能夠從其他域進行請求,需要注意的是這樣做可能會出現安全性的問題。
當將參數crossDomainSessionSecurity設爲false後再次調用類方法會發下,雖然日誌打出:
org.directwebremoting.util.CommonsLoggingOutput info
信息: Exec: sayHello.say()
提示執行SayHello類的say()方法成功,但是任然沒有執行回調函數。解決的辦法是設定另外一個參數的值來解決次問題。
將參數allowScriptTagRemoting的值設爲true,意思爲允許腳本標籤遠程調用。
再來試試程序,點擊頁面上的名爲“點我吧......”的按鈕,發現程序運行成功,在調用了SayHello類的say()方法後,成功返回了打招呼的語句。