【DWR系列04】- DWR配置詳解

1、DWR配置簡介

  雖然使用DWR只須要簡單的配置,可是DWR的功能仍是不少的,若是要使用這些功能就要對DWR的配置進行了解。配置主要有web.xml,dwr.xml和註解配置。下面依次介紹。javascript

2、DWR的web.xml配置

  標準的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不來顯示它  

2.1 配置dwr.xml路徑

  能夠配置多個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>

2.2 配置DWR插件

  通常來講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

  • 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模式後,日誌信息會打印的更詳細:安全

  這在開發階段很是有用,可是在部署環境上必定要將此屬性註釋掉,官方解釋容易引發安全問題。

3、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>

4、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 {
    @RemoteMethod
    public int calculateFoo() {
       return 42;
    }
}

  任何沒有被@RemoteMethod聲明的將不能被訪問,也能夠爲遠程對象從新定義名稱:

@RemoteProxy(name="Functions")
    public class RemoteFunctions {
}

4.2 對象轉換

  經過使用@DataTransferObject和@RemoteProperty註解來進行配置:

@DataTransferObject
public class Foo {
    @RemoteProperty
    private int foo;
    public int getFoo() {
        return foo;
    }
    @RemoteProperty
    public int getBar() {
        return foo * 42;
    }
}

5、流式配置

  這也是一種配置方式,若是想用流式配置代替dwr.xml配置方式,你須要這麼作:

  1. 建立org.directwebremoting.fluent.FluentConfigurator實現類,並重寫configure()方法
  2. 在web.xml的servlet新增參數customConfigurator,指向你的配置類

  一個簡單的流式配置以下:

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方式進行配置。

相關文章
相關標籤/搜索