雖然使用DWR只須要簡單的配置,可是DWR的功能仍是不少的,若是要使用這些功能就要對DWR的配置進行了解。配置主要有web.xml,dwr.xml和註解配置。下面依次介紹。javascript
標準的DWR配置只須要配置一個servlet和servlet-mapping便可:html
<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>
可選的參數有:java
屬性名稱 | 默認值 | 簡介 | 開始版本 |
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不來顯示它 |
能夠配置多個dwr.xml配置文件並指定路徑:web
<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>
通常來講DWR容許你使用本身的實現,經過以下配置:spring
<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>
容許的插件有:json
DWR有一個測試模式,經過配置來開啓:跨域
<init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param>
開啓後就能夠經過訪問主機名:端口/Web名/dwr/index.html:數組
能夠看到系統中配置的可訪問類被列出來了,點擊進去:瀏覽器
能夠看到一些幫助信息,也有對配置的類進行測試,重要的是開啓debug模式後,日誌信息會打印的更詳細:安全
這在開發階段很是有用,可是在部署環境上必定要將此屬性註釋掉,官方解釋容易引發安全問題。
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>
首先了解dwr.xml配置文件的基本術語:
dwr.xml配置文件能夠有多個,多個配置文件須要在web.xml文件中聲明。
轉化器是DWR的重要組成部分,肩負着客戶端和服務器數據轉化責任。須要轉化的有方法的參數對象和返回值對象。
轉換指定的一個類:
<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>
假若有如下代碼,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);
集合默認支持基本類型的轉換,可是Map不支持null鍵,可是能夠設置當出現null鍵的時候用什麼來替代:
<convert converter="map" match="java.util.Map"> <param name="nullKey" value="null"/> </convert>
構造器的基本結構以下:
<allow> <create creator="..." javascript="..." scope="..."> <param name="..." value="..."/> <auth method="..." role="..."/> <exclude method="..."/> <include method="..."/> </create> ... </allow>
create具備如下屬性(若是你想編寫本身的構造器,那麼你須要在<inti>部分進行聲明。):
javascript屬性:是必須的,是對象的js名稱,避免使用js禁止的名稱。
scope屬性:有"application", "session", "request", "page" 和額外的"script",默認爲page,前四個屬性和Web類似,script容許你有和HTTP session類似的功能可是不是用cookie而是綁定ID來實現。
param屬性:用來對不一樣構造器進行配置的。
auth屬性:容許你指定J2EE的角色屬性。
include和exclude屬性:用來指定須要包含或排除的方法。
過濾器用在響應前、響應後或者阻止響應。可使用@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。
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的註解配置須要在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。
經過使用@RemoteProxy和@RemoteMethod註解來進行配置:
@RemoteProxy public class RemoteFunctions { @RemoteMethod public int calculateFoo() { return 42; } }
任何沒有被@RemoteMethod聲明的將不能被訪問,也能夠爲遠程對象從新定義名稱:
@RemoteProxy(name="Functions") public class RemoteFunctions { }
經過使用@DataTransferObject和@RemoteProperty註解來進行配置:
@DataTransferObject public class Foo { @RemoteProperty private int foo; public int getFoo() { return foo; } @RemoteProperty public 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方式進行配置。