servlet+jsp/js二種實(shí)現(xiàn)方式:三級聯(lián)動(dòng)(附加demo代碼)

V_1.0 準(zhǔn)備工作:
   #1.創(chuàng)建表 [城市信息表]  [行政區(qū)信息表]

   create table city(
      cid  int,
      cname varchar(200),
      pid  int
   );

   create table qu(
     qid   int,
     qname varchar(200),
     cid  int
   );
  2.制造測試數(shù)據(jù)
     insert into city values(1,"北京市",1); 
     insert into city values(2,"廊坊市",1);
     insert into city values(3,"沈陽市",2);
     insert into city values(4,"大連市",2);
     
     insert into qu values(1,"海淀區(qū)",1);
     insert into qu values(2,"廊坊區(qū)",2);
     insert into qu values(3,"皇姑區(qū)",3);
     insert into qu values(4,"甘井子區(qū)",4);
     
   3.制造實(shí)體類   
V_2.0 省市級聯(lián)
     1. index.jsp  添加findCity,用于將用戶選擇【省編號】通過代理對象發(fā)送到服務(wù)器端,
        并接受結(jié)果,填充城市下拉列表
     2. CityFindServlet:
                     1. 獲得【省編號】
                     2. JDBC獲得當(dāng)前省擁有的所有的城市信息
                     3. 將【城市信息】交給【代理對象】
V_3.0 如何將JAVA中高級類型數(shù)據(jù)交給代理對象進(jìn)行編譯:
   1.所有的編程語言,都擁有8中基本數(shù)據(jù)類型:
             編程語言都需要在內(nèi)存中運(yùn)行躏率,運(yùn)行期間涉及的數(shù)據(jù)特征就必須符合內(nèi)存條的要求。
             所有內(nèi)存廠商浪腐,都只支持8中基本數(shù)據(jù)類型
   2.不同編程語言的基本數(shù)據(jù)類型,彼此之間是可以直接相互編譯                
   3.由于不同編程語言描述各自高級類型時(shí)顿乒,使用描述方式是不同的议街,因此
                不同編程語言之間高級類型是無法直接編譯
   4.javascript如何描述一個(gè)對象:JSON形式
         var cityObj ={cid:"1",cname:"北京",pid:"1"}
   5. java如何描述一個(gè)對象
         City  city = new City();
         city.cid =1;
         city.cname="北京"                  
   6. 為了能夠讓【代理對象】正確編譯高級類型
                    在服務(wù)器端,將JAVA修飾對象格式轉(zhuǎn)變?yōu)镴SON形式格式
V_3.1 城市和行政區(qū)下拉列表級聯(lián):與省市級聯(lián)完全一致
V_4.0 如何實(shí)現(xiàn)真正三表級聯(lián):
  1.上述的兩個(gè)功能中璧榄,都是讀取當(dāng)前下拉表中選中<option>來獲得隸屬于當(dāng)前數(shù)據(jù)的內(nèi)容 
  2.瀏覽器加載下拉列表時(shí)特漩,默認(rèn)情況將下拉列表中第一個(gè)<option>作為默認(rèn)選中項(xiàng)吧雹。
            瀏覽器將當(dāng)前<option value>自動(dòng)賦值給當(dāng)前的下拉列表

代碼:

歡迎頁面:index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
     <script type="text/javascript">
     
       function findCity(){
         var pid = document.getElementById("province").value;  
         if(pid==0){
            alert("請選擇具體的省");
            return;
         }
       
         // 1. 獲得當(dāng)前瀏覽器【代理對象】
        var xmlHttp = new XMLHttpRequest();
        // 2.初始化【代理對象】           
        xmlHttp.open("get","/city/find.do?pid="+pid,true);
        // 3.通知【代理對象】發(fā)送請求
        xmlHttp.send();
        // 4.實(shí)時(shí)監(jiān)控【代理對象】工作狀態(tài),決定何時(shí)讀取服務(wù)器端返回的數(shù)據(jù)
        xmlHttp.onreadystatechange = function (){
                                                   if(xmlHttp.readyState == 4){
         // 5...........................................獲得服務(wù)器端的數(shù)據(jù)   
                                                        var jsonData =  xmlHttp.responseText; //json形式的字符串 "[{},{}]"
                                                        //alert("jsonData "+jsonData);
                                                        // 將JSON形式字符串涂身,轉(zhuǎn)換成一個(gè)真正的JSON形式對象
                                                        //  eval()
                                                        var jsonObj = eval("{"+jsonData+"}");//[cid:xx,cname:xx;cid:xx,cname:xx]
                                                       // alert("jsonObj "+jsonObj);
                                                        //將返回的數(shù)據(jù)雄卷,填充到城市下拉列表--------------start
                                                             //1.將當(dāng)前城市下拉列表原有的<option>銷毀掉
                                                             document.getElementById("city").options.length = 0;
                                                             //2.將新的數(shù)據(jù),生成<option>,并填充到下拉列表
                                                             for(var i=0;i<jsonObj.length;i++){
                                                                  //jsonObj[i].cid
                                                                  //jsonOjb[i].cname
                                                                  //<option value="xxx">顯示內(nèi)容</option>
                                                                  //var optionObj = new Option(顯示內(nèi)容,value);
                                                                  var optionObj = new Option(jsonObj[i].cname,jsonObj[i].cid);
                                                                   document.getElementById("city").options.add(optionObj);
                                                             }
                                                        //將返回的數(shù)據(jù)蛤售,填充到城市下拉列表--------------end                                    
                                                        //此時(shí)城市下拉列表中丁鹉,已經(jīng)有了value,就將這個(gè)value發(fā)送到服務(wù)器端悴能,獲得當(dāng)前城市擁有的行政區(qū)
                                                          findQu();
                                                   }
                                                };
       }
       //根據(jù)城市編號揣钦,查詢對應(yīng)行政區(qū)
       function findQu(){
          var cid = document.getElementById("city").value;  
         if(cid==0){
            alert("請選擇具體的城市");
            return;
         }
       
         // 1. 獲得當(dāng)前瀏覽器【代理對象】
        var xmlHttp = new XMLHttpRequest();
        // 2.初始化【代理對象】           
        xmlHttp.open("get","/qu/find.do?cid="+cid,true);
        // 3.通知【代理對象】發(fā)送請求
        xmlHttp.send();
        // 4.實(shí)時(shí)監(jiān)控【代理對象】工作狀態(tài),決定何時(shí)讀取服務(wù)器端返回的數(shù)據(jù)
        xmlHttp.onreadystatechange = function (){
                                                   if(xmlHttp.readyState == 4){
         // 5...........................................獲得服務(wù)器端的數(shù)據(jù)   
                                                        var jsonData =  xmlHttp.responseText; //json形式的字符串 "[{},{}]"
                                                        //alert("jsonData "+jsonData);
                                                        // 將JSON形式字符串漠酿,轉(zhuǎn)換成一個(gè)真正的JSON形式對象
                                                        //  eval()
                                                        var jsonObj = eval("{"+jsonData+"}");//[qid:xx,1name:xx;qid:xx,qname:xx]
                                                       // alert("jsonObj "+jsonObj);
                                                        //將返回的數(shù)據(jù)冯凹,填充到城市下拉列表--------------start
                                                             //1.將當(dāng)前城市下拉列表原有的<option>銷毀掉
                                                             document.getElementById("qu").options.length = 0;
                                                             //2.將新的數(shù)據(jù),生成<option>,并填充到下拉列表
                                                             for(var i=0;i<jsonObj.length;i++){
                                                                  //jsonObj[i].cid
                                                                  //jsonOjb[i].cname
                                                                  //<option value="xxx">顯示內(nèi)容</option>
                                                                  //var optionObj = new Option(顯示內(nèi)容,value);
                                                                  var optionObj = new Option(jsonObj[i].qname,jsonObj[i].qid);
                                                                   document.getElementById("qu").options.add(optionObj);
                                                             }
                                                        //將返回的數(shù)據(jù)炒嘲,填充到城市下拉列表--------------end                                    
                                                   }
                                                };
       }
     </script>
    <center>
       省<select id="province" onchange="findCity()">
       <option value="0">請選擇</option>
       <option value="1">河北省</option> 
        <option value="2">遼寧省</option> 
     </select><br/>
    城市<select id="city" onchange="findQu()">
        <option value="0">請選擇</option>
     </select> <br/>
  行政區(qū)<select id="qu">
        <option value="0">請選擇</option>
     </select> <br/>   
     
    
    </center>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>CityFindServlet</servlet-name>
    <servlet-class>src.com.bjpowernode.action.CityFindServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>QuFindServlet</servlet-name>
    <servlet-class>src.com.bjpowernode.action.QuFindServlet</servlet-class>
  </servlet>


  <servlet-mapping>
    <servlet-name>CityFindServlet</servlet-name>
    <url-pattern>/city/find.do</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>QuFindServlet</servlet-name>
    <url-pattern>/qu/find.do</url-pattern>
  </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

java代碼1:

package src.com.bjpowernode.action;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import src.com.bjpowernode.entity.City;



public class CityFindServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
             
             String sql="select * from city where pid=?";
             Connection con=null;
             PreparedStatement ps=null;
             ResultSet rs=null;
             List<City> cityList= new ArrayList<City>();
        
            String pid = request.getParameter("pid");
        
            try{
                 Class.forName("com.mysql.jdbc.Driver");
                 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root", "root");
                 ps = con.prepareStatement(sql);                
                 ps.setInt(1, Integer.valueOf(pid));
                 rs=ps.executeQuery();
            }catch(Exception ex){
                ex.printStackTrace();
            }
         
           try{
               while(rs.next()){
                    City city = new City();
                    city.setCid(rs.getInt("cid"));
                    city.setCname(rs.getString("cname"));
                    city.setPid(rs.getInt("pid"));
                    cityList.add(city);
                }
           }catch(Exception ex){
               ex.printStackTrace();
           }
        
           JSONArray jsonData=JSONArray.fromObject(cityList);
          // System.out.println(jsonData);
        
           response.setCharacterEncoding("utf-8");
           PrintWriter out=response.getWriter();
           out.print(jsonData); 
    }

}

java代碼2:

package src.com.bjpowernode.action;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import src.com.bjpowernode.entity.City;



public class CityFindServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
             String sql="select * from city where pid=?";
             Connection con=null;
             PreparedStatement ps=null;
             ResultSet rs=null;
             List<City> cityList= new ArrayList<City>();
            String pid = request.getParameter("pid");
            try{
                 Class.forName("com.mysql.jdbc.Driver");
                 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root", "root");
                 ps = con.prepareStatement(sql);                
                 ps.setInt(1, Integer.valueOf(pid));
                 rs=ps.executeQuery();
            }catch(Exception ex){
                ex.printStackTrace();
            }
           try{
               while(rs.next()){
                    City city = new City();
                    city.setCid(rs.getInt("cid"));
                    city.setCname(rs.getString("cname"));
                    city.setPid(rs.getInt("pid"));
                    cityList.add(city);
                }
           }catch(Exception ex){
               ex.printStackTrace();
           }
           JSONArray jsonData=JSONArray.fromObject(cityList);
           response.setCharacterEncoding("utf-8");
           PrintWriter out=response.getWriter();
           out.print(jsonData); 
    }

}

jar包

下載鏈接:http://note.youdao.com/groupshare/?token=A15DB4EF63DA4FC78B1F53ADE63C8114&gid=27180369
  • mysql-connector-java-5.1.25.jar
  • json-lib-2.3-jdk15.jar
  • commons-collections-3.2.2.jar
  • commons-beanutils-1.3.jar
  • commons-lang-1.0.1.jar
  • ezmorph-1.0.2.jar
  • commons-logging-1.2.jar

搭建環(huán)境

  • eclipse
  • jdk1.8
  • jetty(服務(wù)器)
  • Dynamic Web Module 2.5

第二種js方式實(shí)現(xiàn)三級聯(lián)動(dòng):

注意事項(xiàng):
1宇姚、 需要引入jquery.js 插件。
2夫凸、特別值得注意的是:發(fā)送ajax的時(shí)候一定要加上dataType=“text”或者dataType=“html”浑劳。不加會(huì)出現(xiàn)瀏覽器解析的問題。如果不加
(1) 在Google Chrome中沒有問題夭拌。
(2)在Firefox中不支持魔熏。返回的json數(shù)據(jù)會(huì)成了(Object xmlDocument)

$("#province").change(function(){
    var province = $("#province").val();
    loadCity(province);
    
})
 function loadCity(msg){
     $.ajax({
         url:"/city/find.do?",
         type:"post",
         data:{"pid":msg},
         dataType:'text',
         success:function(data){
             if (data == "[]") {
                    $("#city").empty();
                    $("<option value='0'>請輸入城市</option>").appendTo($("#city"))
                  } else {
                    
                    $("#city").empty();
                    var data = JSON.parse(data);
//                  var data = eval("("+msg+")");
                    /*$("<option value='' selected='selected' >請選擇市</option>").appendTo($("#district_id"));*/
                    for (var i = 0; i < data.length; i++) {
                      $("<option value='" + data[i].cid + "'>" + data[i].cname
                              + "</option>").appendTo($("#city"));
                    }
                    chushihua()
              }
         }
         
     });
 }
$("#city").change(function(){
    var province = $("#city").val();
    loadCity1(province);
    
})
function chushihua(){
    if($("#city").val()!=''){
        
        loadCity1($("#city").val())
    }
}

 function loadCity1(msg){
     $.ajax({
         url:"/qu/find.do",
         type:"post",
         data:{"cid":msg},
         dataType:'html',
         success:function(msg){
             if (msg == "[]") {
                    $("#qu").empty();
                    $("<option value='0'>請輸入城市</option>").appendTo($("#qu"))
                  } else {
                    $("#qu").empty();
                    var data = eval("("+msg+")");
//                  data =  jQuery.parseJSON(msg);
                    /*$("<option value='' selected='selected' >請選擇市</option>").appendTo($("#district_id"));*/
                    for (var i = 0; i < data.length; i++) {
                      $("<option value='" + data[i].qid + "'>" + data[i].qname
                              + "</option>").appendTo($("#qu"));
                    }
              }
         } 
     });
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市啼止,隨后出現(xiàn)的幾起案子道逗,更是在濱河造成了極大的恐慌兵罢,老刑警劉巖献烦,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卖词,居然都是意外死亡巩那,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門此蜈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來即横,“玉大人,你說我怎么就攤上這事裆赵。” “怎么了战授?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵页藻,是天一觀的道長份帐。 經(jīng)常有香客問我废境,道長噩凹,這世上最難降的妖魔是什么栓始? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任幻赚,我火速辦了婚禮禀忆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘落恼。我一直安慰自己箩退,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布佳谦。 她就那樣靜靜地躺著戴涝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钻蔑。 梳的紋絲不亂的頭發(fā)上啥刻,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機(jī)與錄音咪笑,去河邊找鬼可帽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窗怒,可吹牛的內(nèi)容都是我干的映跟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼扬虚,長吁一口氣:“原來是場噩夢啊……” “哼努隙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辜昵,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荸镊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躬存,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡收厨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了优构。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诵叁。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钦椭,靈堂內(nèi)的尸體忽然破棺而出拧额,到底是詐尸還是另有隱情,我是刑警寧澤彪腔,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布侥锦,位于F島的核電站,受9級特大地震影響德挣,放射性物質(zhì)發(fā)生泄漏恭垦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一格嗅、第九天 我趴在偏房一處隱蔽的房頂上張望番挺。 院中可真熱鬧,春花似錦屯掖、人聲如沸玄柏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粪摘。三九已至,卻和暖如春绍坝,著一層夾襖步出監(jiān)牢的瞬間徘意,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工轩褐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椎咧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓灾挨,卻偏偏與公主長得像邑退,于是被迫代替她去往敵國和親竹宋。 傳聞我的和親對象是個(gè)殘疾皇子劳澄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容