servlet+jsp/js二种实现方式:三级联动(附加demo代码)

V_1.0 准备工作:
   #1.创建表 [城市信息表]  [行政区信息表]

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

   create table qu(
     qid   int,
     qname varchar(200),
     cid  int
   );
  2.制造测试数据
     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,"海淀区",1);
     insert into qu values(2,"廊坊区",2);
     insert into qu values(3,"皇姑区",3);
     insert into qu values(4,"甘井子区",4);
     
   3.制造实体类   
V_2.0 省市级联
     1. index.jsp  添加findCity,用于将用户选择【省编号】通过代理对象发送到服务器端,
        并接受结果,填充城市下拉列表
     2. CityFindServlet:
                     1. 获得【省编号】
                     2. JDBC获得当前省拥有的所有的城市信息
                     3. 将【城市信息】交给【代理对象】
V_3.0 如何将JAVA中高级类型数据交给代理对象进行编译:
   1.所有的编程语言,都拥有8中基本数据类型:
             编程语言都需要在内存中运行,运行期间涉及的数据特征就必须符合内存条的要求。
             所有内存厂商,都只支持8中基本数据类型
   2.不同编程语言的基本数据类型,彼此之间是可以直接相互编译                
   3.由于不同编程语言描述各自高级类型时,使用描述方式是不同的,因此
                不同编程语言之间高级类型是无法直接编译
   4.javascript如何描述一个对象:JSON形式
         var cityObj ={cid:"1",cname:"北京",pid:"1"}
   5. java如何描述一个对象
         City  city = new City();
         city.cid =1;
         city.cname="北京"                  
   6. 为了能够让【代理对象】正确编译高级类型
                    在服务器端,将JAVA修饰对象格式转变为JSON形式格式
V_3.1 城市和行政区下拉列表级联:与省市级联完全一致
V_4.0 如何实现真正三表级联:
  1.上述的两个功能中,都是读取当前下拉表中选中<option>来获得隶属于当前数据的内容 
  2.浏览器加载下拉列表时,默认情况将下拉列表中第一个<option>作为默认选中项。
            浏览器将当前<option value>自动赋值给当前的下拉列表

代码:

欢迎页面: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. 获得当前浏览器【代理对象】
        var xmlHttp = new XMLHttpRequest();
        // 2.初始化【代理对象】           
        xmlHttp.open("get","/city/find.do?pid="+pid,true);
        // 3.通知【代理对象】发送请求
        xmlHttp.send();
        // 4.实时监控【代理对象】工作状态,决定何时读取服务器端返回的数据
        xmlHttp.onreadystatechange = function (){
                                                   if(xmlHttp.readyState == 4){
         // 5...........................................获得服务器端的数据   
                                                        var jsonData =  xmlHttp.responseText; //json形式的字符串 "[{},{}]"
                                                        //alert("jsonData "+jsonData);
                                                        // 将JSON形式字符串,转换成一个真正的JSON形式对象
                                                        //  eval()
                                                        var jsonObj = eval("{"+jsonData+"}");//[cid:xx,cname:xx;cid:xx,cname:xx]
                                                       // alert("jsonObj "+jsonObj);
                                                        //将返回的数据,填充到城市下拉列表--------------start
                                                             //1.将当前城市下拉列表原有的<option>销毁掉
                                                             document.getElementById("city").options.length = 0;
                                                             //2.将新的数据,生成<option>,并填充到下拉列表
                                                             for(var i=0;i<jsonObj.length;i++){
                                                                  //jsonObj[i].cid
                                                                  //jsonOjb[i].cname
                                                                  //<option value="xxx">显示内容</option>
                                                                  //var optionObj = new Option(显示内容,value);
                                                                  var optionObj = new Option(jsonObj[i].cname,jsonObj[i].cid);
                                                                   document.getElementById("city").options.add(optionObj);
                                                             }
                                                        //将返回的数据,填充到城市下拉列表--------------end                                    
                                                        //此时城市下拉列表中,已经有了value,就将这个value发送到服务器端,获得当前城市拥有的行政区
                                                          findQu();
                                                   }
                                                };
       }
       //根据城市编号,查询对应行政区
       function findQu(){
          var cid = document.getElementById("city").value;  
         if(cid==0){
            alert("请选择具体的城市");
            return;
         }
       
         // 1. 获得当前浏览器【代理对象】
        var xmlHttp = new XMLHttpRequest();
        // 2.初始化【代理对象】           
        xmlHttp.open("get","/qu/find.do?cid="+cid,true);
        // 3.通知【代理对象】发送请求
        xmlHttp.send();
        // 4.实时监控【代理对象】工作状态,决定何时读取服务器端返回的数据
        xmlHttp.onreadystatechange = function (){
                                                   if(xmlHttp.readyState == 4){
         // 5...........................................获得服务器端的数据   
                                                        var jsonData =  xmlHttp.responseText; //json形式的字符串 "[{},{}]"
                                                        //alert("jsonData "+jsonData);
                                                        // 将JSON形式字符串,转换成一个真正的JSON形式对象
                                                        //  eval()
                                                        var jsonObj = eval("{"+jsonData+"}");//[qid:xx,1name:xx;qid:xx,qname:xx]
                                                       // alert("jsonObj "+jsonObj);
                                                        //将返回的数据,填充到城市下拉列表--------------start
                                                             //1.将当前城市下拉列表原有的<option>销毁掉
                                                             document.getElementById("qu").options.length = 0;
                                                             //2.将新的数据,生成<option>,并填充到下拉列表
                                                             for(var i=0;i<jsonObj.length;i++){
                                                                  //jsonObj[i].cid
                                                                  //jsonOjb[i].cname
                                                                  //<option value="xxx">显示内容</option>
                                                                  //var optionObj = new Option(显示内容,value);
                                                                  var optionObj = new Option(jsonObj[i].qname,jsonObj[i].qid);
                                                                   document.getElementById("qu").options.add(optionObj);
                                                             }
                                                        //将返回的数据,填充到城市下拉列表--------------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/>
  行政区<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

搭建环境

  • eclipse
  • jdk1.8
  • jetty(服务器)
  • Dynamic Web Module 2.5

第二种js方式实现三级联动:

注意事项:
1、 需要引入jquery.js 插件。
2、特别值得注意的是:发送ajax的时候一定要加上dataType=“text”或者dataType=“html”。不加会出现浏览器解析的问题。如果不加
(1) 在Google Chrome中没有问题。
(2)在Firefox中不支持。返回的json数据会成了(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"));
                    }
              }
         } 
     });
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容