基于SSM框架实现省市区3级联查

本文详细介绍了如何使用Spring、MyBatis、SpringMVC等技术实现省市区三级联动查询功能,涵盖了核心配置文件设置、数据库操作、前端交互及数据展示全过程。

作者:乔你那熊色
来源:优快云
原文:https://blog.youkuaiyun.com/qq_41160264/article/details/82810128


下面我们就以代码的形式来说一下这个省市区3级联查是如何实现的。

一.Spring的核心配置文件

           我们知道Spring的核心配置文件applicationContext通常放在src目录下,下面就是applicationContext.xml。


 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:jee= "http://www.springframework.org/schema/jee"
  4. xmlns:tx= "http://www.springframework.org/schema/tx" xmlns:aop= "http://www.springframework.org/schema/aop"
  5. xmlns:p= "http://www.springframework.org/schema/p" xmlns:util= "http://www.springframework.org/schema/util"
  6. xmlns:tool= "http://www.springframework.org/schema/tool" xmlns:context= "http://www.springframework.org/schema/context"
  7. xsi:schemaLocation= "http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/tx
  10. http://www.springframework.org/schema/tx/spring-tx.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop.xsd
  13. http://www.springframework.org/schema/jee
  14. http://www.springframework.org/schema/jee/spring-jee.xsd
  15. http://www.springframework.org/schema/context
  16. http://www.springframework.org/schema/context/spring-context.xsd
  17. http://www.springframework.org/schema/util
  18. http://www.springframework.org/schema/util/spring-util.xsd
  19. http://www.springframework.org/schema/tool
  20. http://www.springframework.org/schema/tool/spring-tool.xsd"
  21. default-lazy-init= "false" default-autowire= "byName">
  22. <!-- 配置数据源,指定要操作的数据库 -->
  23. <bean id="basicDataSource" class="org.apache.commons.dbcp.BasicDataSource">
  24. <!-- 数据源的基本属性 -->
  25. <property name="driverClassName" value="com.mysql.jdbc.Driver"> </property>
  26. <property name="url" value="jdbc:mysql://localhost:3306/ssmltl"> </property>
  27. <property name="username" value="root"> </property>
  28. <property name="password" value="root"> </property>
  29. </bean>
  30. <!-- 配置要操作数据库的sessionFactory -->
  31. <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
  32. <!-- <property name="dataSource"> <ref bean="dataSource" /> </property> -->
  33. <property name="dataSource" ref="basicDataSource"> </property>
  34. <property name="configLocation" value="classpath:mybatis.cfg.xml"> </property>
  35. </bean>
  36. <!-- 配置事务管理器 -->
  37. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  38. <!-- 指定事务要操作的数据库 -->
  39. <property name="dataSource" ref="basicDataSource"/>
  40. </bean>
  41. <!-- 配置事务管理器所作用的方法,事务策略-->
  42. <tx:advice id="txAdvice" transaction-manager="txManager">
  43. <tx:attributes>
  44. <tx:method name="get*" read-only="true" />
  45. <tx:method name="find*" read-only="true" />
  46. <tx:method name="load*" read-only="true" />
  47. <tx:method name="select*" read-only="true" />
  48. <tx:method name="add*" propagation="REQUIRED" />
  49. <tx:method name="save*" propagation="REQUIRED" />
  50. <tx:method name="update*" propagation="REQUIRED" />
  51. <tx:method name="del*" propagation="REQUIRED" />
  52. </tx:attributes>
  53. </tx:advice>
  54. <!-- 进行切面和切点的配置 -->
  55. <aop:config proxy-target-class="true">
  56. <!-- 配置切点 -->
  57. <aop:pointcut id="serviceMethod" expression="execution(* service.*.*(..))"/>
  58. <!-- 配置切面 -->
  59. <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
  60. </aop:config>
  61. <!-- 扫描包,发挥注解的作用 ,进行属性注入-->
  62. <context:annotation-config/>
  63. <context:component-scan base-package="com.java"/>
  64. <!--
  65. 空地,用xml的方式来配置bean
  66. -->
  67. </beans>

               在这段代码中,我们配置了数据源,配置要操作数据库的sessionFactory。并且在配置sessionFactory时,指定了sessionFactory操作的数据库和操作数据库的方法。

                   我们也在该文件中配置了事务管理器,用来进行事务管理。配置事务管理器的时候,指定了事务要操作的数据库。

                   下面我们来看一下配置事务时,<tx:advice>标签的作用:

                   我们在<tx:method>标签中,配置了name值,说明为哪一类方法实现了事务管理。 propagation="REQUIRED"代表支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。其中*为通配符,即代表以select为开头的所有方法,即表示符合此命名规则的方法作为一个事务。

                  在配置切面的切点的过程中,切点的作用是为满足条件的所有方法开启事务,但是没有是实现事务,实现事务需要用<tx:method>标签来指明。expression="execution(* service.*.*(..))"  的作用是:service包下的作用类的作用方法(不限返回值类型和方法的参数个数)开启事务。第一个 * 通配符: 任意返回值类型;第二个 * 通配符: 包service  下的任意class;第三个 * 通配符:包service下的任意class的任意方法;第四个 .. :方法可以有0个或多个参数。

                   当然了,我们需要在该文件中扫描所需要的包,发挥注解的作用 ,进行属性注入。

二.Mybatis的核心配置文件

                   mybatis的核心配置文件的位置和名称不是固定的,因为在applicationContext.xml需要引入这个文件,我们只需要把mybatis的核心配置文件路径给applicationContext.xml即可。但是我们通常将它放在src目录下,命名为mybatis.cfg.xml。  


 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 配置要操作数据库的映射文件,映射文件中定义了操作数据库的具体方式(方法) -->
  7. <mappers>
  8. <mapper resource="com/java/entity/ProvinceMapper.xml"> </mapper>
  9. </mappers>
  10. </configuration>

                     在该文件中,我们只引入了mapper.xml,这个文件我们可以认为是操作数据库的方法(sql语句)。

三.springMVC的核心配置文件

                 springMVC的核心配置文件的文件名和存放位置我们也可以自定义,因为这个容器是有web容器进行加载的,我们只需要在web容器中指定做需要加载的  springMVC的核心配置文件的路径即可。但是我们通常将它放在src目录下,命名为springmvc-servlet.xml。  


 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop= "http://www.springframework.org/schema/aop"
  4. xmlns:c= "http://www.springframework.org/schema/c" xmlns:mvc= "http://www.springframework.org/schema/mvc"
  5. xmlns:p= "http://www.springframework.org/schema/p" xmlns:tx= "http://www.springframework.org/schema/tx"
  6. xmlns:util= "http://www.springframework.org/schema/util" xmlns:context= "http://www.springframework.org/schema/context"
  7. xsi:schemaLocation= "http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
  8. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
  9. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
  11. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
  12. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
  13. <!-- 配置handleMapping
  14. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
  15. -->
  16. <!-- 配置HandlerAdapter
  17. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
  18. -->
  19. <!-- springmvc上传图片 -->
  20. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  21. <property name="defaultEncoding" value="utf-8"> </property>
  22. <property name="maxUploadSize" value="10485760000"> </property>
  23. <property name="maxInMemorySize" value="40960"> </property>
  24. </bean>
  25. <!-- 用于将对象转为JSON -->
  26. <bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
  27. <property name="supportedMediaTypes">
  28. <list>
  29. <value>text/plain;charset=UTF-8 </value>
  30. </list>
  31. </property>
  32. </bean>
  33. <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> </bean>
  34. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  35. <property name="messageConverters">
  36. <list>
  37. <ref bean="stringConverter"/>
  38. <ref bean="jsonConverter"/>
  39. </list>
  40. </property>
  41. </bean>
  42. <!-- 对模型视图添加前后缀
  43. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
  44. p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
  45. -->
  46. <!-- 扫描包,发挥注解的作用,并把生成的bean放到springmvc容器中-->
  47. <context:component-scan base-package="com.java.Controller"/>
  48. </beans>

                      在这里最重要的就是配置了 用于将对象转为JSON  的功能(JSON转换器)。我们需要导入 jackson-annotations-*.jar , jackson-core-.jar , jackson-databind-.jar。

四.web.xml

              上述的spring的核心配置文件和springmvc的核心配置文件之所以位置和名称可以自定义,就是因为在web.xml中已经指定了这两个文件所在的位置,关于这个文件,代码如下:


 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3. xmlns= "http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation= "http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <!-- 该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。
  8. param-name 设定上下文的参数名称。必须是唯一名称
  9. param-value 设定的参数名称的值
  10. -->
  11. <context-param>
  12. <param-name>contextConfigLocation </param-name>
  13. <param-value>classpath:applicationContext.xml </param-value>
  14. </context-param>
  15. <listener>
  16. <listener-class>org.springframework.web.context.ContextLoaderListener </listener-class>
  17. </listener>
  18. <servlet>
  19. <servlet-name>DisplayChart </servlet-name>
  20. <servlet-class>
  21. org.jfree.chart.servlet.DisplayChart <!--这个固定不变-->
  22. </servlet-class>
  23. </servlet>
  24. <servlet-mapping>
  25. <servlet-name>DisplayChart </servlet-name>
  26. <url-pattern>/DisplayChart </url-pattern>
  27. </servlet-mapping>
  28. <servlet>
  29. <servlet-name>springmvc </servlet-name>
  30. <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
  31. <!-- 指定位置加载springmvc配置文件 -->
  32. <init-param>
  33. <param-name>contextConfigLocation </param-name>
  34. <param-value>classpath:springmvc-servlet.xml </param-value>
  35. </init-param>
  36. <load-on-startup>1 </load-on-startup>
  37. </servlet>
  38. <servlet-mapping>
  39. <servlet-name>springmvc </servlet-name>
  40. <url-pattern>*.action </url-pattern>
  41. </servlet-mapping>
  42. <!-- 乱码过滤器 begin -->
  43. <filter>
  44. <filter-name>encodingFilter </filter-name>
  45. <filter-class>org.springframework.web.filter.CharacterEncodingFilter </filter-class>
  46. <init-param>
  47. <param-name>encoding </param-name>
  48. <param-value>UTF-8 </param-value>
  49. </init-param>
  50. <init-param>
  51. <param-name>forceEncoding </param-name>
  52. <param-value>true </param-value>
  53. </init-param>
  54. </filter>
  55. <filter-mapping>
  56. <filter-name>encodingFilter </filter-name>
  57. <url-pattern>/* </url-pattern>
  58. </filter-mapping>
  59. <!-- 乱码过滤器 end -->
  60. <welcome-file-list>
  61. <welcome-file>index.jsp </welcome-file>
  62. </welcome-file-list>
  63. </web-app>

五.index.jsp

                 在配置文件完成后,我们就可以着手功能代码了。我们先来介绍一下index.jsp,也就是用来显示3级联查的页面。


 
  1. <%@ page language="java" import="com.java.utils.*" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. <%
  4. String path = request.getContextPath();
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. System.out.println(basePath);
  7. %>
  8. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  9. <html>
  10. <head>
  11. <!-- <base href="<%=basePath%>"> -->
  12. <script type="text/javascript" src="js/jquery-1.11.0.min.js"> </script>
  13. <title>My JSP 'index.jsp' starting page </title>
  14. <meta http-equiv="pragma" content="no-cache">
  15. <meta http-equiv="cache-control" content="no-cache">
  16. <meta http-equiv="expires" content="0">
  17. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  18. <meta http-equiv="description" content="This is my page">
  19. <!--
  20. <link rel="stylesheet" type="text/css" href="styles.css">
  21. -->
  22. <script type="text/javascript">
  23. function show_1(){
  24. $.ajax({
  25. url: 'province/selectAll.action',
  26. type: 'post',
  27. data:{ 'typeId': 0},
  28. dataType: 'json',
  29. //成功回调函数的参数data是一个json数组,长度是json数组里面的对象的个数。
  30. success: function(data){
  31. /*
  32. alert(data);
  33. alert(JSON.stringify(data));
  34. */
  35. console.log( JSON.stringify(data));
  36. console.log(data.length);
  37. var t= "<option value='0'>----请选择省----</option>";
  38. for( var i= 0;i<data.length;i++){
  39. t+= "<option value="+data[i].provinceId+ ">"+data[i].provinceName+ "</option>";
  40. //<option value=1>liaoning</option><option value=1>heilongjiang</option>
  41. }
  42. $( "#p").html(t);
  43. }
  44. })
  45. }
  46. function show_2(){
  47. var provinceId=$( "#p").val();
  48. $.ajax({
  49. url: 'province/selectAllCity.action',
  50. type: 'post',
  51. data:{ 'provinceId':provinceId},
  52. dataType: 'json',
  53. success: function(data){
  54. var t= "<option value='0'>----请选择城市----</option>";
  55. for( var i= 0;i<data.length;i++){
  56. t+= "<option value="+data[i].cityId+ ">"+data[i].cityName+ "</option>"
  57. }
  58. $( "#c").html(t);
  59. },
  60. error: function(data){
  61. alert( "查询城市失败了!");
  62. }
  63. })
  64. }
  65. function show_3(){
  66. var cityId=$( "#c").val();
  67. $.ajax({
  68. url: 'province/selectAllArea.action',
  69. type: 'post',
  70. data:{ "cityId":cityId},
  71. dataType: 'json',
  72. success: function(data){
  73. alert(data);
  74. console.log( JSON.stringify(data));
  75. var t= "<option value='0'>----请选择市区----</option>";
  76. for( var i= 0;i<data.length;i++){
  77. t+= "<option value="+data[i].areaId+ ">"+data[i].areaName+ "</option>"
  78. }
  79. $( "#a").html(t);
  80. }
  81. })
  82. }
  83. function text_1(){
  84. $.ajax({
  85. url: 'TextResponseBody/text.action',
  86. type: 'post',
  87. dataType: 'json',
  88. success: function(data){
  89. /*
  90. alert(data);
  91. alert(JSON.stringify(data));
  92. */
  93. console.log( JSON.stringify(data));
  94. console.log(data.length);
  95. var t= "<option value='0'>----请选择省----</option>";
  96. for( var i= 0;i<data.length;i++){
  97. t+= "<option value="+data[i].provinceId+ ">"+data[i].provinceName+ "</option>";
  98. //<option value=1>liaoning</option><option value=1>heilongjiang</option>
  99. }
  100. $( "#p").html(t);
  101. }
  102. })
  103. }
  104. </script>
  105. </head>
  106. <!-- onload页面加载之后立即执行一段 JavaScript
  107. 包含有onchange事件的标签在发生改变时会触发已经绑定的函数。
  108. JSONObject.fromObject()方法。
  109. -->
  110. <body onload="show_1()">
  111. <!-- 请选择你要查询的省份:<input type="text" name="selectProvince"/>
  112. <br/>
  113. -->
  114. <select id="p" onchange="show_2()"> </select>
  115. <select id="c" onchange="show_3()"> <option value='0'>----请选择城市---- </option> </select>
  116. <select id="a" > <option value='0'>----请选择市区---- </option> </select>
  117. </body>
  118. </html>

                  要想使用ajax,那么必须要导入jquery.js文件。里面定义了3个show方法,这3个方法分别查询数据库中的省,市,区。我们通过字符串的拼接(包括标签),然后将所拼接的字符串通过html方法放到所需要的标签中来显示信息。

                   在这个文件中,在body标签中有一个onload="show_1()"属性,这个属性的作用是当页面加载完成后,自动执行js中的函数show_1()方法,它和$(function(){  }); 的作用是相似的。

                    在select标签中还有一个onchange()方法。onchange()方法的作用是当这个属性所在的标签发生改变时,就会执行这个方法中的js函数。例如select标签,我们选中不同的元素时,那么select标签的value值发生改变,就会执行对应的函数。有如:让input输入框中有这个标签时,只要输入框中的值发生改变时,那么就会执行onchange()方法中的js函数。

                    在这个文件中,成功回调函数接收到的是一个json数组。我们如果直接alert(data),那么提示的会是多个Object类型的数据,我们可以通过JSON.stringify(data)方法来将数据进行解析,然后通过console.log()方法,就可以将数据打印到前台控制台。                                                                   我们可以看到有这么一行代码:String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

                   输出basePath我们可以得到:http://localhost:8080/SSMLTL/。通过打印我们可以知道,request.getScheme()可以得到请求该页面用到的协议。request.getServerName()可以得到请求的主机名。request.getServerPort()可以得到请求的端口号。而path就是我们已经得到的项目名。注意path得到的是  /+项目名,所以端口号和path拼接的时候,不用在拼接 “/”。

六.Controller

                   我们通过url 访问指定的Controller的指定方法。


 
  1. package com.java.Controller;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Map;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.RequestParam;
  11. import org.springframework.web.bind.annotation.ResponseBody;
  12. import com.java.service.ProvinceService;
  13. import com.java.utils.ToJson;
  14. @Controller
  15. @RequestMapping( "/province")
  16. public class ProvinceController {
  17. //将service对象注入到controller中
  18. @Autowired
  19. private ProvinceService provinceService;
  20. public ProvinceService getProvinceService() {
  21. return provinceService;
  22. }
  23. //通过注解注入好像有没有set方法都可以?
  24. public void setProvinceService(ProvinceService provinceService) {
  25. this.provinceService = provinceService;
  26. }
  27. @RequestMapping( "/selectAll")
  28. @ResponseBody
  29. //挑选全部的省份信息
  30. public void selectAll(HttpServletRequest request,HttpServletResponse response,
  31. @RequestParam("typeId") int typeId) {
  32. List<Map<String, Object>> list= new ArrayList<Map<String, Object>>();
  33. try {
  34. list=provinceService.selectAll(typeId);
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. ToJson.toJson(list, request, response);
  39. }
  40. @RequestMapping( "/selectAllCity")
  41. @ResponseBody
  42. //挑选全部的城市信息
  43. public void selectAllCity(HttpServletRequest request,HttpServletResponse response,
  44. @RequestParam("provinceId") int provinceId) {
  45. List<Map<String, Object>> list= new ArrayList<Map<String, Object>>();
  46. try {
  47. list=provinceService.selectAllCity(provinceId);
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. }
  51. ToJson.toJson(list, request, response);
  52. }
  53. @RequestMapping( "/selectAllArea")
  54. @ResponseBody
  55. //挑选全部的区信息
  56. public void selectAllArea(HttpServletRequest request,HttpServletResponse response,
  57. @RequestParam("cityId") int cityId) {
  58. List<Map<String, Object>> list= new ArrayList<Map<String, Object>>();
  59. try {
  60. list=provinceService.selectAllArea(cityId);
  61. } catch (Exception e) {
  62. e.printStackTrace();
  63. }
  64. System.out.println(list);
  65. ToJson.toJson(list, request, response);
  66. }
  67. //==============================================================================================
  68. public static void main(String[] args) {
  69. ProvinceController a= new ProvinceController();
  70. a.selectAll( null, null, 3);
  71. }
  72. /*hou:[{areaName=和平区, areaId=1}, {areaName=铁西区, areaId=2}, {areaName=沈河区, areaId=3}]
  73. qian:[{"areaId":1,"areaName":"和平区"},{"areaId":2,"areaName":"铁西区"},{"areaId":3,"areaName":"沈河区"}]
  74. * */
  75. }

                     @RequestMapping注解括号内的值就是我们要访问的路径。通过  @RequestParam 来将前台对应的参数给方法参数。 @ResponseBody  一会我转发一篇博客,那么将会有详细介绍。

                         这里用到了一个toJson工具方法,代码如下:


 
  1. package com.java.utils;
  2. import java.io.PrintWriter;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import com.alibaba.fastjson.JSON;
  8. public class ToJson {
  9. /**
  10. * 方法功能:将对象转换成JSON字符串,并响应回前台
  11. * 参数:object,request,response
  12. * 返回值:void
  13. * 异常:IOException
  14. */
  15. public static void toJson(Object object,HttpServletRequest request,HttpServletResponse response) {
  16. //Object 类型可以接收list集合,集合也是一个对象,对象拥有类型,Object是所有类型的父类。
  17. Object obj= new ArrayList();
  18. /*PrintWriter打印字符流、用于将各种java数据一字符串的形式打印到底层字符输出流中
  19. * */
  20. PrintWriter out = null;
  21. try {
  22. //JSON.toJSONStringWithDateFormat用于序列化信息。
  23. String json = JSON.toJSONStringWithDateFormat(object, "yyyy-MM-dd HH:mm:ss");
  24. /*response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览
  25. *器内不同的程序嵌入模块来处理相应的数据。例如web浏览器就是通过MIME类型来判断文件是GIF图片。通过MIME类型来处
  26. *理json字符串。
  27. * */
  28. response.setContentType( "text/html;charset=utf-8");
  29. //得到一个打印字符输出流
  30. out = response.getWriter();
  31. //[{"areaId":1,"areaName":"和平区"},{"areaId":2,"areaName":"铁西区"},{"areaId":3,"areaName":"沈河区"}]
  32. System.out.println(json);
  33. //要通过字符输出流来向前台输出数据
  34. out.write(json);
  35. out.flush();
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. } finally {
  39. if (out != null) {
  40. out.close();
  41. }
  42. }
  43. }
  44. }

                       这个小Demo是我从网上下的,然后自己重新写了一遍,做了一点更改,也将自己不懂的记录起来。这里看到一个集合容器竟然用Object类型来接收,心想,一个容器怎么可以用对象类型来接收呢?后来又一想:集合也是一个对象,是对象就拥有类型,而Object是所有类型的父类,所以能接收。

                       PrintWriter打印字符流,用于将各种java数据 —— 字符串的形式打印到底层字符输出流中。

                      response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。例如web浏览器就是通过MIME类型来判断文件是GIF图片。通过MIME类型来处理json字符串。  而MIME类型简单来说就是文本数据的类型。

                      在传数据的时候,传进来的是一个list集合,其中是对象,但是经过:

String json = JSON.toJSONStringWithDateFormat(object, "yyyy-MM-dd HH:mm:ss");

 这行代码,这个对象集合就变成了Json对象数组。这里有有点不理解,既然这能做到,那在spring中配置Json转换器还有什么用?没有它同样可以将对象集合就变成了Json对象数组。

                      通过write()方法来向前台返回数据。

七.Service

                   下面是service实现类部分代码,service接口这里就省略不写了。


 
  1. package com.java.service;
  2. import java.util.List;
  3. import java.util.Map;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import com.java.dao.ProvinceDao;
  7. @Service( "/provinceService")
  8. public class ProvinceServiceImpl implements ProvinceService {
  9. @Autowired
  10. private ProvinceDao provinceDao;
  11. public ProvinceDao getProvinceDao() {
  12. return provinceDao;
  13. }
  14. public void setProvinceDao(ProvinceDao provinceDao) {
  15. this.provinceDao = provinceDao;
  16. }
  17. //挑选全部的省份信息
  18. @Override
  19. public List<Map<String, Object>> selectAll( int typeId) {
  20. List<Map<String, Object>> list=provinceDao.selectAll(typeId);
  21. return list;
  22. }
  23. //挑选全部的城市信息
  24. @Override
  25. public List<Map<String, Object>> selectAllCity( int provinceId) {
  26. List<Map<String, Object>> list=provinceDao.selectAllCity(provinceId);
  27. return list;
  28. }
  29. //挑选全部的地区信息
  30. @Override
  31. public List<Map<String, Object>> selectAllArea( int cityId) {
  32. List<Map<String, Object>> list=provinceDao.selectAllArea(cityId);
  33. return list;
  34. }
  35. }

  八.dao

                这里呢,我们不适用代理的方式,我们直接实现dao接口,编写它的实现类。下面是dao实现类的代码,同样的dao接口这里我们也省略不贴代码了。


 
  1. package com.java.dao;
  2. import java.util.List;
  3. import java.util.Map;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Repository;
  8. @Repository( "/provinceDao")
  9. public class ProvinceDaoImpl implements ProvinceDao{
  10. @Autowired
  11. private SqlSessionFactory sqlSessionFactory; //因为采用mybatis所以SqlSessionFactory
  12. public SqlSessionFactory getSqlSessionFactory() {
  13. return sqlSessionFactory;
  14. }
  15. //通过sqlSessionFactory工厂来获得操作数据库的sqlSession对象
  16. public SqlSession getSqlSession(){
  17. return sqlSessionFactory.openSession();
  18. }
  19. public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
  20. this.sqlSessionFactory = sqlSessionFactory;
  21. }
  22. //挑选全部的省份信息
  23. @Override
  24. public List<Map<String, Object>> selectAll( int typeId) {
  25. SqlSession sqlSession= this.getSqlSession();
  26. //通过sqlSession来调用框架自带的方法查询
  27. List<Map<String, Object>> list=sqlSession.selectList( "selectAll",typeId);
  28. return list;
  29. }
  30. //挑选全部的城市信息
  31. @Override
  32. public List<Map<String, Object>> selectAllCity( int provinceId) {
  33. SqlSession sqlSession= this.getSqlSession();
  34. List<Map<String, Object>> list=sqlSession.selectList( "selectAllCity",provinceId);
  35. return list;
  36. }
  37. //挑选全部的地区信息
  38. @Override
  39. public List<Map<String, Object>> selectAllArea( int cityId) {
  40. SqlSession sqlSession= this.getSqlSession();
  41. List<Map<String, Object>> list=sqlSession.selectList( "selectAllArea",cityId);
  42. return list;
  43. }
  44. }

九.Mapper.xml

               我们已经通过sqlSession调用方法来查询数据库,那么我们就需要在mapper中定义查询数据库的sql语句,并且这个sql语句所在标签的id 值要和daoImpl中的索引值一致。


 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <!-- 这就相当于一个Dao的实现类一样,并指定实现哪一个Dao接口
  5. <mapper namespace="com.java.dao.ProvinceDao">
  6. -->
  7. <mapper namespace="com.java.entity.Province">
  8. <!--如果引入的xml文件中有相同的id值,就会发生异常。selectAll在映射语句集合中是含糊不清的(尝试使用包括名称空间在内的全名,或者重命名其中一个条目
  9. selectAll is ambiguous in Mapped Statements collection (try using the full name including the namespace, or rename one of the entries
  10. -->
  11. <!--
  12. <resultMap id="province" type="com.java.entity.Province" >
  13. <result column="provinceId" property="provinceId" jdbcType="INTEGER" javaType="int"/>
  14. <result column="provinceName" property="provinceName" jdbcType="VARCHAR" javaType="string"/>
  15. <result column="typeId" property="typeId" jdbcType="INTEGER" javaType="int"/>
  16. </resultMap>
  17. -->
  18. <!-- 挑选全部的省份信息 -->
  19. <select id="selectAll" parameterType="int" resultType="com.java.entity.Province">
  20. select provinceId,provinceName from t_province
  21. </select>
  22. <!-- 挑选全部的城市信息 -->
  23. <select id="selectAllCity" parameterType="int" resultType="java.util.Map">
  24. select cityId,cityName from t_city where provinceId=#{provinceId}
  25. </select>
  26. <!-- 挑选全部的城市信息 -->
  27. <select id="selectAllArea" parameterType="int" resultType="java.util.Map" >
  28. select areaId,areaName from t_area where cityId=#{cityId}
  29. </select>
  30. </mapper>

                   每回namespace中我们写的都是dao接口的权限定名,但是这次却写什么都可以,因为我们已经实现了dao接口,所以namespace我们可以把它当做命名空间。如果不同的mapper.xml文件中,有相同的id值标签怎么办?那么在查询的时候,就会发生异常,因为jvm不知道执行哪一个标签的sql语句。我百度了一下,想既然你模棱两可不知道用哪个sql语句,那我把namespace加上,通过namespace+id的形式不就可以指定执行哪一个sql了?很遗憾,我们找到书写语法。。。。。。。。

十.数据库

                  最后贴一下数据库的截图。

------------ 

------------------------- 

------------------------ 

                

---------------------- 

                    这个数据库建的属实很简单,为了测试吗,见谅。。。。。。。

                    对了,还有一个实体类,也顺便贴上吧:


 
  1. package com.java.entity;
  2. public class Province {
  3. //省所需属性
  4. private int provinceId;
  5. private String provinceName;
  6. public int getProvinceId() {
  7. return provinceId;
  8. }
  9. public void setProvinceId(int provinceId) {
  10. this.provinceId = provinceId;
  11. }
  12. public String getProvinceName() {
  13. return provinceName;
  14. }
  15. public void setProvinceName(String provinceName) {
  16. this.provinceName = provinceName;
  17. }
  18. //-------------------------------------
  19. /*市所需属性
  20. private int cityId;
  21. private String cityName;
  22. public int getCityId() {
  23. return cityId;
  24. }
  25. public void setCityId(int cityId) {
  26. this.cityId = cityId;
  27. }
  28. public String getCityName() {
  29. return cityName;
  30. }
  31. public void setCityName(String cityName) {
  32. this.cityName = cityName;
  33. }
  34. */
  35. //------------------------------------
  36. /*区所需属性
  37. private int areaId;
  38. private String areaName;
  39. public int getAreaId() {
  40. return areaId;
  41. }
  42. public void setAreaId(int areaId) {
  43. this.areaId = areaId;
  44. }
  45. public String getAreaName() {
  46. return areaName;
  47. }
  48. public void setAreaName(String areaName) {
  49. this.areaName = areaName;
  50. }
  51. */
  52. }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值