DWR
是一個開源的工具,她利用
Java
的反射和
AJAX
技術實現了
javascript
與
java
類的通信。官方網站是:
http://getahead.ltd.uk/dwr/
下面看一個實際的例子:
?
這個例子是根據 DWR 的 demo 改寫的,是一個簡化的聊天室,下面輸入信息在上面顯示出來,這是 AJAX 技術的典型應用。
對于這個應用編寫過程如下:
1、? 編寫三個 JAVA 類: Message.java 、 MessageDao.java 、 ChatManager.java ;
2、? 配置 DWR : dwr.xml 、 web.xml ;
3、? 編寫一個 html 的頁面: index.html ;
4、? 再 index.html 上添加與 DWR 相關的 js 腳本;
Message.java
package test.dwr;
public class Message { ??? private String text;
??? private String from;
??? /** ???? * 空構造方法很重要 ???? * ???? * 1 、 java 編譯器默認如果已經有了帶參構造函數,就不會再生成無參構造函數; ???? * ???? * 2 、 DWR 大量使用 Class.forName("clazz").newInstance() ,如果沒有空構造方法將會拋錯; ???? * ???? */ ??? 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(); ??? } } |
至此,大家可能看到這與我們一貫的寫法沒有什么差異。
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 的具體解釋大家可以參見官方網站,這里是常用的, create 節點的意思是將 ChatManager 轉變成 ChatManager.js , convert 節點的意思是使用 bean 轉換器。 bean 轉換器的定義在 dwr.jar 包中的 dwr.xml 中,這個配置文件會被預先裝載。
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 聯系客戶端和服務器端程序的聯系紐帶,它首先將你定義的 dwr.xml 中的類轉變成 js ,當客戶端調用 js 中的方法后,又由他來調用具體的實現類的方法,返回給客戶端結果。
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
中配置的調用類的
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 根據 dwr.xml 中的定義自動生成的。要想查看可以在瀏覽器地址欄輸入:
http://localhost/dwrdemo/dwr/interface/ChatManager.js 結果如下
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); } |
他自動生成后會轉變成回調函數的形式,至于回調函數,大家可以注意一下:
ChatManager.add(message, gotMessage);
他原先在類中的方法是:
public Message add(Message message)
他的意思是將類的方法返回的結果對象 Message 給 gotMessage 方法在頁面上顯示, Message 對象的 js 對象和 java 對象轉換是由 dwr 的 bean 轉換器自動完成的。
本例程在
tomcat-5.0.28
和
websphere 6.0
上測試通過,源碼下載:
dwrdemo.rar
?