DWR
是一個(gè)開(kāi)源的工具,她利用
Java
的反射和
AJAX
技術(shù)實(shí)現(xiàn)了
javascript
與
java
類的通信。官方網(wǎng)站是:
http://getahead.ltd.uk/dwr/
下面看一個(gè)實(shí)際的例子:
?
這個(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
?