当前位置: 首页 > 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…...

Linux部署达梦数据库超详细教程

陈老老老板&#x1f9b8;&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;国产数据库-达梦数据库&#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下达梦数据库的下载与安装教程&#xff08;Linux版&#xff09;&#xff0c;超级详细。&#x1f468;‍&#x1f4bb…...

ctfshow 每周大挑战 极限命令执行

《简单的命令执行题目》 这里感叹一下&#xff0c;g4佬是真好厉害&#xff0c;这次题目十分的难&#xff0c;嗯&#xff0c;对我这种菜鸡来说是这样的&#xff0c;想了一天&#xff0c;最后结束了&#xff0c;也还是没有想明白第五题的解法&#xff0c;我真是fw&#xff0c;到最…...

使用vue3,vite,less,flask,python从零开始学习硅谷外卖(16-40集)

严正声明&#xff01; 重要的事情说一遍&#xff0c;本文章仅供分享&#xff0c;文章和代码都是开源的&#xff0c;严禁以此牟利&#xff0c;严禁侵犯尚硅谷原作视频的任何权益&#xff0c;我知道学习编程的人各种各样的心思都有&#xff0c;但这不是你对开源社区侵权的理由&am…...

坚持就是胜利

很多朋友&#xff0c;可能坚持了多年的同等学力申硕考试&#xff0c;依然没有通过。如果你感到困惑&#xff0c;感到迷茫&#xff0c;要坚信&#xff1a;坚持就能胜利。有很多人跟你一样&#xff0c;一直坚持在路上&#xff0c;没有停止脚步。 生活没有你想象的那么好&#xff…...

代码中出现转置 pose (c2w,外参矩阵) 或者转置 intrinsic (内参)矩阵的原因

在代码中见到 pose&#xff08;c2w&#xff09;&#xff0c;intrinsic 矩阵的转置&#xff0c;觉得比较奇怪。 后来想了一下为什么。下面解释一下&#xff1a; 用 c2w 矩阵举例子。理论上&#xff0c;一个 c2w 左乘上 一个相机坐标系下的点 P的坐标&#xff0c;能够得到该点在…...

2023 年腾讯云服务器配置价格表出炉(2核2G/2核4G/4核8G/8核16G、16核32G)

腾讯云轻量应用服务器为轻量级的云服务器&#xff0c;使用门槛低&#xff0c;按套餐形式购买&#xff0c;轻量应用服务器套餐自带的公网带宽较大&#xff0c;4M、6M、7M、10M、14M及20M套餐可选&#xff0c;如果是云服务器CVM这个带宽价格就要贵很多了。 1、轻量应用服务器优惠…...

相机出图画面一半清晰,一半模糊的原因是什么?

1、问题背景&#xff1a;在做项目的过程中&#xff0c;有遇到过几次&#xff0c;出图后画面是一半清晰&#xff0c;一半模糊的现象&#xff0c;再重新对焦也是一样。但换了个镜头后就好了&#xff0c;这应该是镜头的质量问题&#xff0c;但导致镜头出现这种问题的具体原因是什么…...

Rust学习入门--【4】Rust 输出到命令行

Rust 语言中的打印“函数” 学习新的编程语言时&#xff0c;大家都喜欢打印“Hello World”。 在Rust中怎样将字符串打印出来呢&#xff1f; Rust 输出文字的方式主要有两种&#xff1a;println!() 和 print!()。 “函数”差异说明&#xff1a; 这两个"函数"都是向…...

Vector刷写方案—vFlash工具介绍

我是穿拖鞋的汉子,魔都中坚持长期主义的工科男! 今天魔都天气是连阴雨,滴滴答答的下个不停,心情也跟着潮湿起来!老规矩分享一段喜欢的文字,避免成为高知识低文化的工程师: 即使在真正的困境里,也一直提示自己,每次自恋不得超过十分钟! 那些看似无法度过得困境,不是…...

【阶段总结】《非结构化信息分析应用与实践(筹)》

《非结构化信息分析应用与实践&#xff08;筹&#xff09;》Part 1.知识储备一、机器学习 1.几种常见的有监督学习算法 2.几种常见的无监督学习算法 3.数据挖掘基础知识 30 问 二、神经网络与深度学习 1.MP神经网络模型&#xff08;附实例代码讲解&#xff09; 2.图解LST…...

wordpress百度云/seo软件简单易排名稳定

Best Financing Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 29 Accepted Submission(s): 3 Problem Description小A想通过合理投资银行理财产品达到收益最大化。已知小A在未来一段时间中的收入情况&#…...

怎么做网店网站/软件定制开发

容器因其轻量且可重用的代码&#xff0c;功能更灵活、开发成本更低而被得到越来越广泛的应用。Docker作为应用容器中最引人瞩目的实现方式&#xff0c;其优点很多&#xff0c;其诞生的目的就是便于持续集成和快速部署尽量减少中间环节&#xff0c;这也为其安全控制带来难度。容…...

二手书哪个网站做的好/付费推广外包

EnableAutoConfiguration注解通常用在Spring Boot项目的主类上&#xff0c;用于启用自动配置。它通过扫描项目中的依赖和类路径配置自动配置Spring应用程序上下文&#xff0c;从而简化了配置过程。这样&#xff0c;您可以快速构建和运行Spring Boot应用程序&#xff0c;而无需手…...

网站用户 微信商城/湖南网站制作公司

jasypt能够以很简单的方式为Java项目提供加密功能&#xff0c;这种简单的方式体现着它的命令行工具&#xff0c;与Spring&#xff0c;Hibernate&#xff0c; Springsecurity&#xff0c; wicket等第三方框架的集成。 本文参加jasypt官方网站&#xff1a;http://www.jasypt.org/…...

一级a做爰片试看 免费网站/企业qq一年多少费用

2019独角兽企业重金招聘Python工程师标准>>> ping IPADDR 测试网络是否连通 -s 字节数 -i 发送间隔 -c 次数 traceroute 显示路由追踪信息 IPADDR/HOSTNAME route 显示路由 -n 数字形式 -host HOSTNAME route add -net IPADDR netmask NETMASK gw GATEWAY route del…...

网站建设之家/信息流优化师面试常见问题

1、Yolov5损失函数分析 2、bbox 回归损失 v5 使用的是 CIoU Loss&#xff0c;后续又优化出EIOU Loss如下所示 论文&#xff1a;Focal and efficient IOU loss for accurate bounding box regression 3、目标置信度损失 目标置信度损失由正样本匹配得到的样本对计算&#xff0c…...