二级联动,实现前一个select下拉框改变,后一个随之改变

今天学习了jQuery中的Ajax,简单的实现一个二级联动的实例,废话不多说,直接上代码

//这是jsp代码
<%@ 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 type="text/javascript" src="jquery2.x/jquery-2.1.3.min.js"></script>
<script type="text/javascript">
//直接调用getProvince()方法,开启整个js语句
	getProvince();
	//创建一个Ajax对象,创建方法在上一篇已经介绍了
	var ajax;
	function getAjax(){
		try{
			ajax=new XMLHttpRequest();
		}catch (e) {
			ajax=new ActiveXObject("Microsoft.XMLHTTP");
		}
		return ajax;
	}
	function getProvince(){
		ajax = getAjax();
		//使用get提交,将url和想要传递到后台的参数进行拼接,便于后台获取数据
		ajax.open("get","/java-9-20day/choose?name=province",true);
		//监听Ajax的状态变化
		ajax.onreadystatechange=function(){
			if(ajax.status==200&&ajax.readyState==4){
				//当Ajax对象状态为4,并且status为200时,responseText接收数据
				var data=ajax.responseText;
				//将接收到的字符串转换成json格式
				var json=JSON.parse(data);
				//循环得到的json数组,将值添加到select中
				for (var i = 0; i < json.length; i++) {
					//创建一个option
					var opt=document.createElement("option");
					var select1=document.getElementById("myselect1");
					//给option的value属性和具体内容赋值
					opt.value=json[i].id;
					opt.innerHTML=json[i].name;
					//将option添加到select中
					select1.append(opt);
				}
			}
		}
		ajax.send();
	}
	
	//当省份选择好了,自动将该省的城市添加到省份后的select中
	//方法的具体实施和上面的基本上差不多,只有略有改动
	function getCity() {
		//获得所选省份的id
		var id = document.getElementById("myselect1").value;
		ajax = getAjax();
		//选择了省份后,将city的下拉框置空
		document.getElementById("myselect2").innerHTML="";
		//拼接想要传过去的参数,id要传过去,servlet通过id找到想要的城市
		ajax.open("get", "/java-9-20day/choose?name=city&cityId=" + id, true);
		//后面的不说了都一样
		ajax.onreadystatechange = function() {
			if (ajax.status == 200 && ajax.readyState == 4) {
				var data = ajax.responseText;
				var json = JSON.parse(data);
				for (var i = 0; i < json.length; i++) {
					var opt = document.createElement("option");
					var select2 = document.getElementById("myselect2");
					opt.value = json[i].id;
					opt.innerHTML = json[i].name;
					select2.append(opt);
				}
			}
		}
		ajax.send();
	}
</script>
</head>
<body>
	省:
	<select id="myselect1" onchange="getCity()">
		<option>---请选择---</option>
	</select> 
	市:
	<select id="myselect2">
		<option>---请选择---</option>
	</select>
</body>
</html>



//这是servlet的代码
package com.coding.province;

import java.io.IOException;
import java.util.List;

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

import net.sf.json.JSON;
import net.sf.json.JSONSerializer;
@WebServlet("/choose")
public class ChooseServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设置响应的字符集,防止乱码
		resp.setContentType("text/html;charset=utf8");
		//得到拼接过来的参数
		String param = req.getParameter("name");
		//判断参数的值是否符合条件
		if (param.equals("province")) {
			//传过来的请求想要省的名称的响应,所以获取省份响应给他
			List<Province> pro = Province.getAllProvince();
			//拼接成一个json数组形式的字符串返回回去
			//就是这个样子[{"id":1,"name":"安徽"},{"id":2,"name":"广东"},{"id":3,"name":"云南"}]
			//纯手动拼接
			StringBuffer sbf1=new StringBuffer();
			sbf1.append("[");
			for (int i = 0; i < pro.size(); i++) {
				if (i==pro.size()-1) {
					sbf1.append("{\"id\":"+pro.get(i).getId()+",\"name\":\""+pro.get(i).getName()+"\"}");
				}else {
					sbf1.append("{\"id\":"+pro.get(i).getId()+",\"name\":\""+pro.get(i).getName()+"\"},");
				}
			}
			
			sbf1.append("]");
			//发送响应
			resp.getWriter().print(sbf1);
		}
		//这是城市的响应
		//导入工具包可以轻松将list转换成json序列,不用进行手动拼接
		else {
			String cityId = req.getParameter("cityId");
			List<City> list = City.getCityByProvinceId(Long.valueOf(cityId));
			JSON json = JSONSerializer.toJSON(list);
			resp.getWriter().print(json);
		}
	}
}


//下面是添加城市和省份的代码
package com.coding.province;

import java.util.ArrayList;
import java.util.List;

public class Province {

	private Long id;
	private String name;

	public Province(Long id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	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 Province() {
		super();
	}

	public static List<Province> getAllProvince() {
		List<Province> provinces = new ArrayList<Province>();
		provinces.add(new Province(1L, "安徽"));
		provinces.add(new Province(2L, "广东"));
		provinces.add(new Province(3L, "云南"));
		return provinces;
	}
}



package com.coding.province;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class City {
	private Long id;
	private String name;

	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() {

	}

	public City(Long id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	/**
	 * 根据省份id查询省份中的城市!
	 * 
	 * @return
	 */
	public static List<City> getCityByProvinceId(Long id) {
		
		List<City> citys = new ArrayList<City>();
		
		if (id == 1) {
			citys = Arrays.asList(
					new City(1L,"合肥"),
					new City(2L,"阜阳"),
					new City(3L,"淮南"),
					new City(4L,"黄山"),
					new City(5L,"宿州"),
					new City(6L,"六安"),
					new City(7L,"蚌埠")
			);
		} else if (id == 2) {
			citys = Arrays.asList(
					new City(11L,"广州"),
					new City(12L,"佛山"),
					new City(13L,"东莞")
			);
		} else if (id == 3) {
			citys = Arrays.asList(
					new City(21L,"昆明"),
					new City(22L,"玉溪"),
					new City(23L,"丽江")
			);
		}
		return citys;
	}
}

将list序列化用到jar包https://download.csdn.net/download/yang_xinqiao/10679729

猜你喜欢

转载自blog.csdn.net/Yang_xinqiao/article/details/82792428