目录
- 第十二章 REST风格CRUD练习
- 12.1 搭建环境
- 12.2 实现功能思路
- 第十三章 SpringMVC消息转换器
- 13.1 消息转换器概述
- 13.2 使用消息转换器处理请求报文
- (1) 使用@RequestBody获取请求体
- (2) 使用HttpEntity\<T>获取请求体及请求头
- 13.3 使用消息转换器处理响应报文
- (1) 使用@ResponseBody,以返回值直接作为响应报文的响应体响应到浏览器
- 13.4 使用消息转换器处理JSON格式数据
- (1) 使用步骤
- 第十四章 SpringMVC文件上传和文件下载
- 14.1 文件下载
- 14.2 文件上传
- 第十五章 SpringMVC中拦截器
- 15.1 拦截器和过滤器的区别
- 15.2 拦截器概念
- 15.3 实现拦截器的基本步骤
- 15.4 拦截器工作原理
- 15.6 拦截器preHandle()方法返回值
- 第十六章 SpringMVC异常处理器
- 16.1 SpringMVC中异常处理器
- 16.2 示例代码
- 第十七章 SSM【Spring+SpringMVC+Mybatis】整合
- 17.1 SSM整合思路
- 17.2 SSM整合步骤
- 1、Spring+SpringMVC
- (1)导入jar包
- (2)编写核心配置文件
- web.xml
- springmvc.xml
- spring.xml
- 2、Spring+Mybatis
- (1)导入jar包
- (2)编写核心配置文件
- spring.xml【就是以前的applicationContext.xml文件】
- mybatis-config.xml【核心配置文件】
- xxxMapper.xml【映射文件】
第十二章 REST风格CRUD练习
12.1 搭建环境
-
导入相关jar包
<!--spring-webmvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.1</version> </dependency> <!-- 导入thymeleaf与spring5的整合包 --> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.0.12.RELEASE</version> </dependency> <!--servlet-api--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
-
编写配置文件
- web.xml
- CharacterEncodingFilter
- HiddenHttpMethodFilter
- DispatcherServlet
- springmvc.xml
- 开启组件扫描
- 装配视图解析器
- 装配视图控制器
- 解决静态资源加载问题
- 装配annotation-driver
- web.xml
-
dao&pojo
12.2 实现功能思路
-
实现添加功能思路
- 跳转添加页面【查询所有部门信息】
- 实现添加功能
-
实现删除功能思路
-
方式一:直接使用表单实现DELETE提交方式
-
方式二:使用超链接【a】实现DELETE提交方式
-
使用Vue实现单击超链接,后提交对应表单
-
取消超链接默认行为
-
示例代码
<div align="center" id="app"> <a href="#" @click="deleteEmp">删除</a> <form id="delForm" th:action="@{/emps/}+${emp.id}" method="post"> <input type="hidden" name="_method" value="DELETE"> </form> </div> <script type="text/javascript" src="static/js/vue_v2.6.14.js"></script> <script type="text/javascript"> new Vue({ el:"#app", data:{}, methods:{ deleteEmp(){ alert("hehe"); //获取响应表单 var formEle = document.getElementById("delForm"); formEle.submit(); //取消超链接默认行为 event.preventDefault(); } } }); </script>
-
-
第十三章 SpringMVC消息转换器
13.1 消息转换器概述
- HttpMessageConverter:消息转换器主要作用
- 将java对象与请求报文及响应报文的相互转换
- 跟
《第六章 SpringMVC处理请求数据》
作用一致,这是另一种处理方式
- 使用 HttpMessageConverter将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径:
- a)使用 @RequestBody / @ResponseBody 对处理方法进行标注
- b) 使用 HttpEntity<T>/ ResponseEntity<T> 作为处理方法的入参或返回值。
13.2 使用消息转换器处理请求报文
(1) 使用@RequestBody获取请求体
- 语法
<form th:action="@{/testRequestBody}" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit"> </form>
@RequestMapping("/testRequestBody") public String testRequestBody(@RequestBody String requestBody){ System.out.println("requestBody:"+requestBody); return "success"; }
- 输出结果:
requestBody:username=admin&password=123456
- 注意:使用@RequestBody必须以POST方式提交,不能使用GET(没有请求体)
(2) 使用HttpEntity<T>获取请求体及请求头
- 语法
<form th:action="@{/testRequestBody}" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit"> </form>
@RequestMapping("/testHttpEntity") public String testHttpEntity(HttpEntity<String> HttpEntity){ // 获取请求头 HttpHeaders headers = HttpEntity.getHeaders(); System.out.println("headers:" + headers); // 获取请求体 String body = HttpEntity.getBody(); System.out.println("body:" + body); return "success"; }
- 输出结果:
headers:[host:“localhost:8080”, connection:“keep-alive”, content-length:“27”, cache-control:“max-age=0”, sec-ch-ua:“” Not A;Brand";v=“99”, “Chromium”;v=“90”, “Google Chrome”;v=“90"”, sec-ch-ua-mobile:“?0”, upgrade-insecure-requests:“1”, origin:“http://localhost:8080”, user-agent:“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36”] body:username=admin&password=123
- 注意:可以获取请求体及请求头
13.3 使用消息转换器处理响应报文
(1) 使用@ResponseBody,以返回值直接作为响应报文的响应体响应到浏览器
- 位置
- 书写在class类上【当前类的所有方法,均返回文本,不跳转页面】
- 书写在method上
- 语法
<a th:href="@{/testResponseBody}">测试@ResponseBody</a>
@RequestMapping("/testResponseBody") @ResponseBody public String testResponseBody(){ return "success"; }
- 输出结果:
浏览器直接显示success文本,而不是跳转到success.html页面
- 作用:将指定数据,直接以响应流的方式,响应数据。
- 类似response.getWriter().write()获取响应流
13.4 使用消息转换器处理JSON格式数据
(1) 使用步骤
-
- 添加jackson依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency>
-
- 添加MappingJackson2HttpMessageConverter消息转换器
必须配置<mvc:annotation-driven />
标签才能装配jackson的转换器
- 添加MappingJackson2HttpMessageConverter消息转换器
-
- 在需要转换json数据的方法上,添加
@ResponseBody
- 需要被转换的数据 作为方法的返回值
- 在需要转换json数据的方法上,添加
- 语法
<a th:href="@{/testJson}">测试@ResponseBody处理Json数据</a>
@RequestMapping("/testJson") @ResponseBody public Employee testJson(){ System.out.println("==>处理json"); // 将Employee 对象转换为json格式响应 Employee employee = new Employee() return employee ; }
- 输出结果:
{"id":1001,"lastName":"zs","email":"zs@163.com","gender":1}
第十四章 SpringMVC文件上传和文件下载
- 还是消息转换器的知识点
- 文件上传和下载的逻辑图:
14.1 文件下载
- 实现文件下载步骤
- 准备文件下载的相关资源
- 将ResponseEntity<T>对象,作为方法返回值
- 为ResponseEntity<T>对象,设置三个参数
- 示例代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>文件下载页面</title>
</head>
<body>
<div align="center">
<h2>atguigu_230212资源库</h2>
<a th:href="@{/fileDownloadController(fileName='索引的实现原理.png')}">索引的实现原理.png</a><br>
<a th:href="@{/fileDownloadController(fileName='34道作业题utf8.txt')}">34道作业题utf8.txt</a><br>
<a th:href="@{/fileDownloadController(fileName='MySQL培训日志.pdf')}">MySQL培训日志.pdf</a><br>
<a th:href="@{/fileDownloadController(fileName='templatefile(3).xlsx')}">templatefile(3).xlsx</a><br>
</div>
</body>
</html>
@Controller
public class FileDownloadController {
@RequestMapping("/fileDownloadController")
public ResponseEntity<byte[]> fileDownloadController(HttpServletRequest request,
String fileName){
System.out.println("===>fileDownloadController");
ResponseEntity<byte[]> responseEntity = null;
try {
// 获取文件名称:通过参数获取
// 获取目标资源,文件的真实路径【通过resquest/session --》获取ServletContext】
// 1.获取ServletContext对象:request.getServletContext()
// 2.获取服务器中文件的真实路径
String realPath = request.getServletContext().getRealPath("/WEB-INF/download/" + fileName);
// 创建输入流
InputStream is = new FileInputStream(realPath);
// 文件下载主体:byte[]
// 创建字节数组
byte[] bytes = new byte[is.available()];
// 将流读到字节数组中
is.read(bytes);
// 创建HttpHeaders对象,并设置响应头信息
HttpHeaders headers = new HttpHeaders();
// 设置要下载的文件名字【及文件格式为附件格式(好处:通知服务器下载当前资源,而不是打开)】
headers.add("Content-Disposition", "attachment;filename="+fileName);
// 处理中文文件名问题
headers.setContentDispositionFormData("attachment", new String(fileName.getBytes("utf-8"),"ISO-8859-1"));
// 状态码:HttpStatus.OK
HttpStatus statusCode = HttpStatus.OK;
// 创建ResponseEntity对象
responseEntity = new ResponseEntity<>(bytes,headers, statusCode);
// 关闭输入流
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return responseEntity;
}
}
14.2 文件上传
- 实现文件上传步骤
- 准备工作
- 准备文件上传的页面
- 表单的提交方式
- 设置enctype=“multipart/form-data”
- 表单中包含【文件域】(type=file)
- 导入jar包
<!--文件上传-api--> <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
- 装配解析器:CommonsMultipartResolver
- 注意:id必须为:multipartResolver
- 设置默认编码集:utf-8
<!-- 装配解析器:CommonsMultipartResolver --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="UTF-8"></property> <!-- 限制【所有】文件上传大小 102400=100kb --> <property name="maxUploadSize" value="102400"></property> <!-- 限制【每个】文件上传大小 102400=100kb --> <property name="maxUploadSizePerFile" value="102400"></property> </bean>
- 准备文件上传的页面
- 实现步骤
- 将type=file【文件域】直接入参成:MultipartFile 类型即可
- 获取文件名称
- 获取上传文件真实路径
- 实现文件上传即可
- 准备工作
- 示例代码
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>文件上传页面</title> </head> <body> <div align="center"> <h2>文件上传</h2> <form th:action="@{/fileUploadController}" method="post" enctype="multipart/form-data"> 上传姓名:<input type="text" name="username"><br> 上传文件:<input type="file" name="uploadFile"><br> <input type="submit" value="文件上传"> </form> </div> </body> </html>
package com.atguigu.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import java.io.File; import java.io.IOException; import java.util.UUID; @Controller public class FileUploadController { /** * 实现文件上传 * @return */ @RequestMapping("/fileUploadController") public String fileUploadController(String username, MultipartFile uploadFile, HttpSession session){ System.out.println("uploadFile = " + uploadFile); try { //获取上传文件的文件名 String filename = uploadFile.getOriginalFilename();//没有配文件上传解析器,会报错: //HTTP Status 500 - Request processing failed; nested exception is java.lang.NullPointerException //获取服务器中uploadFile目录的路径 String realPath = session.getServletContext().getRealPath("/WEB-INF/upload/"); // 判断上传路径是否存在【如不存在,创建】 File filePath = new File(realPath); if(!filePath.exists()){ filePath.mkdirs(); } //处理文件重名问题 // 创建UUID String uuid = UUID.randomUUID().toString().replace("-", ""); //实现上传功能:【File.separator:路径分隔符/】 // String finalPath = filePath + File.separator + filename; File uFile = new File(filePath + File.separator +uuid+ filename); uploadFile.transferTo(uFile); } catch (IOException e) { e.printStackTrace(); } return "success"; } }
第十五章 SpringMVC中拦截器
15.1 拦截器和过滤器的区别
- 过滤器【Filter】属于web服务器组件
- 过滤器主要作用:过滤Servlet请求
- 执行时机:两处执行时机【Servlet前,Servlet后】
- 拦截器【Interceptor】属于SpringMVC框架
- 拦截器主要作用:拦截Controller请求
- 执行时机:三处执行时机
- 执行DIspatcherServlet之后,Controller之前
- 执行Controller之后,DIspatcherServlet之前
- 执行DIspatcherServlet之后【渲染视图之后】
- 图解
15.2 拦截器概念
- SpringMVC可以使用拦截器实现拦截Controller请求,用户可以自定义拦截器来实现特定的功能
- 实现拦截器两种方式
- 实现接口: Handlerlnterceptor
- 继承适配器类: HandlerlnterceptorAdapter
- 拦截器中三个方法
- preHandle(): 这个方法在业务处理器处理请求之前被调用,可以在此方法中做一些权限的校验。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true; 如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
- postHandle(): 这个方法在业务处理器处理请求之后,染视图之前调用。在此方法中可以对0ModelAndView中的模型和视图进行外理。
- afterCompletion(): 这个方法在 DispatcherServlet 完全外理完请求后被调用,可以在该方法中讲行一些资源清理的操作。
15.3 实现拦截器的基本步骤
- 实现接口:
public class Mylnterceptor implements HandlerInterceptor
- 重写三个方法
public class Mylnterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("-->Mylnterceptor-->preHandle"); return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { System.out.println("-->Mylnterceptor-->postHandle"); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { System.out.println("-->Mylnterceptor-->afterCompletion"); } }
- 在springmvc.xml配置文件中,装配拦截器
<!-- 装配拦截器 --> <mvc:interceptors> <!-- 第一种装配方式 --> <!-- <bean class="com.atguigu.interceptor.Mylnterceptor"></bean>--> <!-- 第二种装配方式,需要Mylnterceptor类上加@Component --> <ref bean="mylnterceptor"></ref> </mvc:interceptors>
15.4 拦截器工作原理
- 单个拦截器工作原理
- 浏览器向服务器发送请求
- 执行拦截器第一个方法preHandle()
- 执行Controller中方法,处理请求做出响应
- 执行拦截器第二个方法postHandle()
- 执行DispatcherServlet中渲染视图
- 执行拦截器第三个方法afterCompletion()
- 响应
- 多个拦截器工作原理
- 浏览器向服务器发送请求
- 执行拦截器1第一个方法preHandle()
- 执行拦截器2第一个方法preHandle()
- 执行Controller中方法,处理请求做出响应
- 执行拦截器2第二个方法postHandle()。
- 执行拦截器1第二个方法postHandle()
- 执行DispatcherServlet中渲染视图
- 执行拦截器2第三个方法afterCompletion()
- 执行拦截器1第三个方法afterCompletion()
- 响应
拦截器的顺序,由配置的顺序决定
15.6 拦截器preHandle()方法返回值
- 当第一个拦截器preHandle()方法返回false时,执行当前方法后,程序终止。
- 当不是第一个拦截器preHandle()方法返回false时
- 执行当前拦截器及之前拦截器的preHandle0方法。
- 执行之前拦截器的afterCompletion0方法
第十六章 SpringMVC异常处理器
16.1 SpringMVC中异常处理器
- Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler 映射、数据绑定以及目标方法执行时发生的异常。
- 需要掌握两个异常处理器实现类
- DefaultHandleExceptionResolver: 默认异常处理器,默认开启,可以支持10+多种异常处理。了解即可
- SimpleMappingExceptionResolver
- 映射自定义异常处理器,作用: 将指定的异常映射到指定页面
- 装配异常处理器[SimpleMappingExceptionResolver]
16.2 示例代码
<!-- 装配异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 出现**异常跳转的页面 -->
<!-- 计算异常,比如1/0 -->
<prop key="java.lang.ArithmeticException">error/error_arith</prop>
<!-- 空指针异常,null.length -->
<prop key="java.lang.NullPointerException">error/error_arith</prop>
</props>
</property>
<!-- 异常信息起别名ex -->
<property name="exceptionAttribute" value="ex"></property>
</bean>
当代码出现异常时,比如1/0,null等,根据自定义的配置进行跳转
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>算数异常页面</title>
</head>
<body>
<h2>算数异常页面</h2>
异常信息:<span th:text="${ex}"></span>
</body>
</html>
第十七章 SSM【Spring+SpringMVC+Mybatis】整合
17.1 SSM整合思路
- Spring+SpringMVC
- 容器对象的管理问题
- SpringMVC容器对象,由DispatcherServlet管理
- Spring容器对象,由ContextLoaderListener管理
- 解决组件扫描的冲突问题
- SpringMVC只扫描Controller层
- Spring扫描排除Controller层
- 容器对象的管理问题
- Spring+Mybatis
- 关于数据源、事务管理的代码冲突问题
- 统一交给Spring管理
- Spring管理Mybatis 的核心对象
- SqlSessionFactory
- Mapper代理对象
- 关于数据源、事务管理的代码冲突问题
17.2 SSM整合步骤
1、Spring+SpringMVC
(1)导入jar包
<!--spring-webmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
<!-- 导入thymeleaf与spring5的整合包 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
<!--servlet-api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
(2)编写核心配置文件
web.xml
注册CharacterEncodingFilter,解决乱码问题
注册HiddenHttpMethodFilter,支持PUT、DELETE提交方式【REST风格】
注册DispatcherServlet【前端控制器】,管理SpringMVC容器对象
注册一个上下文参数【contextConfigLocation】,设置spring.xml配置文件路径
注册ContextLoaderListener,管理spring容器对象
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- >注册CharacterEncodingFilter,解决乱码问题 -->
<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>
<!-- 解决POST请求 乱码-->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- >注册HiddenHttpMethodFilter,支持PUT、DELETE提交方式【REST风格】 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<!-- 所有的请求都需要经过过滤器 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- >注册DispatcherServlet【前端控制器】,管理SpringMVC容器对象 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 设置springmvc.xml配置文件路径【管理容器对象】-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 设置DispatcherServlet优先级【启动服务器时,创建当前Servlet对象】-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- >注册一个上下文参数【**contextConfigLocation**】,设置spring.xml配置文件路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<!-- >注册**ContextLoaderListener**,管理spring容器对象 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
springmvc.xml
开启组件扫描【只扫描Controller层】
装配视图解析器
装配视图控制器【view-controller】
装配default-servlet-handler,解决静态资源加载问题
装配annotation-driven,解决后续问题解决view-controller问题
解决default-servlet-handler问题
解决jackson装配消息转换器问题【等23+问题】
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- >开启组件扫描【只扫描Controller层】 -->
<context:component-scan base-package="com.atguigu" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- >装配视图解析器 -->
<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<!-- 配置字符集属性-->
<property name="characterEncoding" value="UTF-8"/>
<!-- 配置模板引擎属性-->
<property name="templateEngine">
<!-- 配置内部bean -->
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<!-- 配置模块的解析器属性 -->
<property name="templateResolver">
<!-- 配置内部bean -->
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/pages/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<!-- <property name="templateMode" value="HTML5"/>-->
<!-- 配置字符集 -->
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>
<!-- >装配视图控制器【view-controller】 -->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!-- >装配default-servlet-handler,解决静态资源加载问题 -->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!-- >装配annotation-driven,解决后续问题 -->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
spring.xml
开启组件扫描【排除Controller层】
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- >开启组件扫描【排除Controller层】 -->
<context:component-scan base-package="com.atguigu">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
2、Spring+Mybatis
(1)导入jar包
spring的jar包
<!--spring-jdbc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.1</version> </dependency> <!--spring-orm--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.3.1</version> </dependency> <!--添加AspectJ支持--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.3.1</version> </dependency>
mybatis的jar包
<!--spring-jdbc--> <!--导入druid(德鲁伊)的jar包--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!--连接mysql驱动的jar包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.37</version> </dependency> <!--导入MyBatis的jar包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!--导入pagehelper的jar包--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.8</version> </dependency>
spring和mybatis整合jar包
<!--mybatis-spring的jar包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency>
(2)编写核心配置文件
spring.xml【就是以前的applicationContext.xml文件】
开启组件扫描【排除Controller层】
加载外部属性文件
装配数据源【DruidDataSource】
装配事务管理器【DataSourceTransactionManager】
开启声明式事务管理的注解支持
装配 SqlSessionFactoryBean,用它管理SqlSessionFactory
装配MapperScannerConfigurer,用它管理Mapper代理对象
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
<!-- >开启组件扫描【排除Controller层】 -->
<context:component-scan base-package="com.atguigu">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 加载外部属性文件 -->
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!-- 装配数据源【DruidDataSource】 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${db.driverClassName}"></property>
<property name="url" value="${db.url}"></property>
<property name="username" value="${db.username}"></property>
<property name="password" value="${db.password}"></property>
</bean>
<!-- 装配事务管理器【DataSourceTransactionManager】 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启声明式事务管理的注解支持 -->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
<!-- 装配 SqlSessionFactoryBean,用它管理SqlSessionFactory -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 设置数据源____必填 -->
<property name="dataSource" ref="dataSource"> </property>
<!-- 设置 mybatis-config.xml 核心配置文件路径____必填 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 设置类型别名____选填 -->
<property name="typeAliasesPackage" value="com.atguigu.pojo"></property>
<!-- 设置映射文件路径____选填 -->
<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
</bean>
<!-- 装配MapperScannerConfigurer,用它管理Mapper代理对象 -->
<mybatis-spring:scan base-package="com.atguigu.mapper"></mybatis-spring:scan>
</beans>
mybatis-config.xml【核心配置文件】
设置别名
开始驼峰式命名映射
设置PageHelper分页插件
…
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 开启自动驼峰式命名映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置加载的数据是按需加载-->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
</configuration>
xxxMapper.xml【映射文件】
SQL语句
<?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="com.atguigu.mapper.EmployeeMapper">
<!-- id 跟 mapper 的方法名一致 -->
<select id="selectAllEmps" resultType="employee">
SELECT
id,
last_name,
email,
salary
FROM
tbl_employee
</select>
</mapper>