Java:SpringMVC的使用(2)

news2024/12/25 8:53:33

目录

  • 第十二章 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.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请求
    • 执行时机:三处执行时机
      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/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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

llvm 创建外部调用函数方法

llvm 创建外部调用函数方法 2023-02-12 15:26:19 sizaif 文章目录llvm 创建外部调用函数方法法一:声名参数类型及函数类型在llvm IR中处理并调用函数:外部函数&#xff1a;法二声明函数在llvm IR中处理并函数调用外部函数法一: 声名参数类型及函数类型 // Fun Ty static Fun…

【CS224W】(task3)NetworkX工具包实践

note 节点可以为任意可哈希的对象&#xff0c;比如字符串、图像、XML对象&#xff0c;甚至另一个Graph、自定义的节点对象。通过这种方式可以自由灵活地构建&#xff1a;图为节点、文件为节点、函数为节点&#xff0c;等灵活的图形式。暂时省略&#xff1a;【B5】计算机网络图…

vue3学习资料整理

一、一个后端程序员为什么要学习前端&#xff1f; 1.网上找到的学习理由 《Java后端的我也要学Node.js 了》 https://blog.csdn.net/yusimiao/article/details/104689007 《nodejs后端开发的优缺点&#xff08;nodejs的概念与特征详解&#xff09;》 https://www.1pindao.co…

2023级浙江大学MEM提面最新经验分享

一、个人背景背景&#xff1a;本人毕业于某211大学工程管理相关专业&#xff0c;目前定居在杭州&#xff0c;在某汽车制造公司工作&#xff0c;负责研发无人驾驶项目。我申请的是浙大MEM提前批面试&#xff0c;因为通过提面优秀资格顺利上岸录取&#xff0c;之前感到对自己有帮…

Java、JSP动漫网站的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着科技的迅速发展&#xff0c;计算机技术已应用到社会的各个领域。随着计算机技术和通信技术的迅速发展&#xff0c;网络的规模也逐渐增大&#xff0c;网络的元素也随之不断增加&#xff0c;有的利用其通信&#xff0c;有的利用其…

【软件测试开发】Junit5单元测试框架

目录1. 注解Test 注解BeforeEach BeforeAllAfterEach AfterAll2. 断言 assertassertequalsassertTrue assertFalseassertNull assertNotNull3. 用例执行顺序方法排序&#xff0c;通过 Order 注解来排序4. 测试套件 Suite5. 参数化单参数stringsints6. 参数化多参数CsvSourceCsv…

File类

&#x1f3e1;个人主页 &#xff1a; 守夜人st &#x1f680;系列专栏&#xff1a;Java …持续更新中敬请关注… &#x1f649;博主简介&#xff1a;软件工程专业&#xff0c;在校学生&#xff0c;写博客是为了总结回顾一些所学知识点 ✈️推荐一款模拟面试&#xff0c;刷题神器…

2. SpringMVC 请求与响应

文章目录1. 请求映射路径2. 请求参数2.1 get 请求发送普通参数2.2 post 请求发送普通参数2.3 五种类型的参数传递2.4.1 普通参数2.4.2 POJO 数据类型2.4.3 嵌套 POJO 类型参数2.4.4 数组类型参数2.4.5 集合类型参数3. json 数据传输参数&#xff08;重点&#xff09;3.1 传输 j…

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;为了安全起…

Python中的进程线程

文章目录前言多进程与多线程基本概念多进程multiprocessing 类对象进程池subprocess模块进程间通信多线程threading实现线程操作线程共享所有变量线程锁参考资料前言 又花了点时间学习了一下Python中的多线程与多进程的知识点&#xff0c;梳理一下供复习参考 多进程与多线程 …

JUC并发编程与源码分析

一、本课程前置知识及要求说明 二、线程基础知识复习 三、CompletableFuture 四、说说Java"锁"事 8锁案例原理解释: 五、LockSupport与线程中断 六、 Java内存模型之JMM 七、volatile与JMM 八、CAS 九、原子操作类之18罗汉增强 十、聊聊ThreadLocal 十一、Java对…

离线数据仓库

1 数据仓库建模 1.1 建模工具 PowerDesigner/SQLYog/EZDML… 1.2 ODS层 &#xff08;1&#xff09;保持数据原貌不做任何修改&#xff0c;起到备份数据的作用。 &#xff08;2&#xff09;数据采用压缩&#xff0c;减少磁盘存储空间&#xff08;例如&#xff1a;压缩采用LZO&…

seata源码-全局事务回滚服务端源码

这篇博客来记录在发起全局事务回滚时&#xff0c;服务端接收到netty请求是如何处理的 1. 发起全局事务回滚请求 在前面的博客中&#xff0c;有说到过&#xff0c;事务发起者在发现分支事务执行异常之后&#xff0c;会提交全局事务回滚的请求到netty服务端&#xff0c;这里是发…

Python 解决dilb和face_recognition第三方包安装失败

目录 dilb和face_recognition第三方包安装失败 亲测有效的解决方法&#xff1a;whl安装方式 dilb和face_recognition第三方包安装失败 场景复现&#xff1a;因为需要用到dlibface_recognition&#xff0c;基于OpenCV做一些人脸识别的项目&#xff0c;在Pycharm中进行pip清华…

图解LeetCode——剑指 Offer 24. 反转链表

一、题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 二、示例 示例: 【输入】 1->2->3->4->5->NULL 【输出】 5->4->3->2->1->NULL 限制&#xff1a; 0 < 节点个数 < 5000 三、…

Linux | Linux卸载和安装MySQL(Ubuntu版)

最近又来到了Linux学习了&#xff0c;原因是要接触云服务器相关知识&#xff0c; 所以博主整理了一些关于Linux的知识&#xff0c; 欢迎各位朋友点赞收藏&#xff0c;天天开心丫&#xff0c;快乐写代码&#xff01; Linux系列文章请戳 Linux教程专栏 目录 一、卸载MySQL 1…

Angular4 中 ckeditor5 插件的使用

Angular4 中 ckeditor5 插件的使用 0 环境、新建项目 环境&#xff1a; Windows10Angular/cli1.4.10&#xff08;安装 Angular 的过程略过&#xff0c;Angular4 版本比较古老&#xff0c;这也导致项目安装插件及其他操作比较麻烦&#xff09; 1. ckeditor5 官方用法 基础用…

邂逅TypeScript基础语法

文章目录p26认识TypeScriptTypeScript的编译环境ts初体验ts环境搭建变量的定义p27number类型booleanArrayObjectSymbolanyunknownvoidnevertuple联合ts中文文档学习-非官方网站 p26 认识TypeScript TypeScript的编译环境 ts初体验 ts环境搭建 第二种方式 webpack.config…

论文阅读_图像生成文本_CLIP

name_en: Learning Transferable Visual Models From Natural Language Supervision name_ch: 从自然语言监督中学习可迁移的视觉模型 paper_addr: http://arxiv.org/abs/2103.00020 doi: 10.48550/arXiv.2103.00020 date_read: 2023-02-09 date_publish: 2021-02-26 tags: [‘…

【1138. 字母板上的路径】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为 board ["abcde", "fghij", "klmno", "pq…