SpringBoot 请求映射原理
url = localhost:8080/user?username=zhangsan&age=18
众所周知 springboot 默认是 tomcat 容器 (SERVLET web类型)。我们要分析一个请求过来所经历的过程,自然要从前端总控制器(DispatchServlet)开始说起。按照 Servlet 规范,所有请求都会被tomcat容器交到 dispatchServlet 的 doService 方法中去处理。跟到这个方法中去,我们发现其中设置了变量进 request 对象,然后执行了 doDispatch 方法,这个方法才是真正实现请求处理的核心。
DispatchServlet.java
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
this.logRequest(request);
try {
this.doDispatch(request, response);
} finally {
}
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
try {
ModelAndView mv = null;
Object dispatchException = null;
try {
//检测是不是文件上传
processedRequest = this.checkMultipart(request);
//如果是文件上传,置标志位
multipartRequestParsed = processedRequest != request;
//使用getHandler 来进行匹配 //本节重要
/*
在这里debug可以找到对应的 关系
RequestHandlerMapping
-> mappingregistry
->registry
->RequestMappingInfo 这个里面对应的 关系 例如"POST/ user" 方法
*/
mappedHandler = this.getHandler(processedRequest); //此处就具体找到了对应的 那个controller和那个方法
....
}
@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
// 通过容器找到所有的handlerMapping
/*
RequestMappingHandlerMapping //这里就是我们需要分析的HandlerMapping
SimpleUrl
BeanName
...
WelecomPageHandler //这里就是处理 欢迎页的 handlerMapping
*/
if (this.handlerMappings != null) {
Iterator var2 = this.handlerMappings.iterator();
while(var2.hasNext()) {
HandlerMapping mapping = (HandlerMapping)var2.next();
//此处进行匹配 将匹配的就是(Controller的具体方法)
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler; //封装为handler 返回
}
}
}
return null;
}
到此,已经可以找到 具体的请求映射了
下面分析 参数的封装原理
springboot 参数封装原理 - 简书 (jianshu.com)