一、搭建环境
1.拷入jar包
2.搭建web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>sun</display-name>
<welcome-file-list>
<welcome-file>area.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
</web-app>
3.搭建application.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 通过扫描带有com.zzu的包,给加了注解(@Component、@Service、@Controller、@Repository)的类创建对象,给加了注解(@Autowired的全局变量创建对象和赋值) -->
<context:component-scan base-package="com.jd"></context:component-scan>
<!-- 配置文件的前缀后缀以跳转到正确的页面 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property><!-- 配置前缀 -->
<property name="suffix" value=".jsp"></property><!-- 配置后缀 -->
</bean>
<!-- 配置数据库连接池 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property><!-- 配置数据库的驱动 -->
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/test"></property><!-- 配置数据库的地址 -->
<property name="username" value="root"></property><!-- 配置数据库的用户名 -->
<property name="password" value="root"></property><!-- 配置数据库的密码 -->
</bean>
<!-- 因为@Autowired自动注入,创建jdbcTemplate对象,这个Spring容器里要有一个jdbcTemplate对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource="#{dataSource}">
</bean>
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
二、实现三级级联
1.代码规范
在工程中的Java Resource文件夹下按照下图搭建,使得代码具有规范性,
(application.xml文件写在com/main/resource中)
2.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
String path = request.getContextPath();
pageContext.setAttribute("path", path);
%>
<!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="${path }/js/jquery-3.3.1.js"></script>
<script type="text/javascript">
function getProvinces(){
var parentCode = "";
var object = {
url:"${path }/area/cascade.do?parentCode="+parentCode,//与Controller层@RequestMapping中的地址对应,寻找到并调用对应的方法
success:function(data){//执行完从Controller层返回出data数据
console.log(data);//打印确认获取到了所有的省份
var options = null;//定义一个变量options
for(var i=0;i < data.length;i++){
var province = data[i];//通过循环方式获取到每一个data[i]的值
options += "<option value=\""+province.code+"\">"+province.name+"</option>"
//通过滚雪球的方式,把所有省份的信息都放入options的值中
}
$("#province").append(options);//将options中的信息放到id为province的select下拉列表中
}
};
$.ajax(object);
}
function getCities(){
var parentCode = $("#province option:selected").val();//获取到用户选中的省份的code
var Object = {
url:"${path }/area/cascade.do?parentCode="+parentCode,
success:function(data){
$("#county").empty();
$("#county").append("<option value=\"\">--请选择县\区--</option>");
var options = "<option value=\"\">--请选择市--</option>";//定义一个变量options
//如果没有这句话,选择完省后触发getCities()方法,执行流执行empty语句将市对应的select下拉列表中的数据清除
for(var i=0;i < data.length;i++){
var province = data[i];//通过循环方式获取到每一个data[i]的值
options += "<option value=\""+province.code+"\">"+province.name+"</option>"
//通过滚雪球的方式,把所有市的信息都放入options的值中
}
$("#city").empty();//先把id为city的select下拉列表中的数据清空,不然重新选择省后还会留有上一个省对应的市
$("#city").append(options);//将options中的信息放到id为city的select下拉列表中
}
};
$.ajax(Object);
}
function getCounties(){
var parentCode = $("#city option:selected").val();//获取到用户选中的市的code
var Object = {
url:"${path }/area/cascade.do?parentCode="+parentCode,
success:function(data){
var options = "<option value=\"\">--请选择县\区--</option>";//定义一个变量options
for(var i=0;i < data.length;i++){
var province = data[i];//通过循环方式获取到每一个data[i]的值
options += "<option value=\""+province.code+"\">"+province.name+"</option>"
//通过滚雪球的方式,把所有县/区的信息都放入options的值中
}
$("#county").empty();//先把id为county的select下拉列表中的数据清空,不然重新选择市后还会留有上一个市对应的县/区
$("#county").append(options);//将options中的信息放到id为county的select下拉列表中
}
};
$.ajax(Object);
}
</script>
</head>
<body onload="getProvinces()">
<select id="province" onchange="getCities()">
<option value="">--请选择省份--</option>
<c:forEach var="province" items="${provinces }">
<option value="${province.code }">${province.name }</option>
</c:forEach>
</select>
<select id="city" onchange="getCounties()">
<option value="">--请选择市--</option>
</select>
<select id="county">
<option value="">--请选择县/区--</option>
</select>
</body>
</html>
3.java代码丰富
IAreaService层
package com.jd.area;
import java.util.List;
import com.jd.vo.Area;
public interface IAreaService {
List<Area> select(String parentCode);
}
IAreaDao层
package com.jd.area;
import java.util.List;
import com.jd.vo.Area;
public interface IAreaDao {
List<Area> select(String parentCode);
}
AreaService层
package com.jd.area.imp;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.jd.area.IAreaDao;
import com.jd.area.IAreaService;
import com.jd.vo.Area;
@Service
public class AreaService implements IAreaService {
@Autowired
private IAreaDao areaDao;
public List<Area> select(String parentCode) {
return areaDao.select(parentCode);//表面上调用的是IAreaDao中的select方法,实际上调用的AreaDao中的select方法(上转型对象)
}
}
AreaDao层
package com.jd.area.imp;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;
import com.jd.area.IAreaDao;
import com.jd.vo.Area;
@Component
public class AreaDao implements IAreaDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Area> select(String parentCode) {//从数据库中查询
String sql = "select * from area where parent_code=?";
return jdbcTemplate.query(sql, new RowMapper<Area>(){
public Area mapRow(ResultSet rs, int arg1) throws SQLException {
String id = rs.getString("id");
String code = rs.getString("code");
String name = rs.getString("name");
String parentCode = rs.getString("parent_code");
return new Area(id, code, name, parentCode);
}
},parentCode);
}
}
AreaController层
package com.jd.area;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.jd.vo.Area;
@Controller
public class AreaController {
@Autowired
private IAreaService areaService;
@ResponseBody
@RequestMapping("/area/cascade.do")
public List<Area> cascade(String parentCode) {
return areaService.select(parentCode);//表面上调用的是IAreaService中的select方法,实际上调用的AreaService中的select方法(上转型对象)
}
}
vo类
package com.jd.vo;
public class Area {
private String id;
private String code;
private String name;
private String parent_code;
public Area(String id, String code, String name, String parent_code) {
super();
this.id = id;
this.code = code;
this.name = name;
this.parent_code = parent_code;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParent_code() {
return parent_code;
}
public void setParent_code(String parent_code) {
this.parent_code = parent_code;
}
}