SpringMVC概述
Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来:

springMVC组件流程


1.DispatcherServlet:中央控制器,把请求给转发到具体的控制类
2.Controller:具体处理请求的控制器
3.handlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略
4.ModelAndView:服务层返回的数据和视图层的封装类
5.ViewResolver & View:视图解析器,解析具体的视图
6.Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作
DispatcherServlet

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
//创建当前请求的web异步管理器
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
ModelAndView mv = null;
Exception dispatchException = null;
try {
//先检查是否是文件上传的请求,是则转化为MultipartHttpServletRequest
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
// Determine handler for the current request.
//判断当前请求该使用哪个处理器来处理
//第一步:由HandlerMapping找到对应的handler
//通过遍历HandlerMapping,以获得handler执行链
mappedHandler = getHandler(processedRequest, false);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
// Determine handler adapter for the current request.
//第二步,找到合适的HandlerAdapter,由它来调度执行handler的方法
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// Process last-modified header, if supported by the handler.
String method = request.getMethod();
boolean isGet = "GET".equals(method);
//get请求或者head请求
if (isGet || "HEAD".equals(method)) {
//获取资源上次被修改的头信息
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if (logger.isDebugEnabled()) {
logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);
}
if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
return;
}
}
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// Actually invoke the handler.
//第三步,执行handler,返回ModelAndView
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
if (asyncManager.isConcurrentHandlingStarted()) {
return;
}
applyDefaultViewName(request, mv);
mappedHandler.applyPostHandle(processedRequest, response, mv);
}
catch (Exception ex) {
dispatchException = ex;
}
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
catch (Exception ex) {
triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
}
catch (Error err) {
triggerAfterCompletionWithError(processedRequest, response, mappedHandler, err);
}
finally {
if (asyncManager.isConcurrentHandlingStarted()) {
// Instead of postHandle and afterCompletion
if (mappedHandler != null) {
mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
}
}
else {
// Clean up any resources used by a multipart request.
if (multipartRequestParsed) {
cleanupMultipart(processedRequest);
}
}
}
}
拦截器
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
}
HandlerAdaptor
public interface HandlerAdapter {
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
}
HandlerMapping
public interface HandlerMapping {
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
HandlerExecutionChain(删除了部分代码)
public class HandlerExecutionChain {
private final Object handler;
private HandlerInterceptor[] interceptors;
private List<HandlerInterceptor> interceptorList;
private int interceptorIndex = -1;
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
HandlerInterceptor[] interceptors = getInterceptors();
if (!ObjectUtils.isEmpty(interceptors)) {
for (int i = 0; i < interceptors.length; i++) {
HandlerInterceptor interceptor = interceptors[i];
if (!interceptor.preHandle(request, response, this.handler)) {
triggerAfterCompletion(request, response, null);
return false;
}
this.interceptorIndex = i;
}
}
return true;
}
void applyPostHandle(HttpServletRequest request, HttpServletResponse response, ModelAndView mv) throws Exception {
HandlerInterceptor[] interceptors = getInterceptors();
if (!ObjectUtils.isEmpty(interceptors)) {
for (int i = interceptors.length - 1; i >= 0; i--) {
HandlerInterceptor interceptor = interceptors[i];
interceptor.postHandle(request, response, this.handler, mv);
}
}
}
void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, Exception ex)
throws Exception {
HandlerInterceptor[] interceptors = getInterceptors();
if (!ObjectUtils.isEmpty(interceptors)) {
for (int i = this.interceptorIndex; i >= 0; i--) {
HandlerInterceptor interceptor = interceptors[i];
try {
interceptor.afterCompletion(request, response, this.handler, ex);
}
catch (Throwable ex2) {
logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);
}
}
}
}
void applyAfterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response) {
HandlerInterceptor[] interceptors = getInterceptors();
if (!ObjectUtils.isEmpty(interceptors)) {
for (int i = interceptors.length - 1; i >= 0; i--) {
if (interceptors[i] instanceof AsyncHandlerInterceptor) {
try {
AsyncHandlerInterceptor asyncInterceptor = (AsyncHandlerInterceptor) interceptors[i];
asyncInterceptor.afterConcurrentHandlingStarted(request, response, this.handler);
}
catch (Throwable ex) {
logger.error("Interceptor [" + interceptors[i] + "] failed in afterConcurrentHandlingStarted", ex);
}
}
}
}
}
}
HandlerMapping接口的实现() :
BeanNameUrlHandlerMapping :通过对比url和bean的name找到对应的对象
SimpleUrlHandlerMapping :也是直接配置url和对应bean,比BeanNameUrlHandlerMapping功能更多
DefaultAnnotationHandlerMapping :主要是针对注解配置@RequestMapping的(已过时)
RequestMappingHandlerMapping :取代了上面一个

分享到:
相关推荐
阅读本篇文章有助于快速了解MVC框架实现原理,帮助新人熟悉开发环境。
SpringMVC 工作原理 SpringMVC 是一种基于 Java 的 Web 应用程序框架,它提供了一种 Model-View-Controller(MVC)架构的实现方式。SpringMVC 的工作原理可以分为以下几个步骤: 1. 用户发送请求:用户通过浏览器...
mybatis.hibernate,springmvc工作原理以及流程总结文档
SpringMVC的工作原理是基于一系列组件的协作,这些组件包括DispatcherServlet、HandlerMapping、Controller、ModelAndView和ViewResolver。 首先,客户端发起HTTP请求,这个请求会到达DispatcherServlet,这是...
在SpringMVC的工作流程中,各个组件协同工作,使得Web应用程序能够高效地处理用户请求并呈现响应结果。 1. 用户发送请求至前端控制器DispatcherServlet。这是SpringMVC流程的起点,用户发起HTTP请求到达服务器,...
其工作原理如下: 1. **用户请求**:当用户通过浏览器或其他HTTP客户端发送请求到服务器时,请求首先到达前端控制器`DispatcherServlet`。 2. **DispatcherServlet**:前端控制器是SpringMVC的核心组件,它接收...
SpringMVC 工作原理实例详解 SpringMVC 是 Spring Framework 中的一部分,当我们需要使用 Spring 框架创建 web 应用程序时,就需要引入 SpringWebMVC。SpringMVC 工作原理实例详解中,通过示例代码介绍了非常详细,...
SpringMVC是一个开源的Java框架,它是Spring项目的一部分,用于简化Web应用程序的开发。SpringMVC通过采用MVC(Model-View-Controller)设计模式,将Web层进行分层管理,以此来达到前后端代码分离的目的。在...
这是一项很好的练习,能够加深对SpringMVC工作原理的认识,并提高我们的编程能力。 在实际开发中,SpringMVC提供了许多开箱即用的功能,如注解驱动的控制器、数据绑定、类型转换、本地化和主题支持等。这些功能极大...
SpringMVC框架原理.mp4
刚想搭建一个新的网站,然后就搭建了一个SpringMVC+MyBatis的框架 IDE:MyEclipse 2015 JDK:1.8 Jar包里面都有了,可以直接跑通,自己也做一个记录,下次就可以直接用了。
入门程序是理解SpringMVC工作原理的重要途径,主要目的是熟悉SpringMVC的基本流程及其各个组件的作用。 - **非注解的处理器映射器和处理器适配器**:这是SpringMVC早期版本中使用的方法,主要用于没有使用注解的...
SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的...同时,通过查看项目结构和配置文件,可以加深对SpringMVC工作原理的理解。对于Eclipse和MyEclipse的用户来说,导入源码后可以直接运行,方便调试和学习。
SpringMVC框架原理图
总的来说,这个案例为初学者提供了一个了解SpringMVC工作原理的起点。通过这个案例,你可以学习到如何配置SpringMVC,编写控制器,以及如何将数据和视图结合在一起,从而创建一个基本的Web应用。进一步学习和实践,...
SpringMVC工作原理** SpringMVC通过DispatcherServlet接收HTTP请求,然后根据请求信息(如URL、参数)找到对应的Handler(控制器)。控制器执行业务逻辑后,可能会返回一个ModelAndView对象,包含了视图名和模型...
SpringMVC 工作原理: 1. **接收请求**:客户端发送请求到 DispatcherServlet(前端控制器)。 2. **处理请求**:DispatcherServlet 查询 HandlerMapping(处理器映射器),找到处理请求的 Controller。 3. **执行...
本资源总结了 Java SpringMvc 经典面试题,涵盖了 SpringMvc 的工作原理、为什么要用 Spring、SSH 整合、Spring 的事务管理等知识点。 一、SpringMvc 工作原理 SpringMvc 的工作原理可以分为六个步骤: 1. ...
该项目提供了完整的源代码,使得学习者能够通过实际操作来加深对SpringMVC工作原理的理解。 在SpringMVC中,注解是实现控制器、请求映射、模型绑定、视图解析等关键功能的主要手段。例如,`@Controller`注解标记一...