DWR2学习笔记(一)
目录:
一. DWR2之HelloWorld入门
二. dwr.xml文件分析
三. 服务器启动DWR初始化,并引出dwr.xml文件多种配置方式
四. DWR处理用户请求流程分析
一. DWR2之HelloWorld入门
功能描述:类似于一个简单的登陆页面,用户输入用户名+密码,如果参数有误,则提示错误信息,
如果登陆成功,提示用户信息。
引发异常情景:用户对象为空、用户名为空、密码为空、非法用户名: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> 密 码: <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学习笔记(一)相关推荐
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 2020年Yann Lecun深度学习笔记(下)
2020年Yann Lecun深度学习笔记(下)
- 2020年Yann Lecun深度学习笔记(上)
2020年Yann Lecun深度学习笔记(上)
- 知识图谱学习笔记(1)
知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...
- 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记
计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...
- 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 ...
- MongoDB学习笔记(入门)
MongoDB学习笔记(入门) 一.文档的注意事项: 1. 键值对是有序的,如:{ "name" : "stephen", "genda" ...
最新文章
- Magento 模版路径
- Android Activity形象描述
- linux 变量获取问题,有关read命令从管道输出读取变量参数的问题
- handler机制的原理_5分钟了解Handler错误使用场景
- 命令行参数的模式匹配
- U盘上的笔记全弄丢了,痛苦啊痛苦!
- Nodejs 内置模块的基本使用
- 企业局域网内如何跨网安全传输数据
- Js中RegExp对象
- 百度安全DDoS攻击年度报告出炉 企业防护有新招!
- Zabbix监控nginx status
- (推荐)(提供下载)ORACLE常见问题一千问(不怕学不成、就怕心不诚!)
- Android开发经典书籍下载——《Android 4高级编程》《疯狂Android讲义》《Android应用开发详解(郭宏志)》《Android应用案例开发大全》《Android 3D游戏开发技术》
- 如何写出让面试官眼前一亮的Java开发简历(附模板)
- CSS颜色代码 颜色值 颜色名字大全
- 邱锡鹏nndl学习记录
- Unity lua行为树实现(可实现rpg挂机自动战斗)
- 电路交换与分组交换技术
- XSS第一节,XSS档案
- RK3188 5.1平台PCM2708 USB声卡调试
热门文章
- CVPR 2021 Oral | GLEAN: 基于隐式生成库的高倍率图像超分辨率
- 谷歌大脑推出视觉领域任务自适应基准:VTAB
- DetNAS:首个搜索物体检测Backbone的方法 | NeurIPS 2019
- 有什么推荐的计算机视觉项目?来自微软亚研院的清单
- matlab画滤波器频响应,matlab如何画出“凯泽窗FIR滤波器”的幅频相频响应图
- 每日整理Python基础——python教程入门学习
- ResNet超强变体CoTNet!一种新的Transformer计算机视觉模块!
- 南方科技大学-计算智能与先进制造方向-博士-博士后-研究助理招聘
- 带你自学Python系列(五):Python解决列表字符不区分大小写问题
- 公式太多,读不懂? 一文带你领略KNN近邻算法~简单易懂