DispatcherServlet 请求处理流程

49 篇文章 1 订阅

子容器创建完成后,当有请求到来时,DispatcherServlet就可以进行分发处理了。我们首先根据Servlet规范查找doService()方法,这个方法在DispatcherServlet本身就有实现:

@Override protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
	// ... ... 
	try { 
		doDispatch(request, response); 
	} finally { 
		// ... ... 
	}

我们省去了无关代码,于是可以明显看出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 { 
			// 查检是否是文件上传请求 
			processedRequest = checkMultipart(request); 
			multipartRequestParsed = (processedRequest != request); 
			// 查找能够处理当前请求的Handler 
			mappedHandler = getHandler(processedRequest); 
			if (mappedHandler == null || mappedHandler.getHandler() == null) { 
				noHandlerFound(processedRequest, response); 
				return; 
			} 
			// 查找能够处理当前请求的Handler 
			Adapter HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); 
			// ... ... 
			// 拦截器的preHandle()方法就是在这里被调用的 
			// 可见,如果preHandle()方法返回false,则终止分发流程,直接返回 
			if (!mappedHandler.applyPreHandle(processedRequest, response)) { 
				return; 
			} try { 
				// 这一行是对我们写的Controller方法的真正调用 
				mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); 
			} finally { 
				if (asyncManager.isConcurrentHandlingStarted()) { 
					return; 
					} 
				} 
				applyDefaultViewName(request, mv); 
				// 拦截器的postHandle()方法就是在这里被调用的,即在Controller调用完成之后 
				mappedHandler.applyPostHandle(processedRequest, response, mv); 
			} catch (Exception ex) { 
				dispatchException = ex; 
			} 
			processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); 
		} catch (Exception ex) { 
			// ... ... 
		} finally { 
			// ... ... 
		} 
	}

分析到这里,DispatcherServlet的分发请求处理流程就一目了然了。

版权声明:本文为博主原创文章,转载请注明出处和原作者。https://blog.csdn.net/neosmith/article/details/44206671

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
客户端可以使用浏览器或其他 HTTP 客户端程序发送请求DispatcherServlet。发送请求的方式是通过 HTTP 协议发送请求报文,请求报文中包含了请求的方法、URL、请求头、请求体等信息。 Spring MVC 框架中使用的是基于 Servlet 的 Web 应用程序,因此客户端可以通过 HTTP GET 或 POST 方法向 DispatcherServlet 发送请求。客户端发送请求的 URL 应该符合 Spring MVC 的 URL 映射规则,即 URL 应该包含控制器的请求路径和方法的请求路径,例如: ``` http://localhost:8080/myapp/user/list ``` 其中,`http://localhost:8080/myapp` 是应用程序的上下文路径,`/user/list` 是控制器的请求路径和方法的请求路径。 在发送请求时,客户端可以通过 URL 参数或请求体中的参数传递数据。客户端还可以设置请求头,例如设置 `Content-Type` 头指定请求体的类型,设置 `Accept` 头指定客户端接受的响应类型等。 以下是使用 jQuery 发送 AJAX 请求的示例代码: ```javascript $.ajax({ url: 'http://localhost:8080/myapp/user/list', type: 'POST', data: { page: 1, pageSize: 10 }, success: function(data) { console.log(data); }, error: function(xhr, status, error) { console.log(status + ': ' + error); } }); ``` 其中,`url` 参数指定请求的 URL,`type` 参数指定请求的方法,`data` 参数指定请求的参数,`success` 回调函数处理请求成功的响应,`error` 回调函数处理请求失败的响应。 总之,客户端可以通过 HTTP 协议向 DispatcherServlet 发送请求,发送请求的方式可以是 GET 或 POST 方法,并可以通过 URL 参数或请求体中的参数传递数据。客户端还可以设置请求头,例如设置 `Content-Type` 头指定请求体的类型,设置 `Accept` 头指定客户端接受的响应类型等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值