• SSM - Springboot - MyBatis-Plus 全栈体系(十八)


    第四章 SpringMVC

    • SpringMVC 实战:构建高效表述层框架

    一、SpringMVC 简介和体验

    1. 介绍

    • Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从一开始就包含在 Spring Framework 中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc ),但它通常被称为“Spring MVC”。

    • 在控制层框架历经 Strust、WebWork、Strust2 等诸多产品的历代更迭之后,目前业界普遍选择了 SpringMVC 作为 Java EE 项目表述层开发的首选方案。之所以能做到这一点,是因为 SpringMVC 具备如下显著优势:

      • Spring 家族原生产品,与 IOC 容器等基础设施无缝对接
      • 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
      • 代码清新简洁,大幅度提升开发效率
      • 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
      • 性能卓著,尤其适合现代大型、超大型互联网项目要求
    • 原生 Servlet API 开发代码片段

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
                                                            throws ServletException, IOException {
        String userName = request.getParameter("userName");
    
        System.out.println("userName="+userName);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 基于 SpringMVC 开发代码片段
    @RequestMapping("/user/login")
    public String login(@RequestParam("userName") String userName,Sting password){
    
        log.debug("userName="+userName);
        //调用业务即可
    
        return "result";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2. 主要作用

    在这里插入图片描述

    • SSM 框架构建起单体项目的技术栈需求!其中的 SpringMVC 负责表述层(控制层)实现简化!
    • SpringMVC 的作用主要覆盖的是表述层,例如:
      • 请求映射
      • 数据输入
      • 视图界面
      • 请求分发
      • 表单回显
      • 会话控制
      • 过滤拦截
      • 异步交互
      • 文件上传
      • 文件下载
      • 数据校验
      • 类型转换
      • 等等等
    • 最终总结:
      • 简化前端参数接收( 形参列表 )
      • 简化后端数据响应( 返回值 )
      • 以及其他…

    3. 核心组件和调用流程理解

    • Spring MVC 与许多其他 Web 框架一样,是围绕前端控制器模式设计的,其中中央 Servlet DispatcherServlet 做整体请求处理调度!
    • 除了DispatcherServletSpringMVC 还会提供其他特殊的组件协作完成请求处理和响应呈现。
    • SpringMVC 处理请求流程:

    在这里插入图片描述

    • SpringMVC 涉及组件理解:
    1. DispatcherServlet : SpringMVC 提供,我们需要使用 web.xml 配置使其生效,它是整个流程处理的核心,所有请求都经过它的处理和分发![ CEO ]
    2. HandlerMapping : SpringMVC 提供,我们需要进行 IoC 配置使其加入 IoC 容器方可生效,它内部缓存 handler(controller 方法)和 handler 访问路径数据,被 DispatcherServlet 调用,用于查找路径对应的 handler![秘书]
    3. HandlerAdapter : SpringMVC 提供,我们需要进行 IoC 配置使其加入 IoC 容器方可生效,它可以处理请求参数和处理响应数据数据,每次 DispatcherServlet 都是通过 handlerAdapter 间接调用 handler,他是 handler 和 DispatcherServlet 之间的适配器![经理]
    4. Handler : handler 又称处理器,他是 Controller 类内部的方法简称,是由我们自己定义,用来接收参数,向后调用业务,最终返回响应结果![打工人]
    5. ViewResovler : SpringMVC 提供,我们需要进行 IoC 配置使其加入 IoC 容器方可生效!视图解析器主要作用简化模版视图页面查找的,但是需要注意,前后端分离项目,后端只返回 JSON 数据,不返回页面,那就不需要视图解析器!所以,视图解析器,相对其他的组件不是必须的![财务]

    4. 快速体验

    4.1 体验场景需求

    在这里插入图片描述

    4.2 配置分析
    • DispatcherServlet,设置处理所有请求!
    • HandlerMapping,HandlerAdapter,Handler 需要加入到 IoC 容器,供 DS 调用!
    • Handler 自己声明(Controller)需要配置到 HandlerMapping 中供 DS 查找!
    4.3 准备项目
    4.3.1 创建项目
    • springmvc-base-quick
    • 注意:需要转成 maven/web 程序!!
    4.3.2 导入依赖
    <properties>
        <spring.version>6.0.6spring.version>
        <servlet.api>9.1.0servlet.api>
        <maven.compiler.source>17maven.compiler.source>
        <maven.compiler.target>17maven.compiler.target>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>
    
    <dependencies>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
            <version>${spring.version}version>
        dependency>
    
        
        
        
        <dependency>
            <groupId>jakarta.platformgroupId>
            <artifactId>jakarta.jakartaee-web-apiartifactId>
            <version>${servlet.api}version>
            <scope>providedscope>
        dependency>
    
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
            <version>${spring.version}version>
        dependency>
    
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    4.4 Controller 声明
    @Controller
    public class HelloController {
    
        //handlers
    
        /**
         * handler就是controller内部的具体方法
         * @RequestMapping("/springmvc/hello") 就是用来向handlerMapping中注册的方法注解!
         * @ResponseBody 代表向浏览器直接返回数据!
         */
        @RequestMapping("/springmvc/hello")
        @ResponseBody
        public String hello(){
            System.out.println("HelloController.hello");
            return "hello springmvc!!";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    4.5 Spring MVC 核心组件配置类

    声明 springmvc 涉及组件信息的配置类

    //TODO: SpringMVC对应组件的配置类 [声明SpringMVC需要的组件信息]
    
    //TODO: 导入handlerMapping和handlerAdapter的三种方式
     //1.自动导入handlerMapping和handlerAdapter [推荐]
     //2.可以不添加,springmvc会检查是否配置handlerMapping和handlerAdapter,没有配置默认加载
     //3.使用@Bean方式配置handlerMapper和handlerAdapter
    @EnableWebMvc
    @Configuration
    @ComponentScan(basePackages = "com.alex.controller") //TODO: 进行controller扫描
    //WebMvcConfigurer springMvc进行组件配置的规范,配置组件,提供各种方法! 前期可以实现
    public class SpringMvcConfig implements WebMvcConfigurer {
    
        @Bean
        public HandlerMapping handlerMapping(){
            return new RequestMappingHandlerMapping();
        }
    
        @Bean
        public HandlerAdapter handlerAdapter(){
            return new RequestMappingHandlerAdapter();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    4.6 SpringMVC 环境搭建

    对于使用基于 Java 的 Spring 配置的应用程序,建议这样做,如以下示例所示:

    //TODO: SpringMVC提供的接口,是替代web.xml的方案,更方便实现完全注解方式ssm处理!
    //TODO: Springmvc框架会自动检查当前类的实现类,会自动加载 getRootConfigClasses / getServletConfigClasses 提供的配置类
    //TODO: getServletMappings 返回的地址 设置DispatherServlet对应处理的地址
    public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
      /**
       * 指定service / mapper层的配置类
       */
      @Override
      protected Class<?>[] getRootConfigClasses() {
        return null;
      }
    
      /**
       * 指定springmvc的配置类
       * @return
       */
      @Override
      protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { SpringMvcConfig.class };
      }
    
      /**
       * 设置dispatcherServlet的处理路径!
       * 一般情况下为 / 代表处理所有请求!
       */
      @Override
      protected String[] getServletMappings() {
        return new String[] { "/" };
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    4.7 启动测试
    • 注意: tomcat 应该是 10+版本!方可支持 Jakarta EE API!

    在这里插入图片描述

  • 相关阅读:
    深度解析BERT:从理论到Pytorch实战
    技术分享 | 想做App测试就一定要了解的App结构
    【计算机网络】 TCP——四次挥手
    Java8中的Stream流
    软件测试
    lambda表达式的使用
    Java从入门到精通-类和对象(三)
    2022到2023基于java+微信小程序毕业设计课题参考
    MyBatis拦截器(JDBC的执行流程、MyBatis执行流程、Mybatis拦截器)
    支持向量机之松弛因子与线性支持向量机
  • 原文地址:https://blog.csdn.net/sgsgkxkx/article/details/133525445