SpringMVC底层执行流程及原理解析

作者:努力学习的Peanut 时间:2022-11-19 03:34:56 

一个简单的HelloSpringMVC程序

先在web,xml中注册一个前端控制器(DispatcherServlet)


<?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">
    <!--配置DispatcherServlet:这是SpringMVC的核心,请求分发器,前端控制器-->
    <servlet>
     <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!--要绑定springmvc的配置文件-->
      <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-servlet.xml</param-value>
      </init-param>
      <!--启动级别为1-->
      <load-on-startup>1</load-on-startup>
    </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

配置文件(springmvc-servlet.xml)

HandlerMapper是处理器映射器-->根据请求的地址去找处理器(如案例中的"/hello")

HandlerAdapter是处理器适配器-->找到处理器后根据id去适配对应的controller(如适配到案例中的HelloController),controller会返回ModelAndView及其前端数据

ViewResolver是视图解析器,其作用为:

1.获取到ModelAndView中的数据

2.解析视图名称

3.拼接视图名称

4.数据渲染


<?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 http://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>

<bean id="/hello" class="com.kuang.contorller.HelloController"/>
</beans>

controller层:

实现Controller接口,重写内部方法(一般不会使用,这是底层原理)

ModelAndView是模型、视图


public class HelloController implements Controller {
  @Override
  public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
    ModelAndView mv = new ModelAndView();
    mv.addObject("msg","HelloSpringMVC!");
    mv.setViewName("test");
    return mv;
  }
}

底层流程图

实线是SpringMVC已经帮你实现好了,虚线是需要自己手动

SpringMVC底层执行流程及原理解析

以上仅是说明底层执行原理,实际开发并不会这样去使用!

在实际开发中SpringMVC推荐使用注解的方式

在注解开发中,不需要我们去配置处理器适配器和处理器映射器。

web.xml中只需配置DispatcherServlet前端控制器


<?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>

在springmvc-servlet.xml中配置视图解析器等


<context:component-scan base-package="com.kuang.controller"/>  /*组件扫描,用于扫描controller下的包*/
   <mvc:default-servlet-handler/>              /*静态资源过滤*/
   <mvc:annotation-driven/>                 /*这个就帮助我们配置了映射器以及适配器*/

<?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">
    <context:component-scan base-package="com.kuang.controller"/>
    <mvc:default-servlet-handler/>
    <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>

contorller


@Controller//说明这类被Spring托管了
@RequestMapping("/hello")
public class HelloController {
  @RequestMapping("/h1")//这个注解会执行视图解析器
  public String hello(Model model){
    model.addAttribute("msg","helloSpringMVCAnnotation");
    return "hello";
  }
}

来源:https://www.cnblogs.com/peanutBlog/p/12914059.html

标签:Spring,MVC,底层,流程,原理
0
投稿

猜你喜欢

  • C#生成随机数的方法小结

    2023-03-30 22:07:33
  • redisson特性及优雅实现示例

    2022-02-13 19:51:25
  • Java二分查找算法与数组处理的应用实例

    2022-07-11 01:26:57
  • 关于Spring事务隔离、传播属性与@Transactional注解

    2021-11-15 04:37:11
  • 浅谈java泛型的作用及其基本概念

    2022-08-10 07:53:47
  • C#给文字换行的小技巧

    2023-07-01 07:38:00
  • Java环境配置与编译运行详解

    2022-10-02 12:42:24
  • Unity使用摄像机实现望远镜效果

    2021-06-07 23:30:26
  • Android SeekBar充当Progress实现兔兔进度条Plus

    2021-12-05 16:36:25
  • 详解Spring Boot2 Webflux的全局异常处理

    2023-11-09 02:12:25
  • Spring IOC:CreateBean环节中的流程转换

    2022-06-10 12:28:31
  • C# 使用CancellationTokenSource取消多线程

    2023-11-15 00:31:54
  • C#基于Socket套接字的网络通信封装

    2023-11-08 16:42:18
  • SpringBoot 如何实现异步编程

    2023-04-15 13:45:43
  • Java Swing实现JTable检测单元格数据变更事件的方法示例

    2022-10-16 19:49:29
  • 如何解决修改StaticText的字体

    2023-05-25 08:40:14
  • C#实现简单订单管理程序

    2023-04-08 08:26:34
  • JavaMail入门教程之解析邮件(5)

    2023-11-29 08:25:13
  • Java深入学习图形用户界面GUI之创建窗体

    2022-11-17 02:40:36
  • java Socket实现网页版在线聊天

    2022-10-19 12:13:42
  • asp之家 软件编程 m.aspxhome.com