Posted on 2007-09-29 15:06
狂奔的蜗牛 阅读(819)
评论(1) 编辑 收藏
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文件,添加如下代码。
<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类的映射。
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. 在页面公开类。在页面中添加如下代码。
<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)的数据格式传入数据,
而且在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()方法:
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使用方法就介绍完了。
网络象棋中所使用主要的技术也介绍完了。
由于网络象棋还没有最终完成所以源代码就不放上来了,什么时候我写完了再与大家分享吧。
将来如果还有网络象棋第四帖那么应该就有源代码可下载了。