一、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配置方式,你需要这么做:

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

转载于:https://www.cnblogs.com/yiwangzhibujian/p/6184596.html

【DWR系列04】- DWR配置详解相关推荐

  1. Maven系列--setting.xml 配置详解

    文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...

  2. Maven系列2--pom.xml 配置详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  3. STM8L101系列单片机串口配置详解(基于IAR自带库)

    STM8L101f3p6  有一个串口如图 本历程基于库操作 不讨论具体寄存器操作 有兴趣的同学可以自行参考编程手册 下面看一下手册的了解一下特点 本人英语是个小白只可意会不可言传了 内部结构了由于是 ...

  4. 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...

  5. SpringMVC 框架系列之组件概述与配置详解

    在上一篇文章 SpringMVC 框架系列之初识与入门实例 的实例中,我们已经知道,SpringMVC 框架是一个 web 层的框架,本篇文章就详细解释一下 SpringMVC 框架具体文件的配置以及 ...

  6. Julia的安装与配置详解(包含在Ubuntu 18.04和Windows 10系统上Julia的安装)

    Julia的安装与配置详解((包含在Ubuntu 18.04和Windows 10系统上Julia的安装) Julia的安装 使用二进制文件安装Julia 在Ubuntu上安装Julia 在Windo ...

  7. mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)

    主从关系 准备三台不同ip的虚拟机 (第一批)主从关系的配置 主192.168.47.131 配置/etc/my.cnf,在[mysqld]下配置 log-error=/var/log/mysqld. ...

  8. SpringSecurity权限管理框架系列(六)-Spring Security框架自定义配置类详解(二)之authorizeRequests配置详解

    1.预置演示环境 这个演示环境继续沿用 SpringSecurit权限管理框架系列(五)-Spring Security框架自定义配置类详解(一)之formLogin配置详解的环境. 2.自定义配置类 ...

  9. LCS2005客户端配置详解:LCS2005系列之二

    LCS2005客户端配置详解 上篇博文中我们介绍了如何部署LCS2005标准版,今天我们要再进一步,配置好LCS2005的客户端,使用户能够使用LCS提供的即时通讯服务来进行彼此间的信息交流.实验拓扑 ...

  10. webpack手摸手学习系列之配置详解的 entry、output、module、resolve、devServer 和 optimization

    一.webpack 配置详解之 entry 创建空文件夹,通过 npm init 命令初始化 package.json 文件,通过 npm install webpack webpack-cli -g ...

最新文章

  1. FPGA之道(46)数字电路中的隐患
  2. 分布式从mysql查数据_技术分享 | 从库数据的查找和参数 slave_rows_search_algorithms...
  3. 用Redux来进行组件间通讯
  4. Vaadin应用程序中的EJB查找
  5. SCU 4439 Vertex Cover(二分图最小覆盖点)题解
  6. 一本通1629聪明的燕姿
  7. 微型计算机中常体力,42.5 用微型计算机进行膳食营养成分计算
  8. hashmap储存有向图_以邻接表的形式创建带权值的有向图即有向网
  9. idea 自动导入包操作及快捷键
  10. 本机号码一键登录原理与应用
  11. Informatic学习总结_day02
  12. SDIO wifi Marvell8801/Marvell88w8801 介绍(二) ---- SDIO协议介绍
  13. Ubuntu20.04安装NVIDIA显卡驱动、CUDA、CUDNN及突破NVENC并发限制
  14. 如何使用js实现交通红绿灯
  15. 自然语言处理(NLP)常用开源工具总结----不定期更新
  16. 健康医疗数据安全指南内容
  17. ur3手眼标定+realsenseL515
  18. linux三剑客及常见命令,Linux三剑客及使用介绍
  19. C语言之运算符练习题
  20. Dashboard安装配置

热门文章

  1. 解决jmeter测试报告不显示后面的断言错误失败信息
  2. Vim文件管理器NERD tree
  3. 清华硕士面试阿里惨遭淘汰,网友:并非所有都是强者,也要看人
  4. Spring Boot 缓存开发实战
  5. 互联网架构“高并发”到底怎么玩?
  6. 硅谷与人工智能的一段风流暧昧史
  7. 人民广场怎么走?地铁换乘算法的实现
  8. 简述Linux虚拟内存管理
  9. PL/SQL Developer 和 instantclient客户端快速安装配置(图文)
  10. Makefile:条件编译