您的位置:首页 > 其它

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

静态页:

<!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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: