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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值