DWR(Direct Web Remoting)js调用java方法

DWR(Direct Web Remoting)是一个用于改善web页面与java类交互的远程服务器端Ajax开源框架。(JavaScript访问java类中的方法)

1.          配置web.xml
<!-- 配置dwr处理器 -->
        <servlet>
                <servlet-name>dwr-invoker</servlet-name>
                <servlet-class>
                        org.directwebremoting.servlet.DwrServlet
                </servlet-class>
        </servlet>

        <servlet-mapping>
                <servlet-name>dwr-invoker</servlet-name>
                <url-pattern>/dwr/*</url-pattern>
        </servlet-mapping>


2.           完成需要被调用的类,即被调用者
User.java

package lynn;

 

public class User {

        

        // 登陆ID,主键唯一

        private String id;

        // 姓名

        private String name;

        // 口令

        private String password;

        // 电子邮件

        private String email;

//各属性的get和set方法

... ...

UserDAO.java

package lynn;

 

import java.util.HashMap;

import java.util.Map;

 

public class UserDAO {

        // 存放保存的数据

        private static Map<String, User> dataMap = new HashMap<String, User>();

 

        // 持久用户

        public boolean save(User user) {

                if (dataMap.containsKey(user.getId()))

                        return false;

                System.out.println("下面开始保存用户");

                System.out.println("id:" + user.getId());

                System.out.println("password:" + user.getPassword());

                System.out.println("name:" + user.getName());

                System.out.println("email:" + user.getEmail());

                dataMap.put(user.getId(), user);

                System.out.println("用户保存结束");

                return true;

        }

 

        // 查找用户

        public User find(String id) {

                return (User) dataMap.get(id);

        }

}


3.配置dwr.xml
<?xml version="1.0" encoding="UTF-8"?>

<!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="DWRUserAccess">

                        <param name="class" value="lynn.DWRUserAccess" />

                </create>

                

                <convert converter="bean" match="lynn.User" />

        </allow>

</dwr>


1)<allow>标签中包括可以暴露给javascript访问的东西。

2)<create>标签中指定javascript中可以访问的java类,并定义DWR应当如何获得要进行远程的类的实例。

creator="new"属性指定java类实例的生成方式,new意味着DWR应当调用类的默认构造函数来获得实例,其他的还有spring方式,通过与IOC容器Spring进行集成来获得实例等等。javascript=" DWRUserAccess"属性指定javascript代码访问对象时使用的名称,即所要生产的js的名称,必须与html中导入的js名称一致。

<param>标签指定要公开给javascript的java类名。

<include>标签指定要公开给javascript的方法。不指定的话就公开所有方法。

<exclude>标签指定要防止被访问的方法。

3)<creator>标签负责公开用于Web远程的类和类的方法,<convertor>标签则负责这些方法的参数和返回类型。

convert元素的作用是告诉DWR在服务器端Java 对象表示和序列化的JavaScript之间如何转换数据类型。DWR自动地在Java和JavaScript表示之间调整简单数据类型。这些类型包括Java原生类型和它们各自的封装类表示,还有String、Date、数组和集合类型。DWR也能把JavaBean转换成JavaScript 表示,但是出于安全性的原因,要求显式的配置,<convertor>标签就是完成此功能的。converter="bean"属性指定转换的方式采用JavaBean命名规范,match="lynn.user"属性指定要转换的javabean名称,标签指定要转换的JavaBean属性。

4.完成html,即调用者
test.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

        <HEAD>

                <TITLE>DWR测试</TITLE>

                <meta http-equiv=Content-Type content="text/html; charset=gb2312">

                <script src="dwr/engine.js"></script>

                <script src="dwr/util.js"></script>

                <script src="dwr/interface/DWRUserAccess.js"></script>

        </HEAD>

        <SCRIPT LANGUAGE="JavaScript">

function saveFun(data) {

        if (data) {

                alert("注册成功!");

        } else {

                alert("登陆ID已经存在!");

        }

}

 

function OnSave() {

 

        var userMap = {};

        userMap.id = regForm.id.value;

        userMap.password = regForm.password.value;

        userMap.name = regForm.name.value;

        userMap.email = regForm.email.value;

        DWRUserAccess.save(userMap, saveFun);

}

 

function findFun(data) {

        if (data == null) {

                alert("无法找到用户:" + queryForm.id.value);

                return;

        }

        alert("找到用户,nid:" + data.id + ",npassword:" + data.password + ",nname:"

                        + data.name + ",nemail:" + data.email);

}

 

function OnFind() {

        DWRUserAccess.find(queryForm.id.value, findFun);

}

</SCRIPT>

        <BODY>

                <B>用户注册</B>

                <br>

                ------------------------------------------------

                <Br>

                <form name="regForm">

                        登陆ID:

                        <input type="text" name="id">

                        <br>

                        口 令:

                        <input type="password" name="password">

                        <br>

                        姓 名:

                        <input type="text" name="name">

                        <br>

                        电子邮件:

                        <input type="text" name="email">

                        <br>

                        <input type="button" name="submitBtn" value="提交" onclick="OnSave()">

                        <br>

                </form>

 

                <br>

                <br>

                <B>用户查询</B>

                <br>

                ------------------------------------------------

                <Br>

                <form name="queryForm">

                        登陆ID:

                        <input type="text" name="id">

                        <br>

                        <input type="button" name="submitBtn" value="提交" onclick="OnFind()">

                        <br>

                </form>

                <br>

        </BODY>

</HTML>


1)必须导入

<script src="dwr/engine.js"></script>

<script src="dwr/util.js"></script>

<script src="dwr/interface/DWRUserAccess.js"></script>

其中engine.js和util.js都在dwr-2.0.3-src.zip的java/org/dwrwebremoting/目录下。DWRUserAccess.js是自动生产的,注意路径必须是*/interface/*.js。

2)调用java方法

function saveFun(data) {

        if (data) {

                alert("注册成功!");

        } else {

                alert("登陆ID已经存在!");

        }

}

 

function OnSave() {

 

        var userMap = {};

        userMap.id = regForm.id.value;

        userMap.password = regForm.password.value;

        userMap.name = regForm.name.value;

        userMap.email = regForm.email.value;

        DWRUserAccess.save(userMap, saveFun);

}


DWR组件名称.调用的java方法名称(方法参数,方法的返回值)

5.DWR和Spring的整合
需要更改的地方:

1)Web.xml中添加

<!--初始化WebApplicationContext-->

        <context-param>

                <param-name>contextConfigLocation</param-name>

                <param-value>

                        /WEB-INF/applicationContext.xml

                </param-value>

        </context-param>

        <listener>

                <listener-class>

                        org.springframework.web.context.ContextLoaderListener

                </listener-class>

</listener>


注意applicationContext.xml的路径

2)applicationContext.xml中配置bean

<bean id="DWRUserAccess" class="lynn.DWRUserAccess"></bean>

3)修改dwr.xml

<dwr>

        <allow>

                <create creator="spring" javascript="DWRUserAccess">

                        <param name="beanName" value="DWRUserAccess" />

                </create>

                

                <convert converter="bean" match="lynn.User" />

        </allow>

</dwr>


creator的值可以是new、spring、struts。

<param>标签配置被调用的bean。

你可能感兴趣的:(JavaScript,java,spring,Web,DWR)