DWR(Direct Web Remoting)是一個AJAX框架,讓人興奮的是它可以使前臺javascript直接調用后臺java代碼,這使得AJAX開發變得更加簡單。
當然它的功能遠不止這么多,大家可以從http://getahead.org/dwr了解更多信息。
下面我以DWR2.0為例,為大家演示DWR在網絡象棋中的應用。
DWR在網絡象棋中的應用比較多,它們的運行方式都大同小異,在此就不一一展示出來了。
今天要演示的是每走一步棋時,如何向后臺提交數據,及如何取得返回的數據。
使項目支持DWR,要做下面幾步。
1. 從http://getahead.org/dwr下載dwr2.0的jar包,把jar包放在項目的lib目錄下。
2. 修改web.xml文件,添加如下代碼。
dwr.xml內容如下。
<script type="text/javascript" src="<%=request.getContextPath()%>/dwr/interface/ChessProcessDao"></script>
這樣javascript就可以調用ChessProcessDao里的方法了。
本文中所使用的內個類大致內容如下:
而且在dwr.xml中還要加入這段代碼,是為了把ChessStep公開給DWR,不然DWR會不認ChessStep類。
網絡象棋中所使用主要的技術也介紹完了。
由于網絡象棋還沒有最終完成所以源代碼就不放上來了,什么時候我寫完了再與大家分享吧。
將來如果還有網絡象棋第四帖那么應該就有源代碼可下載了。
當然它的功能遠不止這么多,大家可以從http://getahead.org/dwr了解更多信息。
下面我以DWR2.0為例,為大家演示DWR在網絡象棋中的應用。
DWR在網絡象棋中的應用比較多,它們的運行方式都大同小異,在此就不一一展示出來了。
今天要演示的是每走一步棋時,如何向后臺提交數據,及如何取得返回的數據。
使項目支持DWR,要做下面幾步。
1. 從http://getahead.org/dwr下載dwr2.0的jar包,把jar包放在項目的lib目錄下。
2. 修改web.xml文件,添加如下代碼。
<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>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>
initApplicationScopeCreatorsAtStartup
</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>500</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
3. 在WEB-INF目錄下創建dwr.xml文件。此文件主要是配置java類的映射。<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>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>
initApplicationScopeCreatorsAtStartup
</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>500</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
dwr.xml內容如下。
<?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 javascript="ChessProcessDao" creator="new">
<param name="class" value="com.chess.dao.ChessProcessDao" />
</create>
<convert match="com.chess.entity.ChessStep" converter="bean">
<param name="include"
value="userId,currentStep,chessmanId,gamenameId,previousStep,eatChessman,tableId" />
</convert>
</allow>
</dwr>
4. 在頁面公開類。在頁面中添加如下代碼。<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create javascript="ChessProcessDao" creator="new">
<param name="class" value="com.chess.dao.ChessProcessDao" />
</create>
<convert match="com.chess.entity.ChessStep" converter="bean">
<param name="include"
value="userId,currentStep,chessmanId,gamenameId,previousStep,eatChessman,tableId" />
</convert>
</allow>
</dwr>
<script type="text/javascript" src="<%=request.getContextPath()%>/dwr/interface/ChessProcessDao"></script>
這樣javascript就可以調用ChessProcessDao里的方法了。
本文中所使用的內個類大致內容如下:
public class ChessProcessDao{
public ChessStep insertStep(ChessStep chessStep){
//略,數據庫處理,把每步棋的信息存入數據庫


return chessStep;
}
}
public class ChessStep {
private int userId = -1;
private String currentStep = null;
private String chessmanId = null;
private String gamenameId = null;
private String previousStep = null;
private String eatChessman = null;
private int tableId = -1;
//略,變量的get和set方法


}
在上篇的mouseUp方法中中添加DWR調用。要注意的是如果類中的方法所接收或返回數據為對象實例,那么必須以JSON(JSON介紹http://www.json.org/json-zh.html)的數據格式傳入數據,public ChessStep insertStep(ChessStep chessStep){
//略,數據庫處理,把每步棋的信息存入數據庫


return chessStep;
}
}
public class ChessStep {
private int userId = -1;
private String currentStep = null;
private String chessmanId = null;
private String gamenameId = null;
private String previousStep = null;
private String eatChessman = null;
private int tableId = -1;
//略,變量的get和set方法


}
而且在dwr.xml中還要加入這段代碼,是為了把ChessStep公開給DWR,不然DWR會不認ChessStep類。
<convert match="com.chess.entity.ChessStep" converter="bean">
<!--把當前類中的屬性暴露給DWR,沒有暴露出來的屬性將不可訪問-->
<param name="include"
value="userId,currentStep,chessmanId,gamenameId,previousStep,eatChessman,tableId" />
</convert>
修改javascript代碼中的mouseUp()方法:<!--把當前類中的屬性暴露給DWR,沒有暴露出來的屬性將不可訪問-->
<param name="include"
value="userId,currentStep,chessmanId,gamenameId,previousStep,eatChessman,tableId" />
</convert>
function mouseUp(ev){


if(eatChessman(curTarget)){


//JSON數據格式
var data = {userId:user_id, currentStep:curTarget.id, chessmanId:dragObject.id,
gamenameId:gamename_id, previousStep:parentTarget.id, eatChessman:eatObj.id, tableId:table_id};
ChessProcessDao.insertStep(data, callbackfunc); //callbackfunc為AJAX回調函數
}else{


}


}
//每一個回調函數都有一個data數據變量。
function callbackfunc(data){
var userId = data.userId; //可以通過這樣的方式調用傳回的數據
var ccurrentStep = data.currentStep;


}
最基本的DWR使用方法就介紹完了。

if(eatChessman(curTarget)){


//JSON數據格式
var data = {userId:user_id, currentStep:curTarget.id, chessmanId:dragObject.id,
gamenameId:gamename_id, previousStep:parentTarget.id, eatChessman:eatObj.id, tableId:table_id};
ChessProcessDao.insertStep(data, callbackfunc); //callbackfunc為AJAX回調函數
}else{


}


}
//每一個回調函數都有一個data數據變量。
function callbackfunc(data){
var userId = data.userId; //可以通過這樣的方式調用傳回的數據
var ccurrentStep = data.currentStep;


}
網絡象棋中所使用主要的技術也介紹完了。
由于網絡象棋還沒有最終完成所以源代碼就不放上來了,什么時候我寫完了再與大家分享吧。

將來如果還有網絡象棋第四帖那么應該就有源代碼可下載了。
