当前位置: 首页 > 编程笔记 >

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

朱翔
2023-03-14
本文向大家介绍SpringMVC底层执行流程及原理解析,包括了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";
   }
 }

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

 类似资料:
  • 主要内容:一、写在前面,二、ReentrantLock和AQS的关系,三、ReentrantLock加锁和释放锁的底层原理,四、总结一、写在前面 上一篇文章聊了一下java并发中常用的原子类的原理和Java 8的优化,具体请参见文章:《为什么程序员招聘都要5年经验起?因为他们懂Java8底层优化!》。 这篇文章,我们来聊聊面试的时候比较有杀伤力的一个问题:聊聊你对AQS的理解? 之前有同学反馈,去互联网公司面试,面试官聊到并发时就问到了这个问题。当时那位同学内心估计受到了一万点伤害。。。 因为首

  • 本文向大家介绍Javascript执行流程细节原理解析,包括了Javascript执行流程细节原理解析的使用技巧和注意事项,需要的朋友参考一下 Javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈、全局对象、执行环境、变量对象、活动对象、作用域和作用域链等,这些概念正是JS引擎工作的核心组件。这篇文章的目的不是

  • 主要内容:1.Spi机制处理,2.调用onStarterup方法,3.DispatcherServlet类分析,4.web容器的准备阶段,5.Question这里的SpringMvc是基于注解版的, 在Servlet3.0之后注解版为主要的实现方式。 1.Spi机制处理 Servlet的规范ServletContainerInitializer的实现类上面的注解代表着这个接口的实现都是来自Spi机制的。 于是加载了所有实现WebApplicationInitializer的接口的类 2.调用on

  • 本文向大家介绍详解ssh框架原理及流程,包括了详解ssh框架原理及流程的使用技巧和注意事项,需要的朋友参考一下 什么是SSH SSH是 struts+spring+hibernate的一个集成框架,是目前较流行的一种web应用程序开源框架。SSH不是一个框架,而是把多个框架(Struts、Spring以及Hibernate)紧密的结合在一起,用于构建灵活、易于扩展的多层Web应用程序。 SSH框架

  • 主要内容:一、synchronized的使用方式,二、synchronized锁的原理,三、synchronized锁的优化,四、Lock锁与synchronized一、synchronized的使用方式 在语法上,要使用synchronized关键字,需要把任意一个非null对象作为"锁"对象,也就是需要一个对象监视器(Object Monitor)。总的来说有三种用法: 1.1 作用在实例方法 修饰实例方法,相当于对当前实例对象this加锁,this作为对象监视器。 1.2 作用在静态方法

  • 主要内容:一、synchronized的使用方式,二、synchronized锁的原理,三、synchronized锁的优化,四、Lock锁与synchronized一、synchronized的使用方式 在语法上,要使用synchronized关键字,需要把任意一个非null对象作为"锁"对象,也就是需要一个对象监视器(Object Monitor)。总的来说有三种用法: 1.1 作用在实例方法 修饰实例方法,相当于对当前实例对象this加锁,this作为对象监视器。 1.2 作用在静态方法