SpringMVC简介和体验(一)

一、SpringMVC简介和体验

1. 介绍

https://docs.spring.io/spring-framework/reference/web/webmvc.html

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);
}

基于SpringMVC开发代码片段

@RequestMapping("/user/login")
public String login(@RequestParam("userName") String userName,Sting password){
    
    log.debug("userName="+userName);
    //调用业务即可
    
    return "result";
}

2. 主要作用

在这里插入图片描述

SSM框架构建起单体项目的技术栈需求!其中的SpringMVC负责表述层(控制层)实现简化!

SpringMVC的作用主要覆盖的是表述层,例如:

  • 请求映射
  • 数据输入
  • 视图界面
  • 请求分发
  • 表单回显
  • 会话控制
  • 过滤拦截
  • 异步交互
  • 文件上传
  • 文件下载
  • 数据校验
  • 类型转换
  • 等等等

最终总结:

  1. 简化前端参数接收( 形参列表 )
  2. 简化后端数据响应( 返回值 )
  3. 以及其他…

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

Spring MVC与许多其他Web框架一样,是围绕前端控制器模式设计的,其中中央 Servlet DispatcherServlet 做整体请求处理调度!

除了DispatcherServletSpringMVC还会提供其他特殊的组件协作完成请求处理和响应呈现。

SpringMVC处理请求流程:

在这里插入图片描述

SpringMVC涉及组件理解:

  1. DispatcherServlet : SpringMVC提供,我们需要使用web.xml配置使其生效,它是整个流程处理的核心,所有请求都经过它的处理和分发!
  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. 快速体验

  1. 体验场景需求

    在这里插入图片描述

  2. 配置分析

    1. DispatcherServlet,在web.xml配置!设置处理所有请求!
    2. HandlerMapping,HandlerAdapter,Handler需要加入到IoC容器,供DS调用!
    3. Handler自己声明(Controller)需要配置到HandlerMapping中供DS查找!
  3. 准备项目

    1. 创建项目

      springmvc-base-quick

      注意:需要转成maven/web程序!!

    2. 导入依赖

      <properties>
          <spring.version>6.0.6</spring.version>
          <maven.compiler.source>17</maven.compiler.source>
          <maven.compiler.target>17</maven.compiler.target>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
      
      <dependencies>
          <!-- springioc相关依赖  -->
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context</artifactId>
              <version>${spring.version}</version>
          </dependency>
      
          <!-- web相关依赖  -->
          <!-- 在 pom.xml 中引入 Jakarta EE Web API 的依赖 -->
          <!--
              在 Spring Web MVC 6 中,Servlet API 迁移到了 Jakarta EE API,因此在配置 DispatcherServlet 时需要使用
               Jakarta EE 提供的相应类库和命名空间。错误信息 “‘org.springframework.web.servlet.DispatcherServlet’
               is not assignable to ‘javax.servlet.Servlet,jakarta.servlet.Servlet’” 表明你使用了旧版本的
               Servlet API,没有更新到 Jakarta EE 规范。
          -->
          <dependency>
              <groupId>jakarta.platform</groupId>
              <artifactId>jakarta.jakartaee-web-api</artifactId>
              <version>9.1.0</version>
              <scope>provided</scope>
          </dependency>
      
          <!-- springwebmvc相关依赖  -->
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-webmvc</artifactId>
              <version>${spring.version}</version>
          </dependency>
      
      </dependencies>
      
  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!!";
        }
    }
    
    
  5. SpringIoC配置

    <?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对应的包,将handler加入到ioc-->
        <context:component-scan base-package="com.atguigu.controller" />
    
        <!-- 方案1: 手动配置handlerMapping 和 handlerAdapter -->
        <!-- handlerMapping
             RequestMappingHandlerMapping 就是springmvc提供的组件
             支持@RequestMapping方式注册的handler
        -->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
        <!-- handlerAdapter
             RequestMappingHandlerAdapter 就是springmvc提供的组件
             支持@RequestMapping方式注册的handler
        -->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
        <!-- 方案2: 不配置
             解释: springmvc会在启动的时候,如果发现我们没有配置handlerMapping,handlerAdapter,viewResolver
             就会加载spring-webmvc包下的配置DispatcherServlet.properties下的组件!
             DispatcherServlet.properties:
               org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
                    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\
                    org.springframework.web.servlet.function.support.RouterFunctionMapping
    
                org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
                    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
                    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\
                    org.springframework.web.servlet.function.support.HandlerFunctionAdapter
                ........
    
             所以,我们可以不同写,也会默认加载! 注意: 一旦你配置了,就不会加载对应的默认组件切记!!!
        -->
    
         <!-- viewResolver 不需要配置,因为我们不需要查找逻辑视图!!! -->
    
    </beans>  
    
  6. web.xml配置

    <?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">
        <!-- 配置SpringMVC中负责处理请求的核心Servlet,也被称为SpringMVC的前端控制器 -->
      <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <!-- DispatcherServlet的全类名 -->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 通过初始化参数指定SpringMVC配置文件位置 -->
        <init-param>
          <!-- 如果不记得contextConfigLocation配置项的名称,可以到DispatcherServlet的父类FrameworkServlet中查找 -->
          <param-name>contextConfigLocation</param-name>
          <!-- 使用classpath:说明这个路径从类路径的根目录开始才查找 -->
          <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!-- 作为框架的核心组件,在启动过程中有大量的初始化操作要做,这些操作放在第一次请求时才执行非常不恰当 -->
        <!-- 我们应该将DispatcherServlet设置为随Web应用一起启动 -->
        <load-on-startup>100</load-on-startup>
    
      </servlet>
    
      <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <!-- 对DispatcherServlet来说,url-pattern有两种方式配置 -->
        <!-- 配置“/”,表示匹配整个Web应用范围内所有请求。这里有一个硬性规定:不能写成“/*”。
          只有这一个地方有这个特殊要求,以后我们再配置Filter还是可以正常写“/*”。 -->
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
    </web-app>
    
  7. 启动测试

    注意: tomcat应该是10+版本!方可支持 Jakarta EE API!

    在这里插入图片描述

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值