目录:

一.    DWR2HelloWorld入门

二.    dwr.xml文件分析

三.    服务器启动DWR初始化,并引出dwr.xml文件多种配置方式

四.    DWR处理用户请求流程分析

 

一.    DWR2HelloWorld入门

功能描述:类似于一个简单的登陆页面,用户输入用户名+密码,如果参数有误,则提示错误信息,

如果登陆成功,提示用户信息。

引发异常情景:用户对象为空、用户名为空、密码为空、非法用户名:bye

1.        下载dwr.jar,这里我用的是dwr2.jar,将其它添加到WEB-INF/lib目录下,并配置我们的web.xml文件

<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>

<load-on-startup>9</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>dwr-invoker</servlet-name>

<url-pattern>/dwr/*</url-pattern>

</servlet-mapping>

Debug = true表示可以在浏览器中输入:http://localhost:8080/%5bWEB-APP%5d/dwr,

然后就可以测试我们自己所写的dwr程序了。

如果为false,则不能访问这个地址的。

2.        在WEB-INF目录下新建一个dwr.xml文件(默认情况下DWR会在启动时加载这个文件)

3.        定义一个POJO用户类User,它有2个属性:username,password,并提供setter/getter方法,

代码略…

4.        定义一个普通异常类,继承自 RuntimeException,

public class ParameterException extends RuntimeException{

public ParameterException() {

super();

}

public ParameterException(String message) {

super(message);

}

}

5.        编写我们的HelloWorld类,

package helloWorld;

public class HelloWorld {

public HelloWorld(){

System.out.println("------------构造函数初始化------------");

}

public String sayHello(User userInfo){

if(userInfo == null){

throw new ParameterException("用户信息不能为空!!!");

}

String username = userInfo.getUsername();

String password = userInfo.getPassword();

if(username == null || username.length() <= 0){

throw new ParameterException("用户名不能为空!!!");

}

if(password == null || password.length() <= 0){

throw new ParameterException("密码不能为空!!!");

}

if("bye".equals(username)){

throw new ParameterException("非法用户名:"+username+"!!!");

}

return "Hello, your name is "+username+", password is "+password+"!!!";

}

}

6.        在dwr.xml中配置我们的HelloWorld,让jsp页面可以访问我们的HelloWorld.sayHello(…)方法

<allow>

<!-- 生成器:生成所需要的业务逻辑对象 -->

<create creator="new" javascript="HelloWorld" scope="session">

<param name="class" value="helloWorld.HelloWorld" />

<!-- 指定客户端可以访问哪些个方法,默认可以访问所有 -->

<include method="sayHello" />

</create>

<!-- 转换器 -->

<convert converter="bean" match="com.dwr.bean.User">

<!-- 指定转换时可以给哪些参数赋值(调用其set方法),默认可以给所有参数赋值 -->

<param name="include" value="username,password" />

</convert>

<!-- 当发生以下异常时,返回异常详细信息到前台,否则只返回字符串:Error -->

<convert match="com.dwr.bean.ParameterException" converter="exception" />

</allow>

(1)javascript="HelloWorld",表示页面需要像这样引入js:

<script type='…' src="/dwr/interface/HelloWorld.js"></script>

并且要像这样调用方法:HelloWorld.sayHello(…);

(2)scope="session",表示这个HelloWorld的作用范围,默认是page

(3)<convert converter="bean" match="com.dwr.bean.User">

指定当jsp页面传递一个对象过来时,怎样将给对象赋值给后台的User对象

(4)

7.        编写jsp页面:

<script type="text/javascript" src="/dwr/engine.js"></script>

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

<script type='text/javascript' src="/dwr/interface/HelloWorld.js"></script>

<script type="text/javascript">

function commit(){

var username = document.getElementById("username").value;

var password = document.getElementById("password").value;

var user = {

username : username,

password : password

};

// 调用服务器端方法

HelloWorld.sayHello(user, {

callback : function(data){

alert('成功:'+data);

},

exceptionHandler : function(data){

alert('异常:'+data);

}

}); }

</script>

</head>

<body>

用户名:

<input type='text' name="username" id="username" /><br>

&nbsp;&nbsp;&nbsp;&nbsp;码:

<input type='text' name="password" id="password" />

<input type='button' value="提交" onclick="commit();" />

</body>

(1)     这里必须引入的js: engine.js , util.js , HelloWorld.js

它们是从org.directwebremoting包中加载的,加载的时候会给js中一些参数赋值

其中enjine.js提供了客户端 与 服务器 交互的细节方法,

Util.js提供了一些常用的工具方法,例如:取值、设值…

HelloWorld.js,名称是根据dwr.xml中javascript属性来定的,

当访问HelloWorld.js时,服务器会生成调用HelloWorld.sayHello()方法的方式,

8.        测试。

(1)     什么也不输入,提示:异常:用户名不能为空!!!

(2)     用户名:bye,密码:123,提示:异常:非法用户名:bye!!!

(3)     改变调用参数HelloWorld.sayHello(null,…),提示:异常:用户信息不能为空

(4)     用户名:zhangxd,密码:123,提示:成功:Hello,your name is zhangxd…

二.    dwr.xml文件分析

1. 服务器启动时,DwrServlet.java会将dwr.xml加载到内存中,这里共有2个dwr.xml,

1个是在dwr.jar包中(系统dwr.xml),1个是我们自己编写的(用户dwr.xml),放在WEB-INF目录下。

2. 系统dwr.xml中有一些默认的:

(1) 对象生成器(<creator id=’’ class=’’/>),用户dwr.xml可以使用这些构造器来生成对象,例如:

<create creator="new" javascript="HelloWorld" scope="session">

它使用了系统中的new对象生成器,来生成我们的HelloWorld对象,

当然系统dwr.xml也定义了其它的对象生成器,如:spring,struts…

(2) 参数转换器(<converter id=’’ class=’’/>),用户dwr.xml可以使用这些参数转的确器,将页面传递过来的参数转换成我们java方法所需要的参数,例如:

Java方法:public String sayHello(User userInfo)

用户dwr.xml:<convert converter="bean" match="com.dwr.bean.User">

页面参数:var user = {username : username, password : password}

这里使用了bean参数转换器,它调用User类的setter方法,将页面对象赋值给user对象

(2)     默认允许的参数转换方式

<allow>

<convert converter="string" match="java.lang.String"/>

<convert converter="date" match="java.util.Date"/>

</allow>

如果java方法需要的参数是:String、Date类型的,就不用我们手工去用户dwr.xml配置参数转换器了,直接用系统默认的这个参数转换方式就可以了。

转载于:https://www.cnblogs.com/java-koma/archive/2009/12/19/1627980.html

DWR2学习笔记(一)相关推荐

  1. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  2. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  3. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  5. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  6. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  7. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  8. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  9. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

最新文章

  1. Magento 模版路径
  2. Android Activity形象描述
  3. linux 变量获取问题,有关read命令从管道输出读取变量参数的问题
  4. handler机制的原理_5分钟了解Handler错误使用场景
  5. 命令行参数的模式匹配
  6. U盘上的笔记全弄丢了,痛苦啊痛苦!
  7. Nodejs 内置模块的基本使用
  8. 企业局域网内如何跨网安全传输数据
  9. Js中RegExp对象
  10. 百度安全DDoS攻击年度报告出炉 企业防护有新招!
  11. Zabbix监控nginx status
  12. (推荐)(提供下载)ORACLE常见问题一千问(不怕学不成、就怕心不诚!)
  13. Android开发经典书籍下载——《Android 4高级编程》《疯狂Android讲义》《Android应用开发详解(郭宏志)》《Android应用案例开发大全》《Android 3D游戏开发技术》
  14. 如何写出让面试官眼前一亮的Java开发简历(附模板)
  15. CSS颜色代码 颜色值 颜色名字大全
  16. 邱锡鹏nndl学习记录
  17. Unity lua行为树实现(可实现rpg挂机自动战斗)
  18. 电路交换与分组交换技术
  19. XSS第一节,XSS档案
  20. RK3188 5.1平台PCM2708 USB声卡调试

热门文章

  1. CVPR 2021 Oral | GLEAN: 基于隐式生成库的高倍率图像超分辨率
  2. 谷歌大脑推出视觉领域任务自适应基准:VTAB
  3. DetNAS:首个搜索物体检测Backbone的方法 | NeurIPS 2019
  4. 有什么推荐的计算机视觉项目?来自微软亚研院的清单
  5. matlab画滤波器频响应,matlab如何画出“凯泽窗FIR滤波器”的幅频相频响应图
  6. 每日整理Python基础——python教程入门学习
  7. ResNet超强变体CoTNet!一种新的Transformer计算机视觉模块!
  8. 南方科技大学-计算智能与先进制造方向-博士-博士后-研究助理招聘
  9. 带你自学Python系列(五):Python解决列表字符不区分大小写问题
  10. 公式太多,读不懂? 一文带你领略KNN近邻算法~简单易懂