DWR 是一個(gè)開(kāi)源的工具,她利用 Java 的反射和 AJAX 技術(shù)實(shí)現(xiàn)了 javascript java 類的通信。官方網(wǎng)站是: http://getahead.ltd.uk/dwr/

          下面看一個(gè)實(shí)際的例子:
          chat.gif?

          這個(gè)例子是根據(jù) DWR demo 改寫(xiě)的,是一個(gè)簡(jiǎn)化的聊天室,下面輸入信息在上面顯示出來(lái),這是 AJAX 技術(shù)的典型應(yīng)用。

          對(duì)于這個(gè)應(yīng)用編寫(xiě)過(guò)程如下:

          1、? 編寫(xiě)三個(gè) JAVA 類: Message.java MessageDao.java ChatManager.java

          2、? 配置 DWR dwr.xml web.xml

          3、? 編寫(xiě)一個(gè) html 的頁(yè)面: index.html

          4、? index.html 上添加與 DWR 相關(guān)的 js 腳本;

          Message.java

          package test.dwr;

          ?

          public class Message {

          ??? private String text;

          ?

          ??? private String from;

          ?

          ??? /**

          ???? * 空構(gòu)造方法很重要

          ???? *

          ???? * 1 java 編譯器默認(rèn)如果已經(jīng)有了帶參構(gòu)造函數(shù),就不會(huì)再生成無(wú)參構(gòu)造函數(shù);

          ???? *

          ???? * 2 DWR 大量使用 Class.forName("clazz").newInstance() ,如果沒(méi)有空構(gòu)造方法將會(huì)拋錯(cuò);

          ???? *

          ???? */

          ??? public Message() {

          ??? }

          ?

          ??? public Message(String text, String from) {

          ??????? this.text = text;

          ??????? this.from = from;

          ??? }

          ?

          ??? public String getFrom() {

          ??????? return from;

          ??? }

          ?

          ??? public void setFrom(String from) {

          ??????? this.from = from;

          ??? }

          ?

          ??? public String getText() {

          ??????? return text;

          ??? }

          ?

          ??? public void setText(String text) {

          ??????? this.text = text;

          ??? }

          }

          MessageDao.java

          package test.dwr;

          ?

          public class MessageDao {

          ??? public Message save(Message message) {

          ??????? System.out.println("========Lucky DWR Begin=======");

          ??????? System.out.println("text:" + message.getText());

          ??????? System.out.println("from:" + message.getFrom());

          ??????? System.out.println("=========Lucky DWR End========");

          ?

          ??????? return message;

          ??? }

          ?

          ??? public Message get() {

          ??????? return new Message("This is the first dwr demo!", "test");

          ??? }

          }

          ChatManager.java

          package test.dwr;

          ?

          public class ChatManager {

          ??? MessageDao messageDao = new MessageDao();

          ?

          ??? public Message add(Message message) {

          ??????? return messageDao.save(message);

          ??? }

          ?

          ??? public Message read() {

          ??????? return messageDao.get();

          ??? }

          }

          至此,大家可能看到這與我們一貫的寫(xiě)法沒(méi)有什么差異。

          dwr.xml

          <?xml version="1.0" encoding="UTF-8"?>

          <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">

          ?

          <dwr>

          ? <allow>

          ??? <create creator="new" javascript="ChatManager">

          ????? <param name="class" value="test.dwr.ChatManager"/>

          ??? </create>

          ??? <convert converter="bean" match="test.dwr.Message"/>

          ? </allow>

          </dwr>

          dwr.xml 的具體解釋大家可以參見(jiàn)官方網(wǎng)站,這里是常用的, create 節(jié)點(diǎn)的意思是將 ChatManager 轉(zhuǎn)變成 ChatManager.js convert 節(jié)點(diǎn)的意思是使用 bean 轉(zhuǎn)換器。 bean 轉(zhuǎn)換器的定義在 dwr.jar 包中的 dwr.xml 中,這個(gè)配置文件會(huì)被預(yù)先裝載。

          web.xml

          <?xml version="1.0" encoding="ISO-8859-1"?>

          <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

          ?

          <web-app id="chat-demo">

          ? <display-name>Chat-Demo</display-name>

          ? <servlet>

          ??? <servlet-name>dwr-invoker</servlet-name>

          ??? <display-name>DWR Servlet</display-name>

          ??? <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>

          ? </servlet>

          ? <servlet-mapping>

          ??? <servlet-name>dwr-invoker</servlet-name>

          ??? <url-pattern>/dwr/*</url-pattern>

          ? </servlet-mapping>

          </web-app>

          DWRServlet DWR 聯(lián)系客戶端和服務(wù)器端程序的聯(lián)系紐帶,它首先將你定義的 dwr.xml 中的類轉(zhuǎn)變成 js ,當(dāng)客戶端調(diào)用 js 中的方法后,又由他來(lái)調(diào)用具體的實(shí)現(xiàn)類的方法,返回給客戶端結(jié)果。

          index.html

          <html>

          <head>

          ? <title>Chat-Demo</title>

          ?

          ? <!--Dwr 自帶的 js-->

          ? <script type='text/javascript' src='dwr/engine.js'></script>

          ? <script type='text/javascript' src='dwr/util.js'></script>

          ? <!-- 你在 dwr.xml 中配置的調(diào)用類的 js-->

          ? <script type='text/javascript' src='dwr/interface/ChatManager.js'></script> ?

          ?

          ? <script type='text/javascript'>

          ??? function sendMessage()

          ??? {

          ??? ????????????? var message = {};

          ????? ???

          ????? ??? message.text = document.all.text.value;

          ????? ??? message.from = document.all.from.value;

          ????? ???

          ??????? ChatManager.add(message, gotMessage);

          ??? }

          ???

          ??? function checkMessage()

          ???

          ??? {??? ????

          ??????? ChatManager.read(gotMessage);

          ??? }

          ???

          ??? function gotMessage(message)??? {

          ??? ??????

          ??????? var chatlog = "";

          ???????

          ??????? chatlog = "<div>" + message.from + ":" + message.text + "</div>";???????

          ???????

          ??????? DWRUtil.setValue("chatlog", chatlog);??????

          ??? }

          ? </script>

          </head>

          <body onload="checkMessage()">

          <p>Messages:</p>

          <div id="chatlog" style="border: 1px solid black;"></div>

          <p>

          ? Your Message:

          ? <br>

          ? text:<input id="text" />

          ? <br>

          ? from:<input id="from" />

          ? <br>

          ? <input value="Send" onclick="sendMessage()" type="button" />

          </p>

          </body>

          </html>

          engine.js util.js dwr 自帶的,在 dwr.jar 包中可以找到。 ChatManager.js 是由 DWRServlet 根據(jù) dwr.xml 中的定義自動(dòng)生成的。要想查看可以在瀏覽器地址欄輸入:

          http://localhost/dwrdemo/dwr/interface/ChatManager.js 結(jié)果如下

          function ChatManager() { } ChatManager.add = function(p0, callback) { DWREngine._execute('/dwrdemo/dwr', 'ChatManager', 'add', p0, callback); } ChatManager.read = function(callback) { DWREngine._execute('/dwrdemo/dwr', 'ChatManager', 'read', callback); }

          ?

          他自動(dòng)生成后會(huì)轉(zhuǎn)變成回調(diào)函數(shù)的形式,至于回調(diào)函數(shù),大家可以注意一下:

          ChatManager.add(message, gotMessage);

          他原先在類中的方法是:

          public Message add(Message message)

          他的意思是將類的方法返回的結(jié)果對(duì)象 Message gotMessage 方法在頁(yè)面上顯示, Message 對(duì)象的 js 對(duì)象和 java 對(duì)象轉(zhuǎn)換是由 dwr bean 轉(zhuǎn)換器自動(dòng)完成的。

          ?

          本例程在 tomcat-5.0.28 websphere 6.0 上測(cè)試通過(guò),源碼下載: dwrdemo.rar

          ?

          posted on 2006-04-02 20:41 野草 閱讀(1158) 評(píng)論(1)  編輯  收藏 所屬分類: ajax

          評(píng)論:
          # re: DWR使得Java中的AJAX變得簡(jiǎn)單 2006-04-03 11:15 | freshman
          不錯(cuò)不錯(cuò),很有收獲  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 镇巴县| 萨嘎县| 德格县| 涞源县| 大关县| 观塘区| 固阳县| 筠连县| 绥中县| 肇源县| 德江县| 玉溪市| 连平县| 翁牛特旗| 同德县| 叙永县| 大庆市| 开化县| 瑞昌市| 麻栗坡县| 浦江县| 浦县| 同仁县| 云安县| 改则县| 红桥区| 桦川县| 崇州市| 琼结县| 阜新| 瑞安市| 鹤庆县| 精河县| 丹凤县| 辉南县| 镇沅| 剑河县| 崇左市| 黄石市| 大连市| 承德市|