ajax案例之二级联动json版

先上效果图:

ajax案例之二级联动json版

前台页面:

<%@ 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>json版二级联动</title>
		<script type="text/javascript">
		//创建ajax对象
		function createAjax(){
			try{
				return new XMLHttpRequest();// 非IE6浏览器,主流浏览器支持的
			}catch(e){
				return new ActiveXObject("Microsoft.XMLHTTP");//IE6浏览器以下创建的核心对象
			}
		}
		// 加载省份
		function loadProvince(){
			// 1.创建ajax核心对象
			var ajax = createAjax();
			// 2.以异步方式发出get请求  true:异步     false:同步
			ajax.open("get","/zq/findParentCitys",true); 
			// 3.监听ajax状态,http响应状态       (注意:必须放在send之前执行)
			ajax.onreadystatechange = function(){
	  			if(ajax.readyState == 4 && ajax.status == 200){  //ajax已经处理完成并且http响应状态是200
					var jsonStr = ajax.responseText;//获取后台返回的json字符串
					var jsonArray = JSON.parse(jsonStr);//json字符串转为json对象
					var parentEle = document.getElementById("parent");//获取省对应的dom对象
					//获取具体的某个json对象
					for(var i=0;i<jsonArray.length;i++){
						//创建元素
						var optionEle = document.createElement("option");//<option></option>
						optionEle.value=jsonArray[i].id;//<option value=1></option>
						optionEle.innerHTML=jsonArray[i].name;//<option value=1>四川省</option>
						parentEle.appendChild(optionEle);//把添加的option元素放到parent对应的dom对象中
					}
				}
			}
			// 4.发出请求
			ajax.send();
		}
		
		//当省份改变的时候,触发该事件
		function changeCity(obj){
			var pid = obj.value;//获取省份的id
			var childEle = document.getElementById("child");//获取子城市的dom对象
			if(pid==-1){
				childEle.innerHTML="<option value='-1'>请选择</option>";
				return;
			}
			// 1.创建ajax核心对象
			var ajax = createAjax();
			// 2.以异步方式发出get请求  true:异步     false:同步
			ajax.open("get","/zq/findChildCityByPid?id="+pid,true);
			// 3.监听ajax状态,http响应状态       (注意:必须放在send之前执行)
			ajax.onreadystatechange = function(){
	  			if(ajax.readyState == 4 && ajax.status == 200){  //ajax已经处理完成并且http响应状态是200
					var jsonStr = ajax.responseText;//获取后台返回的json字符串
					var jsonArr = JSON.parse(jsonStr);//把json字符串转为json对象
					childEle.innerHTML="";//清空
					//获取具体的某个json对象
					for(var i=0;i<jsonArr.length;i++){
						var optionEle = document.createElement("option");
						optionEle.value=jsonArr[i].id;
						optionEle.innerHTML=jsonArr[i].name;
						childEle.appendChild(optionEle);
					}
				}
			}
			// 4.发出请求
			ajax.send();
		}
		loadProvince();
	</script>
	</head>
	<body>
		省:<select id="parent" onchange="changeCity(this)">
			 <option value="-1">请选择</option>
		   </select>
		市:<select id="child">
			 <option value="-1">请选择</option>
		   </select>
	</body>
</html>

后台Controller:

@Controller
public class CityController {
	
	//查找所有的省份
	@RequestMapping("/findParentCitys")
	@ResponseBody
	public List<City> findParentCitys(){
		return CityService.findParentCitys();
	}
	
	//根据省份的id去找对应的市
	@RequestMapping("/findChildCityByPid")
	@ResponseBody
	public List<City> findChildCityByPid(Long id){
		return CityService.findCitysByPid(id);
	}
	
	//方式一:手动拼接json对象
	@RequestMapping("/01")
	@ResponseBody
	public void returnJson01(HttpServletResponse response) throws IOException{
		response.setContentType("text/json;charset=UTF-8");
		response.getWriter().print("{\"id\":1,\"name\":\"张三\"}");
	}
	
	//方式二:利用工具类自动返回json对象
	@RequestMapping("/02")
	@ResponseBody
	public void returnJson02(HttpServletResponse resp) throws IOException{
		resp.setContentType("text/json;charset=UTF-8");
		City city = new City(2L, "成都市", new City(1L, "四川省", null));
		JSON json = JSONSerializer.toJSON(city);
		resp.getWriter().print(json.toString());
	}
	
}

bean类:

public class City {
	private Long id;//城市id
	private String name;//城市名
	private City parent;//父级城市
	public City() {}
	public City(Long id, String name, City parent) {
		super();
		this.id = id;
		this.name = name;
		this.parent = parent;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public City getParent() {
		return parent;
	}
	public void setParent(City parent) {
		this.parent = parent;
	}
	@Override
	public String toString() {
		return "City [id=" + id + ", name=" + name + "]";
	}
}

准备数据:

public class CityService {
	
	private static List<City> parents = new ArrayList<City>();
	private static List<City> childrens = new ArrayList<City>();
	
	/**
	 * 初始化数据
	 */
	static{
		Long id= 1L;
		City parentCity1 = new City(id++,"四川省",null);
		parents.add(parentCity1);
		
		City city = new City(id++,"都江堰市",parentCity1);
		childrens.add(city);
		city = new City(id++,"成都市",parentCity1);
		childrens.add(city);
		city = new City(id++,"绵阳市",parentCity1);
		childrens.add(city);
		city = new City(id++,"内江市",parentCity1);
		childrens.add(city);
		city = new City(id++,"德阳市",parentCity1);
		childrens.add(city);
		
		City parentCity2 = new City(id++,"广东省",null);
		parents.add(parentCity2);
		
		city = new City(id++,"东莞市",parentCity2);
		childrens.add(city);
		city = new City(id++,"广州市",parentCity2);
		childrens.add(city);
		city = new City(id++,"佛山市",parentCity2);
		childrens.add(city);
		city = new City(id++,"深圳市",parentCity2);
		childrens.add(city);
	}
	
	/**
	 * 获取父级城市
	 * @return
	 */
	public static List<City> findParentCitys(){
		return parents;
	}
	
	/**
	 * 根据父级城市id,去找对应的下级城市
	 * @param pid  父级城市id
	 */
	public static List<City> findCitysByPid(Long pid){
		List<City> citys = new ArrayList<City>();
		for (City city : childrens) {
			if(city.getParent().getId().equals(pid)){
				citys.add(city);
			}
		}
		return citys;
	}
	
	public static void main(String[] args) {
		for (City c : findParentCitys()) {
			System.out.println(c);
			List<City> citys = findCitysByPid(c.getId());
			for (City city : citys) {
				System.out.println("=="+city);
			}
		}
	}
	
}