jsp+ajax實例

下面介紹JSP前臺表單內容通過Ajax異步提交到後臺Servlet進行校驗(校驗方式多種,包括提取數據庫信息,校驗用戶名是否重複等),異步在JSP表單頁面顯示校驗結果信息的基本過程。 

一、說明: 

       1.由於本文只限於介紹JSP+Servlet+Ajax運用的基本流程,重點不在於後臺數據庫的訪問和校驗內容,因此省略Servlet對數據庫的訪問。 

二、基本流程: 

      1. JSP頁面login.jsp提供一個表單“form”,表單中有兩個“text”類型的輸入框,其中我們將用第一個輸入框來做實驗。 

        在第一個輸入框中(輸入用戶名),通過onblur=validate();,當用戶光標離開輸入框時,觸發JS函數validate() ,函數validate()在Ajax.js文件中聲明。

Html代碼  收藏代碼
  1. <%@page contentType="text/html" pageEncoding="UTF-8"%>  
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
  3.     "http://www.w3.org/TR/html4/loose.dtd">  
  4.   
  5. <html>  
  6.     <head>  
  7.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  8.         <script type="javascript" src="Ajax.js"></script>        
  9.     </head>  
  10.     <body>  
  11.         <h1>Test Ajax</h1><p>  
  12.         <form action="" method="get" name="form">  
  13.             <br>  
  14.             輸入用戶名:  
  15.             <input type="text" size="10" maxlength="8" id="userName" name="name" onblur="validate()">  
  16.             <span id="info"></span>  
  17.             <br>  
  18.             輸入商品名:  
  19.             <input type="text" size="10" maxlength="8" >  
  20.         </form>  
  21.     </body>  
  22. </html>  

 
       

2、Ajax.js文件聲明瞭一系列函數,用於完成向表單與servlet的中接處理。 


2.1、函數validate()要點: 

        2.1.1、通過document.getElementById(String id)獲取表單中有特定id值的輸入框的值,即獲取用戶輸入的用戶名。 

        2.1.2、聲明一個變量url,存放要訪問的servlet:"validate.do?id=" + escape(idField.value),問號?後面表示在url後添加一個值,這個值在validate.do這個servlet中可以通過request.getParameter("id")來獲取。

Js代碼  收藏代碼
  1. var url = "validate.do?id=" + escape(idField.value);  

  

       2.1.3、 通過if()語句以兼容IE,Firefox等多個瀏覽器版本的方式創建一個XMLHttpRequest對象。

Java代碼  收藏代碼
  1. if(window.XMLHttpRequest) {  
  2.     //IE7, Firefox, Opera支持  
  3.     req = new XMLHttpRequest();  
  4. }else if(window.ActiveXObject) {  
  5.     //IE5,IE6支持  
  6.     req = new ActiveXObject("Microsoft.XMLHTTP");  
  7. }  

 

       2.1.4、調用XMLHttpRequest對象函數open()準備向servlet發送請求(此時只是“準備發送”,並沒有發送)

Js代碼  收藏代碼
  1. req.open("GET", url, true);  

  

       2.1.5、 調用XMLHttpRequest對象函數send(param)向servlet發送請求。param參數的值null(關於send()方法使用請另外查閱)

Js代碼  收藏代碼
  1. req.send(null);  

 


       2.1.6、調用一個觸發事件onreadystatechange,每當 readyState 改變時,onreadystatechange 函數就會被執行。readyState有5個可能值:0:請求未初始化(在調用open()之前);1:請求已經提出(調用send()之前);2:請求已經發送(這裏通常可以從響應得到內容頭部);3:請求處理中(響應中通常有部分數據可用,但是服務器還沒有完成響應);4:請求已經完成(可以訪問服務器響應並使用它)

Js代碼  收藏代碼
  1. req.onreadystatechange = callback;  

 

2.2、function callback()要點: 

      2.2.1    XMLHttpRequest.status = 200表示服務器已經成功響應。 

                  通過XMLHttpRequest.responseText獲取servlet端的getPrintWriter().write()輸出的響應。得到的值是 一個String類型數據。

Js代碼  收藏代碼
  1. var check = req.responseText;  

 

2.3、通過show()函數輸出結果到標籤標記的位置。

 

完整的Ajax.js文件:

Js代碼  收藏代碼
  1. var req;  
  2. function validate() {  
  3.     //獲取表單提交的內容  
  4.     var idField = document.getElementById("userName");  
  5.     //訪問validate.do這個servlet,同時把獲取的表單內容idField加入url字符串,以便傳遞給validate.do  
  6.     var url = "validate.do?id=" + escape(idField.value);                  
  7.     //創建一個XMLHttpRequest對象req  
  8.     if(window.XMLHttpRequest) {  
  9.         //IE7, Firefox, Opera支持  
  10.         req = new XMLHttpRequest();  
  11.     }else if(window.ActiveXObject) {  
  12.         //IE5,IE6支持  
  13.         req = new ActiveXObject("Microsoft.XMLHTTP");  
  14.     }  
  15.     /* 
  16.      open(String method,String url, boolean )函數有3個參數 
  17.      method參數指定向servlet發送請求所使用的方法,有GET,POST等 
  18.      boolean值指定是否異步,true爲使用,false爲不使用。 
  19.      我們使用異步才能體會到Ajax強大的異步功能。 
  20.      */  
  21.     req.open("GET", url, true);  
  22.     //onreadystatechange屬性存有處理服務器響應的函數,有5個取值分別代表不同狀態  
  23.     req.onreadystatechange = callback;  
  24.     //send函數發送請求  
  25.     req.send(null);                  
  26. }  
  27.   
  28. function callback() {  
  29.     if(req.readyState == 4 && req.status == 200) {  
  30.         var check = req.responseText;  
  31.         show (check);  
  32.     }  
  33. }  
  34.   
  35. function show(str) {  
  36.     if(str == "OK") {  
  37.         var show = "<font color='green'>恭喜!!用戶名可用!</font>";  
  38.         document.getElementById("info").innerHTML = show;  
  39.     }  
  40.     else if( str == "NO") {  
  41.         var show = "<font color='red'>對不起,用戶名不可用!!請重新輸入!</font>";  
  42.         document.getElementById("info").innerHTML = show;  
  43.     }  
  44. }  

 
三、servlet處理: 

      重點1:通過以下幾行代碼設置瀏覽器不進行Ajax處理頁面的緩存(如果出現緩存,將導致一些不可預知的麻煩) 

Java代碼  收藏代碼
  1. response.setContentType("text/html");  
  2. response.setHeader("Cache-Control""no-store");  
  3. response.setHeader("Pragma""no-cache");  
  4. response.setDateHeader("Expires"0);  

 
       重點2:通過request.getParameter()來獲取Ajax傳遞的參數。

Java代碼  收藏代碼
  1. String name = request.getParameter("id");  

 

       重點3:通過response.getWriter().write()向Ajax輸出參數,在Ajax一端通過var check = XMLHttpRequest.responseText獲取參數值。

Java代碼  收藏代碼
  1. if(name.equals("1")) {  
  2.     out.write("OK");  
  3. }  
  4. else {  
  5.     out.write("NO");  
  6. }  

 
完整的servlet代碼:

Java代碼  收藏代碼
  1. package com.model;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10.   
  11. public class DoAjaxServlet extends HttpServlet {  
  12.      
  13.     protected void processRequest(HttpServletRequest request, HttpServletResponse response)  
  14.     throws ServletException, IOException {  
  15.         response.setContentType("text/html;charset=UTF-8");  
  16.         PrintWriter out = response.getWriter();  
  17.         try {  
  18.             response.setContentType("text/html");  
  19.             response.setHeader("Cache-Control""no-store");  
  20.             response.setHeader("Pragma""no-cache");  
  21.             response.setDateHeader("Expires"0);  
  22.             String name = request.getParameter("id");  
  23.             if(name.equals("1")) {  
  24.                 out.write("OK");  
  25.             }  
  26.             else {  
  27.                 out.write("NO");  
  28.             }  
  29.         } finally {   
  30.             out.close();  
  31.         }  
  32.     }   
  33.   
  34.     @Override  
  35.     protected void doGet(HttpServletRequest request, HttpServletResponse response)  
  36.     throws ServletException, IOException {  
  37.         processRequest(request, response);  
  38.     }   
  39.   
  40.     @Override  
  41.     protected void doPost(HttpServletRequest request, HttpServletResponse response)  
  42.     throws ServletException, IOException {  
  43.         processRequest(request, response);  
  44.     }  
  45.   
  46.     @Override  
  47.     public String getServletInfo() {  
  48.         return "Short description";  
  49.     }  
  50.   
  51. }  

 

最後,記得在web.xml配置文件中配置這個servlet:

Xml代碼  收藏代碼
  1. <servlet>  
  2.     <servlet-name>DoAjaxServlet</servlet-name>  
  3.     <servlet-class>com.model.DoAjaxServlet</servlet-class>  
  4. </servlet>  
  5. <servlet-mapping>  
  6.     <servlet-name>DoAjaxServlet</servlet-name>  
  7.     <url-pattern>/validate.do</url-pattern>  
  8. </servlet-mapping>  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章