SpringMVC ModelFactory源码解析

本文深入解析SpringMVC中的ModelFactory,主要职责包括初始化model和更新sessionAttributes。通过`RequestMappingHandlerAdapter`的`invokeHandlerMethod`方法调用,详细探讨`findSessionAttributeArguments`获取@modelAttribute标注参数的过程,以及`invokeModelAttributeMethods`方法的执行流程,包括从session获取参数、执行modelAttribute方法及给注解参数赋值三个步骤。
摘要由CSDN通过智能技术生成

SpringMVC ModelFactory

干什么

modelFactory 主要是维护model的,有两个作用:

  1. 初始化model
  2. 更新model,在处理器处理完了之后,把参数更新的到sessionAttributes中

初始化

在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter中的invokeHandlerMethod(HttpServletRequest request,HttpServletResponse response, HandlerMethod handlerMethod)方法中调用。看一下源码

public void initModel(NativeWebRequest request, ModelAndViewContainer container,
			HandlerMethod handlerMethod) throws Exception {
   
		//取出sessionAttribute中保存的参数合并到model中
		Map<String, ?> sessionAttributes = this.sessionAttributesHandler.retrieveAttributes(request);
		container.mergeAttributes(sessionAttributes);
		//执行注释了标记了@modelAttribute的方法
		invokeModelAttributeMethods(request, container);
		
		//看看要执行的方法,入参有没有被@modelAttribute修饰的,如果有在@sessionAttribute中找,找到给赋值,主要在创建一个 有@modelAttribute修饰的入参的name
		for (String name : findSessionAttributeArguments(handlerMethod)) {
   
			if (!container.containsAttribute(name)) {
   
				Object value = this.sessionAttributesHandler.retrieveAttribute(request, name);
				if (value == null) {
   
					throw new HttpSessionRequiredException("Expected session attribute '" + name + "'", name);
				}
				container.addAttribute(name, value);
			}
		}

首先细说一下findSessionAttributeArguments(handlerMethod)这个方法,这个方法主要是取得被@modelAttribute标签修饰的入参的属性名

private List<String> findSessionAttributeArguments(HandlerMethod handlerMethod) {
   
		List<String> result = new ArrayList<String>();
		//取得所有的入参
		for (MethodParameter parameter : handlerMethod.getMethodParameters(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值