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同目录(在后面将会配置).
表信息:

Code
create table user(
uid INT primary key auto_increment,
username VARCHAR(32) unique not null,
password VARCHAR(32) not null,
);
Hibernate映射:
hibernate.cfg.xml文件

Code
<?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实体类:

Code
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映射文件

Code
<?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接口:

Code
package org.topCSA.dwr;
public interface UserDAO
{
public boolean existUser(String username);
}
形成UserDAOImpl:

Code
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接口(主要就是为客户端定义要调用的服务方法):

Code
package org.topCSA.dwr;
public interface
{
public boolean existUser(String username);
}
形成一个UserDAOAjaxImpl类:

Code
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代码):

Code
<?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框架的支持:

Code
<?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
[url]http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd[/url]">
<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:

Code
<%@ 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>
密码 :
</td>
<td>
<input type="text" name="username" />
</td>
</tr>
</table>
</form>
</body>
</html>
上面已经基本完成要实现的功能,下面就是布置测试:
完成了当用户输入完用户名的时候,自动测试用户名是否被使用。
若数据库里面有相册的用户名提示用户名已被注册!

附件:
您所在的用户组无法下载或查看附件(文/xcp 出处/BLOGJAVA)
您可能对 [Java] 的这些文章也感兴趣: