




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、本書目前僅網(wǎng)絡(luò)版,完全免費,請注明作者信息。任何或個人作者允許不得印刷。另外如果發(fā)現(xiàn)本人的部分內(nèi)容有所,請不要來找我理論,我本來做的就是公益事情。,侵僅。2 / 92參考及資料DWRJavaScud Wiki IBM 中國./Home/3 / 92前言Ajax 向襲來的時候,很多寫代碼的程序員看到了 Ajax 的發(fā)展前景,但并不是每一個程序員都能將頁面與代碼完美整合在一起,DOM、CSS、javascript 讓人眼花繚亂,不知從何下手。本書的讀者必須有一定的 Jsp,JavaScript,應(yīng)用服務(wù)器(比如 Tomcat)的基礎(chǔ)和使用經(jīng)驗,否則請在看此前先去了解一下。當(dāng)然附錄里有一些 Java
2、Script 的。本書可以當(dāng)作一本 DWR 完整的,也可以當(dāng)作一本詳細(xì)介紹 DWR 的“詞典”,我的目的只是通過本書,希望您能夠了解一些 DWR 的基本知識、常用的用戶界面組件、方法調(diào)用等。并能夠搭建 DWR 開發(fā)環(huán)境,實現(xiàn) DWR 的快速開發(fā)。非常感謝 JavaScud Wiki,省去了我很多翻譯時間,同時感謝的幾位翻譯。由于本人也剛剛接觸 DWR,書中難免會有一些錯誤和表達(dá)不是太好的地方,請讀者諒解并提出您的寶貴意見。我很希望得到讀者對本書的評價和建議。您可以在學(xué)習(xí)本書的過所遇到和建議發(fā)送到郵箱 jor,以便我對本書下一個版本的更新,我會在第一時間給您回復(fù)。感謝您閱讀本書!希望這本書對你來
3、說是一本有用的書。我是華東理工大學(xué) 03 屆計算機(金山)專業(yè)的。2007-01-224 / 92目錄第 1 章.1.11.2DWR 入門8簡介8第一個 DWR 程序:o World..41.2.5將 DWR 放入你的工程9編輯配置文件9編寫service10測試 DWR10編寫一個 jsp11本章總結(jié)121.3第 2 章.2.12.2web.xml 配置13主要配置13常用參數(shù)列表.22.2.3安全參數(shù)14Ajax 服務(wù)器加載時保護(hù)參數(shù)14其他參數(shù)15日志配置16多個dwr.xml 配置和J2EE 角色定義16插件配置18測試模式配置1
4、2.6第 3 章.dwr.xml 配置20縱覽2020 .2Creator21Converter253.4第 4 章.4.1 30整合32DWR 與Servlet3.2使用 webContext 的方法:32方法選擇32DWR 與Spring34讓 DWR 和Spring 一起工作的檢查列表34Spring Creator34找到Spring 配置文件34使用Spring 配置 DWR35DWR 與JSF36JSF Creator36Servlet Filter36DWR 與Struts37Struts creator
5、3..5 / 924.4.2開始順序37DWR 與Weblogic 或PageFlow38DWR 與 Hibernate39讓 DWR 和 Hibernate 一起工作的檢查列表39HibernateBeanConverter3..3Ses管理394.7DWR 與WebWork40配置dwr.xml40.24.7.3在JSP 中導(dǎo)入 40高級41DWR 與Acegi42問題提出42解決方案44.8.2第 5 章.5.4第
6、 6 章.6.16.2DWR 中的JavaScript 簡介44簡單的回調(diào)函數(shù)44調(diào)用元數(shù)據(jù)對象45查找回調(diào)函數(shù)45創(chuàng)造一個與Java 對象匹配的Javascript 對象46engine.js 功能47使用選項47選項索引4...6處理器(Handler)48調(diào)用處理器(Call Handler)48Hooks (一個 batch 中可以多個 hook)49全局選項(在單次調(diào)用或者批量調(diào)用中不可用)49廢棄的選項49未來版本的選項49選項說明50批量調(diào)用50順序調(diào)用50錯誤警告和超時50調(diào) Hooks51調(diào)用選項56.3
7、..46.3.5第 7 章.7.10util.js 功能54$() 54 addOptions and removeAllOptions 54addRows and removeAllRows55getText56getValue56getValues57onReturn57selectRange57setValue58setValues586 / 93第 8 章.8.1toDescriptiveString58useLoadingMessage58Submisbox61DWR 進(jìn)階63DWR An
8、noions6.28.1.3初始配置63類63對象轉(zhuǎn)換64錯誤和異常處理64錯誤處理64異常6.3找出的信息6第 9 章.9.1傳遞額外的數(shù)據(jù)到callback 函數(shù)66從其他的 URL數(shù)據(jù)67安全68范例精講71購物車7....8介紹71實現(xiàn)目錄72測試部署74調(diào)用對象75實現(xiàn)購物車77的 Cart 方法79調(diào)用演示結(jié)果81總結(jié)81附錄83常見問題83TransformerFactoryConfigurationError83第 10 章.10.11
9、.210.1.3XML錯誤83使用 weblogic 的類路徑問題8310.1.4s 的情況下用DWR84沒有10.2JavaScript 高級應(yīng)用85用變量函數(shù)85高階函數(shù)86動態(tài)類型87靈活的對象模型89本節(jié)總結(jié)9.210.2.310.2.410.2.57 / 92第1章.DWR 入門1.1 簡介DWR 是一個可以允許你去創(chuàng)建AJAX WEB 站點的JAVA 開源庫。它可以讓你在瀏覽器中的Javascript 代碼調(diào)用Web 服務(wù)器上的Java 代碼,就像在Java 代碼就在瀏覽器中一樣。DWR 包含 2 個主要部分:一個運行在服務(wù)器端的Java S
10、ervlet,它處理請求并且向瀏覽器發(fā)回響應(yīng)。運行在瀏覽器端的JavaScript,它發(fā)送請求而且還能動態(tài)更新網(wǎng)頁。DWR 工作原理是通過動態(tài)把Java 類生成為 Javascript。它的代碼就像 Ajax 魔法一樣,你感覺調(diào)用就像發(fā)生在瀏覽器端,但是實際上代碼調(diào)用發(fā)生在服務(wù)器端,DWR 負(fù)責(zé)數(shù)據(jù)的傳遞和轉(zhuǎn)換。這種從Java 到JavaScript 的調(diào)用功能的方式使DWR 用起來有種非常像RMI 或者SOAP 的常規(guī)RPC 機制,而且DWR的優(yōu)點在于不需要任何的網(wǎng)頁瀏覽器插件就能運行在網(wǎng)頁上。Java 從根本上講是同步機制,然而AJAX 卻是異步的。所以你調(diào)用的時候,你要提供有反調(diào) (ca
11、llback) 功能的 DWR。方法時,當(dāng)數(shù)據(jù)已經(jīng)從網(wǎng)絡(luò)上返回這個顯示了 DWR 如何選擇一個下拉列表的內(nèi)容作為 JavaScript 的 onclick 事件的結(jié)果。DWR 動態(tài)在JavaScript 里生成一個AjaxService 類,去匹配服務(wù)氣端的代碼。由 evenndler 去調(diào)用它,然后 DWR 處理所有的值。在示例中,先在 even細(xì)節(jié),包括倒置 (converting) 所有的參數(shù)以及返回Javascript 和Java 之的ndler 方法里調(diào)用 AjaxService 的 getOptions() 方法,然后通過反調(diào)(callback)方法 populaist(data)
12、 得到返回的數(shù)據(jù),其中 data 就是String1, 2, 3,最后再使用 DWR utility 把data 加入到下拉列表。好了,DWR 介紹完了,現(xiàn)在大家肯定很想知道如何做出第一個 DWR 吧!然后oWorld 示例帶領(lǐng)大家入門。在下一章節(jié)以一個8 / 921.2 第一個 DWR 程序:o World有 2 中方法可以幫助你入門 DWR,一個方法是去WAR 文件并且去完整看一下代碼,但是這樣并不能幫助你發(fā)現(xiàn)DWR 是如何簡單地集成到你當(dāng)前地WEB 應(yīng)用,所以以下幾個簡單地步驟看一下:1.2.1 將 DWR 放入你的工程從將dwr.jar 包。然后將它放在你 webapp 的 WEB-I
13、NF/lib 目錄下。的dwr-版本號-src.zip javadirectwebremoting 內(nèi)的 engine.js 和 util.js 放入WEB 應(yīng)用中,比如 js 文件夾下。1.2.2 編輯配置文件1.web.xml以下幾行代碼必須被添加到WEN-INF/web.xml 文件中。注意,要把和其他放在一起,要和其他放在一起2.dwr.xml在 web.xml 的同一目錄下,創(chuàng)建dwr.xml,并且將要被調(diào)用的 java 類寫入其中。9 / 92dwr-invoker.directwebremoting.servlet.DwrServlet debugtruedwr-invoker/
14、dwr/*1.2.3 編寫 service就像沒有dwr 一樣,寫一個簡單類并加一個方法是1.2.4 測試 DWR將代碼放入應(yīng)用服務(wù)器(比如Tomcat),啟動。然后在地址欄輸入你的工程/dwr然后點擊service,會看到剛才寫的sayo()的方法,輸入自己的名字然后點擊“Execute”,如果發(fā)現(xiàn)確實是正確的返回結(jié)果,說明測試通過了,可以進(jìn)入下一步了。10 / 92packageoWorld;public class Service public String sayo(String yourName) /可以是數(shù)據(jù)庫的復(fù)雜代碼return o World + yourName;1.2.5
15、 編寫一個 jsp接下來最后一步就是創(chuàng)建一個 jsp 文件1)2)3)要幾個dwr 的 js,其中 engine.js 必須要,如果需要用到 dwr 提供的一些方便的工具要util.jsdwr 自動生成的 js,dwr/ erfaervice.js,注意 js 名字要和 dwr.xml 配置的一樣然后還要js 里的serviayo 和 java 類的那個有一點區(qū)別,多了個參數(shù),用來 callback 返回的數(shù)據(jù)11 / 92My JSP _dwr.jsp starting page functionDwr()serviayo(Jorwen,callBacko);function callBac
16、ko(data) alert(data);地址欄輸入顯示的結(jié)果如下:你的工程/ dwr.jsp1.3 本章總結(jié)相信看了此章節(jié),大家一般都能做出這個實例來,也算是 DWR 剛?cè)腴T了,在以后的里將詳細(xì)介紹 DWR各個功能。幫助大家能開發(fā)出任何Ajax 需求的功能來??捶独龑W(xué)習(xí)DWR 然后有疑問再查看該文檔的相關(guān)章節(jié)。進(jìn)階的例子可以參考范例精講,您也可以通過12 / 92第2章.web.xml 配置2.1 主要配置要加入到你的web.xml 最少的代碼就是簡單地去DWR servlet,沒有它 DWR 就不起作用。在 DWR2.x 里,DwrServlets 是類.directwebremoting
17、.servlet.DwrServlet ,盡管uk. .getahead.dwr.DWRServlet 仍然可以用。在 DWR 1.x 你不得不使用后者。有些額外的servlet 參數(shù),在有些地方很重要。尤其 debug 參數(shù)這個擴展 DWR 的標(biāo)準(zhǔn)結(jié)構(gòu)是使用。放在內(nèi),就像如下使用另外,啟動服務(wù)時,如果報如下錯。13 / 92dwr-invoker .directwebremoting.servlet.DwrServletjava.lang.IllegalArgumentException: DefaultContainer cant find a classes是 DWR2.0 加入了JDK
18、5 的注釋(annoions).DwrServlet 初始化的時候會去檢查注釋的類,找不到就抱錯了。如果你不用 anno ions 也可以忽略掉這個錯誤。不過看起來總是不爽。解決方案如下dwr-invoker .directwebremoting.servlet.DwrServletdebugtruedwr-invoker .directwebremoting.servlet.DwrServletdwr-invoker/dwr/*2.2 常用參數(shù)列表2.2.1 安全參數(shù)allowGetForSafariButMakeF開始版本:2.0默認(rèn)值:falseeryEasier描述:設(shè)置成true 使
19、 DWR 工作在Safari 1.x , 會稍微降低安全性。crossSesSecurity開始版本:2.0默認(rèn)值:true描述:設(shè)置成false 使能夠從其他域進(jìn)行請求。注意,這樣做會在安全性上有點在沒有理解這個前不要設(shè)置成為false。,參考一下這篇文章,debug開始版本:1.0默認(rèn)值:false描述:設(shè)置成true 使 DWR 能夠 debug 和進(jìn)入測試頁面scriptSes開始版本:2.0Timeout默認(rèn)值:1800000(30 分鐘)描述:script ses的超時設(shè)置maxCallCount開始版本:2.0rc2 和 1.1.4默認(rèn)值:20描述:一次批量(batch)允許最大
20、的調(diào)用數(shù)量。(幫助保護(hù) Dos)2.2.2 Ajax 服務(wù)器加載時保護(hù)參數(shù)etEnabled開始版本:2.014 / 92debugtrueclassesjava.lang.Object默認(rèn)值:false描述:設(shè)置成true 能增加服務(wù)器的加載能力,盡管 DWR 有保護(hù)服務(wù)器過載的機制。maxWaitingThreads開始版本:2.0默認(rèn)值:100描述:最大等待線程數(shù)量。preStreamWaitTime開始版本:2.0默認(rèn)值:29000(:毫秒)描述:對一個打開流前的反應(yīng),等待的最大時間tStreamWaitTime開始版本:2.0默認(rèn)值:1000(:毫秒)描述:對一個打開流后的反應(yīng),等待
21、的最大時間2.2.3 其他參數(shù)ignoreLastModified開始版本:2.0默認(rèn)值:false描述:默認(rèn)值支持最后修改,這樣就允許服務(wù)器端對客戶端請求較少資源。設(shè)置為 true 就能支持。pressed開始版本:1.1默認(rèn)值:false描述:DWR 能夠執(zhí)行簡單的壓縮,設(shè)置為 true 可以激活此功能。另外還有一個未公開的有關(guān)系的重要參數(shù)“compresLevel”,此參數(shù)允許你配置壓縮類型。查看這里得到詳細(xì)資料。ses開始版本:2.0默認(rèn)值:JSESNameID描述:DWR 通過檢查文檔和提取當(dāng)前sesID 支持 URL 重寫。一些servlet 引擎使用非標(biāo)準(zhǔn)的名。參數(shù)允許你改變默認(rèn)
22、值。eFiles開始版本:2.0默認(rèn)值:index.html, index.htm, index.jsp描述:類似于web.xml 的15 / 922.3 日志配置DWR 工作在JDK1.3 中不支持 java.util.logging,但并不強迫任何人都去使用 coms-logging 或者log4j,所以在使用 HttpServlet.log()方法時 DWR 將正常工作,如果沒有日志類的話。然而如果 DWR 可以使用,那么它將使用日志。Commoms-Logging由于大多數(shù)servlet 容器都使用它,幾乎每個人都將使用 coms-logging。所以如果你的 webapp 不明確使用
23、coms-logging,它將被默認(rèn)設(shè)為可以使用。在這些日志將被一些配置文件所約束,比如 java.util.logging 或者log4j,可以去查看他們各自的文檔獲得詳情。HttpServlet.log()如果你正在使用 HttpServlet.log(), 以下的代碼用來控制 DWR 日志值可以是:FATAL,ERROR,WARN(默認(rèn)),INFO,DEBUG2.4 多個 dwr.xml 配置和 J2EE 角色定義一般來說只需要一個dwr.xml 文件,并且會被設(shè)為默認(rèn)位置 WEB-INF/dwr.xml。所以你不需要配置。有 3 個原因說明你為何需要指定不同位置的 dwr.xml 文件
24、:你想保持dwr.xml 的文件請參照下面的例子你可以有很多的方法類并且希望指定文件。在這個例子里將指定不同文件開始配置,不同的 param-name 將重復(fù)多次 DWR 將輪流它們。DWR 能夠使J2EE URL 具有給與不同用戶組不同權(quán)限的安全機制。通過起不同名字,URL 和權(quán)限。就像如下例子去使用16 / 92config*WEB-INF/dwr.xmlWhat config file do we use?W/yourco/dwr/dwr.xmllogLevelDEBUG用一個字符串”config” 作為開始,設(shè)置 param-name,每個 param-name 必須不同。17 / 9
25、2dwr-user-invoker.directwebremoting.servlet.DwrServletconfig-userWEB-INF/dwr-user.xmldwr-admin-invoker.directwebremoting.servlet.DwrServletconfig-adminWEB-INF/dwr-admin.xmldwr-admin-invoker/dwradmin/*dwr-user-invoker/dwruser/*dwr-admindwr-admin-collection/dwradmin/*admindwr-user2.5 插件配置大多數(shù) DWR 的功能是可
26、以作為插件的,所以就通過替換默認(rèn)的類可以改變 DWR 的功能。你可以通過包含去覆蓋默認(rèn)的實現(xiàn)。舉個例子:沒有規(guī)定越過主要的版本丟棄這些接口,但是嘗試提供簡單的升級路徑。DWR2.0 插件.directwebremoting.Container.directwebremoting.WebContextFactory.WebContextBuilder.directwebremoting.ServerContextFactory.ServerContextBuilder.directwebremoting.servlet.UrlProsor.directwebremoting.extend.Acs
27、Control.directwebremoting.extend.AjaxFilterManager.directwebremoting.extend.ConverterManager.directwebremoting.extend.CreatorManager.directwebremoting.extend.DebugPageGenerator.directwebremoting.extend.HtmlCallMarshaller.directwebremoting.extend.HtmlPollHandler.directwebremoting.extend.PageNormalize
28、r.directwebremoting.extend.PlainCallMarshaller.directwebremoting.extend.PlainPollHandler.directwebremoting.extend.Remoter.directwebremoting.extend.ScriptSesManager.directwebremoting.extend.ServerLoaditor默認(rèn)的實現(xiàn)大多數(shù)在.directwebremoting.impl 包,細(xì)節(jié)是在 ContainerUtil.setupDefaults()指定的。18 / 92.directwebremotin
29、g.extend.ServerLoaditorcom.exle.MyCustomServerLoaditordwr-user-collection/dwruser/*userDWR1.1 插件uk.uk.uk.uk.uk.uk.getahead.dwr.AcsControl.getahead.dwr.Configuration.getahead.dwr.ConverterManager.getahead.dwr.CreatorManager.getahead.dwr.Prosor.getahead.dwr.ExecutionContext默認(rèn)的實現(xiàn)大多數(shù)在 uk. .getahead.dwr.
30、impl 包2.6 測試模式配置通過添加如下參數(shù),設(shè)置 debug 測試模式在 debug 模式里,DWR 將為每個 allow 的類(請看下面的dwr.xml 配置章節(jié))生成測試頁面。這些能變得非常有用幫助了解 DWR 能做什么和如何工作。這個模式也能警告你以防止 javascript 的保留字,或者重載問題。然而這個模式不應(yīng)該被用在現(xiàn)場部署,因為他能給或者者許多關(guān)于服務(wù)器的詳細(xì)信息。19 / 92debugtrue第3章.dwr.xml 配置3.1 縱覽dwr.xml 是你用來配置 DWR 的文件,默認(rèn)是將其放入WEB-INF 文件夾。創(chuàng)建一個 dwr.xml 文件dwr.xml 有如下的
31、結(jié)構(gòu):3.2 這個初始化部分被用來創(chuàng)建beans 而且這個類能被用來以某種過程轉(zhuǎn)換。大多數(shù)例子你將不需要用它,如果你想去定義一個新的 Creator 或者 Converter,就要在此被。在 init 部分里有了定義只是告訴 DWR 這些擴展類的存在,給出了如何使用的信息。這時他們還沒有被使用。這種方式很像Java 中的 import 語句。多數(shù)類需要在使用前先 import 一下,但是只有 import 語句并不表明這個類已經(jīng)被使用了。每一個creator 和converter 都用id 屬性,以便后面使用。20 / 92.3.3 allow 部分定義了 DWR 能夠創(chuàng)建和轉(zhuǎn)換的類。3.3.
32、1 Creator每一個在類中被調(diào)用的方法需要一個有若干類型的creator,使用“new”關(guān)鍵字或者 Spring 框架等。create 元素是如下的結(jié)構(gòu)1.creator 屬性1)new:Java 用“new”關(guān)鍵字創(chuàng)造對象是 DWR 默認(rèn)的creator,如下所示沒有必要把它加入dwr.xml,它已經(jīng)在 DWR了。這個creator 將使用默認(rèn)構(gòu)造器創(chuàng)建類的實例,以下是用new 創(chuàng)建器的好處安全:DWR 創(chuàng)造的對象生存的時間越短,多次調(diào)用中間的值不一致的錯誤機會越少。內(nèi)存消耗低: 如果你的站點用戶量非常大,這個創(chuàng)造器可以減少 VM 的內(nèi)存溢出。2)none: 它不創(chuàng)建對象,看下面的原因。
33、 (v1.1+)none 創(chuàng)建器不創(chuàng)建任何對象,它會假設(shè)你不須要創(chuàng)建對象。有 2 個使用的原因:你可能在使用的scope 不是page(看上面),并在這時你就不需要再創(chuàng)建對象了。面已經(jīng)把這個對象創(chuàng)建到這個scope 中了,還有一種情況是要調(diào)用的方法是靜態(tài)的,這時也不需要創(chuàng)建對象。DWR 會在調(diào)用創(chuàng)建器之前先檢查一下這個方法是不是靜態(tài)的。對于上訴兩種情況,你仍然需要class 參數(shù),用來告訴DWR 它是在操作的對象類型是什么。21 / 92.3)scripted: 通過BSF 使用語言創(chuàng)建對象,例如 BeanS或Groovy。要使用這個創(chuàng)造器,你需要把一些輔助庫放到WEB-INF/lib 文件夾
34、下:比如BSF 的 jar 包的語言的jar 包 。,你要用new 創(chuàng)造器在 DWR 中已經(jīng)默認(rèn)了:這個創(chuàng)造器用BSF 來執(zhí)行得到Bean,例如:script 創(chuàng)造器有如下參數(shù):注意:當(dāng)一個類是用script 創(chuàng)造出來的,并且 scope 是ses或 application,如果你的改變,ses中的類和script 中的類就不一致了。這樣會出現(xiàn)錯誤。雖然 web 容器不用重啟,但是用戶需要先登出(或以某種方式清空ses),然后再登錄。當(dāng)clazz 參數(shù)不為空,并且用來創(chuàng)造新實例,DWR 簡單的調(diào)用 claewInstance() 方法。這種方法是沒問題的,除非正在用某個參數(shù)創(chuàng)建一個類,或者調(diào)用
35、某個函數(shù)來配置這個類。 不幸的是,每次請求都要重新運行script 并造成上面。22 / 92參數(shù)DWR 版本描述language1.0語言,字符串,例如beans. (必需)script1.0要執(zhí)行的。 (必需,除非scriptPath 參數(shù)存在)scriptPath1.1文件路徑。 (必需,除非script 參數(shù)存在)reloadable1.1是否檢測文件的改動,以重新加載 (可選, 默認(rèn)true)class1.0創(chuàng)造出對象的類型(可選). 如果沒有 DWR 通過創(chuàng)造器得到類型。.imports.validator.Validator; returnValidatetInstance();
36、.4). spring: 通過 Spring 框架見 DWR 與Spring 整合Bean。5). jsf: 使用 JSF 的 Bean。 (v1.1+)見 DWR 與JSF 整合6). struts: 使用 Struts 的 FormBean。 (v1.1+)見 DWR 與Struts 整合7). pageflow:Weblogic 或 Beehive 的 PageFlow。 (v1.1+)見 DWR 與Weblogic 或Beehive 的 PageFlow 整合8). ejb3:使用 EJB3 ses一個正在實驗的創(chuàng)造器,用來不能作為產(chǎn)品被使用。bean。(v2.0+)EJB Sesbe
37、ans。直到進(jìn)行的測試和正式的,否則還如果你想寫自己的creator,你必須在里它。2.javascript 屬性在瀏覽器里給你創(chuàng)建的對象命名。避免使用JavaScript 保留字。這個名字將在頁面里作為 js 被導(dǎo)入,就像第 2 章節(jié)的那個 jsp:dwr.xmlhtml / jsp3.scope 屬性和定義在servlet 的scope 一樣大的范圍,它允許你指定哪個 bean 是可以獲得的。選項可以是:application,ses, request 和page。這些值應(yīng)該已經(jīng)被開發(fā)者們熟悉了。scope 選項是可選的,默認(rèn)為 page, 使用sess。目前,DWR 還不支持 URL 重
38、寫。請求23 / 924.param 元素被用來指定創(chuàng)造器的其他參數(shù),每種構(gòu)造器各有不同。例如,new創(chuàng)造器需要知道要創(chuàng)建的對象類型是什么。每一個創(chuàng)造器的參數(shù)在各自的文檔中能找到。5.include 和 exclude 元素允許一個創(chuàng)造器去限制進(jìn)入類的方法。一個創(chuàng)造器必須指定 include 列表或exclude 列表之一。如果是include 列表則暗示默認(rèn)的策略是,include 中的每個方法就是允許的方法;如果是exclude列表則暗示默認(rèn)的比如:策略是允許,exclude 中的每個方法就是的方法。說明你只能在 DWR 中使用Fred 的是setWibble 方法。6.auth 元素允許
39、你指定一個J2EE 的角色作為將來的控制檢查:7.使用靜態(tài)方法DWR 會在調(diào)用創(chuàng)建器之前先檢查一下這個方法是不是靜態(tài)的,如果是那么創(chuàng)造器不會被調(diào)用。很顯然這個邏輯適用于所有創(chuàng)造器,盡管如此null創(chuàng)造器是最容易配置的。8.使用單例類對于單例類的創(chuàng)建,最好適用BeanS和 BSF 來實例化對象。請參考scripted 創(chuàng)造器。9.DWR 與 HttpSesBindingListenersDWR1.x 中存貯已經(jīng)創(chuàng)造的Bean 的方法需要注意,它在每次請求時都會調(diào)用相同的 setribute() 方法。就是說,如果一個Bean 在dwr.xml 中的周期設(shè)置為 ses,再每次調(diào)用 bean 中的方
40、法時,DWR危害,但是如果你要使用servlet 的事都會執(zhí)行一次 ses.setribute(yourBean) 。這看上去沒件機制的,就是說用了 HttpSesBindingListener 接口,你就會發(fā)現(xiàn) valueBound 和valueUnbound 事件在每次調(diào)用時都會發(fā)生,而不是你想像的在 bean 被創(chuàng)建時以及ses過期時。DWR2 只在第一次創(chuàng)建對象時調(diào)用 setribute() 。24 / 923.3.2 Converter需要確認(rèn)所有的參數(shù)能被轉(zhuǎn)換。許多 JDK 提供的類型使你能夠使用,但是你如果要轉(zhuǎn)換你自己的代碼,就必須告訴DWR。一般是指JavaBean 的參數(shù)需要
41、一個作為。你不需要在dwr.xml 中部分的中定義。它們默認(rèn)支持。所有主要的類型,, double 等等。包裝類,java.lang.String,eger 等等。java.util.Date 和 java.sql.Times,java.sql.Timest數(shù)組(存放以上類型的)。集合類型 (List, Set, Map, Iterator 等等) (存放以上類型的)DOM 對象(來自于 DOM, XOM, JDOM 和DOM4J)1.日期轉(zhuǎn)換器如果你有一個String(例如:“20010211”)在 Javascript,你想把它轉(zhuǎn)換成 Java 日期。那么你有 2 種選擇,一是使用 Dat
42、e.parse()然后使用 Donverter 傳入服務(wù)器端,還有一種選擇是把該 String 傳入,然后用java 的 SimpleDateFormat(或者其他的)來轉(zhuǎn)換。同樣,如果你有個Java 的 Date 類型并且希望在 HTML 使用它。你可以先用SimpleDateFormat 把它轉(zhuǎn)換成字符串再使用。也可以直接傳Date 給Javascript,然后用 Javascript 格式化。第式簡單一些,盡管浪費了你的轉(zhuǎn)換器,而且這樣做也會是瀏覽器上的顯示邏輯受到限制。其實后面的方法更好,也有一些工具可以幫你,例如:The Javascript Toolbox Date formatt
43、erWeb Developers Notes on Date formatting2.數(shù)組轉(zhuǎn)換器數(shù)組實體不太容易理解。默認(rèn)情況下 DWR 能轉(zhuǎn)換所有原生類型的數(shù)組,還有所有 marshallable 對象的數(shù)組。這些 marshallable 對象包括前面介紹的 String 和Date 類型。match 屬性看上去很怪。上面沒有解釋 * 的作用 - 它是通配符,表示匹配接下來的所有字符串。這也是 DWR 可以轉(zhuǎn)換任意類型的數(shù)組的原因。25 / 923.bean 和對象轉(zhuǎn)換器兩個沒有默認(rèn)打開的轉(zhuǎn)換器是Bean 和 Object 轉(zhuǎn)換器。Bean 轉(zhuǎn)換器可以把POJO 轉(zhuǎn)換成Javascript
44、 的接合數(shù)組(類似與Java 中的Map),或者反向轉(zhuǎn)換。這個轉(zhuǎn)換器默認(rèn)情況下是沒打開的,因為 DWR 要獲得你的允許才能動你的代碼。Object 轉(zhuǎn)換器很相似,不同的是它直接應(yīng)用于對象的成員,而不是通過 getter 和setter 方法。下面的例子都是可以用 object 來替換bean 的來直接對象成員。如果你有一個在 中的調(diào)用Bean。它有個一參數(shù)也是一個 bean,并且這個 bean 有一個setter 存在一些安全隱患,那么者就可能利用這一點。你可以為某一個單獨的類打開轉(zhuǎn)換器:如果要允許轉(zhuǎn)換一個包或者子包下面的所有類,可以這樣寫:顯而易見,這樣寫是允許轉(zhuǎn)換所有的JavaBean:B
45、eanConverter 和 JavaBeans 規(guī)范用于被BeanConverter 轉(zhuǎn)換的Bean 必須符合JavaBeans 的規(guī)范,因為轉(zhuǎn)換器用的是rospection,而不是 Reflection。這就是說屬性要符合一下條件:有 getter 和setter,setter 有一個參數(shù),并且這個參數(shù)的類型是getter 的返回類型。setter 應(yīng)該返回void,getter 應(yīng)該沒有任何參數(shù)。setter 沒有重載。以上這些屬于。就在 eclipse 里自動為每個屬性添加 setter,getter 那種類型,如果你用的不是JavaBean,那么你應(yīng)該用 ObjectConverte
46、r.設(shè)置 Javascript 變量DWR 可以把Javascript 對象(又名 maps,或聯(lián)合數(shù)組)轉(zhuǎn)換成 JavaBean 或者Java 對象。例子:26 / 92public class Remoted public void set(p) / .public classpublic void setName(String name) . public void setAge(age) . / .如果這個 Remoted 已經(jīng)被配置成 Creator 了,Per的方式調(diào)用Java 代碼:類也定義了BeanConverter,那么你可以通過下面限制轉(zhuǎn)換器就像你可以在creator 的定
47、義中剔出一些方法一樣,converter 也有類似的定義。限制屬性轉(zhuǎn)換僅僅對于Bean 有意義,很明顯原生類型是不要需要這個功能的,所以只有BeanConverter 及其子類型(HibernateBeanConverter)有這個功能。語法是這樣的:這就保證了DWR 不會調(diào)用 fred.getProperty1() 和fred.getProperty2 兩個方法。另外如果你喜歡白而不是的話:安全上比較好的設(shè)計是使用白而不是。對象的私有成員通過object轉(zhuǎn)換器的參數(shù)的一個名為 force 的參數(shù),可以讓 DWR 通過反射來對象私有成員。語法是這樣的:直到 DWR1.1.3,這里有一個 bug
48、,public 的field 反而不能被發(fā)現(xiàn),所以你需要在 public 成員上設(shè)置force=true。27 / 92var p = name:Fred, age:21 ;Remoted.set(p);4.集合類型轉(zhuǎn)換器有個兩個默認(rèn)的轉(zhuǎn)換器,針對 Map 和 Collection:一般來說這些轉(zhuǎn)換器可以遞歸轉(zhuǎn)換它們的內(nèi)容。但是也有兩點之處:僅僅用反射機制是沒有方法明確集合里面是什么類型的。所以這兩個轉(zhuǎn)換器不能把集合里面的東西轉(zhuǎn)換成有意義的Javascript 對象。不能讓他們自動的起作用,可以在 dwr.xml 中用不能明確是那種類型的集合。 雖然signatures 語法它們類型,使之正確
49、轉(zhuǎn)換。5.枚舉類型轉(zhuǎn)換器枚舉類型轉(zhuǎn)換器默認(rèn)是沒有打開的。它在 Java5 中的Enum 和Javascript 的String 之間進(jìn)行轉(zhuǎn)換。這個轉(zhuǎn)換器默認(rèn)關(guān)閉是因為 DWR 要在轉(zhuǎn)換你的代碼之前得到你的同意。枚舉類型轉(zhuǎn)換器是 DWR 1.1 版以后才支持的。你可以這樣設(shè)置來打開這個轉(zhuǎn)換器:設(shè)置Javascript,一個簡單的例子。假設(shè)你有下面的 Java 代碼:如果 Remoted 類已經(jīng)配置好 Creator,并且 Sus 枚舉類型已經(jīng)設(shè)置了EnumConverter。那么你就可以在 javascript 中這樣調(diào)用:28 / 92Remoted.setSus(PASS);public c
50、lass Remoted public void setSus(Sus p) / .enum Sus PASS, FAIL,6.DOM 對象DWR 可以自動轉(zhuǎn)換來之 DOM,DOM4J,JDOM 和 XOM 的 DOM 樹。你可以簡單得用上面這些類庫返回一、Element 或者 Node,DWR 會把他們自動轉(zhuǎn)換成瀏覽器的 DOM 對象。個在程序啟動的時候會有一個常見的關(guān)于JDOM 轉(zhuǎn)換器的警告,你可以放心的忽略它,除非你要用JDOM:因為 DWR 沒有辦法知道你是否想用JDOM,所以這個信息設(shè)在INFO 級別的。如果你曾經(jīng)嘗試過使用JDOM,你會的原因。在這種情況下這個轉(zhuǎn)換器不可用的 - 這
51、也是顯示這個信息exist-db.持這個。,我相信 DWR 能同exist-db 很好的工作,因為它是建立在W3C DOM 之上的,而DWR 也支29 / 92INFO: Missing classdef for converter jdom. Failed to loaduk.getahead.dwr.convert.JDOMConverter. Cause:/jdom/3.4 DWR 使用反射機制在轉(zhuǎn)換過在此處用方法簽名給予暗示。找到它應(yīng)該使用的類型。有時候類型的信息無法獲得,在這種情況下你要signatures 段使 DWR 能確定集合中存放的數(shù)據(jù)類型。例如下面的定義中類型。無法知道 l
52、ist 中存放的是什么signatures 段允許解。暗示 DWR 應(yīng)該用什么類型去處理。格式對以了解 JDK5 的泛型的人來說很容易理DWR 中又一個器專門來做這件事,所以即便你的環(huán)境時 JDK1.3 DWR 也能正常工作。規(guī)則基本上會和你預(yù)想規(guī)則的一樣(有兩個例外),所以 java.lang 下面的類型會被默認(rèn) import。第一個是 DWR1.0 中器的 bug,某些環(huán)境下不能返回正確類型。所以你也不用管它了。第二個是這個器時陽光(sunny day)器。就是說它非常寬松,不想編譯器那樣嚴(yán)格的保證你一定正確。所以有時它也會允許你丟失 import:30 / 92!CDATAimport
53、java.util.List; Check.setLotteryResults(List);!CDATAimport java.util.List; import com.exle.Check;Check.setLotteryResults(List nos);public class Check public void setLotteryResults(List nos).將來的 DWR 版本會使用一個更正式的多這個不嚴(yán)格的東西。器,這個編譯器會基于Java 定義,所以你最好不要使用太signatures 段只是用來確定泛型參數(shù)中的類型參數(shù)。DWR 會自己使用反射機制或者運行時類型確定類型
54、,或者假設(shè)它是一個String 類型。所以:不需要signatures - 沒有泛型參數(shù):需要signatures - DWR 不能通過反射確定:不需要signatures - DWR 能正確的猜出:不需要signatures - DWR 可以通過運行時類型確定:沒有必要讓Javascript 中的所有對象的 key 都是String 類型 - 你可以使用其他類型作為key。但是他們在使用之前會被轉(zhuǎn)換成String 類型。DWR1.x 用Javascript 的特性把key 轉(zhuǎn)換成String。DWR2.0 可能會用toString()方法,在服務(wù)段進(jìn)行這一轉(zhuǎn)換。31 / 92public L
55、ist method(String p);public void method(List p);public void method(Map p);public void method(List p);public void method(Map p);public void method(String p);public void method(String p);第4章.整合4.1 DWR 與 Servlet有 2 個Java 類你一般需要用在 DWR 中,是 webContext 和WebContextFactory在 DWR 1.x 它們在 uk. .getahead.dwr 包, D
56、WR 2.0在.directwebremoting 包。這 2 個類給與你標(biāo)準(zhǔn) Http servlet 對象的。這些對象是:HttpServletRequest HttpServletResponse HttpSes ServletContextServletConfig4.1.1 使用 webContext 的方法:處理 Http request 和 response 做為只讀是非常重要的。因為,當(dāng) Http headers 也許會通過,那么有些瀏覽器會忽略它們(比如IE 忽略緩存參數(shù))。任何嘗試改變 Http body 將會導(dǎo)致 DWR 錯誤。WebContext 使用一個本地線程變量,
57、所以你能使用以上的代碼放在任何地方。也可以看一下 DWR 的Java 文檔 ,或者詳細(xì)看一下 WebContext 。WebContext 代替了 DWR1.1 中的ExecutionContext。4.1.2 方法選擇在沒有寫依賴于 DWR 的代碼時,要能夠Http servlet 對象是可以做到的(比如 HttpServletRequest,HttpServletResponse, HttpSes, ServletContext or ServletConfig)。DWR 將自動填充它。舉個例子:32 / 92public class Remote public void method(p
58、aram, ServletContext cx, String s) . import uk.getahead.dwr.WebContext;import uk.getahead.dwr.WebContextFactory;/WebContext ctx = WebContextFactory.get(); req = ctx.getHttpServletRequest();然后你將可以從Javascript 中通它盡管沒有ServletContext 參數(shù):DWR 將為你填充這個參數(shù)。對這個方法這里有個小小的警告,你要保證你的沒有把callback function作為第一個參數(shù),而應(yīng)該把它
59、作為最后一個參數(shù),或者作為元數(shù)據(jù)對象33 / 92Remote.method(42, test, callback);4.2 DWR 與 Spring4.2.1 讓 DWR 和 Spring 一起工作的檢查列表.確認(rèn)你用的是版的 DWR。Spring 創(chuàng)造器已經(jīng)有了變化,所以你最好檢查一下 DWR 的版本 。確認(rèn)你的Spring 的Bean 在DWR 外面運行良好。配置 DWR 和Spring 一起工作。 (看下面)查看演示頁面: YOUR-WEBAPP /dwr ,檢查spring 的Bean 是否出現(xiàn)。DWR 對于Spring 沒有運行期依賴,所以如果你不使用 Spring
60、那么Spring 的支持不會產(chǎn)生任何影響到。4.2.2 Spring Creator這個創(chuàng)造器會在spring beans.xml 里查詢 beans,并且會使用 Spring 去創(chuàng)建它們。如果你已經(jīng)使用 Spring,這個創(chuàng)造器會非常有用。否則將完全沒有任何用處。要讓 DWR 使用Spring 創(chuàng)造器去創(chuàng)建和調(diào)用 beans,要像如下所示:4.2.3 找到 Spring 配置文件有 3 個方法可以找到Spring 配置文件1.ContextLoaderListener最簡單的用法使從Spring-MVC 里使用.springframework.web.context.ContextLoade
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國棉織睡袋數(shù)據(jù)監(jiān)測研究報告
- 15籃球運球 教學(xué)設(shè)計 -九年級體育與健康
- 光儲氫氨一體化項目的環(huán)境影響評估
- 大型儀器服務(wù)平臺升級改造數(shù)據(jù)管理與存儲方案
- 二零二五年度水稻種植戶風(fēng)險共擔(dān)收購合同
- 二零二五年度勞動合同與用工單位員工離職交接與檔案管理合同
- 二零二五年度知識產(chǎn)權(quán)侵權(quán)案件和解協(xié)議
- 二零二五年度承包油茶種植基地土地承包與品牌推廣合同
- 二零二五年度防盜門品牌形象設(shè)計與授權(quán)合同
- 《書憤》教學(xué)設(shè)計 2024-2025學(xué)年統(tǒng)編版高中語文選擇性必修中冊
- 提升電子商務(wù)的發(fā)展邏輯
- 提升醫(yī)療質(zhì)量減少醫(yī)療糾紛
- (完整)特種設(shè)備專項應(yīng)急預(yù)案
- 小學(xué)體質(zhì)測試標(biāo)準(zhǔn)
- 機床安全操作培訓(xùn)課件
- 自動化電氣控制方案
- 臍疝護(hù)理查房課件
- XX學(xué)校學(xué)校集體備課實施方案細(xì)則、方案、計劃、制度、總結(jié)(全套資料)
- 開展去向不明人員專項工作方案
- 南方談話學(xué)習(xí)匯報
- 高處作業(yè)吊籃施工安全監(jiān)理實施細(xì)則
評論
0/150
提交評論