转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6686115.html 

一:DWR的用途

DWR(Direct Web Remoting)是一个Web远程调用框架,会根据java类动态生成javascript代码。

二:DWR实现Ajax的原理

DWR是基于远程过程调用的组件,可以在浏览器端远程调用服务端的业务函数,并获取返回结果。而我们知道,浏览器端是不能直接运行Java代码的,但是可以运行JavaScript代码。DWR的作用就是:把服务端的业务函数转化成JS函数,然后在页面导入js文件,像使用普通JS函数一样调用。而页面在触发该函数时,就向服务端发出请求,服务器根据转换映射关系调用相应业务函数,并把结果返回个页面端的JS函数调用处。这样没有引发页面跳转,所以也是Ajax。

三:DWR使用步骤

(1)下载dwr.jar(核心包)、commons-logging-1.0.4.jar(依赖包),并放置在web项目WEB-INF/lib下面。

下载地址:http://download.csdn.net/detail/qq_28745795/9847205

(2)在web.xml中配置DWR组件,DWR相当于是一个servlet;

  1. <servlet>
  2. <servlet-name>MyDWR</servlet-name>
  3. <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
  4. <init-param>
  5. <param-name>debug</param-name>
  6. <param-value>true</param-value>
  7. </init-param>
  8.  
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>MyDWR</servlet-name>
  12. <url-pattern>/dwr/*</url-pattern>
  13. </servlet-mapping>

(3)定义异步处理函数类AjaxService,在其中定义一系列函数进行业务处理并返回结果;

(4)在与web.xml同目录下创建dwr.xml,配置AjaxService类的哪些方法、哪个DTO通过DWR“转换”成JS函数、JS对象给前端使用;

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
  3. <dwr>
  4. <allow>
  5. <filter class="org.directwebremoting.filter.AuditLogAjaxFilter" />
  6.  
  7. <!-- AjaxService类的转换 -->
  8. <create creator="new" javascript="_AjaxService_js">//转换得到的JS对象名,供前端调用方法时使用
  9. <param name="class" value="demo.AjaxService" />
  10. <include method="ajax1"/>//把哪些函数进行转换,配置方法名即可
  11. <include method="ajax2"/>
  12. <include method="ajax3"/>
  13. </create>
  14. (上面的内容,我们只需写 javascript、value、include三者内容即可,其他照抄)
  15. <!-- 实体类的转换:把一个DTO转换成JS对象供前端使用,一般很少用 -->
  16. <convert converter="bean" match="model.AjaxDTO">
  17. <param name="include" value="username,name" />//把DTO的哪些属性提取出来转换成一个JS对象
  18. </convert>
  19. </allow>
  20. </dwr>

<create>标签中指定javascript中可以访问的java类,并定义DWR应当如何获得要进行远程的类的实例。

creator="new"属性指定java类实例的生成方式,new意味着DWR应当调用类的默认构造函数来获得实例。

javascript=""属性指定javascript代码进行函数调用时使用的对象名称。
<param>标签指定要公开给javascript的java类名。
<include>标签指定要公开给javascript的方法。不指定的话就公开所有方法。

<convertor>标签负责配置方法的参数和返回类型。告诉DWR在服务器端Java 对象表示和序列化的JavaScript对象之间如何转换。

converter="bean"属性指定转换的方式采用JavaBean命名规范

match=""属性指定要转换的javabean相对路径下名称

<param>标签指定要转换的JavaBean的属性,可以不把所有属性都转换,自己定制。

(5)最最关键的一步:在WebRoot下,新建一个文件夹叫dwr,然后从dwr.jar中找到engine.js和util.js 或 从 http://download.csdn.net/detail/qq_28745795/984719 下载这两个js文件,放入dwr文件夹中。

(6)在前端页面代码中导入DWR的JS引擎以及上面dwr.xml中AjaxService转换得到的JS函数文件,就可在js中通过转换后的函数名直接调用方法了。

  1. <!-- 导入dwr的JS引擎与工具 -->
  2. <script type="text/javascript" src="/项目名/dwr/engine.js"></script>
  3. <script type="text/javascript" src="/项目名/dwr/util.js"></script>
  1. <script type="text/javascript" src="/项目名/dwr/interface/_AjaxService_js.js"></script>//这个只是这样写,实际上是运行期间服务器通过dwr动态生成的

四:页面中调用转换后方法:传参与回调

1:传参调用:通过  转换后对象名.方法名(参数列表,回调函数名)   的格式进行函数调用

  1. AjaxService_js.ajaxMethodNameparameters,callback);

2:回调接收结果:定义回调函数,回调函数的形参接收上面函数调用的返回值

  1. function callback(data){
  2.  
  3. //data就是函数调用返回值,进行处理。在JS中,函数的形参变量是根据实际值来决定类型的,所以这里的data可以接收返回的普通类型、JavaBean、集合类等
  4. }

DWR组件——基于远程过程调用实现Ajax的更多相关文章

  1. reactjs-swiper react轮播图组件基于swiper

    react轮播图组件基于swiper demo地址:http://reactjs-ui.github.io/reactjs-swiper/simple.html 1. 下载安装 npm install ...

  2. 基于jQuery实现的Ajax 验证用户名唯一性

    基于jQuery实现的Ajax 验证用户名唯一性 前端jsp页面代码 <tr> <th><span class="requiredField"> ...

  3. 基于BootStrap,FortAweSome,Ajax的学生管理系统

    一. 基于BootStrap,FortAweSome,Ajax的学生管理系统代码部分 1.students.html <1>html页面文件 <!DOCTYPE html> & ...

  4. vue2.0 富文本组件(基于wangeditor)

    1. 本组件基于 wangeditor http://www.wangeditor.com/ 如有侵权 请告知, 2. 效果图 3. 依赖安装 package.json 中 devDependenci ...

  5. python 爬虫 基于requests模块发起ajax的post请求

    基于requests模块发起ajax的post请求 需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定某个城市地点的餐厅数据 点击肯德基餐厅查 ...

  6. python 爬虫 基于requests模块发起ajax的get请求

    基于requests模块发起ajax的get请求 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据 用抓包工具捉取 使用ajax加载页面的请求 鼠标往下 ...

  7. 拥抱基于jquery.deferred的ajax,和层层嵌套回调的ajax说拜拜

    前言 在项目中,无论是维护自己的代码,还是重构他人的项目代码,看到层层嵌套,异常冗余的某个function,那时我们的内心肯定是奔溃的! 在jquery1.5版本之前,如果我们某个操作需要多个ajax ...

  8. [js开源组件开发]network异步请求ajax的扩展

    network异步请求ajax的扩展 在日常的应用中,你可能直接调用$.ajax是会有些问题的,比如说用户的重复点击,比如说我只希望它成功提交一次后就不能再提交,比如说我希望有个正在提交的loadin ...

  9. DWR第三篇之逆向Ajax升级

    1. 本示例在第二篇架构基础上添加代码 2.在client.jsp开头的地方添加如下代码: 本示例需要做的是定向推送,那么就需要浏览器进行登录,从而进行定向的推送功能,为了节省时间,这里不做登录模块了 ...

随机推荐

  1. 利用ViewStub来延迟加载视图

    很多情况下,我们的视图可能会随着用户的操作的不同而变化,比如一个新的页面包含多个控件,但仅仅在用户点击这个按钮后,所有的控件才能完全显示.也就是说一上来可能就显示一个控件,点击按钮后把其他隐藏的控件再 ...

  2. Eclipse 在线汉化的和修改字体大小、颜色的方法

    一.在线汉化 先进入 http://www.eclipse.org/babel/downloads.php 找到自己对应版本的网址,然后复制下来. 然后,进入eclipse.点工具栏上的Help - ...

  3. [Web 前端] 使用yarn代替npm作为node.js的模块管理器

    cp from : https://www.jianshu.com/p/bfe96f89da0e     Fast, reliable, and secure dependency managemen ...

  4. Mysql中的条件语句if、case

    Mysql中的条件语句在我们对数据进行转换的时候比较有用,这样就不需要创建中转表. IF 函数 IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> ...

  5. Anaconda需要添加的环境变量

    F:\Anaconda3 F:\Anaconda3\Scripts F:\Anaconda3\Library\bin

  6. Installing Hyperledger Fabric v1.1 on Ubuntu 16.04 — Part I

    There is an entire library of Blockchain APIs which you can select according to the needs that suffi ...

  7. mybatis中sql标签、where标签、foreach标签用法

    <sql id="query_user_where"> <!-- 如果 userQueryVo中传入查询条件,再进行sql拼接--> <!-- tes ...

  8. go语言之进阶篇Ticker的使用

    Ticker是一个定时触发的计时器,它会以一个间隔(interval)往channel发送一个事件(当前时间),而channel的接收者可以以固定的时间间隔从channel中读取事件. 1.Ticke ...

  9. go语言之进阶篇文件常用操作接口介绍和使用

    一.文件常用操作接口介绍 1.创建文件 法1: 推荐用法 func Create(name string) (file *File, err Error) 根据提供的文件名创建新的文件,返回一个文件对 ...

  10. go语言之进阶篇方法值

    1.方法值 示例: package main import "fmt" type Person struct { name string //名字 sex byte //性别, 字 ...