一个完整的Ajax开发示例:二级联动

需求:页面显示两个下拉列表,一个显示省,一个显示市,要求选择省的时候显示对应的市,不选择则后面的下拉列表不显示内容。本案例通过JSP+Servlet+Hibernate+MySQL完成

(1)编写JSP页面

<html>
  <head>
    <title>jsTest</title>
    <!-- 引入js文件 -->
    <script type="text/javascript" src="demo.js"></script>
  </head>
  
  <body>
    <select name="pro" id="pro" οnchange="javascript:selectChange();">
    	<!-- 省份 -->
    	<option value="">--请选择--</option>
    </select>
    <select name="city" id="city">
    	<!-- 城市 -->
    	<option value="">--请选择--</option>
    </select>
  </body>
</html>

(2)构建PO,Pro和City,Pro和City是一对多的关系,

public class Pro {
	private int id;
	private String proName;
	private Set<City> citySet = new HashSet<City>();
	
	public Set<City> getCitySet() {
		return citySet;
	}
	public void setCitySet(Set<City> citySet) {
		this.citySet = citySet;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getProName() {
		return proName;
	}
	public void setProName(String proName) {
		this.proName = proName;
	}
	
}

public class City {
	private int id;
	private String cityName;
	private Pro pro;
	
	
	public Pro getPro() {
		return pro;
	}
	public void setPro(Pro pro) {
		this.pro = pro;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getCityName() {
		return cityName;
	}
	public void setCityName(String cityName) {
		this.cityName = cityName;
	}
	public City(int id, String cityName) {
		super();
		this.id = id;
		this.cityName = cityName;
	}
	public City() {
		super();
		// TODO Auto-generated constructor stub
	}
}

(3)创建PO的配置文件,在此之前要配置Hibernate的主配置文件

<hibernate-mapping package="cn.itcast.domain">
	<class name="Pro" table="t_pro">
		<id name="id" type="integer" column="id">
			<generator class="native"></generator>
		</id>
		<property name="proName" type="string" column="proName"></property>
		<set name="citySet" cascade="save-update">
			<key column="pro_id"></key>
			<one-to-many class="City"/>
		</set>
	</class>
</hibernate-mapping>

<hibernate-mapping package="cn.itcast.domain">
	<class name="City" table="t_city">
		<id name="id" type="integer" column="id">
			<generator class="native"></generator>
		</id>
		<property name="cityName" type="string" column="cityName"></property>
		
		<many-to-one name="pro" class="Pro" column="pro_id"></many-to-one>
	</class>
</hibernate-mapping>

(4)创建测试类添加数据

public class Test {
	
	public static void main(String[] args) {
		save();
	}
	public static void save(){
		Session session = SessionUtils.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		
		try {
			//创建Pro对象
			Pro pro = new Pro();
			pro.setProName("河北");
			City city1 = new City();
			city1.setCityName("石家庄");
			City city2 = new City();
			city2.setCityName("廊坊");
			City city3 = new City();
			city3.setCityName("秦皇岛");
			City city4 = new City();
			city4.setCityName("邯郸");
			City city5 = new City();
			city5.setCityName("保定");
			pro.getCitySet().add(city1);
			pro.getCitySet().add(city2);
			pro.getCitySet().add(city3);
			pro.getCitySet().add(city4);
			pro.getCitySet().add(city5);
			
			Pro pro2 = new Pro();
			pro2.setProName("山东");
			City city6 = new City();
			city6.setCityName("济南");
			City city7 = new City();
			city7.setCityName("日照");
			City city8 = new City();
			city8.setCityName("青岛");
			pro2.getCitySet().add(city6);
			pro2.getCitySet().add(city7);
			pro2.getCitySet().add(city8);
			
			session.save(pro);
			session.save(pro2);
			
			transaction.commit();
		} catch (HibernateException e) {
			transaction.rollback();
			throw new RuntimeException(e.getMessage(),e);
		} 
	}
}

(5)DAO层实现

public class ProDao {
	
	
	/**
	 * 获取所有的省份对象集合
	 * @return
	 */
	public List<Pro> getPro(){
		Session session = SessionUtils.openSession();
		Transaction transaction = session.beginTransaction();
		try {
			Query query = session.createQuery("from Pro");
			List<Pro> list = query.list();
			transaction.commit();
			return list;
		} catch (HibernateException e) {
			transaction.rollback();
			throw new RuntimeException(e.getMessage(),e);
		} finally{
			session.close();
		}
	}
	
	/**
	 * 通过省份名来获取省份对象
	 * @param pro
	 * @return
	 */
	public Pro getProByName(String pro) {
		Session session = SessionUtils.openSession();
		System.out.println(pro);
		Transaction transaction = session.beginTransaction();
		try {
			Query query = session.createQuery("from Pro where proName=?");
			query.setParameter(0, pro);
			Pro pro1 = (Pro) query.uniqueResult();
			transaction.commit();
			return pro1;
		} catch (HibernateException e) {
			transaction.rollback();
			throw new RuntimeException(e.getMessage(),e);
		} finally{
			session.close();
		}
	}

	/**
	 * 通过省份的id来获取各省的城市的信息,城市表的外键指向省份的id
	 * @param id
	 * @return
	 */
	public List<City> getCitysByProId(int id) {
		Session session = SessionUtils.openSession();
		Transaction transaction = session.beginTransaction();
		try {
			Query query = session.createQuery("from City where pro.id=?");
			query.setParameter(0, id);
			List<City> citys = query.list();
			transaction.commit();
			return citys;
		} catch (HibernateException e) {
			transaction.rollback();
			throw new RuntimeException(e.getMessage(),e);
		} finally{
			session.close();
		}
	}
}

(6)Service层实现

public class ProService {
	private ProDao dao = new ProDao();
	public List<Pro> getPro(){
		return dao.getPro();
	}
	public Pro getProByName(String pro) {
		return dao.getProByName(pro);
	}
	public List<City> getCitysByProId(int id) {
		return dao.getCitysByProId(id);
	}
}	

(7)WEB层实现

/**
 * 页面初始化时,获取第一个下拉列表的所有省份的servlet
 * @author Administrator
 *
 */
public class DemoServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		response.setContentType("text/xml");
		PrintWriter out = response.getWriter();
		
		ProService service = new ProService();
		List<Pro> list = service.getPro();
		XStream xst = new XStream();
		xst.alias("province", Pro.class);
		xst.useAttributeFor(Pro.class, "id");
		xst.useAttributeFor(Pro.class, "proName");
		String xml = xst.toXML(list);
		response.getWriter().write(xml);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/xml");
		PrintWriter out = response.getWriter();
		
	}
}


/**
 * 页面初始化时,获取第一个下拉列表的所有省份的servlet
 * @author Administrator
 *
 */
public class DemoServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		response.setContentType("text/xml");
		PrintWriter out = response.getWriter();
		
		ProService service = new ProService();
		List<Pro> list = service.getPro();
		XStream xst = new XStream();
		xst.alias("province", Pro.class);
		xst.useAttributeFor(Pro.class, "id");
		xst.useAttributeFor(Pro.class, "proName");
		String xml = xst.toXML(list);
		response.getWriter().write(xml);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/xml");
		PrintWriter out = response.getWriter();
	}
}

(8)获取HibernateSession的工具类

public class SessionUtils {
	private static SessionFactory sessionFactory = null;
	static {
		sessionFactory = new Configuration().configure().buildSessionFactory();
	}
	public static Session getCurrentSession(){
		return sessionFactory.getCurrentSession();
	}
	public static Session openSession(){
		return sessionFactory.openSession();
	}
}

(9)编写js文件,当打开页面是初始化所有省份,当选择省份时在第二个下拉列表框中显示对应的城市。

//获取XMLHttpRequest对象的方法,此方法是固定方法。
function ajaxFunction(){
	var xmlHttp;
	try{ // Firefox, Opera 8.0+, Safari
		xmlHttp=new XMLHttpRequest();
	}
	catch (e){
		try{// Internet Explorer
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e){
			try{
			   xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e){}
		}
	}
	return xmlHttp;
}

//获取所有的省份的信息,添加到省份的下拉列表中
window.onload = function(){
	//获取对象
	var xmlHttp = ajaxFunction();
	//打开链接
	xmlHttp.open("get","../servlet/DemoServlet",true);
	//发送请求。
	xmlHttp.send(null);
	//接收响应
	xmlHttp.onreadystatechange = function(){
		if(xmlHttp.readyState == 4){
			if(xmlHttp.status == 200){
				var docXml = xmlHttp.responseXML;
				var proXmlElements = docXml.getElementsByTagName("province");
				
				for(var i=0;i<proXmlElements.length;i++){
					var proEle = proXmlElements[i];
					var proValue = proEle.getAttribute("proName");
					
					var option = document.createElement("option");
					option.setAttribute("value",proValue);
					var text = document.createTextNode(proValue);
					option.appendChild(text);
					
					var proElement = document.getElementById("pro");
					proElement.appendChild(option);
				}
			}
		}
	}
}

//点击省份的下拉列表,当列表发生改变时,显示对应省份的城市
var selectChange = function(){
	//每次改变的时候,都要将上次的清除,否则会累加到下面。
	//清除动作。
	var cityObj = document.getElementById("city");
	var cityOptions = cityObj.getElementsByTagName("option");
	for(var i=0;i<cityOptions.length;i++){
		if(cityOptions[i].getAttribute("value")!=null){
			cityObj.removeChild(cityOptions[i]);
		}
		i--;
	}
	var xmlHttp = ajaxFunction();
	var obj = document.getElementById("pro");//定位id
	var index = obj.selectedIndex; // 选中索引
	var proName = obj.options[index].text; // 选中文本
	//var value = obj.options[index].value; // 选中值
	//var proName = currentPro.getAttribute("value");
	//建立连接
	xmlHttp.open("get","../servlet/GetCityServlet?pro="+proName,true);
	//发送请求
	xmlHttp.send(null);
	//接收响应
	xmlHttp.onreadystatechange = function(){
		if(xmlHttp.readyState == 4){
			if(xmlHttp.status == 200){
				//获取响应的xml文本。
				var docXml = xmlHttp.responseXML;
				var cityEles = docXml.getElementsByTagName("city");
				var cityElement = document.getElementById("city");
				
				var oneOption = document.createElement("option");
				oneOption.setAttribute("value","");
				var oneText = document.createTextNode("--请选择--");
				oneOption.appendChild(oneText);
				cityElement.appendChild(oneOption);
				
				for(var i=0;i<cityEles.length;i++){
					var cityEle = cityEles[i];
					var cityValue = cityEle.getAttribute("cityName");
					
					//创建option节点
					var option = document.createElement("option");
					option.setAttribute("value",cityValue);
					//创建option内的文本节点。
					var text = document.createTextNode(cityValue);
					//将文本节点添加到option节点上。
					option.appendChild(text);
					
					//获取jsp中的城市下拉列表的节点,并将创建的option节点添加到select上
					
					cityElement.appendChild(option);
				}
			}
		}
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值