Ajax + Struts 實現省市聯動詳解

想實現一個省市聯動菜單,斷斷續續研究了好長時間,現在終於通過自己的努力實現了.
過程詳解:
準備工作:
一個XML文件:

xml 代碼
  1. xml version="1.0" encoding="GBK"?>  
  2. <china>  
  3.     <province name="直轄市">  
  4.         <city>北京city>  
  5.         <city>上海city>  
  6.         <city>天津city>  
  7.         <city>重慶city>  
  8.     province>  
  9.     <province name="廣東">  
  10.         <city>廣州city>  
  11.         <city>珠海city>  
  12.         <city>深圳city>  
  13.         <city>東莞city>  
  14.     province>  
  15.     <province name="廣西">  
  16.         <city>桂林city>  
  17.         <city>柳州city>  
  18.         <city>北海city>  
  19.         <city>南寧city>  
  20.     province>  
  21.     <province name="海南">  
  22.         <city>海口city>  
  23.         <city>三亞city>  
  24.     province>  
  25.     <province name="湖北">  
  26.         <city>武漢city>  
  27.         <city>鄂州city>  
  28.         <city>荊州city>  
  29.         <city>十堰city>  
  30.     province>  
  31.     <province name="湖南">  
  32.         <city>長沙city>  
  33.         <city>岳陽city>  
  34.         <city>常德city>  
  35.         <city>張家界city>  
  36.     province>  
  37.     <province name="浙江">  
  38.         <city>杭州city>  
  39.         <city>紹興city>  
  40.         <city>寧波city>  
  41.         <city>台州city>  
  42.     province>  
  43.     <province name="遼寧">  
  44.         <city>瀋陽city>  
  45.         <city>大連city>  
  46.         <city>撫順city>  
  47.         <city>鐵嶺city>  
  48.     province>  
  49. china>  

用一個Java類來解析這個XML文件,我用的是JDOM,實現的功能爲能夠獲取所有省份,和傳入省份的集合(用於Jsp頁面顯示),可以獲取相應的城市集合.

java 代碼
  1. import java.io.FileNotFoundException;   
  2. import java.io.IOException;   
  3. import java.util.ArrayList;   
  4. import java.util.List;   
  5. import org.jdom.Document;   
  6. import org.jdom.Element;   
  7. import org.jdom.JDOMException;   
  8. import org.jdom.input.SAXBuilder;   
  9. public class ReadXml {   
  10.     private Element root = null;   
  11.            
  12.     public ReadXml() throws FileNotFoundException, JDOMException, IOException {   
  13.         super();   
  14.         SAXBuilder sb = new SAXBuilder();//解析器對象   
  15.         Document doc = sb.build(this.getClass().getResourceAsStream("/city.xml"));//綁定文件   
  16.         root = doc.getRootElement();//獲取根元素   
  17.     }   
  18.        
  19.     public List getProvince(){  //獲取省份         
  20.         ArrayList provinceList = new ArrayList();   
  21.         List tempList = root.getChildren();//獲取所有省份節點   
  22.         for(int i=0; i
  23.             Element province=(Element)tempList.get(i);//子節點轉型   
  24.             provinceList.add(province.getAttributeValue("name"));//獲取省份節點屬性內容   
  25.         }   
  26.         return provinceList;           
  27.     }   
  28.        
  29.     public List getCity(String province){   
  30.         ArrayList cityList = new ArrayList();   
  31.         List provincetemplist = root.getChildren();//省份集合   
  32.         for(int i=0; i
  33.             Element provinceElement = (Element)provincetemplist.get(i);   
  34.             if((provinceElement.getAttributeValue("name")).equals(province)){//如果屬性爲傳進來的名稱   
  35.                 List cityTempList = provinceElement.getChildren();//獲取子節點集合   
  36.                 for(int j=0; j//循環   
  37.                     Element cityElement = (Element)cityTempList.get(j);//當前城市節點   
  38.                     cityList.add(cityElement.getTextTrim());//增加城市到集合                      
  39.                 }   
  40.             }   
  41.         }   
  42.         return cityList;   
  43.     }   
  44. }  
準備工作完畢,建一個Struts工程
寫一個Action,用來獲取省份集合
java 代碼
  1. public class GetProvinceAction extends Action {   
  2.        
  3.     public ActionForward execute(ActionMapping mapping, ActionForm form,   
  4.             HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException, JDOMException, IOException {   
  5.         ReadXml rx = new ReadXml();   
  6.         List provinces = rx.getProvince();//獲取省份   
  7.         request.setAttribute("provinces", provinces);//放入request中   
  8.         return mapping.findForward("success");   
  9.     }   
  10. }  

先通過此Action,然後再顯示首頁,這樣省的下拉框裏就有值了.
我先把Struts-Config.XML文件貼出來

xml 代碼
  1. <form-beans>  
  2.     <form-bean name="selectForm" type="com.selectdemo.struts.form.SelectForm" />  
  3. form-beans>  
  4. <action-mappings>          
  5.       
  6.     <action path="/getProvince" type="com.selectdemo.struts.action.GetProvinceAction">  
  7.         <forward name="success" path="/select.jsp"/>  
  8.     action>  
  9.       
  10.     <action path="/select" scope="request" input="/select.jsp" name="selectForm"    
  11.         type="com.selectdemo.struts.action.SelectAction">  
  12.     <forward name="success" path="/getProvince.do" />  
  13. action>  

然後是顯示的JSP頁面

xml 代碼
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean"  prefix="bean"%>  
  3. <%@ taglib uri="http://jakarta.apache.org/struts/tags-html"  prefix="html"%>  
  4. <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>  
  5.   
  6. <html:html>  
  7. <head>  
  8.     <meta http-equiv="pragma" content="no-cache">  
  9.     <meta http-equiv="cache-control" content="no-cache">  
  10.     <title>Insert title heretitle>  
  11. head>  
  12. <script type="text/javascript">  
  13. var xmlHttp;   
  14. // 創建xmlHttp;   
  15. function createXMLHttpRequest(){   
  16.     if(window.ActiveXObject){   
  17.         xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");   
  18.     }else if(window.XMLHttpRequest){   
  19.         xmlHttp = new XMLHttpRequest();   
  20.     }   
  21. }   
  22.   
  23. // 刪除城市選項   
  24. function clearCityList(){   
  25.     var citys = document.getElementById("city");   
  26.     while(citys.childNodes.length > 0){   
  27.         citys.removeChild(citys.childNodes[0]);   
  28.     }   
  29. }   
  30.   
  31. //選項省份時   
  32. function selectProvince(){   
  33.     var province = document.getElementById("province").value;//獲取省份值   
  34.        
  35.     if(province == ""){ //如果爲空,則清空城市選項   
  36.         clearCityList();   
  37.         var citySelect = document.getElementById("city"); //獲取城市select組件   
  38.         var option = document.createElement("option");   
  39.         option.appendChild(document.createTextNode("請選擇城市"));   
  40.         citySelect.appendChild(option);   
  41.         return ; //返回   
  42.     }   
  43.     //服務器處理地址,是一個Servlet   
  44.     var url = "http://localhost:8080/SelelctDemo/servlet/Linkage?province=" + encodeURIComponent(province) + "&ts=" + new Date().getTime();   
  45.     createXMLHttpRequest();//創建xmlHttp對象;   
  46.     xmlHttp.onreadystatechange = handleStateChange; //回調函數   
  47.     xmlHttp.open("GET",url,true);   
  48.     xmlHttp.send(null);   
  49. }   
  50.   
  51. //回調函數   
  52. function handleStateChange(){   
  53.     if(xmlHttp.readyState == 4){   
  54.         if(xmlHttp.status == 200){   
  55.             updateCitysList();   
  56.         }   
  57.     }   
  58. }   
  59.   
  60. //頁面更新城市集合函數   
  61. function updateCitysList(){   
  62.     clearCityList();//首先刪除先前的城市選項   
  63.     var citySelect = document.getElementById("city"); //獲取城市select組件   
  64.     var results = xmlHttp.responseXML.getElementsByTagName("city");//獲取Ajax返回的結果,city爲返回的XML裏的節點   
  65.     var option = null;   
  66.     for(var i=0; i<results.length; i++){           
  67.         option = document.createElement("option");   
  68.         option.appendChild(document.createTextNode(results[i].firstChild.nodeValue));   
  69.         citySelect.appendChild(option);   
  70.     }   
  71. }          
  72. script>  
  73. <body>  
  74.     <html:form action="/select" method="post">  
  75.         <logic:present name="provinces" scope="request">  
  76.             <html:select property="province" styleId="province" onchange="selectProvince();">  
  77.                 <html:option value="">請選擇省份html:option>  
  78.                 <html:options name="provinces" labelName="provinces" />  
  79.             html:select>  
  80.   
  81.             <html:select property="city" styleId="city" style="width:90px">  
  82.                 <html:option value="">請選擇城市html:option>  
  83.             html:select>  
  84.         logic:present>  
  85.         <html:submit>html:submit>  
  86.     html:form>  
  87.     <br/>省份:   
  88.     <logic:present name="province" scope="request">  
  89.         <bean:write name="province" scope="request"/>  
  90.     logic:present>  
  91.     <br/>城市:   
  92.     <logic:present name="city" scope="request">  
  93.         <bean:write name="city" scope="request"/>  
  94.     logic:present>  
  95. body>  
  96. html:html>  
  97.   

下面是按處理Ajax的Servlet

java 代碼
  1. import java.io.IOException;   
  2. import java.io.PrintWriter;   
  3. import java.util.List;   
  4. import javax.servlet.ServletException;   
  5. import javax.servlet.http.HttpServlet;   
  6. import javax.servlet.http.HttpServletRequest;   
  7. import javax.servlet.http.HttpServletResponse;   
  8. import org.jdom.JDOMException;   
  9. import com.selectdemo.tool.ReadXml;   
  10. public class Linkage extends HttpServlet {   
  11.   
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response)   
  13.             throws ServletException, IOException {   
  14.         response.setContentType("text/html;charset=UTF-8");   
  15.         String province = request.getParameter("province"); //獲取參數中的值   
  16.         System.out.println(province);   
  17.         ReadXml rx;   
  18.         List citys = null;   
  19.         try {   
  20.             rx = new ReadXml();   
  21.             citys = rx.getCity(province);   
  22.         } catch (JDOMException e) {            
  23.             e.printStackTrace();   
  24.         }          
  25.         System.out.println(citys.size());   
  26.         //組裝城市選項   
  27.         StringBuffer results = new StringBuffer("<citys>");   
  28.         for(int i=0; i<citys.size(); i++){   
  29.             results.append("<city>");   
  30.             results.append(citys.get(i));   
  31.             results.append("</city>");   
  32.         }   
  33.         results.append("</citys>");   
  34.         response.setContentType("text/xml;");   
  35.         PrintWriter pw = response.getWriter();     
  36.         System.out.println(results.toString());   
  37.         pw.print(results.toString());   
  38.         pw.flush();   
  39.         pw.close();   
  40.     }   
  41.     public void doPost(HttpServletRequest request, HttpServletResponse response)   
  42.             throws ServletException, IOException {   
  43.         doGet(request, response);   
  44.     }   
  45. }  

Servlet處理完後,返回到JSP頁面,會傳給JSP頁面一個XML文檔,以字符串的形式傳過去的,JSP頁面解析這個String,從而增加城市選項的下拉列表

點擊submit後,用一個Action接收,看值傳進來沒有

java 代碼
  1. import javax.servlet.http.HttpServletRequest;   
  2. import javax.servlet.http.HttpServletResponse;   
  3. import org.apache.struts.action.Action;   
  4. import org.apache.struts.action.ActionForm;   
  5. import org.apache.struts.action.ActionForward;   
  6. import org.apache.struts.action.ActionMapping;   
  7. import com.selectdemo.struts.form.SelectForm;   
  8.   
  9. public class SelectAction extends Action {   
  10.   
  11.     public ActionForward execute(ActionMapping mapping, ActionForm form,   
  12.             HttpServletRequest request, HttpServletResponse response) {   
  13.         response.setContentType("text/html;charset=UTF-8");   
  14.         SelectForm sf = (SelectForm)form;   
  15.         String province = sf.getProvince();   
  16.         System.out.println(province);   
  17.         String city = sf.getCity();   
  18.         System.out.println(city);   
  19.         request.setAttribute("province", province);   
  20.         request.setAttribute("city", city);   
  21.         return mapping.findForward("success");   
  22.     }   
  23. }  

這裏,你會發現,傳進來的值會是亂碼,解決亂碼我寫了一個MyActionServlet

java 代碼
  1. import org.apache.struts.action.ActionServlet;   
  2. import javax.servlet.http.HttpServletRequest;   
  3. import javax.servlet.http.HttpServletResponse;   
  4.      
  5. public class MyActionServlet extends org.apache.struts.action.ActionServlet   
  6. {   
  7.     protected void process(HttpServletRequest request, HttpServletResponse response)   
  8.         throws java.io.IOException, javax.servlet.ServletException   
  9.     {   
  10.         request.setCharacterEncoding("UTF-8");   
  11.         super.process(request, response);   
  12.     }   
  13. }  

 

好了,到這裏後,就大功告成了.

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