springMVC处理请求全过程(参数解析以及返回值处理)

本文详细阐述了SpringMVC的完整工作流程,从用户请求到DispatcherServlet,再到处理器映射、HandlerAdapter处理、视图解析,最终响应用户。涵盖了Controller映射、参数解析、视图渲染等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringMVC全过程略写图

在这里插入图片描述

  1. 用户发送请求,经过前端控制器Dispacherservlet(Controller的核心)将url交给处理器映射器HandlerMapping处理

  2. 处理器映射器HandlerMapping处理url,返回HandlerExecutionChain(可能包含拦截器,一定包含自定义的Controller(handler))

  3. 前端控制器将Controller交给处理器适配器HandlerAdapter处理,处理完成后,返回MV对象(ModelAndView

  4. 前端控制器将MV交给视图解析器处理ViewResolver,处理的过程:将MV拆分成Model和view两个对象,并且将model渲染到view视图上,并且将view返回给前端控制器。

  5. 最后,前端控制器将视图响应给用户

在这里插入图片描述

用户发送请求到DispatchServlet,请求查询Handle到处理器映射器(HandleMapping),此时返回一个处理器拦截器链到dispatchServlet之后再请求执行Handler到处理器适配器去选择相应处理器(就是Controller),处理器返回一个ModelAndView之后再转达到dispatchServlet,dispatchServlet在向视图解析器(ViewResolver)请求解析视图,之后视图解析器返回一个View对象给dispatchServlet,前端控制器在渲染视图,之后在响应给用户。

SpringMVC全过程详解

首先我们大家都知道SpringMvc是通过DispatcherServlet这个类和web.xml配置中的拦截来接管Tomcat中的请求的。所有想看所有关于控制器(打了Controller注解)的细节基本都是在DispatcherServlet这个类中,下面我们就来看看DispatcherServlet中的dodispatch方法:

	protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
   
   
	HttpServletRequest processedRequest = request;
	HandlerExecutionChain mappedHandler = null;
	boolean multipartRequestParsed = false;
	
	WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
	
	try {
   
   
	ModelAndView mv = null;
	Exception dispatchException = null;
	
	try {
   
   
		//可以看出springMVC最先初始化的是文件上传组件
		processedRequest = checkMultipart(request);
		multipartRequestParsed = (processedRequest != request);
	
		//为request请求找到对应的处理器
(源码在下一个三级标题)
		mappedHandler = getHandler(processedRequest);
		//非空判断
		if (mappedHandler == null) {
   
   
			noHandlerFound(processedRequest, response);
			return;
		}
	
		//
很明显这是为了拿到处理器适配器了
		HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
	
		// 
获取Method,并且在下面代码就开始和Method比较了
		String method = request.getMethod();
		boolean isGet = "GET".equals(method);
		if (isGet || "HEAD".equals(method)) {
   
   
			long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
			if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
   
   
				return;
			}
		}
	
		if (!mappedHandler.applyPreHandle(processedRequest, response)) {
   
   
			return;
		}
	
		// Actually invoke the handler.
真正执行处理器适配的方法,返回ModelAndView对象了
		mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
	
		if (asyncManager.isConcurrentHandlingStarted()) {
   
   
			return;
		}
		
//是否需要解析view name ,渲染时需要。
		applyDefaultViewName(processedRequest, mv);
		//执行处理器的postHandler方法
		mappedHandler.applyPostHandle(processedRequest, response, mv);
	}
	//下一步的方法就是拿着ModelAndView去render(渲染)了,至此程序跑完,页面也出来了(这一步也有视图解析器工作流程)
	//将map和model参数保存在request中是在internResourceView的exposeModelRequestAttribute
	processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}

mappedHandler = getHandler(processedRequest)源码:

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
   
   
	//此时会拿到所有的处理器映射器进行匹配
   if (this.handlerMappings != null) {
   
   
      for (HandlerMapping mapping : this.handlerMappings) {
   
   
		//通过处理器映射器去找到对应的处理器(三级标题为getHandler)
         HandlerExecutionChain handler = mapping.getHandler(request);
         if (handler != null) {
   
   
            return handler;
         }
      }
   }
   return null;
}

处理器映射器(handlerMappings):

在这里插入图片描述

getHandler(我们写的Controller其实就是Handler)

public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
   
   
	//通过这个方法来找到处理器,也就是Controller
   Object handler = getHandlerInternal(request);
	//很神奇spring做了两次null处理
   if (handler == null) {
   
   
      handler 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

five-five

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值