DWR基本環境配置,回調函數不執行問題

利用一個傳入的姓名,然後給該姓名說“你好,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()方法後,成功返回了打招呼的語句。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章