Spring源码系列08——Spring事务管理源码介绍

一、SpringMVC调用流程图

在这里插入图片描述

二、源码分析

1、请求到DispatcherServlet

springmvc结构在servlet框架的基础上发展而来,请求会交由servlet来进行处理,而我们的DispatcherServlet实现了servlet接口。
在这里插入图片描述
在springmvc容器初始化的时候会调用initStrategies方法;初始化initHandlerMappings和initHandlerAdapters;

protected void initStrategies(ApplicationContext context) {
		initMultipartResolver(context);
		initLocaleResolver(context);
		initThemeResolver(context);
		initHandlerMappings(context);
		initHandlerAdapters(context);
		initHandlerExceptionResolvers(context);
		initRequestToViewNameTranslator(context);
		initViewResolvers(context);
		initFlashMapManager(context);
	}

在这里插入图片描述

2、通过处理器映射器找到合适的处理器

@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
	if (this.handlerMappings != null) {
		for (HandlerMapping mapping : this.handlerMappings) {
			HandlerExecutionChain handler = mapping.getHandler(request);
			if (handler != null) {
				return handler;
			}
		}
	}
	return null;
}

3、返回处理器执行链

包含Handler和interceptors

public class HandlerExecutionChain {

	private static final Log logger = LogFactory.getLog(HandlerExecutionChain.class);

	private final Object handler;

	@Nullable
	private HandlerInterceptor[] interceptors;
	.........
	}

4、处理器适配器

在DispatcherServlet#doDispatch中获取适合的HandlerAdapter

HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

5、调用执行器方法

在DispatcherServlet#doDispatch中调用执行器方法

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

SimpleControllerHandlerAdapter类

public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
		throws Exception {

	return ((Controller) handler).handleRequest(request, response);
}

调用你自己写的controller方法;

6、你自己写controller中返回modelAndView

7、返回modelAndView

8、视图解析

DefaultRequestToViewNameTranslator#getViewName;完善view的名称

public String getViewName(HttpServletRequest request) {
		String lookupPath = this.urlPathHelper.getLookupPathForRequest(request, HandlerMapping.LOOKUP_PATH);
		return (this.prefix + transformPath(lookupPath) + this.suffix);
	}

DispatcherServlet#processDispatchResult方法中调用如下的方法,开始视图解析的流程

render(mv, request, response);

9、返回View

protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
Locale locale, HttpServletRequest request) throws Exception {

if (this.viewResolvers != null) {
	for (ViewResolver viewResolver : this.viewResolvers) {
		View view = viewResolver.resolveViewName(viewName, locale);
		if (view != null) {
			return view;
		}
	}
}
return null;

}

10、将Model中的数据填充到view中

AbstractView#render

public void render(@Nullable Map<String, ?> model, HttpServletRequest request,
		HttpServletResponse response) throws Exception {

	if (logger.isDebugEnabled()) {
		logger.debug("View " + formatViewName() +
				", model " + (model != null ? model : Collections.emptyMap()) +
				(this.staticAttributes.isEmpty() ? "" : ", static attributes " + this.staticAttributes));
	}

	Map<String, Object> mergedModel = createMergedOutputModel(model, request, response);
	prepareResponse(request, response);
	renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);
}

11、展示给用户

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值