Java:SpringMVC的使用(2)

news/2024/11/28 9:49:45/

目录

  • 第十二章 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
  • dao&pojo

12.2 实现功能思路

  • 实现添加功能思路

    1. 跳转添加页面【查询所有部门信息】
    2. 实现添加功能
  • 实现删除功能思路

    1. 方式一:直接使用表单实现DELETE提交方式

    2. 方式二:使用超链接【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) 使用步骤

    1. 添加jackson依赖
    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version>
    </dependency>
    
    1. 添加MappingJackson2HttpMessageConverter消息转换器
      必须配置<mvc:annotation-driven />标签才能装配jackson的转换器
    1. 在需要转换json数据的方法上,添加@ResponseBody
    • 需要被转换的数据 作为方法的返回值
  • 语法
    <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文件上传和文件下载

  1. 还是消息转换器的知识点
  2. 文件上传和下载的逻辑图:
    在这里插入图片描述

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.OKHttpStatus 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();}//处理文件重名问题// 创建UUIDString 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请求
    • 执行时机:三处执行时机
      1. 执行DIspatcherServlet之后,Controller之前
      2. 执行Controller之后,DIspatcherServlet之前
      3. 执行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/javaeehttp://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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://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 configurationPUBLIC "-//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 mapperPUBLIC "-//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">SELECTid,last_name,email,salaryFROMtbl_employee</select>
</mapper>

http://www.ppmy.cn/news/24358.html

相关文章

详解Python正则表达式中group与groups的用法

在Python中&#xff0c;正则表达式的group和groups方法是非常有用的函数&#xff0c;用于处理匹配结果的分组信息。 group方法是re.MatchObject类中的一个函数&#xff0c;用于返回匹配对象的整个匹配结果或特定的分组匹配结果。而groups方法同样是re.MatchObject类中的函数&am…

Python爱心代码

前言 Python漂浮爱心&#xff0c;具体源码见&#xff1a;Python动态爱心代码_爱心代码-Python文档类资源-CSDN下载 爱心类 class Heart(): #每个爱心&#xff08;爱心类&#xff09; def __init__(self): self.r ra.randint(10,15) #爱心的半径 …

飞速创新更新IPO招股书:计划募资约14亿元,向伟为实际控制人

近日&#xff0c;深圳市飞速创新技术股份有限公司&#xff08;下称“飞速创新”&#xff09;预披露更新招股书&#xff0c;准备在深圳证券交易所主板上市。本次冲刺上市&#xff0c;飞速创新计划募资13.54亿元&#xff0c;招商证券为其保荐机构。 据介绍&#xff0c;飞速创新专…

Golang 模糊测试的使用

一 背景 在 Go 1.18 中,Go 语言新增模糊测试(Fuzzing)。Fuzzing,又叫fuzz testing,中文叫做模糊测试或随机测试。其本质上是一种自动化测试技术,更具体一点,它是一种基于随机输入的自动化测试技术,常被用于发现处理用户输入的代码中存在的bug和问题。模糊测试和常规的功能…

【Vue3源码】第一章 effect和reactive

文章目录【Vue3源码】第一章 effect和reactive前言1、实现effect函数2、封装track函数&#xff08;依赖收集&#xff09;3、封装reactive函数4、封装trigger函数&#xff08;依赖触发&#xff09;5、单元测试【Vue3源码】第一章 effect和reactive 前言 今天就正式开始Vue3源码…

Dart语法基础补充

Asynchrony support Dart 库中充满了返回 Future 或 Stream 对象的函数。 这些函数是异步的&#xff1a;它们在设置一个可能耗时的操作&#xff08;例如 I/O&#xff09;后返回&#xff0c;而不等待该操作完成。 async 和 await 关键字支持异步编程&#xff0c;让编写看起来类…

Fluent Python 笔记 第 8 章 对象引用、可变性和垃圾回收

本章先以一个比喻说明 Python 的变量&#xff1a;变量是标注&#xff0c;而不是盒子。如果你不知道引用式变量是什么&#xff0c;可以像这样对别人解释别名。 然后&#xff0c;本章讨论对象标识、值和别名等概念。随后&#xff0c;本章会揭露元组的一个神奇特性&#xff1a;元…

【Hello Linux】 Linux的权限以及Shell原理

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍Linux的基础命令 Linux的权限以及Shell原理Shell的运行原理权限Linux中权限的概念如何切换用户如何提升当前操作的权限如何添加信任…