1. 程式人生 > >級聯下拉列表 ajax實現(兩種方式)

級聯下拉列表 ajax實現(兩種方式)

案例:設定一個級聯下拉列表,省市區,根據id進行查詢,同屬於同一個省的城市前兩位id相同,屬於同一個市的區前4位id相同

資料庫資料如下(部分):


第一種方式:通過獲取json物件,然後進行解析json物件陣列,動態建立下拉列表

1:Dao程式碼如下:

package com.oracle.dao;

import java.util.List;

import com.oracle.jdbc.util.Dao;
import com.oracle.vo.City;

public class CityDaoImpl implements CityDao {
   //第一種方式的方法,通過id+兩位佔位符獲取 物件,id可以為空
	@Override
	public List<City> getCity(String id) {
		String sql="select id,name from city where id like'"+id+"__'";
		
		return Dao.query(sql,City.class);
	}
   //第二種方式的方法,獲取物件存到list,迴圈取出 連線成html程式碼形式的字串
	@Override
	public String getCities(String id) {
		StringBuffer sb=new StringBuffer();
		List<City>list=Dao.query("select id,name from city where id like'"+id+"__'",City.class);
		for(City l:list){
			sb.append("<option value='"+l.getId()+"'>"+l.getName()+"</option>");
		}
		return sb.toString();
	}

}
2:在servlet中獲取城市的id,返回該id下屬的市或者區,servlet程式碼如下,呼叫dao中方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//獲取id值
		String code=request.getParameter("code");
		//設定編碼
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/plain;charset=utf-8");
		//利用工廠建立dao物件,並呼叫dao方法
		CityDao dao=ServiceFactory.getObject(CityDaoImpl.class);
		List<City>list=dao.getCity(code);
		//通過jackson包的方法,將list物件轉成jason物件,傳回jsp中
		ObjectMapper mapper=new ObjectMapper();		
		String json=mapper.writeValueAsString(list);
		
        response.getWriter().append(json);
	}
3.在jsp檔案中編寫ajax程式碼,實現傳id返資料,程式碼如下
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script  src="js/jquery-1.11.1.js"></script>
<script>
$(function(){
	//初始入口函式
	//初始傳入空字串,自動查出id為兩位的資料,都為省或直轄市
	$.post("city.do",{code:""},function(data){
		//迴圈插入在select中
		for(var i=0;i<data.length;i++){
			$("#province").append($("<option>").val(data[i].id).html(data[i].name));		
		}
		$("#province").change();
	},"json")
	
	
	//設定省change函式
	$("#province").change(function(){
		$.post("city.do",{code:$(this).val()},function(data){
			$("#city").empty();//置空
			for(var i=0;i<data.length;i++){
				
				$("#city").append($("<option>").val(data[i].id).html(data[i].name));		
			}
			$("#city").change();
		},"json")
		
		
	});
	
	
	//設定市change函式
	$("#city").change(function(){
		$.post("city.do",{code:$(this).val()},function(data){
			$("#area").empty();//置空
			for(var i=0;i<data.length;i++){
				
				$("#area").append($("<option>").val(data[i].id).html(data[i].name));		
			}
		},"json")
	});
});
</script>
</head>
<body>
<select style="width:150px" id="province"></select>省
<select style="width:150px" id="city"></select>市
<select style="width:150px" id="area"></select>區
</body>
</html>

第二種方式,通過Dao裡的第二個方法,返回html程式碼形式的 list物件,直接設定在select的html中,可自動生成下拉選單,級聯更新子列表操作同上,不做過多解釋

1:servlet,程式碼如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//取id
		String id=request.getParameter("code");
		//置編碼
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/plain;charset=utf-8");
		//呼叫dao物件的第二個方法,返回htm程式碼字串
		CityDao dao=ServiceFactory.getObject(CityDaoImpl.class);
		String str=dao.getCities(id);
		response.getWriter().append(str);
	}

2:jsp程式碼如下(只有script部分,其他部分同第一個方法相同):
<script>
$(function(){
	
	$.post("city2.do",{code:""},function(data){
		$("#province").html(data);
		$("#province").change();
	})
	
	
	$("#province").change(function(data){
		$.post("city2.do",{code:$(this).val()},function(data){
			$("#city").html(data);
		})
		$("#city").change();
	});
	$("#city").change(function(data){
		$.post("city2.do",{code:$(this).val()},function(data){
			$("#area").html(data);
		})
	});
	
});
</script>

以上兩種方式都可以很好的實現級聯下拉列表的功能,作為自己的學習記錄,同時歡迎大家指出錯誤和可以更好改進的地方,大家一起共同進步~