• AJAX省市县三级联动的实现


    省市县数据

    本例子中省市县数据保存在MySQL数据库中,部分数据截图如下:

    省市县数据

    从数据库中读取数据

    1. 导入需要的jar包

    所需jar包

    1. 连接池配置文件
    <c3p0-config>
    	<!-- 默认配置,如果没有指定则使用这个配置 -->
    	<default-config>
    		<property name="driverClass">com.mysql.jdbc.Driver</property>
    		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test</property>
    		<property name="user">root</property>
    		<property name="password">数据库密码</property>
    		<property name="checkoutTimeout">30000</property>
    		<property name="idleConnectionTestPeriod">30</property>
    		<property name="initialPoolSize">10</property>
    		<property name="maxIdleTime">30</property>
    		<property name="maxPoolSize">100</property>
    		<property name="minPoolSize">10</property>
    		<property name="maxStatements">200</property>
    		<user-overrides user="test-user">
    			<property name="maxPoolSize">10</property>
    			<property name="minPoolSize">1</property>
    			<property name="maxStatements">0</property>
    		</user-overrides>
    	</default-config>
    </c3p0-config> 
    
    1. JDBCUtils工具类文件

    通用JDBCUtils工具类文件,使用时直接引入

    package org.xueyao.ajax.utils;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import javax.sql.DataSource;
    
    import org.apache.tomcat.jni.Thread;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class JDBCUtils {
    	
    	private static ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
    	
    	//使用ThreadLocal存取删链接对象
    	private static ThreadLocal<Connection> local = new ThreadLocal<>();
    	
    	
    	public static Connection getConnection() throws SQLException{
    		return comboPooledDataSource.getConnection();
    	}
    	
    	public static DataSource getDataSource(){
    		return comboPooledDataSource;
    	}
    	//从ThreadLocal获取链接的方法
    	public static Connection getCurrentConnection() throws SQLException{
    		//先从ThreadLocal获取中
    		Connection connection = local.get();
    		if(connection != null){
    			System.out.println("从local获取数据:"+connection);
    			return connection;
    		}else{
    			//如果没有,在从链接池获取,存入ThreadLocal中
    			Connection conn = comboPooledDataSource.getConnection();
    			System.out.println("从连接池获取数据:"+conn);
    			local.set(conn);
    			return conn;
    		}
    	}
    	//开启事务的方法
    	public static void startTransaction() throws SQLException{
    		Connection connection = getCurrentConnection();
    		System.out.println(connection);
    		connection.setAutoCommit(false);
    	}
    	//提交事务的方法
    	public static void commit() throws SQLException{
    		Connection connection = getCurrentConnection();
    		System.out.println(connection);
    		connection.commit();
    	}
    	
    	//回滚事务的方法
    	public static void rollback() throws SQLException{
    		Connection connection = getCurrentConnection();
    		System.out.println(connection);
    		connection.rollback();
    	}
    	
    	//释放资源的方法
    	public static void close() throws SQLException{
    		Connection connection = getCurrentConnection();
    		System.out.println(connection);
    		local.remove();
    		connection.close();
    	}
    	
    }
    
    1. 创建JavaBean文件
    package org.xueyao.ajax.domain;
    
    public class Province {
    	private int codeid;
    	private int parentid;
    	private String cityName;
    	public int getCodeid() {
    		return codeid;
    	}
    	public void setCodeid(int codeid) {
    		this.codeid = codeid;
    	}
    	public int getParentid() {
    		return parentid;
    	}
    	public void setParentid(int parentid) {
    		this.parentid = parentid;
    	}
    	public String getCityName() {
    		return cityName;
    	}
    	public void setCityName(String cityName) {
    		this.cityName = cityName;
    	}
    	@Override
    	public String toString() {
    		return "Province [codeid=" + codeid + ", parentid=" + parentid
    				+ ", cityName=" + cityName + "]";
    	}
    	
    	
    }
    
    1. 创建Servlet文件,获取省市县数据
    package org.xueyao.ajax.linkage;
    
    import java.io.IOException;
    import java.sql.SQLException;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    import org.xueyao.ajax.domain.Province;
    import org.xueyao.ajax.utils.JDBCUtils;
    
    import flexjson.JSONSerializer;
    
    public class GetDataServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		int parentid = Integer.parseInt(request.getParameter("parentid"));
    		String sql = "SELECT * FROM province WHERE parentid=?";
    		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
    		try {
    			List<Province> list = qr.query(sql, new BeanListHandler<Province>(Province.class), parentid);
    			//System.out.println(list);
    			
    			//将list集合转换成json格式字符串
    			JSONSerializer jsonSerializer = new JSONSerializer();
    			String serialize = jsonSerializer.serialize(list);
    			//System.out.println(serialize);
    			
    			//向页面输入字符串数据
    			response.setContentType("text/html;charset=utf-8");
    			response.getWriter().write(serialize);
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	protected void doPost(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }
    

    从页面显示三级联动

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
    <c:set var="root" value="${pageContext.request.contextPath }"></c:set>
    <!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>省市县页面</title>
    <script type="text/javascript" src="js/jquery-1.8.3.js"></script>
    <script type="text/javascript">
    $(function() {
        //获得三个下拉菜单元素
    	var $pro = $("#province");
    	var $city = $("#city");
    	var $area = $("#area");
    	
    	$.get(
    		"${root}/getData?parentid=0",
    		function(data) {
    			//alert(data);
                //遍历数据
    			$(data).each(function(){
    				//创建option标签,并追加到省级菜单中
    				$pro.append("<option value='"+this.codeid+"'>"+this.cityName+"</option>");
    			}); 
    		},"json");
    	//省级菜单选择事件
    	$pro.change(function(){
            //清空市县菜单中数据,保留第一个属性
    		$city.prop("length",1);
    		$area.prop("length",1);
    
    		$.get(
    			"${root}/getData?parentid="+this.value,
    			function(data) {
    				$(data).each(function() {
    					$city.append("<option value='"+this.codeid+"'>"+this.cityName+"</option>");
    				});
    			},"json");
    	});
        //市级菜单选择事件
    	$city.change(function(){
            //清空县菜单中数据,保留第一个属性
    		$area.prop("length",1);
    		$.get(
    				"${root}/getData?parentid="+this.value,
    				function(data) {
    					$(data).each(function(){
    						$area.append("<option value='"+this.codeid+"'>"+this.cityName+"</option>");
    					});
    				},"json");				
    	});
    
    	
    });
    </script>
    </head>
    <body>
    	<center>
    		<select id="province" name="province">
    			<option value="none">--请选择省--</option>
    		</select>
    		<select id="city" name="city">
    			<option value="none">--请选择市--</option>
    		</select>
    		<select id="area" name="area">
    			<option value="none">--请选择县--</option>
    		</select>
    	</center>
    </body>
    </html>
    

    上面的javascript代码可以优化成这样:

    function loadData(value, ele){
    	$.get(
    			"${root}/getData?parentid="+value,
    			function(data) {
    				//遍历数据
    				$(data).each(function(){
    					//创建option标签,追加到菜单中
    					ele.append("<option value='"+this.codeid+"'>"+this.cityName+"</option>");
    				}); 
    			},"json");
    }
    $(function() {
    	var $pro = $("#province");
    	//加载省和直辖市数据
    	loadData(0,$pro);
    	//加载市
    	$("#city,#area").change(function () {
    		// 清空原来的数据
    		$(this).nextAll().prop("length",1);
    		loadData(this.value, $(this).next());
    
    	});
    	
    });
    

    效果图如下:

    ajax三级联动效果图

    代码托管于GitHub

  • 相关阅读:
    GIT更改clone方式 ;GIT的SSH配置
    关于web性能测试的一些总结
    pyinstaller 打包selenium程序后,消除chromdriver 控制台黑框
    pyinstaller 打包exe 遇到的坑
    jenkins 新增节点的3种方式
    class
    python 语法糖
    模块 subprocess
    模块 re
    模块 logging
  • 原文地址:https://www.cnblogs.com/loveyous/p/7523060.html
Copyright © 2020-2023  润新知