DWR组件——基于远程过程调用实现Ajax

转载请注明原文地址: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(依赖包);

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

    <servlet>
        <servlet-name>dwr</servlet-name>
        <servlet-class>
            org.directwebremoting.servlet.DwrServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>dwr</servlet-name>
        <url-pattern>/dwr/*</url-pattern>
   </servlet-mapping>

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

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
    <allow>
        <filter class="org.directwebremoting.filter.AuditLogAjaxFilter" />

        <!-- AjaxService类的转换 -->
        <create creator="new" javascript="_AjaxService_js">//转换得到的JS对象名,供前端调用方法时使用
            <param name="class" value="demo.AjaxService" />
            <include method="ajax1"/>//把哪些函数进行转换
            <include method="ajax2"/>
            <include method="ajax3"/>
        </create>

        <!-- 实体类的转换:把一个DTO转换成JS对象供前端使用 -->
        <convert converter="bean" match="model.AjaxDTO">
            <param name="include" value="username,name" />//把DTO的哪些属性提取出来转换成一个JS对象
        </convert>
    </allow>
</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)在前端页面代码中导入DWR的JS引擎以及上面dwr.xml中AjaxService转换得到的JS函数文件,就可在js中通过转换后的函数名直接调用方法了。

    <!-- 导入dwr的JS引擎与JS文件 -->
    <script type="text/javascript" src="dwr/interface/_AjaxService_js.js"></script>
    <script type="text/javascript" src="dwr/engine.js"></script>
    <script type="text/javascript" src="dwr/util.js"></script>
    

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

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

AjaxService_js.ajax(parameters,callback);

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

function callback(data){

//data就是函数调用返回值,进行处理。在JS中,函数的形参变量是根据实际值来决定类型的,所以这里的data可以接收返回的普通类型、JavaBean、集合类等
        }        
时间: 2024-12-25 11:33:24

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

C#基于数据库存储过程的AJAX分页实例

本文实例讲述了C#基于数据库存储过程的AJAX分页实现方法.分享给大家供大家参考.具体如下: 首先我们在数据库(SQL Server)中声明定义存储过程 代码如下: use sales    –指定数据库 if(exists(select * from sys.objects where name='proc_location_Paging')) –如果这个proc_location_paging存储过程存在则删除 drop proc proc_location_Paging go create

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

基于requests模块发起ajax的get请求 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据 用抓包工具捉取 使用ajax加载页面的请求 鼠标往下下滚轮拖动页面,会加载更多的电影信息,这个局部刷新是当前页面发起的ajax请求, 用抓包工具捉取页面刷新的ajax的get请求,捉取滚轮在最底部时候发起的请求 这个get请求是本次发起的请求的url ajax的get请求携带参数 获取响应内容不再是页面数据,是json字符串,是通过异步请求获取的电影

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

前言 在项目中,无论是维护自己的代码,还是重构他人的项目代码,看到层层嵌套,异常冗余的某个function,那时我们的内心肯定是奔溃的! 在jquery1.5版本之前,如果我们某个操作需要多个ajax异步请求成功后执行,只能在前一个ajax成功的回调函数中接着发送ajax请求,这样一来,不光代码的可读性变得异常差,而且也失去了异步的意义. jquery开发者果然在1.5版本后引入了deferred延迟对象.而jquery.ajax也基于它迎来了巨变,我们先对比下有哪些区别. 传统ajax和现代a

webapp之滑动组件(基于zepto)

一直都没有封装过一套移动web下的滑动组件,正巧今天公司没事,就闲下来写了一个半成品,称之为半成品是因为,循环效果暂时还没有添加. ; (function($) { $.fn.slider = function(opts) { this.each(function() { init.call(this, opts); }); return this; }; function init(opts) { var defaults = { cont: this, contWidth: false, /

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

network异步请求ajax的扩展 在日常的应用中,你可能直接调用$.ajax是会有些问题的,比如说用户的重复点击,比如说我只希望它成功提交一次后就不能再提交,比如说我希望有个正在提交的loading效果.所以我做network这个组件来扩展$.ajax,希望全中国的人民们喜欢. 这里使用到了上篇[js开源组件开发]loading加载效果 一个loading效果,但为了让它独立运行,所以没有进行引用,而是直接做了一个loading方法在里面.它的具体效果图如下: 它的实例DEMO地址请点击这里

基于jQuery实现的Ajax(Django环境)

概览:Ajax(Asynchronous Javascript And XML) 解释为Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据). 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求: 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求. 向服务器发送请求的四个途径: 1.浏览器地址栏,默认get请求 2.form表单 get请求 post请求 3.a标签,默认g

基于jquery框架的ajax搜索显示

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>search_project.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta h

基于JavaScript封装的Ajax工具类

前段是件由于工作需要无奈编写了一个给予JavaScript封装的工具类,技术有限,误喷,感谢大家的支持. 1.以下是JavaScript 的 Ajax 工具类. function createXMLHttpRequest(){ var req; if(window.XMLHttpRequest){ //兼容非IE 并且兼容 IE7以上的浏览器 req = new XMLHttpRequest(); }else if(window.ActiveXObject){ //在 Internet Expl

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

JSP部分代码: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <%@include file="/common/header.jsp"%> <title>用户管理</title> <script type="text/javascript&quo