SpringMVC原理剖析

Posted Ferron Zhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC原理剖析相关的知识,希望对你有一定的参考价值。

初识SpringMVC

概述

笔者这段时间在学习SpringMVC,于是突发奇想想写一篇博客来记录学习的过程,希望自己巩固知识的同时,也能帮助到别人。

SpringMVC原理剖析

SpringMVC是基于Java实现MVC的轻量级Web框架。原来的MVC框架是由servlet,javabean,jsp构成。在SpringMVC中,一切的核心是DispatcherServlet。DispatcherServlet的本质也是一个servlet,用户的所有请求都会通过这个核心的DispatcherServlet,进而协调整个MVC框架。
SpringMVC的工作流程如下:

  1. 用户的请求首先会通过DispatcherServlet,DispatcherServlet接收到用户请求的url时,调用HandlerMapping查找对应url的handler,并向DispatcherServlet返回对应的HandlerExecution(handler)。
  2. DispatcherServlet接收到对应的HandlerExecution,将传递给HandlerAdapter,HandlerAdapter再让具体的控制器(Controller)去执行
  3. Controller执行业务代码后,将ModelAndView返回给HanderAdapter,HanderAdapter再传递给DispatcherServlet。
  4. DispatcherServlet接收到ModelAndView结果后,会调用ViewResolver去解析视图。
  5. DispatcherServlet根据ViewResolver的解析结果,调用具体视图响应给用户。

回顾Servlet

因为SpringMVC的核心终究还是Servlet,因此在实现SpringMVC之前,我们先来回顾一下之前我们是怎么实现Servlet的。

  1. 首先新建一个空Maven项目,删掉其src文件夹,作为本篇文章所有项目的父项目,在父项目中导入相关依赖,同时固定jdk的版本。(因为笔者每次新建项目时jdk默认为1.5,目前对于笔者来说直接使用代码固定jdk版本更方便)
<dependencies>
      <!-- Srping依赖 -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.2.9.RELEASE</version>
      </dependency>
      <!-- junit单元测试-->
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
      </dependency>
      <!-- Servlet依赖 -->
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>4.0.1</version>
      </dependency>
      <!-- JSP依赖 -->
      <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.1</version>
      </dependency>
      <!-- JSTL表达式依赖 -->
      <dependency>
          <groupId>javax.servlet.jsp.jstl</groupId>
          <artifactId>jstl-api</artifactId>
          <version>1.2</version>
      </dependency>
      <!-- Standard标签库 -->
      <dependency>
          <groupId>taglibs</groupId>
          <artifactId>standard</artifactId>
          <version>1.1.2</version>
      </dependency>
  </dependencies>
  <!--固定jdk版本-->
  <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
      <java.version>11</java.version>
      <maven.compiler.source>11</maven.compiler.source>
      <maven.compiler.target>11</maven.compiler.target>
  </properties>
  1. 新建一个module,添加Web框架支持。
  2. 编写HelloServlet,
public class HelloServlet extends HttpServlet 
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 

       //业务代码
       String msg = "这个Servlet的结果";
       req.getSession().setAttribute("msg",msg);
       //转发
       req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);

   
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
       doGet(req, resp);
   

  1. 编写前端页面,前端页面提取msg。
  2. 配置Tomcat,测试。

原生态SpringMVC

  1. 新建一个module,这里建立一个空的Maven项目,同时添加web框架支持。同时在项目结构处新建lib文件夹,手动将依赖导入。(因为不使用模板创建Maven项目有时依赖会无法导入,运行时网页会报404,下面使用注解实现SpringMVC做同样操作)
  2. 编写web.xml配置文件。在这里注册了SpringMVC的核心DispatcherServlet。因为SpringMVC已经帮我们写好DispatcherServlet,我们只需要直接在web.xml中注册就好了。注册的同时需要绑定springmvc的核心配置文件springmvc-servlet.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">

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
  1. 编写核心配置文件springmvc-servlet.xml。在该配置文件中注册SpringMVC中的HandlerMapping,HanderAdapter,ViewResolver。因为这三个SpringMVC也已经帮我们写好了,所以只需要直接注册就行~
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
</beans>
  1. 编写一个控制器HelloController。ModelAndView是用来传递业务结果的。
public class HelloController implements Controller 
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception 
        ModelAndView mav = new ModelAndView();

        mav.addObject("msg","这是SpringMVC的结果");
        mav.setViewName("test");

        return mav;
    

  1. 编写完控制器之后,别忘了在springmvc-servlet.xml中注册。
<bean id="/t2" class="com.ferron.controller.HelloController"/>
  1. 编写前端页面,前端页面提取msg。
  2. 配置Tomcat,测试

使用注解实现SpringMVC

  1. 新建module,添加web框架支持。
  2. 编写同上的web.xml配置文件
  3. 编写核心配置文件springmvc-servlet.xml。
<?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
        https://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">

    <!--扫描包下的注解,让注解生效-->
    <context:component-scan base-package="com.ferron.controller"/>
    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>
  1. 编写一个控制器HelloControllerAnno。使用@Controller注解将其标记为一个控制器,此时就默认注册到springmvc-servlet.xml中了,使用@RequestMapping指定其请求url。
@Controller
public class HelloControllerAnno 

    @RequestMapping("/t3")
    public String test3(Model model)
        model.addAttribute("msg","这是SpringMVC注解的结果");

        return "test";
    

  1. 编写前端页面,提取msg。
  2. 配置Tomcat,测试

结尾

笔者是一个喜欢编程的985理工男,金融科技专业。目前在学习Java全栈技术,过段时间可能会开始接触大数据架构、区块链技术、云计算架构和人工智能等技术的学习,这是我第一次写博客,不足之处希望大家多多谅解。另外对于这篇博客有其他好的想法,以及有提高博客排版的建议,欢迎大家提出~~

以上是关于SpringMVC原理剖析的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC源码剖析-SpringMVC执行流程

SpringMVC源码剖析5:消息转换器HttpMessageConverter与@ResponseBody注解

深入浅出Spring原理及实战「原理分析专题」不看源码就带你剖析MVC容器核心流程以及运作原理

Kafka幂等性原理及实现剖析

skywalking插件工作原理剖析

协议基础:TCP/IP协议原理