首页 > 其他分享 >SpringMVC-解析@PathVariable

SpringMVC-解析@PathVariable

时间:2022-11-12 13:47:57浏览次数:49  
标签:uriVariables PathVariable SpringMVC request namedValueInfo 解析 parameter name

DispatcherServlet.doService去处理请求时,调用getHandler去获取匹配请求的handle。会调用RequestMappingInfoHandlerMapping.handleMatch,这个方法会调用extractMatchDetails解析uri模板变量,MATRIX变量,并将解析后的值设置到request的属性中。

RequestMappingInfoHandlerMapping.extractMatchDetails(
PatternsRequestCondition condition, String lookupPath, HttpServletRequest request)

private void extractMatchDetails(
		PatternsRequestCondition condition, String lookupPath, HttpServletRequest request) {

	String bestPattern;
	Map<String, String> uriVariables;
	if (condition.isEmptyPathMapping()) {
		bestPattern = lookupPath;
		uriVariables = Collections.emptyMap();
	}
	else {
		bestPattern = condition.getPatterns().iterator().next();
		uriVariables = getPathMatcher().extractUriTemplateVariables(bestPattern, lookupPath);
		if (!getUrlPathHelper().shouldRemoveSemicolonContent()) {
			request.setAttribute(MATRIX_VARIABLES_ATTRIBUTE, extractMatrixVariables(request, uriVariables));
		}
		uriVariables = getUrlPathHelper().decodePathVariables(request, uriVariables);
	}
	request.setAttribute(BEST_MATCHING_PATTERN_ATTRIBUTE, bestPattern);
	request.setAttribute(URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriVariables);
}

extractUriTemplateVariables将匹配到的handle的处理请求路径和传过来的请求路径对比,将路径中的{}里面的参数和客户的请求路径对比后放到Map中返回。例如匹配路径是/testPath/{value},请求路径是/testPath/123,则Map中的值是value->123.decodePathVariables对uri模板变量值进行解码。调用request.setAttribute(URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriVariables);将uri模板变量值设置到request的属性中。

DispatcherServlet的doService方法调用handle处理request。会调用InvocableHandlerMethod.invokeForRequest处理request。

InvocableHandlerMethod.invokeForRequest

public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,
		Object... providedArgs) throws Exception {

	Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
	if (logger.isTraceEnabled()) {
		logger.trace("Arguments: " + Arrays.toString(args));
	}
	return doInvoke(args);
}

1、getMethodArgumentValues解析参数。
2、doInvoke执行处理方法。

InvocableHandlerMethod.getMethodArgumentValues(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,Object... providedArgs) 的执行流程和@@RequestParam的解析一致。

AbstractNamedValueMethodArgumentResolver.getNamedValueInfo(MethodParameter parameter)

	private NamedValueInfo getNamedValueInfo(MethodParameter parameter) {
	NamedValueInfo namedValueInfo = this.namedValueInfoCache.get(parameter);
	if (namedValueInfo == null) {
		namedValueInfo = createNamedValueInfo(parameter);
		namedValueInfo = updateNamedValueInfo(parameter, namedValueInfo);
		this.namedValueInfoCache.put(parameter, namedValueInfo);
	}
	return namedValueInfo;
}

1、createNamedValueInfo解析参数注解的name属性
2、updateNamedValueInfo判断解析后的name是否存在,不存在则获取参数名作为name,并将name,required,defaultValue封装成NamedValueInfo。

PathVariableMethodArgumentResolver.createNamedValueInfo(MethodParameter parameter)

protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) {
	PathVariable ann = parameter.getParameterAnnotation(PathVariable.class);
	Assert.state(ann != null, "No PathVariable annotation");
	return new PathVariableNamedValueInfo(ann);
}

PathVariableNamedValueInfo(PathVariable annotation)

public PathVariableNamedValueInfo(PathVariable annotation) {
		super(annotation.name(), annotation.required(), ValueConstants.DEFAULT_NONE);
	}

createNamedValueInfo解析@PathVariable的name,required属性。并设置默认值为DEFAULT_NONE。并封装成NamedValueInfo。

PathVariableMethodArgumentResolver.resolveName重写了父类AbstractNamedValueMethodArgumentResolver.resolveName方法。

PathVariableMethodArgumentResolver.resolveName(String name, MethodParameter parameter, NativeWebRequest request)

protected Object resolveName(String name, MethodParameter parameter, NativeWebRequest request) throws Exception {
	Map<String, String> uriTemplateVars = (Map<String, String>) request.getAttribute(
			HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);
	return (uriTemplateVars != null ? uriTemplateVars.get(name) : null);
}

从request中获取uri模板变量属性,并从属性中获取值。

标签:uriVariables,PathVariable,SpringMVC,request,namedValueInfo,解析,parameter,name
From: https://www.cnblogs.com/shigongp/p/16883507.html

相关文章

  • 这些不知道,别说你熟悉 Nacos,深度源码解析!
    SpringCloud应用启动拉去配置我们之前写过一篇文章,介绍了一些Spring提供的扩展机制。其中说到了ApplicationContextInitializer,该扩展是在上下文准备阶段(prepareContext......
  • Go 语言项目源码解析:定时任务库 cron
    环境准备首先我们将源码克隆(Fork)为自己的个人仓库,只需要在GitHub项目主页点击Fork按钮,然后输入项目名称点击确认即可。克隆完毕后,可以下载到本地,或者直接在科隆后的Git......
  • SpringMVC-解析对象
    如果参数是对象且没有注解,则参数由ServletModelAttributeMethodProcessor解析。解析如下参数:@PostMapping("/userParam0")@ResponseBodypublicUserhandleUserByParam0......
  • python 某猫投诉加密解析
    importhashlibimportjsonimportrandomimporttimeimportrequestssha256=hashlib.sha256()'''某猫投诉https://jiangsu.tousu.sina.com.cn/'''classBlackCatComplain......
  • SpringMVC
    SpringMVC:学习视频-狂神说SpringMVC:视频链接SpringMVCssm:mybatis+Spring+SpringMVCMVC三层架构JavaSE:认真学习,老师带,入门快!JavaWeb:认真学习,老师带,入门快!......
  • SpringMVC-解析@RequestParam参数
    InvocableHandlerMethod.invokeForRequest执行请求时会调用InvocableHandlerMethod.getMethodArgumentValues解析方法参数。InvocableHandlerMethod.getMethodArgumentVal......
  • Linux开启DNS Server后解析外域受限问题
      CentOS7系统里起了一个DNSServer,一切顺利,针对本地域的各项解析都很成功,欢欣鼓舞。 在欢欣鼓舞时却发觉DNS服务器无法进行域外域名解析,查找原因发现除了本地定义的......
  • 快速掌握kafka原理解析
    ​简介​Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数......
  • 三环PE文件自行加载,并运行,解析PE结构,修复IAT,修复重定位表
    1//PELoad.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。2//34#include<iostream>5#include<windows.h>6#include<tchar.h>......
  • onps栈使用说明(2)——ping、域名解析等网络工具测试
    1.ping测试协议栈提供ping工具,其头文件为“net_tools/ping.h”,将其include进你的目标系统中即可使用这个工具。……#include"onps.h"#include"net_tools/ping.h"/......