//用戶名校驗的方法
//這個方法將使用XMLHTTPRequest對象來進行AJAX的異步數據交互
var xmlhttp;
function verify() {
    
//0。使用dom的方式獲取文本框中的值
    
//document.getElementById("userName")是dom中獲取元素節點的一種方法,一個元素節點對應HTML頁面中的一個標簽,如果<input>
    
//。value可以獲取一個元素節點的value屬性值
    var userName = document.getElementById("userName").value;

    
//1.創建XMLHttpRequest對象
    
//這是XMLHttpReuquest對象無部使用中最復雜的一步
    
//需要針對IE和其他類型的瀏覽器建立這個對象的不同方式寫不同的代碼

    
if (window.XMLHttpRequest) {
        
//針對FireFox,Mozillar,Opera,Safari,IE7,IE8
        xmlhttp = new XMLHttpRequest();
        
//針對某些特定版本的mozillar瀏覽器的BUG進行修正
        if (xmlhttp.overrideMimeType) {
            xmlhttp.overrideMimeType(
"text/xml");
        }
    } 
else if (window.ActiveXObject) {
         
//針對IE6,IE5.5,IE5
        
//兩個可以用于創建XMLHTTPRequest對象的控件名稱,保存在一個js的數組中
        
//排在前面的版本較新
        var activexName = ["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
        
for (var i = 0; i < activexName.length; i++) {
            
try{
                
//取出一個控件名進行創建,如果創建成功就終止循環
                
//如果創建失敗,回拋出異常,然后可以繼續循環,繼續嘗試創建
                xmlhttp = new ActiveXObject(activexName[i]);
                
break;
            } 
catch(e){
            }
        }
    }
    
//確認XMLHTtpRequest對象創建成功
    if (!xmlhttp) {
        alert(
"XMLHttpRequest對象創建失敗!!");
        
return;
    } 
else {
        alert(xmlhttp.readyState);
    }

    
//2.注冊回調函數
    
//注冊回調函數時,之需要函數名,不要加括號
    
//我們需要將函數名注冊,如果加上括號,就會把函數的返回值注冊上,這是錯誤的
    xmlhttp.onreadystatechange = callback;

    
//3。設置連接信息
    
//第一個參數表示http的請求方式,支持所有http的請求方式,主要使用get和post
    
//第二個參數表示請求的url地址,get方式請求的參數也在url中
    
//第三個參數表示采用異步還是同步方式交互,true表示異步
    
//xmlhttp.open("GET","AJAXServer?name="+ userName,true);

    
//POST方式請求的代碼
    xmlhttp.open("POST","AJAXXMLServer",true);
    
//POST方式需要自己設置http的請求頭
    xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    
//POST方式發送數據
    xmlhttp.send("name=" + userName);

    
//4.發送數據,開始和服務器端進行交互
    
//同步方式下,send這句話會在服務器段數據回來后才執行完
    
//異步方式下,send這句話會立即完成執行
    
//xmlhttp.send(null);
}

//回調函數
function callback() {
    
//alert(xmlhttp.readyState);
    
//5。接收響應數據
    
//判斷對象的狀態是交互完成
    if (xmlhttp.readyState == 4) {
        
//判斷http的交互是否成功
        if (xmlhttp.status == 200) {
            
//使用responseXML的方式來接收XML數據對象的DOM對象
            var domObj = xmlhttp.responseXML;
            
if (domObj) {
                
//<message>123123123</message>
                
//dom中利用getElementsByTagName可以根據標簽名來獲取元素節點,返回的是一個數組
                var messageNodes = domObj.getElementsByTagName("message");
                
if (messageNodes.length > 0) {
                    
//獲取message節點中的文本內容
                    
//message標簽中的文本在dom中是message標簽所對應的元素節點的字節點,firstChild可以獲取到當前節點的第一個子節點
                    
//通過以下方式就可以獲取到文本內容所對應的節點
                    var textNode = messageNodes[0].firstChild;
                    
//對于文本節點來說,可以通過nodeValue的方式返回文本節點的文本內容
                    var responseMessage = textNode.nodeValue;



                    
//將數據顯示在頁面上
                    
//通過dom的方式找到div標簽所對應的元素節點
                    var divNode = document.getElementById("result");
                    
//設置元素節點中的html內容
                    divNode.innerHTML = responseMessage;
                } 
else {
                    alert(
"XML數據格式錯誤,原始文本內容為:" + xmlhttp.responseText);
                }
            } 
else {
                alert(
"XML數據格式錯誤,原始文本內容為:" + xmlhttp.responseText);
            }
        } 
else {
            alert(
"出錯了!!!");
        }
    }
}

public class AJAXServer extends HttpServlet {
    
protected void doPost(HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse) 
throws ServletException,
            IOException {
        doGet(httpServletRequest, httpServletResponse);
    }

    
protected void doGet(HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse) 
throws ServletException,
            IOException {
        
try {
            
// request.setCharacterEncoding("UTF-8");
            
// response.setContentType("text/html;charset=gb18030");

            httpServletResponse.setContentType(
"text/html;charset=utf-8");
            PrintWriter out 
= httpServletResponse.getWriter();

            Integer inte 
= (Integer) httpServletRequest.getSession()
                    .getAttribute(
"total");
            
int temp = 0;
            
if (inte == null) {
                temp 
= 1;
            } 
else {
                temp 
= inte.intValue() + 1;
            }
            httpServletRequest.getSession().setAttribute(
"total", temp);

            
// 1.取參數
            String old = httpServletRequest.getParameter("name");
            
// String name = new String(old.getBytes("iso8859-1"),"UTF-8");
            String name = URLDecoder.decode(old, "UTF-8");
            
// 2.檢查參數是否有問題
            if (old == null || old.length() == 0) {
                out.println(
"用戶名不能為空");
            } 
else {
                
// String name = URLDecoder.decode(old,"UTF-8");
                
// byte[] by = old.getBytes("ISO8859-1");
                
// String name = new String(by,"utf-8");
                
// String name = URLDecoder.decode(old,"utf-8");
                
// 3.校驗操作
                
//String name = old;
                if (name.equals("ashutc")) {
                    
// 4。和傳統應用不同之處。這一步需要將用戶感興趣的數據返回給頁面段,而不是將一個新的頁面發送給用戶
                    
// 寫法沒有變化,本質發生了改變
                    out.println("用戶名[" + name + "]已經存在,請使用其他用戶名, " + temp);
                } 
else {
                    out.println(
"用戶名[" + name + "]尚未存在,可以使用該用戶名注冊, " + temp);
                }
            }
        } 
catch (Exception e) {
            e.printStackTrace();
        }
    }
}