当前位置: 首页 > news >正文

Java:SpringMVC的使用(2)

目录

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

相关文章:

Java:SpringMVC的使用(2)

目录第十二章 REST风格CRUD练习12.1 搭建环境12.2 实现功能思路第十三章 SpringMVC消息转换器13.1 消息转换器概述13.2 使用消息转换器处理请求报文(1) 使用RequestBody获取请求体(2) 使用HttpEntity\<T>获取请求体及请求头13.3 使用消息转换器处理响应报文(1) 使用Respo…...

Elasticsearch7.8.0版本进阶——分布式集群(应对故障)

目录一、Elasticsearch集群的安装1.1、Elasticsearch集群的安装&#xff08;win10环境&#xff09;1.2、Elasticsearch集群的安装&#xff08;linux环境&#xff09;二、应对故障&#xff08;win10环境集群演示&#xff09;2.1、启动集群&#xff08;三个节点&#xff09;2.2、…...

【LeetCode】每日一题(2)

目录 题目&#xff1a;1138. 字母板上的路径 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;1138. 字母板上的路径 - 力扣&am…...

软件设计师教程(六)计算机系统知识-操作系统知识

软件设计师教程 软件设计师教程&#xff08;一&#xff09;计算机系统知识-计算机系统基础知识 软件设计师教程&#xff08;二&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;三&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;…...

Zookeeper下载安装与集群搭建

Zookeeper下载安装与集群搭建1.下载安装1.1 下载安装1.2 配置启动2.集群搭建2.1 搭建要求2.2 准备工作2.3 配置集群2.4 启动集群2.5 模拟集群异常1.下载安装 1.1 下载安装 1、环境准备 ZooKeeper服务器是用Java创建的&#xff0c;它运行在JVM之上。需要安装JDK 7或更高版本。…...

Filter防火墙(8)

实验目的 1、了解个人防火墙的基本工作原理&#xff1b; 2、掌握Filter防火墙的配置。 预备知识防火墙 防火墙&#xff08;Firewall&#xff09;是一项协助确保信息安全的设备&#xff0c;会依照特定的规则&#xff0c;允许或是限制传输的数据通过。防火墙可以是一台专属的硬…...

Spring事务的传播级别——包你一文通

文章目录一、简单说明二、具体案例描述2.1.PROPAGATION_REQUIRED2.2.PROPAGATION_REQUIRED_NEW2.3.PROPAGATION_SUPPORTS2.4.PROPAGATION_NOT_SUPPORTED2.5.PROPAGATION_MANDATORY2.6.PROPAGATION_NEVER2.7.PROPAGATION_NESTED三、总结3.1、PROPAGATION_REQUIRED3.2、PROPAGATI…...

C语言(C预编译指令)

目录 1.undef 2.条件编译#ifdef,#else和#endif 3.#ifndef 4.#if和#elif 5.预定义宏 6.#line和#error 7.#pragma 1.undef #undef指令用于取消已定义的#define指令 #define LIMIT 400 #undef LIMIT 如果想使用一个名称但又不确定之前是否已经用过&#xff0c;为了安全起…...

JMeter 接口测试/并发测试/性能测试

Jmter工具设计之初是用于做性能测试的&#xff0c;它在实现对各种接口的调用方面已经做的比较成熟&#xff0c;因此&#xff0c;本次直接使用Jmeter工具来完成对Http接口的测试。因为再做接口测试时可以设置线程组&#xff0c;所以也可做接口性能测试。本篇使用JMeter完成了一个…...

大家心心念念的RocketMQ5.x入门手册来喽

1、前言 为了更好的拥抱云原生&#xff0c;RocketMQ5.x架构进行了大的重构&#xff0c;提出了存储与计算分离的设计架构&#xff0c;架构设计图如下所示&#xff1a; RocketMQ5.x提供了一套非常建议的消息发送、消费API&#xff0c;并统一放在Apache顶级开源项目rocketmq-clie…...

(考研湖科大教书匠计算机网络)第四章网络层-第三节1:IPv4地址概述

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;IPv4地址概述二&#xff1a;IPv4地址表示方法&#xff08;1&#xff09;概述&#xff08;2&#xff09;8位无符号二进制数转十进制正整数&#xff…...

B站Python与OpenCV人脸识别项目超详细记录(对图片、视频、摄像头人脸的检测)

课程来源&#xff1a;一天搞定人脸识别项目&#xff01;学不会up直接下跪&#xff01;&#xff08;pythonopencv&#xff09;_哔哩哔哩_bilibili 图片来源&#xff1a;感谢王鹤棣先生友情出镜~ 环境配置详见&#xff1a; 在conda虚拟环境中安装OpenCv并在pycharm中使用_cond…...

【Node.js实战】一文带你开发博客项目之Koa2重构(实现session、开发路由、联调、日志)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…...

第一部分:简单句——第二章:简单句的补充

简单句的核心构成&#xff1a;一主一谓 主语/宾语/表语 可以变成名词/代词/doing/to do 谓语动词有四种核心变化&#xff1a;三态 一否 时态语态情态否定 简单句的核心&#xff1a;将简单句给写对 简单句的补充&#xff1a;将简单句给写的更好、更充分 简单句的补充 1、限定…...

Spring Security简介

前面我们已经完成了传智健康后台管理系统的部分功能&#xff0c;例如检查项管理、检查组管理、套餐管理、预 约设置等。接下来我们需要思考2个问题&#xff1a; 问题1&#xff1a;在生产环境下我们如果不登录后台系统就可以完成这些功能操作吗&#xff1f; 答案显然是否定的&am…...

Hadoop安装 --- 简易安装Hadoop

目录 1、使用xftp工具 在opt目录下创建install和soft文件 2、使用xftp工具 将压缩包上传到install文件 3、编写shell脚本 3.1、创建目录来放shell脚本 3.2、创建autoinsatll.sh文件并修改权限 3.3、编写autoinsatll.sh 文件 刷新资源 运行文件 格式化 启动所有进程 Ha…...

俞军产品方法论,消化吸收,要点整理

一、总体概括二、产品经理、价值、用户模型、交易模型三、价值、产品和企业的价值生存游戏的常见要点&#xff1a;企业做产品的4方面产出&#xff1a;四、决策五、俞军产品方法论&#xff0c;认知迭代史1&#xff09;俞军12条产品军规2)产品经理职级的背后影响因素&#xff1a;…...

spring注解的开端(@Component替代bean标签的使用)

目录 一、介绍 1.什么是注解开发&#xff1f; 2.Spring注解的版本 3.基于spring注解的应用 4. Component的细分注解 5.相关注解 二、简单例子讲解 1.类打注解 2.扫描注解放入工厂 3.总工厂取注解调用 4.运行结果 总结&#xff1a; 一、介绍 1.什么是注解开发&…...

Matlab傅里叶谱方法求解一维波动方程

傅里叶谱方法求解基本偏微分方程—一维波动方程 一维波动方程 对于一根两端固定、没有受到任何外力的弦, 若只研究其中的一段, 在不太长的时间 里, 固定端来不及对这段弦产生影响, 则可以认为固定端是不存在的, 弦的长度为无限大。 这种无界 (−∞<x<∞)(-\infty<x&…...

py3中 collections.Counter()函数典型例题

文章目录py3中 collections 的常用STL**Counter()** 函数**defaultdict()** 函数**deque()** 函数**orderedDict()** 函数&#xff08;缺例题&#xff09;小结py3中 collections 的常用STL 对于这个工具包非常好用&#xff0c;尤其是其中的 Counter() 函数 使用次数颇为频繁&a…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...