1. 程式人生 > >JavaWeb筆記-23-ajax請求案例---省市聯動

JavaWeb筆記-23-ajax請求案例---省市聯動

省市聯動

1. 頁面
  <select name="province">
    <option>===請選擇省份===</option>
  </select>
  <select name="city">
    <option>===請選擇城市===</option>  
  </select>

2. ProvinceServlet:
        當頁面載入完畢後馬上請求ProvinceServlet! 
        1)載入china.xml檔案,把所有的省的名稱使用字串傳送給客戶端!

3. 頁面的工作-1
        將省份省份新增到<select name="province">中
        1)獲取ProvinceServlet傳送的字串,使用逗號分隔,得到陣列
        2)迴圈遍歷每個字串(省份的名稱)。
        3)使用每個字串建立一個使用每個字串建立一個<option>元素
        4)將建立的<option>元素新增到<select name="province">這個元素中

4. CityServlet
        當頁面選擇某個省時,請求CityServlet:
        1)得到省份的名稱,載入china.xml檔案,查詢出該省份對應的元素物件!
        2)把這個元素轉換成xml字串,傳送給客戶端

5. 頁面的工作-2
      1)把<select name="city">中的所有子元素刪除,但不要刪除<option>===請選擇城市===</option>
      2)得到伺服器的響應結果:document
      3)獲取所有的<city>子元素,迴圈遍歷,得到<city>的內容
      4)使用每個<city>的內容建立一個<option>元素,新增到<select name="city">

ssld.jsp

//此jsp頁面工作:
    1)從provinceServlet中得到省份,顯示在第一個下拉選擇框中
    2)當第一個選擇框選擇改變時,請求CityServlet,得到對應省份,顯示在第二個下拉選擇框中。


<script type="text/javascript">


/*
   1. a> 在文件載入完畢時傳送請求,
      b> 使用ajax請求ProvinceServlet,得到所有省份名稱。
      c> 顯示在<select name="province"/>中
 */

 //得到XMLHttpRequest
//依次使用三種得到(XMLHttpRequest)方式 function createXMLHttpRequest() { try { return new XMLHttpRequest(); } catch(e) { try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { return new ActiveXObject("Microsoft.XMLHTTP"
); } catch(e) { alert("哥們兒,你用的是什麼瀏覽器啊?"); throw e; } } } } window.onload = function(){ //1.得到XMLHttp //2.開啟連線 //3.傳送請求 //4.註冊監聽器 var XMLHttp = createXMLHttpRequest(); XMLHttp.open("GET","<c:url value='/ProvinceServlet'/>",true) XMLHttp.send(null); XMLHttp.onreadystatechange = function() {//xmlHttp的5種狀態都會呼叫本方法 //雙重判斷:判斷是否為4狀態,而且還要判斷是否為200 if(XMLHttp.readyState == 4 && XMLHttp.status == 200) { // 獲取伺服器的響應內容 var text = XMLHttp.responseText; //分割逗號,返回為陣列 var arr = text.split(","); for(var i = 0; i<arr.length; i++){ //建立元素 var option = document.createElement("option"); //為option設定 value(實際值) 和text(顯示值) option.value = arr[i]; //實際值 option.appendChild(document.createTextNode(arr[i])); //顯示值 將文字節點新增到option中 //將option新增到select中 document.getElementById("pro").appendChild(option); } } }; /* 2. a>在選擇了新的省份時,傳送請求(引數為省名稱),得到xml文件 b>解析xml文件,得到其中所有的<city> c>再得到每個<city>元素的內容,即市名, d>使用市名生成<option>,插入到<select name="city">元素中 */ //給<select name="province">註冊改變監聽。 var proSelect = document.getElementById("pro") //先得到id=pro的元素 proSelect.onchange = function(){ //註冊改變監聽 //ajax四步請求 var XMLHttp = createXMLHttpRequest(); XMLHttp.open("POST", "<c:url value='/CityServlet'/>",true); XMLHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); XMLHttp.send("pname=" + proSelect.value); //將所選省的實際值傳送給被連線的servlet,用於查詢對應城市 XMLHttp.onreadystatechange = function(){ if(XMLHttp.readyState == 4 && XMLHttp.status == 200){ /* 把select中的所有option移除(除了請選擇) */ var citySelect = document.getElementById("c"); // 獲取其所有子元素 var optionEleList = citySelect.getElementsByTagName("option"); // 迴圈遍歷每個option元素,然後在citySelect中移除 while(optionEleList.length > 1) { //子元素的個數如果大於1就迴圈,等於1就不迴圈了! citySelect.removeChild(optionEleList[1]); //總是刪除1下標,因為1刪除了,2就變成1了! } var doc = XMLHttp.responseXML;//得到返回的xml文件 //得到文件中<city>集合 var cityEleList = doc.getElementsByTagName("city"); for(var i = 0; i < cityEleList.length; i++){ //得到集合中每個city var cityEle = cityEleList[i]; var cityName; //獲取元素內容(cityName),處理瀏覽器差異 if(window.addEventListener){ cityName = cityEle.textContent; } else{ cityName = cityEle.text; } //用city建立option,新增到<select name="city">元素中 var option = document.createElement("option"); option.value = cityName; // 建立文字節點 option.appendChild(document.createTextNode(cityName));//把文字節點追加到op元素中 //把option新增到<select>元素中 citySelect.appendChild(option); } } }; }; };
</script> </head> <body> <h1>省市聯動</h1> <select name="province" id="pro"> <option>===請選擇省份===</option> </select> <select name="city" id = "c"> <option>===請選擇城市===</option> </select> </body>

ProvinceServlet


@WebServlet("/ProvinceServlet")
public class ProvinceServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    //載入china.xml檔案,把所有的省的名稱使用字串傳送給客戶端
    //使用dom4j操作xml檔案
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        try {

            // 1)建立解析器
            SAXReader saxReader = new SAXReader();

            InputStream input = this.getClass().getResourceAsStream("/china.xml");

            // 2)呼叫解析器讀方法,得到document    
            Document document = saxReader.read(input);

            /*
             * 查詢所有province的name屬性,得到屬性物件 (使用xpath表示式進行查詢)
             * 
             * 迴圈遍歷,把所有的屬性值連線成一個字串,傳送給客戶端
             */
            List arrList = document.selectNodes("//province/@name");

            //使用StringBuilder儲存由屬性值構成的字串。StringBuilder是一個可變的字元序列。
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < arrList.size(); i++) {
                sb.append(((Attribute) arrList.get(i)).getValue());
                if(i < arrList.size() - 1){
                    sb.append(",");
                }
            }

            //response向客戶端輸出內容
            response.getWriter().print(sb);

        } catch(Exception e) {
            throw new RuntimeException(e);
        }
    }
}

CityServlet

@WebServlet("/CityServlet")
public class CityServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    /*
     * 獲取省份名稱,載入該省對應的<province>元素!
     * 把元素轉換成字串傳送給客戶端
     */
    /*
     * 1. 獲取省份的名稱
     * 2. 使用省份名稱查詢到對應的<province>元素
     * 3. 把<province>元素轉換成字串,傳送!
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");

        //設定text/xml
        response.setContentType("text/xml;charset=utf-8");
        //得到省份名稱
        String pname = request.getParameter("pname");

        try{
            //得到解析器,得到資源流,得到document
            SAXReader saxReader = new SAXReader();
            InputStream input = this.getClass().getResourceAsStream("/china.xml");
            Document document = saxReader.read(input);

            //得到name屬性為pname的元素
            Element proEle = (Element) document.selectSingleNode("//province[@name='" + pname + "']");

            //把proEle元素轉換為字串
            String proStr = proEle.asXML();

            //將字串傳送給客戶端
            response.getWriter().print(proStr);

        }catch(Exception e){
            throw new RuntimeException(e);
        }   
    }
}