Direct Web Remoting

DWR的官网:http://directwebremoting.org/dwr/index.html

什么是DWR?  DWR是一个Java库,使服务器上的Java和JavaScript的浏览器进行交互和相互调用尽可能简单。

  DWR 是一个可以允许你去创建 AJAX WEB 站点的 JAVA 开源库。它可以让你在浏览器中的 Javascript 代码调用 Web 服务器上的 Java 代码,就像在 Java 代码就在浏览器中一样。

DWR 包含 2 个主要部分:

  •一个运行在服务器端的 Java Servlet,它处理请求并且向浏览器发回响应。

  •运行在浏览器端的 JavaScript,它发送请求而且还能动态更新网页。

DWR 工作原理:

  是通过动态把 Java 类生成为 Javascript。它的代码就像 Ajax 魔法一样,你感觉调用就像发生在浏览器端,但是实际上代码调用发生在服务器端,DWR 负责数据的传递和转换。这种从 Java 到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制,而且DWR的优点在于不需要任何的网页浏览器插件就能运行在网页上。

  Java 从根本上讲是同步机制,然而 AJAX 却是异步的。所以你调用远程方法时,当数据已经从网络上返回的时候,你要提供有反调 (callback) 功能的 DWR。

  DWR 动态在 JavaScript 里生成一个 AjaxService 类,去匹配服务气端的代码。eventHandler 去调用它,然后 DWR 处理所有的远程细节,包括倒置 (converting) 所有的参数以及返回 Javascript 和 Java 之的值。在示例中,先在 eventHandler 方法里调用 AjaxService 的 getOptions() 方法,然后通过反调 (callback)方法 populateList(data) 得到返回的数据,其中 data 就是 String[]{"1", "2", "3"},最后再使用 DWR utility 把data 加入到下拉列表。

=======================================================

web.xml配置
1.主要配置
  要加入到你的 web.xml 最少的代码就是简单地去申明 DWR servlet,没有它 DWR 就不起作用。
  有些额外的 servlet 参数,在有些地方很重要。

  尤其 debug 参数。这个扩展 DWR 的标准结构是使用<init-params>。
  

 <servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

  在 DWR2.x 之后,DwrServlets 是类 org.directwebremoting.servlet.DwrServlet ,尽管uk.ltd.getahead.dwr.DWRServlet 仍然可以用。在 DWR 1.x 你不得不使用后者。

  另外,启动服务时,如果报如下错。 

java.lang.IllegalArgumentException: DefaultContainer can't find a classes

  是 DWR2.0 加入了 JDK5 的注释(annotations).DwrServlet 初始化的时候会去检查注释的类,找不到就抱错了。如果你不用 annotations 也可以忽略掉这个错误。不过看起来总是不爽。解决方案如下:

  

 <servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param> <param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>classes</param-name>
<param-value>java.lang.Object</param-value>
</init-param>
</servlet>

===================================================

日志配置

  如果你正在使用 HttpServlet.log(), 以下的代码用来控制 DWR 日志

  

 <init-param>
<param-name>logLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>

===================================================

多个 dwr.xml 配置和 J2EE 角色定义

  一般来说只需要一个 dwr.xml 文件,并且会被设为默认位置 WEB-INF/dwr.xml。所以你不需要配置。有 3 个原因说明你为何需要指定不同位置的 dwr.xml 文件:

  •你想保持 dwr.xml 的文件请参照下面的例子 

<param-value>WEB-INF/classes/com/yourco/dwr/dwr.xml</param-value>

  •你可以有很多的远程方法类并且希望指定文件。在这个例子里将指定不同文件开始配置,不同的 param-name 将重复多次 DWR 将轮流读取它们。

  •DWR 能够使 J2EE URL 具有给与不同用户组不同权限的安全机制。通过起不同名字,URL 和权限。

就像如下例子去使用 

 <init-param>
<param-name>config*****</param-name>
<param-value>WEB-INF/dwr.xml</param-value>
<description>What config file do we use?</description>
</init-param>

用一个字符串”config” 作为开始,设置 param-name,每个 param-name 必须不同。

 <servlet>
<servlet-name>dwr-user-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.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>org.directwebremoting.servlet.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>
<security-constraint>
<display-name>dwr-admin</display-name>
<web-resource-collection>
<web-resource-name>dwr-admin-collection</web-resource-name>
<url-pattern>/dwradmin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>dwr-user</display-name>
<web-resource-collection>
<web-resource-name>dwr-user-collection</web-resource-name>
<url-pattern>/dwruser/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>

====================================================

插件配置

  大多数 DWR 的功能是可以作为插件的,所以就通过替换默认的类可以改变 DWR 的功能。你可以通过包含<init-param>去覆盖默认的实现。举个例子:

  

 <init-param>
<param-name>
org.directwebremoting.extend.ServerLoadMonitor
</param-name>
<param-value>com.example.MyCustomServerLoadMonitor</param-value>
</init-param>

认识DWR的更多相关文章

  1. 【DWR系列06】- DWR日志及js压缩

    img { border: solid 1px } 一.日志 DWR依赖 Apache Commons Logging,可以使用log4j实现日志记录功能. 1.1 日志简介 和其他日志框架一样,当设 ...

  2. 【DWR系列04】- DWR配置详解

    table { margin-left: 30px; width: 90%; border: 1px; border-collapse: collapse } img { border: 1px so ...

  3. 【DWR系列03】- DWR主要类详解

    img { border: 1px solid black } 一.简介 首先应该了解这个jar包主要的类,了解了类,就了解了DWR.DWR的在线javadoc:http://directwebrem ...

  4. 【DWR系列02】-DWR逆向Ajax即服务器推送

    .literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...

  5. 【DWR系列01】-DWR简介及入门例子

    .literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...

  6. DWR实现后台推送消息到web页面

    DWR简介 DWR(Direct Web Remoting)可用于实现javascript直接调用java函数和后台直接调用页面javascript代码,后者可用作服务端推送消息到Web前端. (服务 ...

  7. DWR实现扫一扫登录功能

    前言 <DWR实现后台推送消息到Web页面>一文中已对DWR作了简介,并列出了集成步骤.本文中再一次使用到DWR,用以实现扫一扫登录功能. 业务场景 web端首页点击"登陆&qu ...

  8. dwr和spring的整合

    1.dwr在spring配置文件的配置: <!-- 注意这里新增加的dwr tag, 为使其生效,文件头中要声明namespace --> <dwr:configuration /& ...

  9. DWR同步异步设置

    做项目时遇到一个问题,使用DWR发现js总是执行完了之后再执行DWR的内容,后来发现然来DWR也有一种同步机制:DWREngine.setAsync(false); 还需要在代码末尾恢复异步DWREn ...

  10. 使用dwr时动态生成table的一个小技巧

    这篇随笔是我在07年写的,因为当时用了自己建设的blog,后来停止使用了,今天看到备份数据库还在,恢复出来放到这里.留着记录用. 我在使用DWR时,试了很多次都无法在动态生成的table中的一个或多个 ...

随机推荐

  1. zencart低版本由php5.2.17升级PHP5.3环境下错误及解决方案

    方法:有错误或者空白先打开错误提示,ftp看cache错误日志 或者 面板查看错误日志,再对比数据库是否正确,可拿脚本看是否能连接 \cp -r  backipmysql/nlbarb_007li/ ...

  2. 矩阵快速幂——将运算推广到矩阵上HDU 1575

    /* 本题的思路比较简单,就是将递推公式写出来,然后表达成为一个矩阵的形式 最后通过计算就可以得到一个符合题目要求的矩阵, 然后就是将矩阵上面所有的对角线元素相加 得到的结果即为所求的目标 */ #i ...

  3. word、pdf、ppt 转为图片

    office word文档.pdf文档.powerpoint幻灯片是非常常用的文档类型,在现实中经常有需求需要将它们转换成图片 -- 即将word.pdf.ppt文档的每一页转换成一张对应的图片,就像 ...

  4. Hadoop概论

    1.Hadoop核心项目:HDFS(分布式文件系统)和MapReduce(并行计算框架) 2.HDFS的架构 主从结构 主节点,只有一个:namenode(接受用户操作要求:维护文件系统的目录结构:管 ...

  5. 自己写的select元素可编辑、可筛选JQuery插件 jquery.inputselectbox.js

    /* 功能:实现对select下拉框可输入的功能, 输入时会对下拉框的内容进行动态过滤. 参数:没有选择任何值时默认显示的文字 如何使用:$("#firstLevel").inpu ...

  6. Mysql 锁机制

    innodb引擎提供了针对表级锁和行级锁 这个文章说的是行级锁 Lock有两种类型: 1,s-lock(共享锁),拥有该锁的transaction可以对row进行read操作 2,x-lock(排它锁 ...

  7. Postgres数据库在Linux中的I/O优化

    I/O 优化1 打开 noatime方法: 修改 /etc/fstab2 调整预读方法: 查看 sudo blockdev --getra /dev/sda 设置 sudo blockdev --se ...

  8. 给EditText设置边框

    布局文件中加入background属性: <EditText android:layout_width="200dp" android:layout_height=" ...

  9. isPostBack原理

    从 到输入用户名,点击提交按钮 这个过程就叫做postback(是两个不同的状态)     利用ispostback原理,实现是否第一次进入处理程序(上一个用用户名判断的不好,会导致在用户名空的情况下 ...

  10. UICollectController

    九宫格 UICollectController 1.新建一个xib描述cell 2.注册xib 3.collectionView显示cell *必须设置数据源(和代理并遵守协议) *实现数据源和代理的 ...