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

 更新时间:2020年05月21日 09:07:58   作者:努力学习的Peanut  
这篇文章主要介绍了SpringMVC底层执行流程及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一个简单的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推荐使用注解的方式

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 在logback.xml中自定义动态属性的方法

    在logback.xml中自定义动态属性的方法

    这篇文章主要介绍了在logback.xml中自定义动态属性的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • mac下修改idea的jvm运行参数解决idea卡顿的情况

    mac下修改idea的jvm运行参数解决idea卡顿的情况

    这篇文章主要介绍了mac下修改idea的jvm运行参数解决idea卡顿的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • java字符流缓冲区详解

    java字符流缓冲区详解

    这篇文章主要为大家详细介绍了java字符流缓冲区的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 使用spring oauth2框架获取当前登录用户信息的实现代码

    使用spring oauth2框架获取当前登录用户信息的实现代码

    这篇文章主要介绍了使用spring oauth2框架获取当前登录用户信息的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Mybatis collection查询集合属性报错的解决方案

    Mybatis collection查询集合属性报错的解决方案

    这篇文章主要介绍了Mybatis collection查询集合属性报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java文本编辑器实现方法详解

    Java文本编辑器实现方法详解

    这篇文章主要介绍了Java文本编辑器实现方法,结合实例形式详细分析了java文本编辑器结构、原理、布局、实现步骤与相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • MyBatis 如何获取子类的属性

    MyBatis 如何获取子类的属性

    这篇文章主要介绍了MyBatis 如何获取子类的属性,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java中的Semaphore如何使用

    Java中的Semaphore如何使用

    Semaphore实际上是一种共享锁,因为它允许多个线程并发获取共享的资源,在Semaphore对象创建时必须设置可用令牌的初始数量permits,用于控制并发时同时获取资源权限的线程数量,这篇文章主要介绍了Java中的Semaphore如何使用,需要的朋友可以参考下
    2022-06-06
  • 从零搭建Spring Boot脚手架整合OSS作为文件服务器的详细教程

    从零搭建Spring Boot脚手架整合OSS作为文件服务器的详细教程

    这篇文章主要介绍了从零搭建Spring Boot脚手架整合OSS作为文件服务器的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Spring事务失效之常见场景分析

    Spring事务失效之常见场景分析

    这篇文章主要介绍了Spring事务失效之常见场景,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04

最新评论