`
javandroid
  • 浏览: 27659 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

springMVC工作原理

 
阅读更多

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 :取代了上面一个


分享到:
评论

相关推荐

    SpringMVC工作原理

    阅读本篇文章有助于快速了解MVC框架实现原理,帮助新人熟悉开发环境。

    springmvc工作原理

    SpringMVC 工作原理 SpringMVC 是一种基于 Java 的 Web 应用程序框架,它提供了一种 Model-View-Controller(MVC)架构的实现方式。SpringMVC 的工作原理可以分为以下几个步骤: 1. 用户发送请求:用户通过浏览器...

    mybatis.hibernate,springmvc工作原理以及流程总结文档.pdf

    mybatis.hibernate,springmvc工作原理以及流程总结文档

    SpringMVC工作原理11

    SpringMVC的工作原理是基于一系列组件的协作,这些组件包括DispatcherServlet、HandlerMapping、Controller、ModelAndView和ViewResolver。 首先,客户端发起HTTP请求,这个请求会到达DispatcherServlet,这是...

    SpringMVC工作原理1

    在SpringMVC的工作流程中,各个组件协同工作,使得Web应用程序能够高效地处理用户请求并呈现响应结果。 1. 用户发送请求至前端控制器DispatcherServlet。这是SpringMVC流程的起点,用户发起HTTP请求到达服务器,...

    SpringMVC工作原理.docx

    其工作原理如下: 1. **用户请求**:当用户通过浏览器或其他HTTP客户端发送请求到服务器时,请求首先到达前端控制器`DispatcherServlet`。 2. **DispatcherServlet**:前端控制器是SpringMVC的核心组件,它接收...

    SpringMVC工作原理实例详解

    SpringMVC 工作原理实例详解 SpringMVC 是 Spring Framework 中的一部分,当我们需要使用 Spring 框架创建 web 应用程序时,就需要引入 SpringWebMVC。SpringMVC 工作原理实例详解中,通过示例代码介绍了非常详细,...

    SpringMVC工作原理及介绍

    SpringMVC是一个开源的Java框架,它是Spring项目的一部分,用于简化Web应用程序的开发。SpringMVC通过采用MVC(Model-View-Controller)设计模式,将Web层进行分层管理,以此来达到前后端代码分离的目的。在...

    手写简易版SpringMVC,探索SpringMVC原理

    这是一项很好的练习,能够加深对SpringMVC工作原理的认识,并提高我们的编程能力。 在实际开发中,SpringMVC提供了许多开箱即用的功能,如注解驱动的控制器、数据绑定、类型转换、本地化和主题支持等。这些功能极大...

    SpringMVC框架原理.mp4

    SpringMVC框架原理.mp4

    SpringMVC+MyBatis源码

    刚想搭建一个新的网站,然后就搭建了一个SpringMVC+MyBatis的框架 IDE:MyEclipse 2015 JDK:1.8 Jar包里面都有了,可以直接跑通,自己也做一个记录,下次就可以直接用了。

    springmvc学习第一天

    入门程序是理解SpringMVC工作原理的重要途径,主要目的是熟悉SpringMVC的基本流程及其各个组件的作用。 - **非注解的处理器映射器和处理器适配器**:这是SpringMVC早期版本中使用的方法,主要用于没有使用注解的...

    SpringMVC入门案例源码

    SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的...同时,通过查看项目结构和配置文件,可以加深对SpringMVC工作原理的理解。对于Eclipse和MyEclipse的用户来说,导入源码后可以直接运行,方便调试和学习。

    SpringMVC框架原理、

    SpringMVC框架原理图

    springmvc完整案例

    总的来说,这个案例为初学者提供了一个了解SpringMVC工作原理的起点。通过这个案例,你可以学习到如何配置SpringMVC,编写控制器,以及如何将数据和视图结合在一起,从而创建一个基本的Web应用。进一步学习和实践,...

    Mybatis-SpringMVC在线考试系统源码

    SpringMVC工作原理** SpringMVC通过DispatcherServlet接收HTTP请求,然后根据请求信息(如URL、参数)找到对应的Handler(控制器)。控制器执行业务逻辑后,可能会返回一个ModelAndView对象,包含了视图名和模型...

    SpringMVC面试专题及答案.pdf

    SpringMVC 工作原理: 1. **接收请求**:客户端发送请求到 DispatcherServlet(前端控制器)。 2. **处理请求**:DispatcherServlet 查询 HandlerMapping(处理器映射器),找到处理请求的 Controller。 3. **执行...

    java springMvc经典面试题

    本资源总结了 Java SpringMvc 经典面试题,涵盖了 SpringMvc 的工作原理、为什么要用 Spring、SSH 整合、Spring 的事务管理等知识点。 一、SpringMvc 工作原理 SpringMvc 的工作原理可以分为六个步骤: 1. ...

    《基于注解的SpringMVC增删改DEMO源码》Maven版

    该项目提供了完整的源代码,使得学习者能够通过实际操作来加深对SpringMVC工作原理的理解。 在SpringMVC中,注解是实现控制器、请求映射、模型绑定、视图解析等关键功能的主要手段。例如,`@Controller`注解标记一...

Global site tag (gtag.js) - Google Analytics