`
wx1569488408
  • 浏览: 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视频教程

    通过这个视频教程,你应该能够建立起对DWR的基本认识,并具备在实际项目中使用DWR的能力。记得理论学习与实践操作相结合,才能更好地掌握这些知识。在后续的教程中,可能会深入到更复杂的功能,如批量更新、Caching...

    dwr ajax完整示例,内有dwr配置说明文档,eclicps工程

    学习这个示例,你将能掌握DWR的基本用法,并能将其应用到实际项目中,提升Web应用的用户体验。Eclipse工程可以帮助你在开发环境中直接运行和测试这些示例,加深理解和实践。通过阅读文档并亲手操作示例,你将对DWR有...

    dwr开发文档

    ### DWR开发知识点详解 #### 一、DWR概述 ...通过上述章节的介绍,我们对DWR的基础知识、运行机制、配置管理以及高级用法有了较为全面的认识。这将有助于开发者更高效地利用DWR来构建现代化的Web应用程序。

    DWR(Direct Web Remoting)介绍

    为了更好地理解DWR的工作原理及其配置方式,我们将通过一个简单的例子来详细介绍DWR的基本配置和使用流程。 ##### 1. 配置dwr.xml ```xml &lt;dwr&gt; &lt;param name="class" value="com.dwr.TestClass"/&gt; &lt;/...

    学习dwr的试验

    DWR (Direct Web Remoting) 是...通过实践,不仅可以掌握DWR的基本用法,还能锻炼在复杂场景下的问题解决能力。在完成这个项目后,你将对服务器推送技术有更深的认识,并且能够灵活运用到其他需要实时交互的Web应用中。

    引:dwr实例

    在本文中,我们将深入探讨DWR的基本概念、配置、使用方法以及其实例应用。 1. **DWR的核心概念** - **Remoting**: 远程调用技术,允许客户端与服务器之间进行跨域通信。 - **Ajax**: 异步JavaScript和XML,DWR...

    DWR中文文档入门配置

    **DWR(Direct Web Remoting)中文...通过以上介绍,你应该对DWR有了一个基本的认识,理解了它的配置过程以及与Spring的整合方式。继续深入学习DWR中文文档,你可以掌握更多实用技巧,提高Web应用的交互性和用户体验。

    DWR入门,含有我整理的word,PDF书,代码,jar包

    通过以上内容,你应该对DWR有了初步的认识。现在,你可以利用提供的文档和代码,按照步骤实践,逐步掌握DWR的使用。在实践中遇到问题时,查阅官方文档,结合示例代码进行调试,相信你很快就能熟练地运用DWR来开发富...

    DWR入门测试

    **DWR入门测试** ...通过以上介绍,你可以开始对DWR有一个基础的认识,并能够利用提供的`TestDWR`项目进行实践,进一步理解DWR的工作原理和使用方法。记得在实践中不断探索和学习,提升你的技能。

    serviceserver

    DWRProject2和DWRProject3可能是两个不同版本或者阶段的DWR应用示例,用于学习和实践如何使用DWR进行前后端通信,理解Ajax的实现方式,以及如何优化Web应用的用户体验。 2. **FirstDWRDemo**:这个名字暗示了一个...

    高级Java软件架构师学习计划

    - **学习目标**:掌握Java图形界面编程的基本方法,学习Swing包的应用及Java消息处理机制。 - **具体内容**:深入学习Swing包的应用以及Java的消息处理机制。 - **预期成果**:能够熟练地编写Java可视化界面程序...

    java 工程师简历

    在技能方面,田利斌熟练掌握JAVA SE核心技术,包括面向对象的设计思想和设计模式,了解代码重构,对C#.NET也有一定的认识。他还熟悉各种开源框架,如JFreeChart、OpenFlashChart、IBatis、DWR等。在数据库应用上,他...

Global site tag (gtag.js) - Google Analytics