JSP mysql SpringMvc下中国省市县三级联动下拉框

关键词

  JSP  mysql数据库  SpringMvc  ajax   Controller层  Service层  中国地区  省市县  三级联动  下拉框选择

摘要

  因项目需要,写了一个省市县三级联动下拉框,省市县数据由mysql数据库调用,实现联动查询选择省市县后,将数据返回目标数据表,并且可以查看选择结果。

  功能:项目要求可以新增货编辑商品收件人信息,其中省市县信息可以下拉逐级选择

  基本思路:加载jsp页面时,通过java Controller层和Service层,调用获取全部省份,显示省份下拉框;选择省份后,通过change事件调用ajax,通过java Controller层和Service层,找到目标省份下的所有城市,并将数据返回给前台,市下拉框出现对应城市;选择城市后,通过change事件调用ajax,通过java Controller层和Service层,找到目标城市下的劝募县,并将数据返回给前台,县下拉框出现对应县;选择县后,保存数据,并将数据传回mysql数据表union_shop.sql;同考虑一些可能出现的bug;

  为了突出主题内容,以下只贴出主要代码块,供大家参考,个人认为重点难点在于数据传出传入,以及避免市县重名的情况;欢迎大家相互交流!

正文

  效果展示,如图:

  jsp部分:主要进行页面展示,文件名--unionshop_edit.jsp,对应java Controller层提到的mv.setViewName()的路径

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html lang="en">
<head>
<base href="<%=basePath%>">
/*javascript放在这里*/
</head>
<body>
<form action="unionshop/rest/save.do" name="Form" id="Form" method="post" enctype="multipart/form-data" onsubmit="return save();">
<input type="hidden" name="id" id="id" value="${pd.id}"/>">
<table id="table_report" class="table noline">
<tr>
          
<td style="width:90px;text-align: right;padding-top: 13px;"><em>*</em>所在省:</td>
<td>
            //以下显示省份下拉框
<select name="addr_province" class="addr_province" id="addr_province" >
<c:if test="${pd.addr_province != null && pd.addr_province != ''}"><option value="${pd.addr_province}" selected="selected">${pd.addr_province}</option></c:if>//数据库有对应数据时(即编辑或查看该条数据),显示对应数据
<c:if test="${pd.addr_province == null || pd.addr_province == ''}"><option value="请选择省份">请选择省份</option></c:if> //数据库没有对应数据时(即新建一个项目数据),显示“请选择省份”
//生成全部省份下拉框
              <c:choose>
<c:when test="${not empty addr_province}">
<c:forEach items="${addr_province}" var="var" varStatus="vs">
<option value="${var.region_name}" >${var.region_name}</option>
</c:forEach>
</c:when>
</c:choose>
</select>
</td>
<td style="width:90px;text-align: right;padding-top: 13px;"><em>*</em>所在城市:</td>
<td>
            //以下显示城市信息
<select name="addr_city" class="addr_city" id="addr_city" >
<c:if test="${pd.addr_city != null && pd.addr_city != ''}"><option value="${pd.addr_city}" selected="selected">${pd.addr_city}</option></c:if>
<c:if test="${pd.addr_city == null || pd.addr_city == ''}"><option value="请选择城市">请选择城市</option></c:if>
              /*这里对应的城市option标签是由JavaScript动态生成*/
</select>
</td> </tr>
<tr>
<td style="width:90px;text-align: right;padding-top: 13px;"><em>*</em>所在区县:</td>
//以下显示县信息
<td>
<select name="addr_county" class="addr_county" id="addr_county" >
<c:if test="${pd.addr_county != null && pd.addr_county != ''}"><option value="${pd.addr_county}" selected="selected">${pd.addr_county}</option></c:if>
<c:if test="${pd.addr_county == null || pd.addr_county == ''}"><option value="请选择县">请选择县</option></c:if>
               /*这里对应的县option标签有JavaScript自动生成*/
</select>
</td>
<td style="width:90px;text-align: right;padding-top: 13px;"><em>*</em>地址详情:</td>
<td><input type="text" name="addr_detail" id="addr_detail" value="${pd.addr_detail}" maxlength="32" placeholder="请输入地址详情" title="地址详情"/></td>
</tr>
<tr>
<td style="text-align: center;" colspan="10">
<button id="saveBtn" class="btn btn-primary" type="submit" style="width:100px">保存</button> //保存提交数据,触发form表头的onsubmit时间
</td> </tr> </table> </div> </form> </body> </html> 

  JavaScript部分:实现数据交互

<script type="text/javascript">

    //保存
function save(){
//以下是当用户未选择省市县是,提醒用户
if($("#addr_province").val()=="" || $("#addr_province").val()=="请选择省份"){
popupTip('addr_province', '请选择省份');
return false;
}
if($("#addr_city").val()=="" || $("#addr_city").val()=="请选择城市"){
popupTip('addr_city', '请选择城市');
return false;
}
if($("#addr_county").val()=="" || $("#addr_county").val()=="请选择县"){
popupTip('addr_county', '请选择县');
return false;
}
return true //返回TRUE后,提交数据到后台
} function popupTip(field, msg){
$("#"+field).tips({
side:3,
msg:msg,
bg:'#AE81FF',
time:2
});
$("#field").focus();
} /* 选择省份,并展示城市 */
$(".addr_province").change(function(){
var addr_province=$(this).val();
if(addr_province=="请选择省份"){
$(".addr_city").empty();
$(".addr_country").empty();
return false;
}
$(".addr_city").empty();
$(".addr_county").empty();
var ajaxObject={
url:"unionshop/rest/goSelectCity",
data:{
region_name:addr_province
},
success:function (data) {
var str="<option>请选择城市</option>";
for(var i=0;i<data.data.length;i++){
str=str+"<option value="+data.data[i].region_name+">"+data.data[i].region_name+"</option>";
}
$(".addr_city").html(str);
},
fail:function(){console.log("fail")},
error:function(){console.log("error")},
}
ajaxPost(ajaxObject);
})
/* 选择城市,并展示县*/
$(".addr_city").change(function(){
var addr_city=$(this).val();
if(addr_city=="请选择城市"){
alert("请选择城市");
$(".addr_county").empty();
return false;
}
var addr_province=$(".addr_province").val(); //通过省份 城市双选 确保县范围正确(避免同名市县情况)
$(".addr_county").empty();
var ajaxObject={
url:"unionshop/rest/goSelectCounty",
data:{
addr_province:addr_province,
region_name:addr_city
},
success:function (data) {
var str="<option>请选择县</option>";
for(var i=0;i<data.data.length;i++){
str=str+"<option value="+data.data[i].region_name+">"+data.data[i].region_name+"</option>";
}
$(".addr_county").html(str);
console.log(data.data.length);
console.log(data.data[0].region_name);
},
fail:function(){console.log("fail")},
error:function(){console.log("error")},
}
ajaxPost(ajaxObject);
})
$(".addr_county").change(function(){
var addr_county=$(this).val();
if(addr_county=="请选择县"){
alert("请选择县");
return false;
} }) </script>

  java:controller层,后台接收数据

package com.fh.controller.youbao.information.unionshop;

/*import ……*/ 

@Controller
@RequestMapping(value="/unionshop")
public class UnionShopController extends BaseController { String menuUrl = "unionshop/list.do"; //菜单地址(权限用)
@Resource(name="unionshopService")
private UnionShopService unionshopService; /**
* rest新增
*/
/* @RequestMapping(value="/rest/save" , method=RequestMethod.POST ,
produces="application/json;charset=UTF-8")*/
@RequestMapping(value="/rest/save")
@ResponseBody
public ModelAndView restSave(@RequestParam Map<String, Object> params) throws Exception{ PageData pd = new PageData();
pd.putAll(params); //保存数据
unionshopService.save(pd);
return list(this.getPage()); } /**
* 通过省份确认城市
*/
@RequestMapping(value="/rest/goSelectCity" , method=RequestMethod.POST ,
produces="application/json;charset=UTF-8")
@ResponseBody
public String goSelectCity(@RequestBody Map<String,String> map) throws Exception{
PageData pd = new PageData();
pd.putAll(map);
pd.put("parent_id", 1);
//获取省份id
PageData provinceInfor=unionshopService.confirmByRegionNameAndParentId(pd);
int province_id=Integer.parseInt(String.valueOf(provinceInfor.get("region_id"))); //获取目标省份下的所有city
PageData thisProvince = new PageData();
thisProvince.put("parent_id", province_id);
List<PageData> addr_city = unionshopService.findByParentId(thisProvince);
return ResponseMessageEnum.SUCCESS.appendPageDataListToString(addr_city); //该步骤将目标省份下 的城市信息转化为String格式传给ajax的success函数的data形参
} /**
* 通过省份,城市确认县城
*/
@RequestMapping(value="/rest/goSelectCounty" , method=RequestMethod.POST ,
produces="application/json;charset=UTF-8")
@ResponseBody
public String goSelectCounty(@RequestBody Map<String,String> map) throws Exception{ //获取省份id
PageData pd_province = new PageData();
pd_province.put("parent_id", "1");
pd_province.put("region_name", String.valueOf(map.get("addr_province")));
PageData provinceInfor=unionshopService.confirmByRegionNameAndParentId(pd_province);
int province_id=Integer.parseInt(String.valueOf(provinceInfor.get("region_id"))); //获取城市id
PageData pd_city= new PageData();
pd_city.put("parent_id", province_id);
pd_city.put("region_name", String.valueOf(map.get("region_name")));
PageData cityInfor=unionshopService.confirmByRegionNameAndParentId(pd_city);
int city_id=Integer.parseInt(String.valueOf(cityInfor.get("region_id"))); //获取目标城市下的所有县
PageData thisCity = new PageData();
thisCity.put("parent_id", city_id);
List<PageData> addr_county = unionshopService.findByParentId(thisCity);
return ResponseMessageEnum.SUCCESS.appendPageDataListToString(addr_county); //将目标城市下的县数据返回给ajax
} /**
* 去新增页面,跳转到我们上面提到的jsp界面
*/
@RequestMapping(value="/goAdd")
public ModelAndView goAdd(){
ModelAndView mv = this.getModelAndView();
PageData pd = new PageData();
PageData pdlist = new PageData();
pd = this.getPageData();
try {
//获取全部省份数据
pdlist.put("parent_id", 1);
List<PageData> addr_province = unionshopService.findByParentId(pdlist);
mv.addObject("addr_province",addr_province);
mv.addObject("pdlist", pdlist); mv.setViewName("information/unionshop/unionshop_edit");
mv.addObject("msg", "save");
mv.addObject("pd", pd);
} catch (Exception e) {
logger.error(e.toString(), e);
}
return mv;
} /**
* 去编辑页面,跳转到我们前面提到的jsp界面
*/
@RequestMapping(value="/goEdit")
public ModelAndView goEdit(){
logBefore(logger, "去修改UnionShop页面");
ModelAndView mv = this.getModelAndView();
PageData pd = new PageData();
PageData pdlist = new PageData();
pd = this.getPageData();
try {
//获取全部省份数据
pdlist.put("parent_id", 1);
List<PageData> addr_province = unionshopService.findByParentId(pdlist);
mv.addObject("addr_province",addr_province);
mv.addObject("pdlist", pdlist); pd = unionshopService.findById(pd); //根据ID读取该条数据,包括省市县
mv.setViewName("information/unionshop/unionshop_edit");
mv.addObject("msg", "edit");
mv.addObject("pd", pd);
} catch (Exception e) {
logger.error(e.toString(), e);
}
return mv;
}
}

    java:service层

package com.fh.service.information.unionshop;

@Service("unionshopService")
public class UnionShopService { @Resource(name = "daoSupport")
private DaoSupport dao; /*
* 新增
*/
public void save(PageData pd)throws Exception{
dao.save("UnionShopMapper.save", pd);
} /*
* 修改
*/
public void edit(PageData pd)throws Exception{
dao.update("UnionShopMapper.edit", pd);
} /*
*列表
*/
public List<PageData> list(Page page)throws Exception{
return (List<PageData>)dao.findForList("UnionShopMapper.datalistPage", page);
} /*
*查找省份
*/
public List<PageData> findByParentId(PageData pd)throws Exception{
return (List<PageData>)dao.findForList("UnionShopMapper.findByParentId", pd);
} /*
* 通过id获取数据
*/
public PageData findById(PageData pd)throws Exception{
return (PageData)dao.findForObject("UnionShopMapper.findById", pd);
}
/*
* 通过省份选择城市
*/
public PageData confirmByRegionNameAndParentId(PageData pd)throws Exception{
return (PageData)dao.findForObject("UnionShopMapper.confirmByRegionNameAndParentId", pd);
} }

    XML:mysql数据操作指令

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="UnionShopMapper"> <!-- 新增-->
<insert id="save" parameterType="pd">
insert into union_shop(
addr_province,
addr_city,
addr_county,
addr_detail ) values (
#{addr_province},
#{addr_city},
#{addr_county},
#{addr_detail} )
</insert> <!-- 修改 -->
<update id="edit" parameterType="pd">
update union_shop
set addr_province = #{addr_province},
addr_city = #{addr_city},
addr_county = #{addr_county},
addr_detail = #{addr_detail}
id = id
where
id = #{id}
</update> <!-- 通过id获取数据 -->
<select id="findById" parameterType="pd" resultType="pd">
select * from
union_shop
where
id = #{id}
</select> <!-- 通过省份选城市 -->
<select id="confirmByRegionNameAndParentId" parameterType="pd" resultType="pd">
select * from
region
where
region_name = #{region_name} and parent_id=#{parent_id}
</select>
</mapper>

  mysql文件:中国省市县全部数据信息,文件名--region.sql链接:http://files.cnblogs.com/files/wobuchifanqie/region-mysql.rar;部分内容如下:

  mysql文件:项目接收选择后的省市县具体数据 ,文件名--union_shop.sql,如图:

 

结论

  本人新手一枚,对我而言,难点在于数据如何交互,以及处理用户一些奇葩操作(比如重新选择,不选择等情况),主要集中在JavaScript部分;,还有要考虑省市县出现同名的情况

  写于此,2017-04-20-下午;备用

项目总结01:JSP mysql SpringMvc下中国省市县三级联动下拉框的更多相关文章

  1. springmvc下的省市县三级联动

    转自:https://blog.csdn.net/rentian1/article/details/77662635

  2. 用jquery写的json省市县三级联动下拉

    <form action="#" name="myform"> <label>省</label><select nam ...

  3. 用jsp实现省市区三级联动下拉

    jsp+jquery实现省市区三级联动下拉 不少系统都需要实现省市区三级联动下拉,像人口信息管理.电子商务网站.会员管理等,都需要填写地址相关信息.而用ajax实现的无刷新省市区三级联动下拉则可以改善 ...

  4. PHP用ajia代码写三级联动下拉

    下面是我做三级联动下拉的步骤以及逻辑 第一步:先做一个省市区表格 第二步:建个PHP页面显示用我是在<body>里放<div>用来接收要显示的省市区表格信息,里面嵌入jquer ...

  5. ajax三级联动下拉菜单

    ajax写三级联动,先写一个文件类吧,以后用的时候直接调用即可: 来找一张表: 实现: 中国地域的三级联动:省.市.区: 图: 说一下思路: (1)当用户选择省份的时候触发事件,把当前的省份的id通过 ...

  6. Android实现三级联动下拉框 下拉列表spinner

    Android实现(省.市.县)三级联动下拉框 下拉列表spinner 转载请注明出处: http://www.goteny.com/articles/2013/11/46.html http://w ...

  7. Web 1三级联动 下拉框 2添加修改删除 弹框

    Web  三级联动 下拉框 using System; using System.Collections.Generic; using System.Linq; using System.Web; u ...

  8. JS年月日三级联动下拉框日期选择代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. jquery+html三级联动下拉框

    jquery+html三级联动下拉框及详情页面加载时的select初始化问题   html写的三个下拉框,如下: <select name="ddlQYWZYJ" id=&q ...

随机推荐

  1. JEECG前后端分离UI框架实战抢先体验(ng2-admin+Angular4+AdminLTE+WebStorm)

    JEECG前后端分离UI框架 (ng2-admin+Angular4+AdminLTE) 关键词: ng2-admin.Angular4.AdminLTE.Nodejs.Jeecg JEECG紧跟技术 ...

  2. Excel快捷生成想要的xml或text

    1.新建一个xml格式的A.xml文本,里面有4条以上的内容,注意哦,里面的元素与Excel里面的标题列数是一直的,不然会少了对应的某列数据.如: 2.打开Excel——>新建一个sheetl— ...

  3. SourceTree commit information window消失解决办法

    https://answers.atlassian.com/questions/15282793/sourcetree-how-to-show-commit-information-panel 执行命 ...

  4. 一个Tparams小测试

    var aParams: TParams; aPar: TParam; I:Integer; begin aParams := TParams.Create(nil); aPar := aParams ...

  5. 【BUG记录】记一次游戏越来越卡的BUG

    U3D的MOBA项目,测试过程中,10分钟以后,游戏帧率开始缓慢下降,约3-5分钟后,由60帧下降到小于10帧,编辑器模式. 打开profiler,看到CPU占用非常高,每帧都有24K的GC, 时间占 ...

  6. 在JSP页面中导入jstl标签库

    1 在工程中引用JSTL的两个jar包和标签库描述文件. (1)在项目上右击,从弹出的快捷键菜单中选择Properties命令,在出现的项目属性对话框上,选择DeploymentAssembly. ( ...

  7. html中,纯数字或纯英文的一串字符超出父容器不会折行显示,如何解决?

    这种情况在软件使用过程中一般不会出现,只有测试人员在测试的时候手比较贱会给你弄一个这种数据,当然这也算是bug吧. 如图:“经营范围”的值严重超出父容器长度,并且没有像“服务信息”一样折行显示.这种情 ...

  8. Java复习 之流

    在Java程序中 对于数据的输入/输出操作以“流”方式进行:提供了各种各样的流类,用以获取各种不同的种类的数据,程序中通过标准的方法输入或输出数据 Inputstream 例子1: 但是中文会乱码 应 ...

  9. HBase 1.2.6 完全分布式集群安装部署详细过程

    Apache HBase 是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,是NoSQL数据库,基于Google Bigtable思想的开源实现,可在廉价的PC Server上搭建大规模结构化存 ...

  10. ansj

    Ansj中文分词使用教程 Ansj中文分词使用教程:https://blog.csdn.net/a822631129/article/details/52331202 ansj分词史上最详细教程:ht ...