Java開發人員與網頁設計人員的橋樑DWR,簡介不再多說。
請先到http://getahead.ltd.uk/dwr/
下載 dwr.jar
,放到WEB-INF/lib
下 …
負責處理用戶端請求,並呼叫Java
對象的是DWRServlet
, DWR
其實也有些 Model 2
的味道,只是View
的這一層比較弱,因為放到用戶端的JavaScript
應用程式中 …
在web.xml
中加入DWRServlet…
<?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>dwrtest</display-name> <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> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> </web-app>
接下來寫個簡單的Hello
吧!
package com.dwr; public class HelloWorld { private String name; public HelloWorld(){ } public String getName() { return name; } public void setName(String name) { this.name = name; } public String sayHello(String name) { return "Hello, " + name; } }
用戶端要呼叫這個Java
對象,傳給它參數,而後傳回一個字串,用戶端再顯示這個字串,神奇?其實是要告訴DWRServlet
這件事,這需要一個 dwr.xml,在WEB-INF目錄下建立這個這個檔案:
<!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="JDate"> <param name="class" value="java.util.Date"/> </create> <create creator="new" javascript="Hello"> <param name="class" value="com.dwr.HelloWorld"/> </create> </allow> </dwr>
creator設定為new
,表示使用Hello
的無參數建構子來產生對象,javascript
設定為 Hello
,表示用戶端JavaScript
程式可以使用 Hello
來呼叫對應的onlyfun.caterpillar.Hello
物件。
來寫個用戶端的網頁,當中有一個輸入欄位,這裡我們建立一個index.html,內容如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>DWR's HelloWorld</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()
函式,因而
需要在當前檔案夾下建立一個hello.js:
function hello(){ var user = $('user').value; Hello.sayHello(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
,就這個而言就是發出非同步請求,而響應不用Refresh
頁面啦!