DWR的搭建及简单使用_arthurzil的博客-程序员秘密

技术标签: string  function  callback  integer  ajax  dwr  javascript  

 DWR(Direct Web Remoting)是一个WEB远程调用框架.是一个开放源码的使用 Apache 许可协议的解决方案,它包含服务器端 Java 库、一个 DWR servlet 以及 JavaScript 库.它

为每一个服务器端的java对象生成一个javaScript对象,让前台开发的程序员,像使用本地javascript对象一样,去使用服务器端的java对象,而不必去关心网络的传输和参数类

型转化的细节
,其基本实现思想是对于服务器端每一个javabean,在客户端都会生成一个javascript对象。两个对象中的方法是一样的。当用户调用javascript对象的方法时,这个方法会通过网

络,去调用服务器端javabean,而这种通信过程,对用户来讲并不知情。
其搭建过程如下:
step 1. 配置 dwr 提供的Servlet .
* 导入 dwr.jar包
* 在 web.xml 中配置 dwr 的Sevlet,如下:
          <servlet>
           <servlet-name>dwrServlet</servlet-name>
           <servlet-class>org.directwebremoting.servlet.DWRServlet</servlet-class>
  <init-param> <!--此处开始的四行在测试时必须,否则会出现"Access to debug pages is denied. "信息.如果不写在正常使用时是不会受影响的,只是一个调试

设置而已-->
    <param-name>debug</param-name>
    <param-value>true</param-value>
   </init-param>
          </servlet> 
          <servlet-mapping>
           <servlet-name>dwrServlet</servlet-name>
           <url-pattern>/dwr/*</url-pattern>
          </servlet-mapping>
step 2. 在dwr.xml 中配置代理 
 在<allow></allow>标签内插入如下内容:
 <create javascript="要起的名字" creator="new">
             <param name="class" value="包全名.类名"/>
        </create> 
 如果是自己写的类那么配置如下内容,其实就是转换,意思是使用BeanConverter类进行转换.
 <convert  converter="bean" match="com.kettas.dwr.Student"/>
step 3. 测试 :http://localhost:8080/ajax/dwr
 启动服务器后输入如下地址:ajax为工程名,dwr为在web.xml文件中配置的<url-pattern>/dwr/*</url-pattern>名
==========================================================================================================
如果函数使用了泛型,那么需要使用<signatures>标签.
<signatures>标签是用来声明java方法中List、Set或者Map参数所包含的确切类,以便java代码作出判断。

signatures段只是用来确定泛型参数中的类型参数。DWR会自己使用反射机制或者运行时类型确定类型,或者假设它是一个String类型。所以:
不需要signatures -  没有泛型参数: public void method(String p); public void  method(String[] p);
需要signatures -  DWR不能通过反射确定: public void method(List<Date> p);  public void method(Map<String, WibbleBean> p);
不需要signatures -  DWR能正确的猜出: public void method(List<String> p);  public void method(Map<String, String> p);
不需要signatures -  DWR可以通过运行时类型确定: public List<Date> method(String  p);
没有必要让Javascript中的所有对象的key都是String类型 - 你可以使用其他类型作为key。但是他们在使用之前会被转换成String类型。DWR1.x用Javascript的特性把key转换成

String。DWR2.0可能会用toString()方法,在服务段进行这一转换。
<signatures> 写法如下:
 <signatures> 
  <![CDATA[
     import java.util.* ;//此处是导入所有要用到的包....
     import com.kettas.dwr.*;
     public List<Student> queryAllStudents() ;
  ]]>
 </signatures>
注意:<signatures>和<allow>标签要写在同一级上面.
当我测试时把泛型(配置文件和java代码中的)都去掉了但是也没有报错,但为了严谨,还是都写上吧,至少不会错
=========================================================================================================
页面上的写法:
<html>              
  <head>
  <script type='text/javascript' src='/ajax/dwr/interface/ 需要产生代理的请求.js'></script>
 <script type="text/javascript" src="/ajax/dwr/engine.js"></script> <!--这个是必不可少的,详细看下面文档-->
  </head>
  <body></body>
  </htm>
   
   url a : /ajax/a.html   //*此是访问时使用的url    
   URL b : /ajax/dwr/interface/JTestBean.js  //*此是引入生成的js文件URL的写法,注意interface,所有生成的js文件都是在其下的.
============================================================================================================
下面将一个测试过程代码全部按顺序列出来:
***********************************
Student.java
package com.kettas.dwr ;

public class Student{
 private Integer id ;
 private String name ;
 private int age ;
 
                           
 public Student(Integer id, String name, int age) {
  super();
  this.id = id;
  this.name = name;
  this.age = age;
 }


 public Student() {
  super();
 }


 public Integer getId() {
  return id;
 }


 public void setId(Integer id) {
  this.id = id;
 }


 public String getName() {
  return name;
 }


 public void setName(String name) {
  this.name = name;
 }


 public int getAge() {
  return age;
 }


 public void setAge(int age) {
  this.age = age;
 }
}
***************************************
TestBean.java
package com.kettas.dwr ;
import java.util.* ;
public class TestBean{
 public String sayHello( String user ){
  if( user == null || user.trim().length() == 0 ){
   return "hello everyone !" ; 
  }else{
   return "hello " + user + "!" ; 
  } 
 } 
 
 public List<Student> queryAllStudents(){  //在dwr.xml中是对此函数进行的泛型设置
  try{
   Thread.sleep( 3000 ) ;
  }catch( Exception e ){}
  List<Student> list = new ArrayList<Student>();
  for( int i = 0 ; i < 2 ; i++ ){
   Student stu = new Student();
   stu.setId( i ) ;
   stu.setName( "name" + i ) ;
   stu.setAge( 10 + i ) ;
   list.add( stu ) ; 
  }                   
  return list ;
 }
}
***************************************
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  version="2.5">  
 
  <servlet>
   <servlet-name>dwrServlet</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>dwrServlet</servlet-name>
   <url-pattern>/dwr/*</url-pattern>
  </servlet-mapping>
</web-app>
***************************************
dwr.xml
<?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>
  <create javascript="JTestBean" creator="new">
   <param name="class" value="com.kettas.dwr.TestBean"/>
  </create>
  <convert  converter="bean" match="com.kettas.dwr.Student"/> 
 </allow>
 <signatures>  <!--函数使用了集合泛型时使用它-->
  <![CDATA[
     import java.util.* ;
     import com.kettas.dwr.*;
     public List<Student> queryAllStudents() ;
  ]]>
 </signatures> 
</dwr>   
***************************************
=============================================================================================================
另附engine.js的简述一篇:
Engine.js的功能
Engine.js对DWR非常重要,因为它是用来转换乃至动态生成接口的javascript函数调用的,所以只要用到DWR的地方就需要它。
 DWREngine.setTimeout()
允许你在call和batch级别调用元数据选项设置超时时间。全局的DWREngine.setTimeout() 函数应用于所有的DWR调用。设置这个值为0可以关闭调用的超时设置(默认就是0)。
setTimeout()的单位是毫秒,如果一个调用超时,那么相应的错误处理器将被调用。比如下面是一个调用级别设置超时的例子:
Remote.method(params, {
callback:function(data) { alert("it worked"); },
errorHandler:function(message) { alert("it broke"); },
timeout:1000
});
 批量调用
  使用batch来批量的执行远程调用。这样可以减少与服务器的交互次数,进而提高反应速度。例如:
DWREngine.begingBatch();
其它的功能操作...........
DWREngine.endBatch();
在批量处理中,DWR会小心的处理保证所有的回调函数都会被调用,注意:不能在batch里面执行同步调用,若batch中设置了不同的超时,只有最后一个是有效的。
--->ajax一般是异步进行的如果人为的让它顺序的执行可以用函数:
DWREngine.setOrdered(boolean)设置为true.但是这样会减慢应用程序
--->错误警告和超时
例子解析:
Remote.method(params, {
callback:function(data) { alert("it worked"); },
errorHandler:function(message) { alert("it broke"); },
timeout:1000
});
如果方法Remote.method调用在1000毫秒没有调用callback(回调函数),就开始执行下面的errorHandler函数,错误处理。
--->远程调用Hooks
DWREngine.setPreHook(function):在执行调用之前调用一个函数,但是没有参数传到这个函数(当你希望一些按钮在调用期间变灰来防止再次使用,这个功能会很有用)
DWREngine.setPostHook(function)与DWREngine.setPreHook(function)刚好相反
--->设置同步机制
DWREngine.setAsync(true);设置全局同步
Remote.method(params,{calback:function(data){......},async:true});设置局部同步
DWREngine.setMethod(newmethod)
newmethod必须是DWREngine.XMLHttpRequest或者DWREnginr.IFrame或者DWREngine.ScriptTag
举例:
-->DWREngine.setMethod(DWREnginr.IFrame); 全局的
-->Remote.method(params,{callback:function(data){.....},method:DWREnginr.IFrame})  单次调用
-->DWREngine.beginBatch();
   Remote.method1(params,callback1);
   Remote.method2(params,callback2);
   DWREngine.endBatch({method:DWREngine.IFrame});
DWREngine.setVerb(verb)设置传输的方法"get"或者"post"


         

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/arthurzil/article/details/4790971

智能推荐

UOJ422. 【集训队作业2018】小Z的礼物 [min-max容斥,插头DP]_dfn8726的博客-程序员秘密

UOJ思路由于没有代码和AC记录的支撑,以下思路可能有错。看到全部取完,大概可以想到min-max容斥。由于期望的表达式里面合法方案的个数是在分母里面的,所以可以想到把它记录在状态里。然而由于我菜,一开始只想到逐列DP,于是复杂度炸了……考虑插头DP:设\(f_{i,j,S,k}\)表示当前做到\((i,j)\),轮廓线上的状态是\(S\),已经有\(k\)个取到礼物的方案,...

.Net Framework各个版本区别_yw1688的博客-程序员秘密

什么是.NET Framework?  .NET Framework又称 .Net框架。是由微软开发,一个致力于敏捷软件开发(Agile software development)、快速应用开发(Rapid application development)、平台无关性和网络透明化的软件开发平台。.NET是微软为下一个十年对服务器和桌面型软件工程迈出的第一步。.NET包含许多有助于互联网和内

VC中通用对话框的子类化_郁闷阳光的博客-程序员秘密

MFC中包含了几个Windows通用对话框设计的封装类。比如,在CFileDialog里可以利用常用的CDialog成员函数DoModal()函数操纵通用文件对话框。  为了从CFileDialog这样的公共对话框类派生出程序员自己的子类,传统方法需要创建一个“子对话框模

jmeter(性能测试):JDBC Connection Configuration与JDBC Request(连接linux数据库,查看cup,压力测试)_linux jdbc测试插件_qq_45482710的博客-程序员秘密

首先启动linux系统第一步:创建JDBC Connection Configuration(用于连接绑定数据库)(要开启linux中mysql的远程接口mysql下载与开启远程接口)第二步:编辑JDBC Connection Configurationjdbc:mysql://127.0.0.1:3306/app01?serverTimezone=UTC第三步:创建JDBC Request连接JDBC Connection Configuration绑定的数据库,进行操作(增删

CUDA入门之并行与核函数_Pason_Lin的博客-程序员秘密

CUDA是英伟达推出的并行计算架构,全称为Compute Unified Device Architecture。其实就是CPU加上GPU。那GPU是什么呢?GPU一开始是用来做图像处理的,所以又称为图像处理器,算是一种微处理器。我们的电脑上不一定带有GPU哦,好点的电脑才有。我们现在的电脑手机上面都有CPU,我们可以边聊微信边看电影边吃鸡,感觉这些事件似乎在同时发生一样。其实是CPU...

Visual Studio发展历程初浅调研_weixin_30621919的博客-程序员秘密

名称内部版本发布日期支持.NET Framework版本核心功能竞争对手优缺点Visual C++ 1.0Visual Studio的最初原型1992把软件开发带入了可视化开发的时代现在看起来十分的简陋和粗糙,但在当时脱离了DOS界面Visual Studio4.01995(初版)Visual C++ 4.0,Visual Basic 3.0,...

随便推点

dm_svc.conf文件介绍_edison丷的博客-程序员秘密

的工作目录是固定的,不能改变。以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。客户端使用的编码格式,会影响帮助信息和错误提示信息,要与客户端使用的编码格式一致。注:若配置服务名时没有指定端口,后续在工具或接口的命令中使用服务名时,在服务名后增加的。配置项可以在全局配置区,也可以在此服务名对应的服务配置区之前,及在 其对应的―[可以不指定,若不指定,系统会读取操作系统信息获得编码信息,建议有需要才指定。的配置项进行了修改,需要重启客户端工具,修改的配置才能生效。

A flexible charting library for .NET_Miracle_Lee的博客-程序员秘密

By JChampion | 6 Jun 2007 .NET1.0.NET1.1Win2KWinXPWin2003VS.NET2003C#GDI+DevIntermediateLooking for a way to draw 2D line graphs with C#? Here's yet another charting class library with a high degree of configurability, that is also easy to use.  See AlsoMo

不要再重复造轮子了,这款多项目开发工具真的贼好使!_粘木氏.嘚绑的博客-程序员秘密

如今,随着企业业务的不断加深,信息系统的复杂性也越来越高,同时对系统的性能、可用性、可靠性和安全性都提出了新的要求,因此,要进行规范的企业信息系统的建设,一套成熟的开发工具是必不可少的。力软多项目开发平台专注于企业应用领域,采用构件化设计理念,并内置高性能,高并发、高复用的基础组件,内置代码生成模块,能够快速构建高质量的企业应用系统。这是一套集权限管理+快速开发+动态接口+通用组件+动态UI于一体的全新多项目开发平台。使用此类工具,可以大大缩短开发周期,提高软件质量,同时也降低企业对高级软件开发人员

hpuoj 1720: 感恩节KK专场——面试难题【贪心】_坚定的水手的博客-程序员秘密

1720: 感恩节KK专场——面试难题时间限制: 1 Sec  内存限制: 128 MB提交: 316  解决: 47[提交][状态][讨论版]题目描述有n个人要来面试学生会XX部门,要求面试过程中任意两个面试者之间的时间不能有重叠。已知n个面试者到来的时间和需要面试的时间,问最多可以面试多少个人。该部门的XX是KK的好友,现在他来找KK帮忙。但是KK很忙,请你帮帮

入行必看_作为老程序员想告诉准程序员的一些建议_python一入门的博客-程序员秘密

初学者,最容易问的或者说最经常想的问题是什么吗?是那些听起来很酷但实际离他们很远的东西。比如:怎么做一个游戏?xxxx要怎么实现?等等等等。确实每个人都想做出一个像样的东西来,你目前该关注的是什么?是离你最近,但比你现在所知道的要高出那么一点点的东西。每个阶段,你都可以尽自己所学的,做一个你认为最好的、最难的,但是经过时间思考和努力能做出来的东西。比如刚学编程可以做一个控制台版的扫雷。学完基本语法...

推荐文章

热门文章

相关标签