使用Ajax框架

1. 简化JavaScript的开发难度

2. 解决浏览器的兼容性问题

3. 简化开发流程

常用Ajax框架

Prototype

一个纯粹的JavaScript函数库,对Ajax提供良好支持

jQuery

1.非常优秀的JavaScript库,对Ajax提供了良好的支持

2.与Prototype设计思想不同的是在使用jQuery之后,开发者操作的不再是DOM对象而是jQuery对象

DWR

1.        非常专业的Java Ajax框架

2.        通过DWR框架,可将Java类的方法直接暴露给客户端

Dojo

① Dojo功能强大,包含许多内容,Ajax只是其中之一

② 特点在于控件和控件系统

③ 目前Dojo仍然在开发完善中,版本更新速度非常快

AjaxTags

由一系列JSP标签组成,将常用的Ajax应用场景封装为简单的标签

使用DWR框架简化Ajax开发

1. DWR(Direct Web Remoting)是一个Java Ajax框架

2. DWR框架允许开发人员在客户端通过JavaScript代码调用服务器端的Java方法

3. DWR框架主要由两部分组成:

1.客户端JavaScript代码直接调用服务器端Java方法

2.服务器上运行的DWR核心Servlet负责处理客户端请求,将客户端请求委托到实际的Java对象进行处理,并将结果返回给客户端

下载DWR框架

DWR的官方站点:

http://directwebremoting.org/dwr/downloads/index.html

各下载项说明:

1. JAR File:该选项仅下载dwr.jar文件

2. WAR File:该选项下载dwr.jar文件及其其他依赖的类库,还包括DWR的使用范例

3. Sources:该选项下载DWR的源文件

安装DWR

1.添加dwr.jar文件到WEB-INF/lib目录下

2.修改web.xml文件,添加如下代码

	<servlet>
		<servlet-name>dwr_invoker</servlet-name>
		<servlet-class>
  	 		 org.directwebremoting.servlet.DwrServlet
		</servlet-class>
    	<init-param><!--初始化参数,debug开发时设置-->
       	 <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>

3 创建dwr.xml文件

1. 与web.xml文件位于同一目录

2. 该文件用于定义Java类和JavaScript之间的对应关系,将Java类的方法暴露给客户端

其结构如下:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
	"http://getahead.org/dwr/dwr30.dtd">
<dwr>
	<allow>
		<!-- 创建脚本对象 -->
		<create creator="..." javascript="..." scope="...">
			<!-- 要发布的类名 -->
			<param name="..." value="..." />
			<!-- 暴露给客户端的,要发布的方法名 -->
			<include method="…" />
			<!-- 不暴露给客户端的 -->
			<exclude method="…" />
		</create>
		<!-- js和服务端的对象进行转换 -->
		<convert converter="..." match="..." />
	</allow>
</dwr>

dwr.xml详解 (参考dwr.xml)

<allow>元素:定义了DWR能够创建和转换的类,是dwr.xml中最重要的元素

<create>元素:创建器定义如何将一个Java类转换成JavaScript对象

<convert >元素:类型转换器,用于定义Java类型和JavaScript类型之间的对应关系

<create>元素的属性:

creator属性:DWR内置多个创建器用于处理多种类型Java类

javascript属性:在客户端给创建的JavaScript对象命名。该名字将在页面里作为js被导入

scope属性:作用域。选项可以是:application, session,request和page。默认为page

<create>元素的子元素:

<param>元素:用来指定创建器的参数。其中name属性用来指定参数名称,value指定参数的值

<include>元素:定义允许访问的方法列表,其他方法将不暴露给客户端

<exclude>元素:定义不允许访问的方法列表,其中method属性指定不被暴露给客户端的方法(其他没指定的方法默认暴露给客户端)

<convert>元素

所有基本类型,boolean、 int 、double等等

包装类,Boolean、Integer等等

java.lang.String

日期类型,如:java.util.Date 和 java.sql.Times、java.sql.Timestamp等

数组(存放以上类型的)

集合类型 (List、Set、Map、Iterator等等)

Bean转换器

用于完成JavaBean对象和JavaScript对象之间的转换

DWR默认关闭Bean转换器

如果需要进行JavaBean对象和JavaScript对象之间的转换,需要在dwr.xml中显式设置

<convert converter="bean"match="www.dwrdemo.DwrBean"/>

为Web工程添加DWR支持,例子:

创建web Project :DWRDemo

加入DWR jar包 ;

(要加入commons-logging.jar)

修改web.xml文件:加servlet
	<servlet>
		<servlet-name>dwr_invoker</servlet-name>
		<servlet-class>
  	 		 org.directwebremoting.servlet.DwrServlet
		</servlet-class>
    	<init-param><!--初始化参数,debug开发时设置-->
       	 <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>

创建dwr.xml文件 (参考

dwr30.dtd:/org/directwebremoting/dwr30.dtd

和dwr.xml:/org/directwebremoting/dwr.xml

写)

与web.xml文件位于同一目录(可以放在src下,但是需要要在web.xml配置的

Servlet里面加

<init-param>

<param-name>config</param-name>

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

</init-param>

初始化的时候,会调用源码里面的对应方法

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
	"http://getahead.org/dwr/dwr30.dtd">
<dwr>
	<allow>
		<!-- 创建脚本对象 -->
		<create creator="new" javascript="DwrDemoDate" scope="application" >
			<!-- 要发布的类名 -->
			<param name="class" value="java.util.Date" />
		</create>
	</allow>
</dwr>

部署,访问:http://localhost:8080/DWRDemo/dwr

Bean转换器

用于完成JavaBean对象和JavaScript对象之间的转换

DWR默认关闭Bean转换器

如果需要进行JavaBean对象和JavaScript对象之间的转换,需要在dwr.xml中显式设置

<convert converter="bean"match="www.dwrdemo.DwrBean"/>

下面举例:

例子 使用Bean转换器

新建DwrService 在com包下,添加下面方法:

public DwrBean getDwrBean(){

return new DwrBean();

}

DwrBean在com包下 添加私有属性message和它get set方法;





Dwr.xml配置:在<allow>里面添加:

<create creator="new" javascript="DwrService" scope="application">

<!-- 要发布的类名 -->

<param name="class" value="com.DwrService" />

</create>

<convert converter="bean" match="com.DwrBean" />

重启访问 http://localhost:8080/DWRDemo/dwr 点击第二个

例子:使用DWR实现页面加载时输出当前的时间等

DWR 如何简化Ajax 开发

http://localhost:8080/DWRDemo/dwr/test/DwrDemoDate前面两行script导入index,编写js

index.jsp:

  </head>
  <!-- 导入DWR的JavaScript文件-->
  <script type='text/javascript' src='/DWRDemo/dwr/engine.js'></script>
  <!-- 导入DWR为Java对象动态生成的JavaScript文件-->
  <script type='text/javascript' src='/DWRDemo/dwr/interface/DwrDemoDate.js'></script>
  <script type="text/javascript">
  	function init(){
  		//调用Date对象的toString()方法,load为回调函数
  		 DwrDemoDate.toString(load);
  	}
  	function load(data){
  		document.getElementById("time").innerHTML = data;
  	}
  </script>
  <body>
   <input id="" type="button" onclick="init()" value="show" />
   <dir id="time"></dir>
  </body>

重启tomcat访问主页;http://localhost:8080/DWRDemo/

点击show,下面显示出当前时间;

例子:在页面输出客户端输入的信息

在DwrService添加方法:





public DwrBean getDwrBean(String message) {

DwrBean db = new DwrBean();

db.setMessage(message);

return db;

}


将public DwrBean getDwrBean()注释;

在Index.jsp添加

http://localhost:8080/DWRDemo/dwr/test/DwrService前面script

<script type='text/javascript' src='/DWRDemo/dwr/interface/DwrService.js'></script>

 在js和body里面加入:
  	function getMessage(){
  		var msg=document.getElementById("myMsg").value;
  		 DwrService.getDwrBean(msg,showMsg);
  	}
 	function showMsg(bean){
  		document.getElementById("message").innerHTML = bean.message;
  	}

  <body>
  <input id="myMsg">

   <input id="" type="button" onclick="getMessage()" value=" showMsg" />
   <dir id="message"></dir>
  </body>

重启tomcat,访问主页,输入文字,点击showMsg使用的是ajax技术;

我们可以在DwrService里面的方法getDwrBean添加:

System.out.println(message);

重启运行的时候,可以看到控制台输出 我们输入的信息,意味着我们可以访问数据库等操作;

使用DWR框架可以异步访问服务端对象

脚本文件说明:

engine.js

1.engine.js对DWR非常重要,它是DWR客户端的核心,用来把动态生成的JavaScript对象转换为服务器上的Java对象

该函数库可用于设置一些DWR的全局属性

dwr.engine.setTimeout(time),以毫秒为单位设置请求超时的时间

dwr.engine.setHttpMethod(method),该方法只能设置两个值POST和GET

dwr.engine.setOrdered(boolean),Ajax通常都是异步调用,但服务器响应的顺序与调用顺序往往不同,使用dwr.engine.setOrfered(true)语句,DWR将保证请求的顺序与服务器响应的顺序一致

2.util.js

1.        util.js文件中包含了一些工具函数,通过这些函数的帮助,将简化JavaScript操作

2.        util.js提供一些基本的页面操作函数,通过这些函数可以方便的操作HTML元素

3.        util.js文件与DWR框架关系不是特别大,可以在任何不同的网页中使用(即便该工程没有DWR支持)

补充说明:

$( )函数

$( )函数根据指定ID查找页面中的HTML元素

简单的讲下面两个一样的意思:

$(ID)= document.getElementById(ID)

使用 $() 使代码更简洁、更清晰

在index.jsp导入:

<script type='text/javascript' src='/DWRDemo/dwr/util.js'></script>

在js里面添加:

//$( )函数

      function test(){

var msg=$('message').innerHTML;

alert(msg);

}

body添加;

<input id="test1"type="button"onclick="test()"value="使用$(
)函数"
/>

刷新页面,要先在myMsg框输入信息,在点击showMsg,id为message才有内容,才可以做上面的实验,然后点击使用$( )函数

getValue() 和setValue()函数

getValue()函数和setValue()函数用于简化访问和修改HTML元素的值

dwr.util.getValue(id):返回HTML元素的值

dwr.util.setVlaue(id,value [,options]):根据第一个参数中指定的id找到相应元素,并根据第二个参数value改变该元素的值

在index.jsp导入:

<scripttype='text/javascript' src='/DWRDemo/dwr/util.js'></script>

在js添加:

//getValue() 和setValue()函数

      function set(){

var value=dwr.util.getValue('set');

dwr.util.setValue('myMsg',value);

}

在body添加:

<input id="set"type="button"onclick="set()"value="getValue()得到的值"/>

刷新页面,点击getValue()得到的值后将信息显示到id为myMsg的输入框上;

列表操作函数

dwr.util.removeAllOption(id):用于删除列表中的所有项

dwr.util.addOptions():用于添加列表项

 

表格操作函数

DWR提供两个函数帮助我们操作表格

dwr.util.removeAllRows(id):删除table中所有行

dwr.util.addRows(id,array,cellFuncs,[options]):向表中添加数据行

源码和所用到的jar包下载:

http://pan.baidu.com/s/1i3p9pYX

Ajax框架,DWR介绍,应用,例子的更多相关文章

  1. Ajax框架,DWR介绍,应用,样例

    使用Ajax框架 1. 简化JavaScript的开发难度 2. 解决浏览器的兼容性问题 3. 简化开发流程 经常使用Ajax框架 Prototype 一个纯粹的JavaScript函数库,对Ajax ...

  2. Ajax框架---dwr的用法

    通常使用Ajax时用的都是jQuery框架,现在公司的框架里用的都是dwr.我觉得dwr和jQuery中的ajax用法差不多,看起来也很像. 一.简介 百度百科上对dwr的描述: DWR采取了一个类似 ...

  3. 几种流行的AJAX框架对比:Jquery,Mootools,Dojo,ExtJs,Dwr

    1:Jquery 主页:http://jquery.com/ 设计思想:简洁的方案思想,几乎所有操作都是以选择DOM元素(有强大的Selector)开始,然后是对其的操作(Chaining等特性). ...

  4. jQuery-1.9.1源码分析系列(十六)ajax——ajax框架

    ajax的介绍就不多说了,点击可看. 既然是ajax框架,那么闲谈一谈jQuery的ajax处理思路. 现在的浏览器都支持ajax,只不过不同的浏览器使用方法可能有不同(IE使用new window. ...

  5. AJAX(二)AJAX框架

    上文(AJAX(一)AJAX的简介和基础)对ajax异步请求服务器做了详细的介绍和基础应用,可以看出,ajax的一些过程是相对不变的.不必要每次发送请求都写一遍发送代码,一些ajax开发人员已经把他们 ...

  6. Android UI-开源框架ImageLoader的完美例子

    Android开源框架ImageLoader的完美例子 2013年8月19日开源框架之Universal_Image_Loader学习 很多人都在讨论如何让图片能在异步加载更加流畅,可以显示大量图片, ...

  7. ThinkPHP页面跳转、Ajax技巧详细介绍(十八)

    原文:ThinkPHP页面跳转.Ajax技巧详细介绍(十八) ThinkPHP页面跳转.Ajax技巧详细介绍 一.页面跳转 $this->success('查询成功',U('User/test' ...

  8. Go语言Web框架gwk介绍4

    Go语言Web框架gwk介绍 (四)   事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(m ...

  9. Go语言Web框架gwk介绍 3

    Go语言Web框架gwk介绍 (三)   上一篇忘了ChanResult ChanResult 可以用来模拟BigPipe,定义如下 type ChanResult struct { Wait syn ...

随机推荐

  1. python AES加密解密 pycryptodome

    环境 pyhton3.6 博主为了解码 AES 用了1天的时间,安了各种包,然而走了很多坑,在这里给大家提供一个简便的方法 首先在命令行(推荐)  pip install Crypto 你会发现安装下 ...

  2. Struts2--struts.xml详解

    通常,struts.xml文件都会继承一个struts-default.xml文件通过一些基本的拦截器来提供一些基本的配置设置之类的. 配置例: <?xml version="1.0& ...

  3. Python3玩转儿 机器学习(2)

    机器学习的基本任务 分类任务 回归任务 分类任务 手写输入数字识别 分类任务: 二分类任务 判断邮件是垃圾邮件或者不是垃圾邮件 判断发放给客户信用卡有风险或者没有风险 判断病患良性肿瘤还是恶性肿瘤 判 ...

  4. bzoj 4545: DQS的trie

    Description DQS的自家阳台上种着一棵颗粒饱满.颜色纯正的trie. DQS的trie非常的奇特,它初始有n0个节点,n0-1条边,每条边上有一个字符.并且,它拥有极强的生长力:某个i时刻 ...

  5. ●SCOI2018 AFO

    Day2 T3代码: #include<cstdio> #include<cstring> #include<iostream> using namespace s ...

  6. WOJ 124. Football Coach 网络流

    Problem 1124 - Football Coach Description It is not an easy job to be a coach of a football team. Th ...

  7. 【bzoj4444 scoi2015】国旗计划

    题目描述 A 国正在开展一项伟大的计划 —— 国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了 NN 名优秀的边防 ...

  8. 2015 多校联赛 ——HDU5402(模拟)

    For each test case, in the first line, you should print the maximum sum. In the next line you should ...

  9. 【NOIP2013】传染病控制

    题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...

  10. hdu 3433 A Task Process 二分+dp

    A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...