Spring MVC简单执行流程

本文详细介绍了SpringMVC的工作流程,包括DispatcherServlet的作用及配置、HandlerMapping的处理过程、HandlerAdapter的不同类型及其功能、ViewResolver的具体实现方式,以及HandlerExceptionResolver如何处理异常。

本片博文主要复习下Spring MVC的执行流程,也方便自己面试的时候做简单的回顾;


以下执行流程图来此网络(动力节点图片)

这里写图片描述

近下来我们对Spring MVC的默认配置类 DispatcherServlet.properties类进行简单的分析:

DispatcherServlet.properties

com.springframework.web.servlet.DispatcherServlet.properties:
o.s.w.s = org.springframework.web.servlet 
//支持国际化,解析用户区域
osws.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

//提供了动态更换样式的支持
osws.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

//根据uri找到处理器handler和拦截器,并将其封装成处理器执行链,HandlerExecutionChain 返回给前端控制器;
osws.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

//HandlerAdapter的功能实际就是执行我们的具体的Controller、Servlet或者HttpRequestHandler中的方法;
osws.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

//HandlerExceptionResolver的功能实际就是执行我们的具体的Controller、Servlet或者HttpRequestHandler中的方法;
osws.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

//ViewResolver的主要作用是把一个逻辑上的视图名称解析为一个真正的视图
osws.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

// flashmap 的作用是在redirect中传递参数。重定向会生成新的request,那传递参数就不能直接用request进行传递。
osws.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

1: HandlerMapping:

HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;

这里写图片描述


2: HandlerAdapter:

boolean supports(Object handler); 

ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)

long getLastModified(HttpServletRequest request, Object handler); 

这里写图片描述

1、SimpleServletHandlerAdapter实际就是执行HttpServlet的service方法
2、SimpleControllerHandlerAdapter实际就是执行Controller的handleRequest方法
3、HttpRequestHandlerAdapter实际就是执行HttpRequestHandler的handleRequest方法
4、RequestMappingHandlerAdapter实际就是执行@RequestMapping注解的方法。
5、AnnotationMethodHandlerAdapter已结被废弃,


3: ViewResolver:

View resolveViewName(String viewName, Locale locale) throws Exception;

这里写图片描述
SpringMVC用于处理视图最重要的两个接口是ViewResolver和View。ViewResolver的主要作用是把一个逻辑上的视图名称解析为一个真正的视图,SpringMVC中用于把View对象呈现给客户端的是View对象本身,而ViewResolver只是把逻辑视图名称解析为对象的View对象。View接口的主要作用是用于处理视图,然后返回给客户端。

  1. AbstractCachingViewResolver:这是一个抽象类,这种视图解析器会把它曾经解析过的视图保存起来,然后每次要解析视图的时候先从缓存里面找。

  2. UrlBasedViewResolver:它是对ViewResolver的一种简单实现,而且继承了AbstractCachingViewResolver,主要就是提供的一种拼接URL的方式来解析视图,

  3. InternalResourceViewResolver: 它会把返回的视图名称都解析为InternalResourceView 对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。存放在/WEB-INF/下面的内容是不能直接通过request请求的方式请求到的,为了安全性考虑,我们通常会把jsp文件放在WEB-INF目录下,而InternalResourceView在服务器端跳转的方式可以很好的解决这个问题。

  4. XmlViewResolver:它继承自AbstractCachingViewResolver抽象类,所以它也是支持视图缓存的。XmlViewResolver需要给定一个xml配置文件,该文件将使用和Spring的bean工厂配置文件一样的DTD定义,所以其实该文件就是用来定义视图的bean对象的。在该文件中定义的每一个视图的bean对象都给定一个名字,然后XmlViewResolver将根据Controller处理器方法返回的逻辑视图名称到XmlViewResolver指定的配置文件中寻找对应名称的视图bean用于处理视图。该配置文件默认是/WEB-INF/views.xml文件,如果不使用默认值的时候可以在XmlViewResolver的location属性中指定它的位置。XmlViewResolver还实现了Ordered接口,因此我们可以通过其order属性来指定在ViewResolver链中它所处的位置,order的值越小优先级越高。

  5. BeanNameViewResolver:这个视图解析器跟XmlViewResolver有点类似,也是通过把返回的逻辑视图名称去匹配定义好的视图bean对象。不同点有二,一是BeanNameViewResolver要求视图bean对象都定义在Spring的application context中,而XmlViewResolver是在指定的配置文件中寻找视图bean对象,二是BeanNameViewResolver不会进行视图缓存。

  6. ResourceBundleViewResolver:它和XmlViewResolver一样,也需要有一个配置文件来定义逻辑视图名称和真正的View对象的对应关系,不同的是ResourceBundleViewResolver的配置文件是一个属性文件,而且必须是放在classpath路径下面的,默认情况下这个配置文件是在classpath根目录下的views.properties文件,如果不使用默认值的话,则可以通过属性baseName或baseNames来指定。

  7. ViewResolverComposite我们介绍了一些springMVC提供的很多视图解析器ViewResolver,在开发的一套springMVC系统中是可以使用多个视图的,当然就需要配置多个视图解析器了简单来说就是使用简单的List来保存你配置使用的视图解析器,


4: View:

void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;

这里写图片描述
图片来此网络(实际体系比此复制)
render中做的操作就是将model中的值全部存放到request和response中,这样就完成了请求的处理操作,最终就是返回response请求。


5:HandlerExceptionResolver:

ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);

这里写图片描述

  1. DefaultHandlerExceptionResolver:
    解决标准的spring异常,并且将他们翻译成HTTP状态码;

  2. ResonseStatusExceptionResolver:
    解决使用@ResponseStatus注解把异常转换成相应的状态码;

  3. SimpleMappingExceptionResolver:
    解决异常类到view的映射与跳转问题;

  4. HandlerExceptionResolverComposite:
    作为容器使用,可以封装别的Resolver,它并不会解析具体的异常,而是调用其他的异常解析器处理异常

  5. ExceptionHandlerExceptionResolver:
    从spring mvc3 开始代替 AnnotationMethodHandlerException来处理注解异常;


菜鸟感觉,要想很好的理解运用spring mvc 还是理解思想,掌握流程,参看源码,以下几篇博文,对理解Spring mvc的流程很有帮助:
1. Sping mvc 源码分析
2. Spring mvc源码解析之异常解析

### Spring MVC 请求处理流程详解 Spring MVC 是基于 Java 实现的一个轻量级 Web 框架,遵循 MVC(Model-View-Controller)设计模式,用于构建 Web 应用程序。以下是 Spring MVC 的请求处理流程的详细解析: #### 1. 用户发送请求到前端控制器(DispatcherServlet) 当用户通过浏览器发起 HTTP 请求时,该请求首先会被 DispatcherServlet 捕获并处理[^5]。 #### 2. 前端控制器请求 HandlerMapping 查找 Handler DispatcherServlet 接收到请求后,会调用 HandlerMapping 来查找与该请求匹配的 Handler(处理器)。HandlerMapping 可以根据 XML 配置或注解来查找对应的处理器[^5]。 #### 3. 处理器映射器向前端控制器返回 Handler HandlerMapping 找到匹配的 Handler 后,将其返回给 DispatcherServlet[^5]。 #### 4. 前端控制器调用处理器适配器执行 Handler DispatcherServlet 调用 HandlerAdapter 来执行找到的 Handler。HandlerAdapter 是一个适配器,负责执行具体的处理器逻辑。 #### 5. Handler 执行完成后返回 ModelAndView Handler(通常是一个 Controller 类中的方法)执行完成后,会返回一个 ModelAndView 对象。该对象包含模型数据和视图信息。 #### 6. 处理器适配器向前端控制器返回 ModelAndView HandlerAdapter 将 Handler 返回的 ModelAndView 对象传递回 DispatcherServlet[^5]。 #### 7. 前端控制器请求视图解析器进行视图解析 DispatcherServlet 调用 ViewResolver(视图解析器)将逻辑视图名解析为实际的视图对象。视图解析器会根据配置的规则将逻辑视图名转换为物理视图路径。 #### 8. 视图解析器向前端控制器返回 View ViewResolver 解析完成后,将实际的视图对象返回给 DispatcherServlet。 #### 9. 前端控制器进行视图渲染 DispatcherServlet 调用视图对象的 `render` 方法进行视图渲染。在此过程中,模型数据会被填充到请求域中,并最终生成 HTML 页面。 #### 10. 前端控制器向用户响应结果 渲染完成后的视图内容通过 HttpServletResponse 返回给客户端,用户可以在浏览器中看到最终的页面结果。 ### 示例代码 以下是一个简单Spring MVC 示例,展示了如何通过注解配置处理器以及视图解析器的工作过程: ```java @Controller public class HelloController { @RequestMapping("/hello") public String handleRequest(Model model) { model.addAttribute("message", "Hello, Spring MVC!"); return "hello"; // 返回逻辑视图名 } } ``` 在上述代码中,`handleRequest` 方法被 `@RequestMapping` 注解标记,表示它将处理 `/hello` 请求。方法返回的字符串 `"hello"` 是逻辑视图名,Spring MVC 会通过视图解析器将其解析为实际的视图路径,例如 `/WEB-INF/views/hello.jsp`。 ### 配置示例 在 Spring MVC 中,可以通过 XML 或 Java 配置启用注解驱动的功能。以下是基于 XML 的配置示例: ```xml <mvc:annotation-driven/> <!-- 静态资源处理 --> <mvc:resources mapping="/static/**" location="/static/"/> <!-- 拦截器配置 --> <mvc:interceptors> <bean class="com.example.interceptor.AuthInterceptor"/> </mvc:interceptors> ``` 上述配置启用了注解驱动功能,并设置了静态资源的映射规则以及拦截器[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值