- 浏览: 79216 次
文章分类
最新评论
DWR的认识及基本应用
一、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
转载于:https://my.oschina.net/u/2449014/blog/548257
相关推荐
通过以上介绍,你应该对DWR框架有了基本的认识,包括其工作原理、配置以及简单的应用方法。在实际项目中,你可以根据需求调整DWR的配置,以满足更复杂的应用场景。同时,记住在使用过程中注意路径正确性和安全性,...
通过这个视频教程,你应该能够建立起对DWR的基本认识,并具备在实际项目中使用DWR的能力。记得理论学习与实践操作相结合,才能更好地掌握这些知识。在后续的教程中,可能会深入到更复杂的功能,如批量更新、Caching...
学习这个示例,你将能掌握DWR的基本用法,并能将其应用到实际项目中,提升Web应用的用户体验。Eclipse工程可以帮助你在开发环境中直接运行和测试这些示例,加深理解和实践。通过阅读文档并亲手操作示例,你将对DWR有...
### DWR开发知识点详解 #### 一、DWR概述 ...通过上述章节的介绍,我们对DWR的基础知识、运行机制、配置管理以及高级用法有了较为全面的认识。这将有助于开发者更高效地利用DWR来构建现代化的Web应用程序。
为了更好地理解DWR的工作原理及其配置方式,我们将通过一个简单的例子来详细介绍DWR的基本配置和使用流程。 ##### 1. 配置dwr.xml ```xml <dwr> <param name="class" value="com.dwr.TestClass"/> </...
DWR (Direct Web Remoting) 是...通过实践,不仅可以掌握DWR的基本用法,还能锻炼在复杂场景下的问题解决能力。在完成这个项目后,你将对服务器推送技术有更深的认识,并且能够灵活运用到其他需要实时交互的Web应用中。
在本文中,我们将深入探讨DWR的基本概念、配置、使用方法以及其实例应用。 1. **DWR的核心概念** - **Remoting**: 远程调用技术,允许客户端与服务器之间进行跨域通信。 - **Ajax**: 异步JavaScript和XML,DWR...
**DWR(Direct Web Remoting)中文...通过以上介绍,你应该对DWR有了一个基本的认识,理解了它的配置过程以及与Spring的整合方式。继续深入学习DWR中文文档,你可以掌握更多实用技巧,提高Web应用的交互性和用户体验。
通过以上内容,你应该对DWR有了初步的认识。现在,你可以利用提供的文档和代码,按照步骤实践,逐步掌握DWR的使用。在实践中遇到问题时,查阅官方文档,结合示例代码进行调试,相信你很快就能熟练地运用DWR来开发富...
**DWR入门测试** ...通过以上介绍,你可以开始对DWR有一个基础的认识,并能够利用提供的`TestDWR`项目进行实践,进一步理解DWR的工作原理和使用方法。记得在实践中不断探索和学习,提升你的技能。
DWRProject2和DWRProject3可能是两个不同版本或者阶段的DWR应用示例,用于学习和实践如何使用DWR进行前后端通信,理解Ajax的实现方式,以及如何优化Web应用的用户体验。 2. **FirstDWRDemo**:这个名字暗示了一个...
- **学习目标**:掌握Java图形界面编程的基本方法,学习Swing包的应用及Java消息处理机制。 - **具体内容**:深入学习Swing包的应用以及Java的消息处理机制。 - **预期成果**:能够熟练地编写Java可视化界面程序...
在技能方面,田利斌熟练掌握JAVA SE核心技术,包括面向对象的设计思想和设计模式,了解代码重构,对C#.NET也有一定的认识。他还熟悉各种开源框架,如JFreeChart、OpenFlashChart、IBatis、DWR等。在数据库应用上,他...