DispatcherServlet 源码分析(二)

本文详细介绍了Spring MVC中请求处理的整体流程,包括DispatcherServlet如何通过HandlerMapping找到合适的Handler,HandlerAdapter如何包装Handler进行统一调用,以及ModelAndView如何被转换为实际的视图对象并完成渲染。

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

1. 已初始化的工具类

# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
	org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

org.springframework.web.servlet.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

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager


2.处理请求的总体过程

a. 用户发送一个http请求

b. DispatcherServlet根据HandlerMapping配置找到处理请求的Handler

c.HandlerAdapter对Handler进行包装,并进行统一调用

d.Handler的返回结果会是一个ModelAndView并交由DispatcherServlet

e.DispatcherServlet将ModelAndView交由ViewResover进行解析,将逻辑视图转换成真实的视图对象View

f.DispatcherServlet将得到的View使用ModelAndView中的数据进行渲染

g.最终用户得到请求的相应


3. 处理请求整体流程

FrameworkServlet.service(HttpServletRequest request, HttpServletResponse response)

FrameworkServlet.doGet/doPost......

FrameworkServlet.processRequest(HttpServletRequest request, HttpServletResponse response)

DispatcherServlet.doService(HttpServletRequest request, HttpServletResponse response)

DispatcherServlet.doDispatch(HttpServletRequest request, HttpServletResponse response)


4. 细节分析

a. DispatcherServlet根据HandlerMapping配置找到处理请求的Handler

step1:

DispatcherServlet

	protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
		//遍历已经初始化好的的HandlerMapping
		//org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
		//org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
 for (HandlerMapping hm : this.handlerMappings) {......
			//HandlerMapping处理请求,找到合适的Handler
			HandlerExecutionChain handler = hm.getHandler(request);
			if (handler != null) {
				return handler;
			}
		}
		return null;
	}



step2:

org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping

org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping


	private final Map<String, Object> handlerMap = new LinkedHashMap<String, Object>();
	@Override
	protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
		//这里就是http请求的Request URL
		String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
		//这里会根据已经装配的好的handlerMap来匹配请求
		//handlerMap会在初始化DefaultAnnotationHandlerMapping或者BeanNameUrlHandlerMapping的时候搞定,时机:ApplicationContextAware.setApplicationContext(ApplicationContext context)
		Object handler = lookupHandler(lookupPath, request);
		......
		return handler;
	}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值