J2EE社区

苟有恒,何必三更起五更眠;
最无益,只怕一日曝十日寒.
posts - 241, comments - 318, trackbacks - 0, articles - 16

使用DWR开发AJAX For J2EE

Posted on 2008-10-03 10:21 xcp 阅读(2818) 评论(7)  编辑  收藏 所属分类: Dwr
DWR是Direct Web Remoting 的缩写。

DWR 是一个开放源码的使用 Apache 许可协议的解决方案,它包含服务器端 Java 库、一个 DWR servlet 以及 JavaScript 库。虽然 DWR 不是 Java 平台上唯一可用的 Ajax-RPC 工具包,但是它是最成熟的,而且提供了许多有用的功能。
从最简单的角度来说,DWR 是一个引擎,可以把服务器端 Java 对象的方法公开给 JavaScript 代码。使用 DWR 可以有效地从应用程序代码中把 Ajax 的全部请求-响应循环消除掉。这意味着客户端代码再也不需要直接处理 XMLHttpRequest 对象或者服务器的响应。不再需要编写对象的序列化代码或者使用第三方工具才能把对象变成 XML。甚至不再需要编写 servlet 代码把 Ajax 请求调整成对 Java 域对象的调用。
DWR 是作为 Web 应用程序中的 servlet 部署的。把它看作一个黑盒子,这个 servlet 有两个主要作用:首先,对于公开的每个类,DWR 动态地生成包含在 Web 页面中的 JavaScript。生成的 JavaScript 包含存根函数,代表 Java 类上的对应方法并在幕后执行 XMLHttpRequest。这些请求被发送给 DWR,这时它的第二个作用就是把请求翻译成服务器端 Java 对象上的方法调用并把方法的返回值放在 servlet 响应中发送回客户端,编码成 JavaScript。DWR 还提供了帮助执行常见的用户界面任务的 JavaScript 工具函数。

下面只是一个注册的时候判断用户名是否已被注册,也就是完成了当用户输入完用户名的时候,自动测试用户名是否被使用.!! ,首先我们要建立一个web工程,导入对 Hibernate的支持(在这就不多说,肯定大家都会);还有加上对Dwr的支持,在我们下载下来的dwr源码里面有一个dwr.jar文件我们把它复制到我们web工程的lib下面,还要加上一个dwr.xml文件与web.xml同目录(在后面将会配置).

表信息:
create table user(
uid 
INT  primary key auto_increment,
username 
VARCHAR(32unique not null,
password 
VARCHAR(32not null,
);

Hibernate映射:

hibernate.cfg.xml文件
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

    
<session-factory>
        
<property name="connection.username">root</property>
        
<property name="connection.url">
            jdbc:mysql://localhost:3306/struts1
        
</property>
        
<property name="dialect">
            org.hibernate.dialect.MySQLDialect
        
</property>
        
<property name="myeclipse.connection.profile">mysql</property>
        
<property name="connection.password">sa</property>
        
<property name="connection.driver_class">
            com.mysql.jdbc.Driver
        
</property>
        
<property name="show_sql">true</property>
        
<mapping resource="org/topCSA/dwr/User.hbm.xml" />

    
</session-factory>

</hibernate-configuration>

User实体类:
package org.topCSA.dwr;

/**
 * User entity.
 * 
 * 
@author MyEclipse Persistence Tools
 
*/


@SuppressWarnings(
"serial")
public class User implements java.io.Serializable
{

    
// Fields

    
private Integer uid;
    
private String  username;
    
private String  password;

    
// Constructors

    
/** default constructor */
    
public User()
    
{
    }


    
/** full constructor */
    
public User(String username, String password)
    
{
        
this.username = username;
        
this.password = password;
    }


    
// Property accessors

    
public Integer getUid()
    
{
        
return this.uid;
    }


    
public void setUid(Integer uid)
    
{
        
this.uid = uid;
    }


    
public String getUsername()
    
{
        
return this.username;
    }


    
public void setUsername(String username)
    
{
        
this.username = username;
    }


    
public String getPassword()
    
{
        
return this.password;
    }


    
public void setPassword(String password)
    
{
        
this.password = password;
    }


}

 

User.hbm.xml映射文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    
<class name="org.topCSA.dwr.User" table="user">
        
<id name="uid" type="java.lang.Integer">
            
<column name="uid" />
            
<generator class="native" />
        
</id>
        
<property name="username" type="java.lang.String">
            
<column name="username" length="32" not-null="true" />
        
</property>
        
<property name="password" type="java.lang.String">
            
<column name="password" length="32" not-null="true" />
        
</property>
    
</class>
</hibernate-mapping>


HibernateSessionFactory类(放在org.topCSA.util,是加入Hibernate时自动生成的Session工厂类,在这为了减少篇幅就不写出来了)


形成UserDAO接口:

 

package org.topCSA.dwr;

public interface UserDAO
{
    
public boolean existUser(String username);
}

 

 形成UserDAOImpl:

package org.topCSA.dwr;

import java.util.List;


import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.topCSA.util.HibernateSessionFactory;

public class UserDAOImpl implements UserDAO
{

    @SuppressWarnings(
"unchecked")
    @Override
    
public boolean existUser(String username)
    
{
        Session session 
= HibernateSessionFactory.getSession();
        Transaction tx 
= session.beginTransaction();
        
        Query qeury 
= session.createQuery("from User u where u.username=?");
        qeury.setString(
0, username);
        
        List
<User> user =  qeury.list();
        
        
if(user.size() > 0)
            
return true;
        
        tx.commit();
        
return false;
        
    }


}



形成一个UserDAOAjax接口(主要就是为客户端定义要调用的服务方法):

 

package org.topCSA.dwr;

public interface 
{
 
public boolean existUser(String username);
}



形成一个UserDAOAjaxImpl类:

package org.topCSA.dwr;

public class UserDAOAjaxImpl implements UserDAOAjax
{
    
private UserDAO userDAO;
    @Override
    
public boolean existUser(String username)
    
{
        userDAO 
= new UserDAOImpl();
        
return userDAO.existUser(username);
    }


}



配置dwr.xml文件(它的作用就是将服务端方法转换成javascript代码):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">

<dwr>
    
<allow>
        
<create javascript="UserDAOAjaxImpl" creator="new">
            
<param name="class" value="org.topCSA.dwr.UserDAOAjaxImpl"></param>
        
</create>
        
<convert match="org.topCSA.dwr.User" converter="bean"></convert>
    
</allow>
</dwr>

web.xml里面加上对dwr框架的支持:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
>

    
<servlet>
        
<servlet-name>dwr</servlet-name>
        
<servlet-class>
            org.directwebremoting.servlet.DwrServlet
        
</servlet-class>
        
<init-param>
            
<param-name>debug</param-name>    
            
<param-value>true</param-value>
        
</init-param>
        
<load-on-startup>1</load-on-startup>
    
</servlet>
    
<servlet-mapping>
        
<servlet-name>dwr</servlet-name>
        
<url-pattern>/dwr/*</url-pattern>
    
</servlet-mapping>
</web-app>


前台页面register.jsp:
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding
="GB18030"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    
<head>
        
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
        
<title>register</title>

        
<!-- 第一个是dwr的引擎脚本 -->
        
<script type="text/javascript" src="dwr/engine.js"></script>
        
<!-- 第二个是dwr的工具脚本 -->
        
<script type="text/javascript" src="dwr/util.js"></script>
        
<!-- 第三个是调用dwr通过dwr.xml自动生成的js -->
        
<script type="text/javascript" src="dwr/interface/UserDAOAjaxImpl.js"></script>
        
<!-- 具体操作脚本 -->
        
<script type="text/javascript">
            
function show(boolean)
            
{
                
if(boolean)
                
{
                    $(
"error").style.visibility="visible";
                    form1.username.value
='';
                }

                
else
                
{
                    $(
"error").style.visibility="hidden";
                }

            }

            
function validate()
            
{
                
var name = $("username").value;
                
//alert(name);
                UserDAOAjaxImpl.existUser(name,show);
            }

            
function init()
            
{
                $(
"error").style.visibility="hidden";
            }

    
</script>

    
</head>
    
<body onload="init()">
        
<form action="#" method="post" name="form1">
            
<table id="table1" border="0">
                
<tr>
                    
<td>
                        用户名:
                    
</td>
                    
<td>
                        
<input type="text" name="username" id="username"
                            onchange
="validate()" />
                    
</td>
                    
<td id="error">
                        
<font color="red">用户名已被注册!</font>
                    
</td>
                
</tr>
                
<tr>
                    
<td>
                        密码
&nbsp;&nbsp;:
                    
</td>
                    
<td>
                        
<input type="text" name="username" />
                    
</td>
                
</tr>
            
</table>
        
</form>
    
</body>
</html>


 上面已经基本完成要实现的功能,下面就是布置测试:

完成了当用户输入完用户名的时候,自动测试用户名是否被使用。
若数据库里面有相册的用户名提示用户名已被注册!

若没有正常执行.



名称: ♪4C.ESL | .↗Evon
口号: 遇到新问题♪先要寻找一个方案乄而不是创造一个方案こ
mail: 联系我


Feedback

# re: 使用DWR开发AJAX For J2EE  回复  更多评论   

2008-10-03 21:51 by 免费小说
这个不错,试试看。

# re: 使用DWR开发AJAX For J2EE  回复  更多评论   

2008-10-06 17:17 by bruno
function validate()
{
var name = $("username").value;
//alert(name);
UserDAOAjaxImpl.existUser(name,show);
}
这段代码是不是有误?
我猜想是
function validate()
{
var name = $("username").value;
//alert(name);
show(UserDAOAjaxImpl.existUser(name));
}
不知对否?

# re: 使用DWR开发AJAX For J2EE  回复  更多评论   

2008-10-12 21:31 by xcp
@bruno
楼上这位你知道回调函数吗?建议学学!!

function validate()
{
var name = $("username").value;
//alert(name);
UserDAOAjaxImpl.existUser(name,show);
}
以上代码正确无误!!

# re: 使用DWR开发AJAX For J2EE  回复  更多评论   

2008-11-11 11:23 by xiaodong
为什么我照着你的代码 敲完 了 没有效果啊

# re: 使用DWR开发AJAX For J2EE[未登录]  回复  更多评论   

2008-11-14 14:54 by xcp
@xiaodong
应该是哪敲错了吧,自己再好好看看。。。

# re: 使用DWR开发AJAX For J2EE  回复  更多评论   

2009-03-22 14:05 by asd
afds@xcp

# re: 使用DWR开发AJAX For J2EE  回复  更多评论   

2009-10-27 16:39 by 免费小说
应该是哪敲错了吧,自己再好好看看。。。 使用DWR开发AJAX For J2EE

只有注册用户登录后才能发表评论。


网站导航: