1.前言:本文主要是針對DWR架構的實際應用進行講解,通過一個登陸資訊即時驗證來講述DWR的使用過程。
2.在Myeclipse中建立一個Web應用項目.首先在web.xml中對dwr進行配置。配置內容如下:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
3.建立一個Java類用來驗證登陸資訊,主要包括使用者名稱,密碼,使用者類型,這些資訊在資料庫中對應於資料庫news中的使用者資訊users表,在這裡我們將users表的建表代碼列出如下:
create database news
go
use news
create table users
(
username varchar(50) default('')primary key,
password varchar(50) default(''),
type varchar(50)default('normal')
)
Java類:
package dwr.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class Validator {
private static String username;
private static String password;
private static String type;
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
public void init() {
try {
conn = DBConnection.getConnection();
Debug.println(conn.toString());
} catch (Exception e) {
Debug.println("沒有獲得串連!");
e.printStackTrace();
}
}
public List<String> getAllType() {
init();
List<String> typelist = new ArrayList<String>();
try {
ps = conn.prepareStatement("select distinct(type) from loginfo");
rs = ps.executeQuery();
while (rs.next()) {
typelist.add((String) rs.getString("type"));
}
} catch (Exception e) {
e.printStackTrace();
}
close();
return typelist;
}
public String validate(int i) {
Debug.println("num:" + i);
init();
String sql1 = "select * from loginfo where type=?";
String sql2 = "select * from loginfo where type=? and username=?";
String sql3 = "select * from loginfo where username=? and password=? and type=?";
try {
if (i == 1) {
ps = conn.prepareStatement(sql1);
ps.setString(1, type);
rs = ps.executeQuery();
Debug.println(sql1);
if (!rs.next()) {
return "此部門沒有使用者!";
}
} else if (i == 2) {
ps = conn.prepareStatement(sql2);
ps.setString(1, type);
ps.setString(2, username);
rs = ps.executeQuery();
Debug.println(sql2);
if (!rs.next())
return "使用者名稱錯誤!";
} else if (i == 3) {
ps = conn.prepareStatement(sql3);
ps.setString(1, username);
ps.setString(2, password);
ps.setString(3, type);
Debug.println(sql3);
rs = ps.executeQuery();
if (!rs.next())
return "使用者密碼錯誤!";
}
return null;
} catch (Exception e) {
Debug.println("判斷時出現異常!");
e.printStackTrace();
} finally {
close();
}
return "判斷時出現了異常";
}
public void close() {
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void setUsername(String username) {
Debug.println("username:" + username);
this.username = username;
}
public void setPassword(String password) {
Debug.println("password:" + password);
this.password = password;
}
public void setType(String type) {
Debug.println("type:" + type);
this.type = type;
}
public static void main(String args[]) {
Validator v = new Validator();
v.setUsername("jiangbin");
v.setPassword("jiangbin");
v.setType("管理員");
if (v.validate(3) == null)
Debug.println("找到了使用者!");
}
}
其中引用的資料庫池邊類為:
package dwr.test;
import java.sql.Connection;
import javax.sql.DataSource;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
public class DBConnection {
private static DataSource dataSource;
public static Connection getConnection() throws Exception {
if (dataSource == null) {
BasicDataSource bds = new BasicDataSource();
bds
.setDriverClassName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
bds
.setUrl("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=news");
bds.setUsername("sa");
bds.setPassword("");
bds.setMaxIdle(2);
bds.setMaxActive(20);
bds.setDefaultAutoCommit(true);
dataSource = bds;
}
return dataSource.getConnection();
}
}
其中引用的Debug類為:
/*
* Debug.java
*/
/*
* Copyright (c) 2001 by Florian Bomers <florian@bome.com>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
package dwr.test;
public class Debug {
public static boolean ERROR = true;
public static boolean DEBUG = true;
public static boolean TRACE = true;
public static boolean TRACE_READWRITE = true;
public static boolean TRACE_INOUT = false;
public static boolean SHOW_ALL_EXCEPTIONS = true;
// for net.Server
public static boolean SLOW_NET_UPLOAD = true;
public static boolean SLOW_NET_DOWNLOAD = true;
// show the time of a debug message
private static final boolean SHOW_TIMES = true;
private static long START_TIME = System.currentTimeMillis();
public static synchronized void println(String sMessage) {
if (TRACE) {
if (SHOW_TIMES) {
sMessage = "" + (System.currentTimeMillis() - START_TIME)
+ ": " + sMessage;
}
System.out.println(sMessage);
}
}
public static void println(Object obj, String sMessage) {
if (TRACE) {
String cn = obj.getClass().getName();
int i = cn.lastIndexOf('.');
if (i >= 0 && i < cn.length() - 1) {
cn = cn.substring(i + 1);
}
println(cn + ": " + sMessage);
}
}
public static synchronized void println(Throwable t) {
if (TRACE) {
t.printStackTrace();
}
}
public static synchronized void printStackTrace() {
if (TRACE) {
Thread.dumpStack();
}
}
}
4.建立dwr.xml檔案將Java驗證類與頁面指令碼對象進行關連,dwr.xml檔案與web.xml檔案於同級目錄下:
<?xml version="1.0" encoding="GB18030"?>
<dwr>
<allow>
<create creator="new" javascript="validator">
<param name="class" value="dwr.test.Validator"/>
</create>
</allow>
</dwr>
5.建立登入頁面index.jsp,其頁面代碼如下:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<html>
<head>
<title>Log page</title>
<script type='text/javascript' src='./dwr/interface/validator.js'></script>
<script type='text/javascript' src='./dwr/engine.js'></script>
<script type='text/javascript' src='./dwr/util.js'></script>
<script type="text/javascript" src="./js/log.js"></script>
</head>
<body onload="addUserType();">
<font color="red" size="4"><div id="isUser"></div>
</font>
<hr>
<form action="success.jsp">
<TABLE>
<TR>
<TD colspan="3" bgcolor="#6699FF">
登入
</TD>
</TR>
<TR>
<TD>
使用者類型
</TD>
<TD>
<select id="type" onblur="reply('1');">
</select>
</TD>
<TD>
<div id='typeText'></div>
</TD>
</TR>
<TR>
<TD>
使用者名稱
</TD>
<TD>
<input type="text" name="username" onblur="reply('2');" />
</TD>
<TD>
<div id='usernameText'></div>
</TD>
</TR>
<TR>
<TD>
密碼
</TD>
<TD>
<input type="password" name="password" onblur="reply('3');" />
</TD>
<TD>
<div id='passwordText'></div>
</TD>
</TR>
<TR>
<TD colspan="3">
<input type="button" value="提交" onclick="check();" />
<input type="reset" value="重設" />
</TD>
</TR>
</TABLE>
</form>
</body>
</html>
6.頁面中引用的log.js檔案如下:
function callback1(str) {
DWRUtil.setValue("isUser", str);
}
function callback2(str) {
DWRUtil.setValue("isUser", str);
}
function callback3(str) {
DWRUtil.setValue("isUser", str);
}
function callback4(str) {
if (str == null) {
location.href = "success.jsp";
} else {
DWRUtil.setValue("isUser", "\錯\誤\:\您\輸\入\的\用\戶\信\息\不\存\在!");
}
}
function reply(num) {
var type = DWRUtil.getValue("type");
if (type == "\請\選\擇") {
DWRUtil.setValue("isUser", "\請\選\擇\用\戶\類\型!");
return;
}
var username = DWRUtil.getValue("username");
var password = DWRUtil.getValue("password");
validator.setType(type);
validator.setUsername(username);
validator.setPassword(password);
if (num == "1") {
validator.validate(1, callback1);
}
if (num == "2") {
validator.validate(2, callback2);
}
if (num == "3") {
validator.validate(3, callback3);
}
if (num == "4") {
validator.validate(3, callback4);
}
}
function addUserType() {
validator.getAllType(allType);
}
function allType(typeList) {
var obj_Type = document.getElementById("type");
DWRUtil.removeAllOptions(obj_Type);
DWRUtil.addOptions(obj_Type, ["\請\選\擇"]);
DWRUtil.addOptions(obj_Type, typeList);
}
function check() {
reply(4);
}
將項目布署到tomcat上就可以了,注意在構建路徑上引用dwr,jar包。