暈呼呼的看了2天AJax初級教程,為將要做的論壇的注冊頁面加寫技術進去...
AJax實際上是在JavaSCRIPT向後台的SERVLET發送消息,然後從SERVLET的響應中獲取消息。這裡提供
一個簡單的注冊頁面提醒用戶注冊名是否存在。
yemian.Html:
<Html>.....<script type="text/Javascript">
var xmlHttp; //定義一個XMLHttpRequest對象,用來發送,提取消息(如想SERVLET後台程序發送)
function createXMLHttpRequest(){ //初始化
if(window.ActiveXObject){ //IE浏覽器
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest){ //Mozilla 浏覽器
xmlHttp = new XMLHttpRequest();
}
}
function checkInfo(){ //HTML響應函數,一般Html中輸入什麼東西發生變化調用次函數
createXMLHttpRequest(); //生成XMLHttpRequest對象
var date = document.getElementById("userName");
var url = "zhuceyemian?userName=" + escape(date.value);
//第一個參數為方法,第二個參數為服務器路徑名/還有其他的參數,第3個為是否異步,一般來說AJax是異步
XMLHttp.open("GET", url, true);
XMLHttp.onreadystatechange = handleStateChange; //徽調函數
XMLHttp.send(null);
}
function handleStateChange() {
if(XMLHttp.readyState == 4) { //判斷對象
if(XMLHttp.status == 200) { //信息返回,處理信息。這裡就可以即時驗證輸入是否為正確了
var mes = xmlHttp.responseXML.getElementsByTagName("message")[0].firstChild.data;
var val = xmlHttp.responseXML.getElementsByTagName("passed")[0].firstChild.data;
setMessage(mes, val);
}
}
}
function setMessage(message, isValid){
var messageArea = document.getElementById("nameMessage");
var fontColor = "red";
if(isValid == "true"){
fontColor = "green";
}
messageArea.innerHtml = "<font color=" +fontColor + ">" + message + "</font>";
}
</script></head>
<!-- 將chenckInfo()賦予onchange就是說當文本域裡面發生變化時,就會調用上面那些函數,向SERVLET發
送消息,在後台SERVLET接受到消息後會查詢數據庫,已驗證當前輸入用戶名是否已被注冊,在<div>區域裡
AJax會填加提示信息->
用戶名:<input id="userName" type="text" maxlength="10" />
<div id="nameMessage"></div>
.... </Html>
在SERVLET裡面的代碼如下:zhuceyemian.Java
import Java.io.*;
import Java.text.ParseException;
import Java.text.SimpleDateFormat;
import Javax.servlet.*;
import Javax.servlet.http.*;
import Java.sql.*;
/* zhuceyemian.Java
* 後台servlet程序,用來檢測注冊用戶名字是否已被注冊,提醒用戶
*/
public class zhuceyemian extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
boolean passed = validateName(request.getParameter("userName"));
response.setContentType("text/XML");
response.setCharacterEncoding("gb2312");
response.setHeader("Cache-Control", "no-cache");
String message = "this name is unavilable.";
if (passed) {
message = "this name is avilable.";
}
out.println("<response>");
out.println("<passed>" + Boolean.toString(passed) + "</passed>");
out.println("<message>" + message + "</message>");
out.println("</response>");
out.close();
}
/**
* 從數據庫中查找是否用戶名已被注冊
*/
private boolean validateName(String name) {
boolean isValid = true;
try {
String driver = "com.MySQL.jdbc.Driver";
Class.forName( driver ); //裝載驅動
String url = "jdbc:MySQL://localhost/test";
Connection conn = DriverManager.getConnection( url, "", "" ); //連接數據庫
Statement stmt = conn.createStatement();
stmt.executeQuery("use test");
ResultSet rs = stmt.executeQuery("SELECT name FROM useinfo where name=\"" + name + "\"");
if(rs.next())
{
isValid = false;
}
rs.close();
stmt.close();
conn.close();
}
catch( Exception x ) {
x.printStackTrace();
}
return isValid;
}
}
在AJax向SERVLET發送請求的第2個參數url在這裡是 zhuceyemian?userName=....這裡zhuceyemian是服務器
名字,在XML裡面要降服務器名和CLASS所在路徑要影射
<servlet>
<servlet-name>zhuceyemian</servlet-name>
<servlet-class>zhuceyemian</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>zhuceyemian</servlet-name>
<url-pattern>/zhuceyemian</url-pattern>
</servlet-mapping>
最後...也是最惡心的地方,讓我郁悶了2天,就是在SERVLET裡面連接數據庫的時候開始他說找不到驅動....郁悶
了,我用APPLICATION都能連接數據庫,最後終於發現在SERVLET下必須把一個MySQL-connector-Java-3.1.10-bin.jar的包打在WEB-INF/LIB下面,直接從BUILD下引入死活就說找不到。