飞道的博客

SpringMVC的执行流程

312人阅读  评论(0)

一、DispatcherServlet宏观流程

1、请求被DispatherServlet拦截

2 、HandlerMapping为处理器映射,DispatcherServlet调用,HandlerMapping,HandlerMapping根据请求url查找Handler(处理器)

3、HandlerExecution表示具体Handler,其主要作用是根据url查找控制器,如上url被查找控制器

4、HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。

5、Handler让具体的Controller执行。

6、Controller让具体的执行信息返回给HandlerAdapter,如ModelAndView

7、HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet

8、DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名

9、视图解析器将解析的逻辑视图名传给DispatcherServlet。

10、DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

11、最终视图呈现给用户

我个人的理解:

一个请求请求进来,被DispatcherServlet进行拦截,然后映射给HandlerMapping,由HandlerMapping找到Controller的id,然后返回给DispatcherServlet,然后由DispatcherServlet交给了HandlerAdapter,找到具体的controller即可,再调用具体的业务,然后返回给DispatcherServlet,将数据封装到VidewResolver,然后返回给前端。

SpringMvc将代码web代码运行过程封装成一个个的对象

二、SpringMVC的两种使用方式:配置文件,注解

1)配置文件方式

(1)配置文件中的web.xml的配置


  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version= "4.0">
  6. <!--1.注册servlet-->
  7. <servlet>
  8. <servlet-name>SpringMVC </servlet-name>
  9. <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
  10. <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
  11. <init-param>
  12. <param-name>contextConfigLocation </param-name>
  13. <param-value>classpath:springmvc-servlet.xml </param-value>
  14. </init-param>
  15. <!-- 启动顺序,数字越小,启动越早 -->
  16. <load-on-startup>1 </load-on-startup>
  17. </servlet>
  18. <!--所有请求都会被springmvc拦截 -->
  19. <servlet-mapping>
  20. <servlet-name>SpringMVC </servlet-name>
  21. <url-pattern>/ </url-pattern>
  22. </servlet-mapping>
  23. </web-app>

在web.xml中进行配置DispatcherServlet,首先当请求请求过来的时候,会被拦截器进行拦截,然后调用DispatcherServlet,由DispatcherServlet然后调用Springmvc-servlet.xml中的映射器

(2)springmvc-servlet.xml


  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context= "http://www.springframework.org/schema/context"
  5. xmlns:mvc= "http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation= "http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. https://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. https://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <!-- 添加处理映射器-->
  13. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
  14. <!-- 添加处理器适配器-->
  15. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
  16. <!--视图解析器:DispatcherServlet给他的ModelAndView-->
  17. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
  18. <!--前缀-->
  19. <property name="prefix" value="/WEB-INF/jsp/"/>
  20. <!--后缀-->
  21. <property name="suffix" value=".jsp"/>
  22. </bean>
  23. <!-- Handler-->
  24. <bean id="/hello" class="com.kuang.controller.HelloController"/>
  25. </beans>

由映射器进行映射,url和Controller,然后再通过适配器调取handler

(3)Controller


  
  1. package com.kuang.controller;
  2. import org.springframework.web.servlet.ModelAndView;
  3. import org.springframework.web.servlet.mvc.Controller;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class HelloController implements Controller {
  7. @Override
  8. public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  9. ModelAndView mv = new ModelAndView();
  10. //业务代码
  11. String result = "HelloSpringMVC";
  12. mv.addObject( "msg",request);
  13. //视图跳转(页面的名字)
  14. mv.setViewName( "test");
  15. return mv;
  16. }
  17. }

2)注解的方式

(1)web.xml


  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version= "4.0">
  6. <!--1.注册servlet-->
  7. <servlet>
  8. <servlet-name>SpringMVC </servlet-name>
  9. <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
  10. <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
  11. <init-param>
  12. <param-name>contextConfigLocation </param-name>
  13. <param-value>classpath:springmvc-servlet.xml </param-value>
  14. </init-param>
  15. <!-- 启动顺序,数字越小,启动越早 -->
  16. <load-on-startup>1 </load-on-startup>
  17. </servlet>
  18. <!--所有请求都会被springmvc拦截 -->
  19. <servlet-mapping>
  20. <servlet-name>SpringMVC </servlet-name>
  21. <url-pattern>/ </url-pattern>
  22. </servlet-mapping>
  23. </web-app>

(2) springmvc-servlet


  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context= "http://www.springframework.org/schema/context"
  5. xmlns:mvc= "http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation= "http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. https://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. https://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
  13. <context:component-scan base-package="com.kuang.controller"/>
  14. <!-- 让Spring MVC不处理静态资源 .css .js .html-->
  15. <mvc:default-servlet-handler />
  16. <!--
  17. 支持mvc注解驱动
  18. 在spring中一般采用@RequestMapping注解来完成映射关系
  19. 要想使@RequestMapping注解生效
  20. 必须向上下文中注册DefaultAnnotationHandlerMapping
  21. 和一个AnnotationMethodHandlerAdapter实例
  22. 这两个实例分别在类级别和方法级别处理。
  23. 而annotation-driven配置帮助我们自动完成上述两个实例的注入。
  24. -->
  25. <mvc:annotation-driven />
  26. <!-- 视图解析器 -->
  27. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
  28. id= "internalResourceViewResolver">
  29. <!-- 前缀 -->
  30. <property name="prefix" value="/WEB-INF/jsp/" />
  31. <!-- 后缀 -->
  32. <property name="suffix" value=".jsp" />
  33. </bean>
  34. </beans>

(3) controller


  
  1. @Controller
  2. @RequestMapping("/hello")
  3. public class HelloController {
  4. @RequestMapping("/h1")
  5. public String hello(Model model){
  6. //封装数据
  7. model.addAttribute( "msg", "Hello,SpringMVCAnnotation");
  8. return "hello"; //会被视图解析器处理
  9. }
  10. }

 


转载:https://blog.csdn.net/MyxZxd/article/details/116427917
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场