DWR的认识及基本应用
2015-12-20 00:00
393 查看
摘要: DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。
一、DWR的基本原理及流程
1、是什么
是一个框架。允许在Javascript中访问后台web服务器上的Java代码。
2、有什么?
基于AJAX的框架,包含两个主要部分:一个运行在服务器端的Java Servlet,它处理请求并且向浏览器发回响应;运行在浏览器端的Javascript,它发送请求而且能动态更新网页。DWR的工作原理是通过动态把Java类生成为Javascript。它不需要任何网页浏览器插件就能运行在网页上。
3、能干什么?
让客户端Javascript通过DWR访问Java程序。
4、怎么做?
DWR没有开发环境只有运行环境。
1)引包:dwr.jar放在web应用的WEB-INF/lib目录下;
2)将下载的dwr-版本号-src.zip/java/org/directwebremoting内的engine.js和util.js放入web应用中对应的文件夹下,如js文件夹下。
jar包:dwr.jar
静态页:
js:
java:
TestOpt:
TestAnnotation(注解形式):
User:
(其中 @DataTransferObject 为注解形式)
IUserService:
UserServiceimpl
配置文件
WEB-INF/dwr.xml
WEB-INF/web.xml
注解的配置 WEB-INF/web.xml:
5、DWR运行原理:
(1)部署阶段:
读dwr.xml,在该xml文件中定义的Javascript(如名为service),它对应的类为如DWRTest,这里cc相当于DWRTest,通过反射生成cc.js,其中DWRTest中的方法也就是调用后台类的方法;
(2)运行阶段:
触发事件调用一个方法
从自己的js中调用了上面的cc.js中的方法t1
调用客户端的AJAX引擎发出请求
以上三步都是由客户端完成,后面的都是有服务器端来完成:
Web容器先接到请求,找上下文路径:/dwr/匹配dwr中对应的servlet
读dwr.xml;根据js名匹配creator定义;依据creator方法创建实例(反射);调用方法,得到返回值
out出去
回调处理
调用客户端的回调处理(自己写的方法)。
二、DWR提供的注解类型
经常用到的注解主要有:@RemoteProxy、@RemoteMethod、@DataTransferObject和@RemoteProperty。@RemoteProxy和@RemoteMethod
1.@RemoteProxy对应于原来dwr.xml文件中的create标签,用于创建DWR所提供的远程方法;
2.@RemoteMethod对应于create标签中的 <include method=”"/>
3.@DataTransferObject对应于原来dwr.xml文件中的convert标签,用于转换Java对象;
4.@RemoteProperty则对应于convert标签中的 <param name=”include” value=”" />。
@RemoteProxy表示这个类将用于远程方法,而使用@RemoteMethod指定所要暴露的方法,没有使用@RemoteMethod的方法将不会显示在客户端。(完全没有使用@RemoteMethod则暴露所有方法)
三、相关链接
http://rabby.iteye.com/blog/774553
http://blog.csdn.net/kuangxiang_panpan/article/details/7417385
http://www.sxt.cn/u/507/blog/2754
JimStoneAjax:
http://my.oschina.net/jimstone/blog/163720?fromerr=bu1C5SP1
一、DWR的基本原理及流程
1、是什么
是一个框架。允许在Javascript中访问后台web服务器上的Java代码。
2、有什么?
基于AJAX的框架,包含两个主要部分:一个运行在服务器端的Java Servlet,它处理请求并且向浏览器发回响应;运行在浏览器端的Javascript,它发送请求而且能动态更新网页。DWR的工作原理是通过动态把Java类生成为Javascript。它不需要任何网页浏览器插件就能运行在网页上。
3、能干什么?
让客户端Javascript通过DWR访问Java程序。
4、怎么做?
DWR没有开发环境只有运行环境。
1)引包:dwr.jar放在web应用的WEB-INF/lib目录下;
2)将下载的dwr-版本号-src.zip/java/org/directwebremoting内的engine.js和util.js放入web应用中对应的文件夹下,如js文件夹下。
jar包:dwr.jar
静态页:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="lib/jquery-2.0.3.js"></script> <script src="js/user.js"></script> <script src="../dwr/engine.js"></script> <script src="../dwr/util.js"></script> <script src="../dwr/interface/TestOpt.js"></script> </head> <body> <form id="userForm"> 姓名:<input type="text" name="name"> 年龄:<input type="text" name="age"> <button type="button" id="saveUser">保存</button> </form> </body> </html>
js:
/** * Created by Administrator on 15-12-20. */ $(function(){ $("#saveUser").click(function(){ var userMap = {}; userMap.name=$("input[name='name']").val(); userMap.age=$("input[name='age']").val(); userMap.userId='1'; // TestOpt.handleSave(userMap, successHand) // TestOpt.testPrivate(successHand) TestAnnotation.handleSave(userMap, successSave) TestAnnotation.testPrivate(successSave) }); function successHand(data){ console.info("successHand:", data); } function successSave(data){ console.info("successSave:", data); } })
java:
TestOpt:
package cn.jmu.test.opt; import cn.jmu.test.model.User; import cn.jmu.test.service.IUserService; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * Created by Administrator on 15-12-20. */ @Component public class TestOpt { Logger logger = Logger.getLogger(TestOpt.class); @Resource IUserService iUserService; public User handleSave(User user){ logger.info("======TestOpt handleSave begin=============="); iUserService.saveUser(user); User resUser = iUserService.getUser(user.getUserId()); iUserService.deleteUser(user.getUserId()); logger.info("======TestOpt handleSave end================"); return resUser; } public void testPrivate(){ logger.info("======testPrivate=============="); } }
TestAnnotation(注解形式):
package cn.jmu.test.opt; import cn.jmu.test.model.User; import cn.jmu.test.service.IUserService; import org.apache.log4j.Logger; import org.directwebremoting.annotations.Param; import org.directwebremoting.annotations.RemoteProxy; import org.directwebremoting.spring.SpringCreator; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.ejb.RemoteHome; /** * Created by Administrator on 15-12-20. */ @Component @RemoteProxy(creator= SpringCreator.class, creatorParams = @Param(name="beanName", value = "testAnnotation"), name = "TestAnnotation") public class TestAnnotation { Logger logger = Logger.getLogger(TestAnnotation.class); @Resource IUserService iUserService; @RemoteMethod public User handleSave(User user){ logger.info("======TestAnnotation handleSave begin=============="); User resUser = iUserService.getUser(user.getUserId()); logger.info("======TestAnnotation handleSave end================"); return resUser; } public void testPrivate(){ logger.info("TestAnnotation testPrivate"); } }
User:
package cn.jmu.test.model; import org.directwebremoting.annotations.DataTransferObject; /** * Created by Administrator on 15-12-20. */ @DataTransferObject public class User { private String userId; private String name; private int age; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } 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; } }
(其中 @DataTransferObject 为注解形式)
IUserService:
package cn.jmu.test.service; import cn.jmu.test.model.User; /** * Created by Administrator on 15-12-20. */ public interface IUserService { /** * 保存用户 * @param user */ public boolean saveUser(User user); /** * 查找用户 * @param userId * @return */ public User getUser(String userId); /** * 删除用户 * @param userId * @return */ public boolean deleteUser(String userId); }
UserServiceimpl
package cn.jmu.test.service.impl; import cn.jmu.test.model.User; import cn.jmu.test.service.IUserService; import org.apache.log4j.Logger; import org.springframework.stereotype.Service; /** * Created by Administrator on 15-12-20. */ @Service public class UserServiceImpl implements IUserService { Logger logger = Logger.getLogger(UserServiceImpl.class); @Override public boolean saveUser(User user) { logger.info("save user begin"); logger.info("user.name:" + user.getName()); logger.info("user.age:" + user.getAge()); logger.info("save user end"); return true; } @Override public User getUser(String userId) { logger.info("get user begin"); logger.info("user.userId:" + userId); User user = new User(); user.setUserId("1"); user.setAge(10); user.setName("jack"); logger.info("get user end"); return user; } @Override public boolean deleteUser(String userId) { logger.info("delete user begin"); logger.info("user.userId:" + userId); logger.info("delete user end"); return true; } }
配置文件
WEB-INF/dwr.xml
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> <dwr> <allow> <!--<create creator="new" javascript="TestOpt">--> <!--<param name="class" value="cn.jmu.test.opt.TestOpt"/>--> <!--</create>--> <create creator="spring" javascript="TestOpt"> <param name="beanName" value="testOpt"/> <include method="handleSave" /> <include method="testPrivate" /> </create> <convert converter="bean" match="cn.jmu.test.model.User"/> </allow> </dwr>
WEB-INF/web.xml
<servlet> <servlet-name>dwr-invoker</servlet-name> <!--<display-name>DWR Servlet</display-name>--> <!--<description>Direct Web Remoter Servlet</description>--> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>scriptCompressed</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>
注解的配置 WEB-INF/web.xml:
<servlet> <servlet-name>dwr-invoker</servlet-name> <!--<display-name>DWR Servlet</display-name>--> <!--<description>Direct Web Remoter Servlet</description>--> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>scriptCompressed</param-name> <param-value>false</param-value> </init-param> <!-- 将设定注解的域对象和业务实现类放在下面列表中,中间使用逗号间隔 --> <init-param> <param-name>classes</param-name> <param-value> cn.jmu.test.opt.TestAnnotation, cn.jmu.test.model.User </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
5、DWR运行原理:
(1)部署阶段:
读dwr.xml,在该xml文件中定义的Javascript(如名为service),它对应的类为如DWRTest,这里cc相当于DWRTest,通过反射生成cc.js,其中DWRTest中的方法也就是调用后台类的方法;
(2)运行阶段:
触发事件调用一个方法
从自己的js中调用了上面的cc.js中的方法t1
调用客户端的AJAX引擎发出请求
以上三步都是由客户端完成,后面的都是有服务器端来完成:
Web容器先接到请求,找上下文路径:/dwr/匹配dwr中对应的servlet
读dwr.xml;根据js名匹配creator定义;依据creator方法创建实例(反射);调用方法,得到返回值
out出去
回调处理
调用客户端的回调处理(自己写的方法)。
二、DWR提供的注解类型
经常用到的注解主要有:@RemoteProxy、@RemoteMethod、@DataTransferObject和@RemoteProperty。@RemoteProxy和@RemoteMethod
1.@RemoteProxy对应于原来dwr.xml文件中的create标签,用于创建DWR所提供的远程方法;
2.@RemoteMethod对应于create标签中的 <include method=”"/>
3.@DataTransferObject对应于原来dwr.xml文件中的convert标签,用于转换Java对象;
4.@RemoteProperty则对应于convert标签中的 <param name=”include” value=”" />。
@RemoteProxy表示这个类将用于远程方法,而使用@RemoteMethod指定所要暴露的方法,没有使用@RemoteMethod的方法将不会显示在客户端。(完全没有使用@RemoteMethod则暴露所有方法)
三、相关链接
http://rabby.iteye.com/blog/774553
http://blog.csdn.net/kuangxiang_panpan/article/details/7417385
http://www.sxt.cn/u/507/blog/2754
JimStoneAjax:
http://my.oschina.net/jimstone/blog/163720?fromerr=bu1C5SP1
相关文章推荐
- 【嘉兴东臣php】BOM+DOM+作用域周总结
- 【Python 第13课】 字符串
- 【Python 第14课】 字符串格式化
- 测试
- error: Microsoft Visual C++ 9.0 is required (Unabl
- 数据库-游标
- spring源码阅读笔记(一)
- 用git创建版本库
- mysql下使用select into outfile来备份数据
- mysql用LOAD DATA INFILE导入数据
- 关于JS闭包一篇不错的文章记录下
- asp.net5发神经一例 ------无法加载依赖
- asp.net5 的应用启动
- PS:oracle恢复删除的数据
- Linux 每日一练习!!开机自启动一些服务比如ssh
- Linux 每日一练习 !!!etc/profile里等设置环境变量导致图形无法登录
- linux下系统启动时,几个配置文件 启动顺序
- Linux 每日一练习 !!!文件编码格式探测file
- linux下使用yum安装mysql
- hive 中执行showdatabases报错:return code 1 from org.apa