林信良(良葛格)的专栏

更多文件,请访问 http://caterpillar.onlyfun.net/

原创 DWR 入門與應用(一)收藏

新一篇: 善于遗忘 | 旧一篇: Spring 對 Lob 的支援...

Java 開發人員與網頁設計人員的橋樑 DWR…呃!我懶得寫簡介了…直接來看看可以做什麼吧!…

請先到 http://getahead.ltd.uk/dwr/ 下載 dwr.jar,放到WEB-INF/lib下…

負責處理客戶端請求,並呼叫Java物件的是DWRServlet,DWR其實也有些Model 2的味道,只是View的這一層比較弱,因為放到客戶端的JavaScript應用程式中…

在web.xml中加入DWRServlet…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>
ajaxDWR</display-name>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<description>
</description>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>


接下來寫個簡單的Hello吧!
1
2
3
4
5
6
7
package onlyfun.caterpillar;
 
public class Hello {
public String hello(String name) {
return "哈囉!" + name + "!您的第一個DWR!";
}
}


客戶端要呼叫這個Java物件,傳給它參數,而後傳回一個字串,客戶端再顯示這個字串,神奇?其實是要告訴DWRServlet這件事,這需要一個dwr.xml:
1
2
3
4
5
6
7
8
9
10
11
<?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="Hello">
<param name="class" value="onlyfun.caterpillar.Hello" />
</create>
</allow>
</dwr>


creator設定為new,表示使用Hello的無參數建構子來生成物件,javascript設定為Hello,表示客戶端JavaScript程式可以使用Hello來呼叫對應的onlyfun.caterpillar.Hello物件。

來寫個客戶端的網頁,當中有一個輸入欄位…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
<title>第一個DWR程式</title>
<script type='text/javascript' src='dwr/interface/Hello.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>
<script type='text/javascript' src='hello.js'></script>
</head>
<body>
 
<input id="user" type="text" />
<input type='button' value='哈囉' onclick='hello();' />
 
<div id="result"></div>
 
</body>
</html>


dwr/interface/Hello.js是由DWRServlet根據dwr.xml中的設定生成的,engine.js負責客戶端伺服端溝通,util.js是一些好用的JavaScript程式,可以讓您少寫很多JavaScript。

hello.js是我們自訂的函式,按下按鈕後,會呼叫當中的hello()函式:
1
2
3
4
5
6
7
8
function hello() {
var user = $('user').value;
Hello.hello(user, callback);
}
 
function callback(msg) {
DWRUtil.setValue('result', msg);
}


${'user'}取得輸入欄位的DOM物件,value取得當中的欄位值,而後呼叫Hello.hello(),並將value當作參數傳送… 結果是呼叫Server端的Hello Java物件,當結果傳回後,會呼叫JavaScript的callback函式,DWRUtil的setValue()方法會將傳回的msg設定給指定 id的DOM,結果就是…啥!AJAX的功能在哪…就這個而言就是發出非同步請求,而回應不用Refresh頁面啦! 



好啦!這個無聊的Hello DWR可以做啥!…XD

已經可以讓您做個簡單的文字提示功能了…像這個…
http://caterpillar.onlyfun.net/Gossip/index.html

把滑鼠指到書的照片上,會顯示提示文字,這些提示文字本身不是存在網頁上的,而是在Server端,當滑鼠指到書上時,會用Request object去抓,然後顯示在框框中…

當然!我的網站只支援PHP,所以那不是DWR完成的功能,而且我是直接用Request object跟DOM去慢慢刻的…對初學者來說已經有些麻煩了…XD

不過!用DWR就可以很簡單完成這個功能…

先寫個Java類別吧!會抓properties檔案中的文字訊息,例如…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package onlyfun.caterpillar;
 
import java.util.ResourceBundle;
 
public class Book {
private ResourceBundle resource;

public Book() {
resource = ResourceBundle.getBundle("book");
}

public String getDescription(String key) {
return resource.getString(key);
}
}


從程式中就知道,它會去抓book_zh_TW.properties的資料,這不是重點啦!只是Java的一個功能,我們要看的是DWR,不過先把book_zh_TW.properties準備好…
1
2
3
java=Java 學習筆記的介紹 … BlaBla...
spring=Spring 技術手冊的介紹…BlaBla...
ajax=Ajax in action 中文版的介紹…


唔!裏頭是中文字,自己用native2ascii轉換吧…這也不是重點…我們是要看DWR怎麼做到文字提示功能…

一樣的…要開放這個Book物件,在dwr.xml中…
1
2
3
4
5
6
7
8
9
10
11
<?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="Book" scope="application">
<param name="class" value="onlyfun.caterpillar.Book"/>
</create>
</allow>
</dwr>


scope設定為application,表示這個Book物件在整個應用程式階段都活著。

然後,客戶端寫個網頁…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
<script type='text/javascript' src='dwr/interface/Book.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>
<script type='text/javascript' src='book.js'></script>
<title>個人著/譯作</title>
</head>
<body>
 
<div id="ajax" onmouseover="getBookData(this);"
onmouseout="clearData();"><a
href="http://www.gotop.com.tw/waweb2004/home/home.aspx?pg=HM010X&bn=AXP011800"><small><img
style="border: 0px solid ; width: 80px; height: 110px; float: left;"
alt="Ajax in action 中文版" title="Ajax in action 中文版"
src="images/ajax_in_action_c.jpg" hspace="10" vspace="2"></small></a></div>
 
<div id="spring" onmouseover="getBookData(this);"
onmouseout="clearData();"><a
href="http://www.gotop.com.tw/waweb2004/home/home.aspx?pg=HM010X&bn=ACL021000"><small><img
style="border: 0px solid ; width: 80px; height: 110px; float: left;"
alt="Spring 技術手冊" title="Spring 技術手冊"
src="images/SpringTech_S.jpg" hspace="10" vspace="2"></small></a></div>
 
<div id="java" onmouseover="getBookData(this);"
onmouseout="clearData();"><a
href="http://www.gotop.com.tw/waweb2004/home/home.aspx?pg=HM010X&bn=ACL020931"><small><img
style="border: 0px solid ; width: 80px; height: 110px; float: left;"
alt="Java 學習筆記" title="Java 學習筆記"
src="images/JavaGossip_Cover_Small.jpg" hspace="10"
vspace="2"></small></a></div>

<br/><br/><br/><br/><br/><br/>

<div id="info"></div>
 
</body>
</html>


重點在於onmouseover跟onmouseout,滑鼠移入與移出時會呼叫的函式,還有最下面的info,抓回來的書籍介紹會放到當中…

book.js如下,簡單的很…
1
2
3
4
5
6
7
8
9
10
11
function getBookData(ele) {
Book.getDescription(ele.id, setBookData);
}
 
function setBookData(description) {
DWRUtil.setValue('info', description);
}
 
function clearData() {
DWRUtil.setValue('info', '');
}


程式很簡單,我懶得解釋了…XD

看一下畫面好了…這是滑鼠移到 Ajax in action中文版 上的介紹畫面…

发表于 @ 2006年09月06日 20:06:00|评论(loading...)|编辑

新一篇: 善于遗忘 | 旧一篇: Spring 對 Lob 的支援...

评论

#qiaohui.zhang 发表于2006-09-07 16:06:00  IP: 219.232.42.*
学习了。。。。。
#lightersky 发表于2006-09-08 22:38:00  IP: 218.15.22.*
支持一下
#lightersky 发表于2006-09-08 23:11:00  IP: 218.15.22.*
写得不错
#haha 发表于2006-09-18 13:55:00  IP: 219.142.176.*
是否可以多写几个例子
#niyboy 发表于2006-09-18 15:59:00  IP: 218.88.36.*
我按照你的例子写下去;怎么调试不出来哦;
#Skywalker 发表于2006-09-19 11:20:00  IP: 218.108.19.*
继续吧
#o0JSP 发表于2006-09-22 13:07:00  IP: 219.159.82.*
很好,希望您可以把官方的文档都翻译一下,感觉官方的文档说得也蛮清楚的.但是就是因为是E文,所以懒得去看.....
#flto 发表于2006-09-28 08:34:00  IP: 59.52.189.*
希望你下次用简体中文写,看不懂繁体,谢谢~
#moamao 发表于2006-10-01 12:36:00  IP: 222.90.16.*
楼上的兄弟真搞笑,繁体看不懂,你是几十年代的人,我想林信良先生看不懂简单更说得通吧!
#希望你下次用简体中文写,看不懂繁体,谢谢~ 发表于2006-10-03 12:52:00  IP: 61.136.151.*
希望你下次用简体中文写,看不懂繁体,谢谢~
希望你下次用简体中文写,看不懂繁体,谢谢~
#林信良 发表于2006-10-03 14:26:00  IP: 211.74.250.*
繁简术语有所不同,为免名词困扰,故不做转换…Orz...
#求助! 发表于2006-10-24 19:03:00  IP: 218.18.208.*
Tomcat报错如下:

2006-10-24 17:54:52 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: Creator 'script' not loaded due to NoClassDefFoundError. This is only an problem if you wanted to use it. Cause: org/apache/bsf/BSFException
2006-10-24 17:54:52 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: retrieved system configuration file: java.io.ByteArrayInputStream@1b3967
2006-10-24 17:54:52 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: Creator 'pageflow' not loaded due to ClassNotFoundException. This is only an problem if you wanted to use it. Cause: Beehive/Weblogic Creator not available.
2006-10-24 17:54:52 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: Creator 'spring' not loaded due to NoClassDefFoundError. This is only an problem if you wanted to use it. Cause: org/springframework/beans/factory/BeanFactory
2006-10-24 17:54:52 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: Creator 'script' not loaded due to NoClassDefFoundError. This is only an problem if you wanted to use it. Cause: org/apache/bsf/BSFException

调试一天不成功,帮帮我!谢谢您!
#提议 发表于2006-10-25 16:17:00  IP: 202.134.114.*
林信良老师,您好,
您能不能把源代码发出来供大家下载啊!

比如说我调试了半天,才明白dwr.xml要和web.xml放在同一目录下,您没提这个,我试了好久!

还有,resource = ResourceBundle.getBundle("book");
其中book_zh.properties 这个文件应该放在哪?我试了所有目录都不行....

请提示一下,谢谢!
#狼 发表于2006-10-28 17:09:00  IP: 125.40.216.*
我用的是这个学习日记,可是里面有条命令不管用Scanner一运行就出错.
状态:Scanner scanner=new Scanner(System.in);
显示:new下面有个出错的符号
一直闹心,就是不知道咋解决,希望有高手指点!!
#林信良 发表于2006-11-04 22:46:00  IP: 59.104.174.*
请使用JDK5…Orz...
#likenice 发表于2006-11-22 16:43:00  IP: 203.86.42.*
你们都能调适成功吗?
作者是不是漏掉了些有关dwr.xml怎么和这个工程结合的呢?
我看了看官方的例子中web.xml有一段话把dwr.xml的信息注释了。
我想看看DWRservlet.class但无法反编译(试了两个反编译工具)。在web.xml中调用DWRservlet.class需要在一个/dwr/*才行,但例子中根本没有调用呀。我改为‘/*’还是到hello.js时出错。难道是DWRservlet.class去调用dwr.xml?(看不了代码,无从得知)
我想知道dwr.xml到底哪里的那句代码和这个程序联系起来了?
#zhanghandong 发表于2006-12-22 04:26:35  IP: 221.218.212.*
我也不成功,林老师能给说详细点吗?谢谢
#zhanghandong 发表于2006-12-22 05:34:48  IP: 221.218.212.*
我的 Tomcat可以启动了 ,但是点击按钮的时候,会报错
$ is not defined
这是为什么,指点一下,谢谢林老师
#zhanghandong 发表于2006-12-22 14:17:03  IP: 221.218.212.*
我把$改成了document.getElementById,没有报那个错了,可是又报这个错误:
Hello.hello(user,callback);
不支持这个属性或方法
#zhanghandong 发表于2006-12-22 16:01:13  IP: 221.218.212.*
我真是粗心啊 ,把.hello方法写成了 Hello方法。。。
#zhanghandong 发表于2006-12-22 16:02:02  IP: 221.218.212.*
还有DWR2.0中uk.ltd.getahead.dwr.DWRServlet要改成
org.directwebremoting.servlet.DwrServlet
#zhanghandong 发表于2006-12-22 22:44:18  IP: 221.218.212.*
终于搞定了,搞了一天一夜,就是一个holloword,不过出了很多问题,林老师其实说的比较详细了,只是如果DWR是2.0的话,照我上面的话改了就可以了。支持林老师
#apuser 发表于2006-12-24 00:31:07  IP:
林老师,我是初学的,请问两个js(Hello.js和hello.js)应该放在什么目录呢?或者是我理解错了吧, 请帮帮忙好吗?谢谢您了
#tonyyl 发表于2007-03-06 11:04:07  IP: 59.108.104.*
写的通俗易懂,技术文章就该这么写啊
#tonyyl 发表于2007-03-06 11:04:29  IP: 59.108.104.*
写的通俗易懂,技术文章就该这么写啊
#zjnbhwh 发表于2007-03-14 15:03:16  IP: 124.90.83.*
回答楼上的,hello.js是自己写的,目录随便,但在src中要写对!!!!关于Hello.js是DWR框架自己生成的,至于在那里?哈哈,这是我在无意中发现的,在web.xml中<url-pattern>/*</url-pattern>就会发生意想不到的事,你要的Hello.js就会出现的!!!!
#yexin218 发表于2007-03-17 13:02:28  IP: 125.31.53.*
sent 501
java.lang.scurityException:No class by name:Hello
。。。。。
请问这是什么错误啊?
要把hello.js放在那个目录阿?
老师你能给出一个这个project的一个目录结构啊?
我们都不是很清楚那个文件的位置?
谢谢!
Email: feixianyexin@163.com
#DrumDance 发表于2007-03-23 16:27:38  IP: 221.219.14.*
讲的易懂 举例也举的简单实用 图文代码并茂
学习完毕
谢谢
#rainbow_1127 发表于2007-03-26 11:30:14  IP: 192.168.12.*
林老师,您好,我在使用dwr的时候碰到一个中文的问题,在远程返回的字符串中如果是全中文的话没有问题,但我想返回一个xml的字符串的话就出错了,也就是我一个由中文和英文组合的字符串里面如果中文的字符长度超过20的话我用dwr就无法得到这个字符串.想请教一下林老师由没有什么解决的方法.谢谢
#zjsjava 发表于2008-04-22 11:06:29  IP: 60.191.53.*
11:03:39,781 WARN [ExceptionHandler] Error: java.lang.SecurityException: No class by name: Hello
#zjsjava 发表于2008-04-22 13:55:08  IP: 60.191.53.*
已无出错提示,但是
"哈囉!" + name + "!您的第一個DWR!";
没有显示出来?何解?
#ballanfeng 发表于2008-04-23 10:42:56  IP: 218.206.246.*
dwr.xml怎么和工程联系到一起啊,好像没有提到吧
#liushuguang 发表于2008-04-24 18:03:18  IP: 219.142.122.*
感谢林老师的精彩贴子。很快就掌握了。。
太感谢了``希望以后能多多放出更精彩的教程
#smallclub 发表于2008-04-25 10:53:14  IP: 125.120.135.*
dwr/engine.js
dwr/util.js
文件是哪里的
#xingwei4225 发表于2008-05-19 14:38:18  IP: 61.190.32.*
谢谢林老师,dwr已经懂了一些了
#cjy1988424 发表于2008-06-19 17:36:06  IP: 58.100.94.*
支持一下
#grape927 发表于2008-07-09 11:54:47  IP: 60.176.146.*
#EsunYang 发表于2008-07-14 16:20:39  IP: 61.145.246.*
我根据上面林先生所说做了一次, 发觉有以下几点值得补充:
1. WebRoot 下的dwr目录是DWR专用的, 并且由DWR动态创建(包括这个目录下的文件),请不要自己创建dwr目录.
2. dwr/interface目录下的JS脚本是是根据dwr.xml生成的, 具体生成什么可以在IE中输入下面的地址查看:http://localhost:8080/[Your project Name]/dwr
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 良葛格