【DWR系列04】- DWR配置详解
一、DWR配置簡介
雖然使用DWR只需要簡單的配置,但是DWR的功能還是很多的,如果要使用這些功能就要對DWR的配置進行了解。配置主要有web.xml,dwr.xml和注解配置。下面依次介紹。
二、DWR的web.xml配置
標準的DWR配置只需要配置一個servlet和servlet-mapping即可:
<servlet><servlet-name>dwr-invoker</servlet-name><servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>dwr-invoker</servlet-name><url-pattern>/dwr/*</url-pattern> </servlet-mapping>可選的參數有:
| 屬性名稱 | 默認值 | 簡介 | 開始版本 |
| jsonpEnabled | false | 設置為true則支持JSONP | 3.0RC2 |
| allowGetForSafariButMakeForgeryEasier | false | 設置為true可以讓DWR工作在Safari 1.x(一個bug導致的問題) | 2.0 |
| crossDomainSessionSecurity | true | 設置為false可以支持跨域 | 2.1 |
| allowScriptTagRemoting | true | 設置為true可以啟用script標簽的遠程訪問 | 2.0 rc4 |
| debug | false | 設置為true可以啟用debug模式/測試頁面 | 1.0 |
| scriptSessionTimeout | 1800000(30min) | 設置scriptSessions的超時時間 | 2.0 |
| maxCallCount | 20 | 同一批最大調用數量 | 2.0rc2和1.1.4 |
| activeReverseAjaxEnabled | false | 設置為true啟用輪詢和長連接 | 2.0 RC3 |
| pollAndCometEnabled | false | 同activeReverseAjaxEnabled一樣 | 2.0 RC1 |
| maxWaitingThreads | 100 | 等待線程的最大數量 | 2.0 |
| maxHitsPerSecond | 40 | 每秒最大的訪問數量 | 2.0 |
| [Interface | Name] | 默認實現類,DWR允許你覆蓋指定接口的實現 | 1.1 |
| generateDtoClasses | interface | dwr服務端類的頁面引用方式 | 2.0 |
| ignoreLastModified | false | 默認支持Last-Modified | 2.0 |
| normalizeIncludesQueryString | false | 默認來說逆向Ajax對同一頁面不同查詢參數將會認為同一個頁面 | 2.0 RC3 |
| normalizeIncludesSessionID | false | 默認來說逆向Ajax對同一頁面不同session id將會認為同一個頁面 | 3.0 RC2 |
| overridePath | null | 可以設置新的值覆蓋路徑到默認值 | 2.0 |
| url:/about | dwr官方網站 | 可以設置為null不來顯示它 |
2.1 配置dwr.xml路徑
可以配置多個dwr.xml配置文件并指定路徑:
<servlet><servlet-name>dwr-user-invoker</servlet-name><servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class><init-param><param-name>config-user</param-name><param-value>WEB-INF/dwr-user.xml</param-value></init-param> </servlet> <servlet><servlet-name>dwr-admin-invoker</servlet-name><servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class><init-param><param-name>config-admin</param-name><param-value>WEB-INF/dwr-admin.xml</param-value></init-param> </servlet> <servlet-mapping><servlet-name>dwr-admin-invoker</servlet-name><url-pattern>/dwradmin/*</url-pattern> </servlet-mapping> <servlet-mapping><servlet-name>dwr-user-invoker</servlet-name><url-pattern>/dwruser/*</url-pattern> </servlet-mapping>2.2 配置DWR插件
一般來說DWR允許你使用自己的實現,通過如下配置:
<servlet><servlet-name>dwr-invoker</servlet-name><servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class><init-param><param-name>org.directwebremoting.extend.ServerLoadMonitor</param-name><param-value>com.example.MyCustomServerLoadMonitor,com.example.MyCustomServerLoadMonitor</param-value></init-param> </servlet>允許的插件有:
- org.directwebremoting.Container
- org.directwebremoting.HubFactory$HubBuilder
- org.directwebremoting.ServerContextFactory$ServerContextBuilder
- org.directwebremoting.WebContextFactory$WebContextBuilder
- org.directwebremoting.dwrp.FileUpload
- org.directwebremoting.extend.AccessControl
- org.directwebremoting.extend.AjaxFilterManager
- org.directwebremoting.extend.CallbackHelperFactory$CallbackHelperBuilder
- org.directwebremoting.extend.Compressor
- org.directwebremoting.extend.ContainerAbstraction
- org.directwebremoting.extend.ConverterManager
- org.directwebremoting.extend.CreatorManager
- org.directwebremoting.extend.DebugPageGenerator
- org.directwebremoting.extend.DownloadManager
- org.directwebremoting.extend.IdGenerator
- org.directwebremoting.extend.PageNormalizer
- org.directwebremoting.extend.Remoter
- org.directwebremoting.extend.ScriptSessionManager
- org.directwebremoting.extend.ServerLoadMonitor
- org.directwebremoting.extend.TaskDispatcherFactory$TaskDispatcherBuilder
- org.directwebremoting.json.parse.JsonParserFactory$JsonParserBuilder
- org.directwebremoting.json.serialize.JsonSerializerFactory$JsonSerializerBuilder
- org.directwebremoting.servlet.UrlProcessor
- org.directwebremoting.dwrp.HtmlPollHandler
- org.directwebremoting.dwrp.PlainCallHandler
- org.directwebremoting.dwrp.PlainPollHandler
- org.directwebremoting.dojo.DwrStoreHandler
- org.directwebremoting.servlet.DownloadHandler
- org.directwebremoting.servlet.EngineHandler
- org.directwebremoting.gi.GiHandler
- org.directwebremoting.servlet.IndexHandler
- org.directwebremoting.jsonp.JsonpCallHandler
- org.directwebremoting.jsonrpc.JsonRpcCallHandler
- org.directwebremoting.servlet.MonitorHandler
- org.directwebremoting.servlet.TestHandler
- org.directwebremoting.ui.servlet.UtilHandler
- org.directwebremoting.webwork.WebworkUtilHandler
2.3 測試模式
DWR有一個測試模式,通過配置來開啟:
<init-param><param-name>debug</param-name><param-value>true</param-value> </init-param>開啟后就可以通過訪問主機名:端口/Web名/dwr/index.html:
可以看到系統中配置的可訪問類被列出來了,點擊進去:
可以看到一些幫助信息,也有對配置的類進行測試,重要的是開啟debug模式后,日志信息會打印的更詳細:
這在開發階段非常有用,但是在部署環境上一定要將此屬性注釋掉,官方解釋容易引起安全問題。
三、DWR的dwr.xml配置
3.1 dwr.xml文件簡介
dwr.xml配置文件時DWR的標準配置文件,默認情況下你需要將其放到WEB-INF根目錄下。一個dwr.xml的配置文件結構如下:
<!DOCTYPE dwr PUBLIC"-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN""http://directwebremoting.org/schema/dwr30.dtd"> <dwr><!-- init只有在你擴展DWR的情況下才使用 --><init><creator id="..." class="..." /><converter id="..." class="..." /></init><!-- 沒有許可,DWR不能做任何事 --><allow><filter class="..." /><create creator="..." javascript="..." /><convert converter="..." match="..." /></allow><!-- 你應該告訴DWR方法的參數泛型 --><signatures>...</signatures> </dwr>3.2 基本術語簡介
首先了解dwr.xml配置文件的基本術語:
- <allow>:allow部分定義了哪些class能被DWR創建和轉換以供全局過濾器使用。沒有它DWR不能做任何工作。
- create:任何我們想要被js執行的Java類都需要在此標簽創建,有幾種創建模式,最常用的是new方式。
- convert:將類轉換成js對象。這樣js可以以對象的方式處理參數。
- filter:過濾器是用來在某些操作的時候進行相應處理。
- <init>:可選的配置部分,聲明可以被創建并遠程訪問的類和可以被轉換的類。
- <signatures>:DWR通過反射來找出哪種類型需要被創建。
dwr.xml配置文件可以有多個,多個配置文件需要在web.xml文件中聲明。
3.3?Converters
轉化器是DWR的重要組成部分,肩負著客戶端和服務器數據轉化責任。需要轉化的有方法的參數對象和返回值對象。
+提示以下類型不需要轉換
- 所有基本類型及其包裝類,double、int、Integer等
- java.lang.String,java.util.Date和其3個SQL的派生類
- 以上所有類型的數組和集合
- 來自DOM,XOM,JDOM和DOM4J的DOM對象,如Element,Document
- 像byte[], java.io.InputStream, java.awt.image.BufferedImage或org.directwebremoting.io.FileTransfer的可以被瀏覽器下載的BOLB對象
- org.directwebremoting.io.JavascriptFunction的實例和org.directwebremoting.io.DwrConvertedException實例
- 服務端TIBCO GI CDF版本的文檔,如jsx3.xml.CdfDocument.
3.3.1 基本轉換示例
轉換指定的一個類:
<convert converter="bean" match="com.example.Person"/>轉換指定包下的所有類:
<convert converter="bean" match="com.example.*"/>轉換指定包及其子包的所有類:
<convert converter="bean" match="com.example.**"/>轉換時排除指定類的指定屬性:
<convert converter="bean" match="com.example.Person"><param name="exclude" value="property1, property2"/> </convert>轉化時,只轉化指定的屬性:
<convert converter="bean" match="com.example.Person"><param name="include" value="property1, property2"/> </convert>對具有私有變量的Object對象進行反射轉化:
<convert converter="object" match="com.example.Person"><param name="force" value="true"/> </convert>3.3.2 轉換后調用
假如有以下代碼,Person被轉換,并可以被Remoted調用。
public class Remoted {public void addToFriends(Person p) {// ... } } public class Person {public void setName(String name) { ... }public void setAge(int age) { ... }// ... }那么js調用代碼如下,將自動根據類型進行轉換:
var p = { name:"Fred", age:21 }; Remoted.addToFriends(p);3.3.3 集合轉換支持
集合默認支持基本類型的轉換,但是Map不支持null鍵,但是可以設置當出現null鍵的時候用什么來替代:
<convert converter="map" match="java.util.Map"><param name="nullKey" value="null"/> </convert>3.4?Creators
構造器的基本結構如下:
<allow><create creator="..." javascript="..." scope="..."><param name="..." value="..."/><auth method="..." role="..."/><exclude method="..."/><include method="..."/></create>... </allow>create具有以下屬性(如果你想編寫自己的構造器,那么你需要在<inti>部分進行聲明。):
- new:通過java的空的構造方法獲得對象
- static:默認通過getInstance()獲得對象
- none:不創建對象
- scripted:使用腳本語言創建對象
- spring:通過Spring容器獲取對象
- jsf:通過JSF獲取對象
- struts:使用Struts的formbeans對象
- pageflow:通過Beehive或Weblogic獲得PageFlow
- ejb3:通過ejb獲得對象
javascript屬性:是必須的,是對象的js名稱,避免使用js禁止的名稱。
scope屬性:有"application", "session", "request", "page" 和額外的"script",默認為page,前四個屬性和Web相似,script允許你有和HTTP session相似的功能但是不是用cookie而是綁定ID來實現。
param屬性:用來對不同構造器進行配置的。
auth屬性:允許你指定J2EE的角色屬性。
include和exclude屬性:用來指定需要包含或排除的方法。
3.5?Filters
過濾器用在響應前、響應后或者阻止響應。可以使用@Filter注解或者dwr:filter進行配置。格式如下:
<filter class="..."><param name="..." value="..."/> </filter>自定義過濾器必須實現org.directwebremoting.AjaxFilter接口,過濾器可以用作全局過濾:
<allow><filter class="com.example.NoopFilter"/>... </allow>或者局部過濾:
<allow><create creator="..."><filter class="com.example.NoopFilter"/></create>... </allow>dwr 3.x提供一個用于模仿網絡延時的過濾器:
<filter class="org.directwebremoting.filter.ExtraLatencyAjaxFilter"><param name="delay" value="200"/> </filter>配置為延時200ms,代表著調用前后各延時100ms,默認延時時間為100ms,代表前后各延時50ms。
3.6?Signatures
Signatures部分用來解決集合泛型問題,例如如下代碼:
public class Check {public List<?> setLotteryResults(List<?> whatDoIContain){...} }DWR不能知道集合中到底存了什么對象,但是當方法如下時就不需要了:
public class Check {public List<Integer> setLotteryResults(List<Integer> whatDoIContain){...} }如果你堅持使用原始類型,那么就需要進行如下配置:
<signatures><![CDATA[import java.util.List;import com.example.Check;Check.setLotteryResults(List<Integer> nos);]]> </signatures>注意,signatures 元素不支持嵌套,以下配置將不起作用:
<signatures><![CDATA[import java.util.List;import java.util.Map ;Check.setConditions(Map<String, Map<String, String>>);]]> </signatures>四、DWR的注解配置
若要使用DWR的注解配置需要在web.xml中指定配置注解的類:
<servlet><description>DWR controller servlet</description><servlet-name>DWR controller servlet</servlet-name><servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class><init-param><param-name>classes</param-name><param-value>com.example.RemoteFunctions,com.example.RemoteBean</param-value></init-param> </servlet>如果配置的是內部類則使用$格式,例如使用java.util.Map$Entry而不是java.util.Map.Entry。
4.1 遠程訪問對象及方法
通過使用@RemoteProxy和@RemoteMethod注解來進行配置:
@RemoteProxy public class RemoteFunctions {@RemoteMethodpublic int calculateFoo() {return 42;} }任何沒有被@RemoteMethod聲明的將不能被訪問,也可以為遠程對象重新定義名稱:
@RemoteProxy(name="Functions")public class RemoteFunctions { }4.2 對象轉換
通過使用@DataTransferObject和@RemoteProperty注解來進行配置:
@DataTransferObject public class Foo {@RemotePropertyprivate int foo;public int getFoo() {return foo;}@RemotePropertypublic int getBar() {return foo * 42;} }五、流式配置
這也是一種配置方式,如果想用流式配置代替dwr.xml配置方式,你需要這么做:
一個簡單的流式配置如下:
public void configure() {withConverterType("dog", "com.yourcompany.beans.Dog");withCreatorType("ejb", "com.yourcompany.dwr.creator.EJBCreator");withCreator("new", "ApartmentDAO").addParam("scope", session).addParam("class", "com.yourcompany.dao.ApartmentDAO").exclude("saveApartment").withAuth("method", "role");withCreator("struts", "DogDAO").addParam("clas", "com.yourcompany.dao.DogDAO").include("getDog").include("getColor");withConverter("dog", "*.Dog").addParam("name", "value");withSignature().addLine("import java.util.List;").addLine("import com.example.Check;").addLine("Check.setLotteryResults(List<Integer> nos);"); }?
dwr.xml的配置方式選擇
dwr.xml的配置方式簡單、易修改、容易閱讀,注解方式簡單、流式配置方式復雜、不易修改,建議使用dwr.xml方式進行配置。
轉載于:https://www.cnblogs.com/yiwangzhibujian/p/6184596.html
總結
以上是生活随笔為你收集整理的【DWR系列04】- DWR配置详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: testng入门教程5TestNG套件测
- 下一篇: 【Eclipse】eclipse che