基于web旅游网站源码分享下载(旅游网站界面web代码)

本篇文章给大家谈谈基于web旅游网站源码分享下载,以及旅游网站界面web代码对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

我们先来了解一个请求是如何被SpringMVC处理的,由于整个流程涉及到的代码非常多,所以本文的重点在于解析整体的流程,主要讲解DispatcherServlet这个核心类,弄懂了这个流程后,才能更好的理解具体的源码,回过头再来看则会更加的豁然开朗

整体流程图

SpringMVC处理请求的流程大致如上图所示

用户的浏览器发送一个请求,这个请求经过互联网到达了我们的服务器。Servlet容器首先接待了这个请求,并将该请求委托给DispatcherServlet进行处理。DispatcherServlet将该请求传给了处理器映射组件HandlerMapping,并获取到适合该请求的HandlerExecutionChain拦截器和处理器对象。在获取到处理器后,DispatcherServlet还不能直接调用处理器的逻辑,需要进行对处理器进行适配。处理器适配成功后,DispatcherServlet通过处理器适配器HandlerAdapter调用处理器的逻辑,并获取返回值ModelAndView对象。之后,DispatcherServlet需要根据ModelAndView解析视图。解析视图的工作由ViewResolver完成,若能解析成功,ViewResolver会返回相应的View视图对象。在获取到具体的View对象后,最后一步要做的事情就是由View渲染视图,并将渲染结果返回给用户。

以上就是SpringMVC处理请求的全过程,上面的流程进行了一定的简化,主要涉及到最核心的组件,还有许多其他组件没有表现出来,不过这并不影响大家对主过程的理解。

组件预览

在上一篇《WebApplicationContext容器的初始化》文档讲述FramworkServlet的onRefresh方法时,该方法由DispatcherServlet去实现,会初始化九大组件,如何初始化的这里暂时不展开讨论,默认会从spring-webmvc下面的DispatcherServlet.properties文件中读取组件的实现类,感兴趣可以先阅读一下源码,后续会依次描述

那么接下来就简单介绍一下DispatcherServlet和九大组件:

组件

说明

DispatcherServlet

SpringMVC的核心组件,是请求的入口,负责协调各个组件工作

MultipartResolver

内容类型(Content-Type)为multipart/*的请求的解析器,例如解析处理文件上传的请求,便于获取参数信息以及上传的文件

HandlerMapping

请求的处理器匹配器,负责为请求找到合适的HandlerExecutionChain处理器执行链,包含处理器(handler)和拦截器们(interceptors)

HandlerAdapter

处理器的适配器。因为处理器handler的类型是Object类型,需要有一个调用者来实现handler是怎么被执行。Spring中的处理器的实现多变,比如用户处理器可以实现Controller接口、HttpRequestHandler接口,也可以用@RequestMapping注解将方法作为一个处理器等,这就导致SpringMVC无法直接执行这个处理器。所以这里需要一个处理器适配器,由它去执行处理器

HandlerExceptionResolver

处理器异常解析器,将处理器(handler)执行时发生的异常,解析(转换)成对应的ModelAndView结果

RequestToViewNameTranslator

视图名称转换器,用于解析出请求的默认视图名

LocaleResolver

本地化(国际化)解析器,提供国际化支持

ThemeResolver

主题解析器,提供可设置应用整体样式风格的支持

ViewResolver

视图解析器,根据视图名和国际化,获得最终的视图View对象

FlashMapManager

FlashMap管理器,负责重定向时,保存参数至临时存储(默认Session)

SpringMVC对各个组件的职责划分得比较清晰。DispatcherServlet负责协调,其他组件则各自做分内之事,互不干扰。经过这样的职责划分,代码会便于维护。同时对于源码阅读者来说,也会很友好。可以降低理解源码的难度,使大家能够快速理清主逻辑。这一点值得我们学习。

ThemeResolver和FlashMapManager组件在该系列文档中不会进行讲解,因为几乎接触不到,感兴趣的可以去Google一下,嘻嘻~笔者没接触过

FrameworkServlet

虽然在上面的整体流程图中,我们看到请求是直接被DispatcherServlet所处理,但是实际上,FrameworkServlet才是真正的入口,再来回顾一个DispatcherServlet的类图,如下:

FrameworkServlet覆盖了HttpServlet的以下方法:

doGet(HttpServletRequestrequest,HttpServletResponseresponse)doPost(HttpServletRequestrequest,HttpServletResponseresponse)doPut(HttpServletRequestrequest,HttpServletResponseresponse)doDelete(HttpServletRequestrequest,HttpServletResponseresponse)doOptions(HttpServletRequestrequest,HttpServletResponseresponse)doTrace(HttpServletRequestrequest,HttpServletResponseresponse)service(HttpServletRequestrequest,HttpServletResponseresponse)

这些方法分别处理不同HTTP请求类型的请求,最终都会调用另一个processRequest(HttpServletRequestrequest,HttpServletResponseresponse)方法

其中doGet、doPost、doPut和doDelete四个方法是直接调用processRequest方法的

service

service(HttpServletRequestrequest,HttpServletResponseresponse)方法,用于处理请求,方法如下:

@Override\nprotectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)\nthrowsServletException,IOException{\n\n//<1>获得请求方法\nHttpMethodhttpMethod=HttpMethod.resolve(request.getMethod());\n//<2>处理PATCH请求\nif(httpMethod==HttpMethod.PATCH||httpMethod==null){\nprocessRequest(request,response);\n}\n//<3>处理其他类型的请求\nelse{\nsuper.service(request,response);\n}\n}\n

获得HttpMethod请求方法若请求方法是PATCH,调用processRequest(HttpServletRequestrequest,HttpServletResponseresponse)方法,处理请求。因为HttpServlet默认没提供处理Patch请求类型的请求,所以只能通过覆盖父类的service方法来实现如果是其他类型的请求,则直接调用父类的service方法,该方法如下://HttpServlet.javaprotectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{Stringmethod=req.getMethod();if(method.equals(METHOD_GET)){longlastModified=getLastModified(req);if(lastModified==-1){//servletdoesn&34;http.method_not_implemented&34;Allow&34;Allow&39;redone.\nreturn;\n}\n}\n\n//UseresponsewrapperinordertoalwaysaddPATCHtotheallowedmethods\n//调用父方法,并在响应Header的&34;增加PATCH的值\nsuper.doOptions(request,newHttpServletResponseWrapper(response){\n@Override\npublicvoidsetHeader(Stringname,Stringvalue){\nif(&34;.equals(name)){\nvalue=(StringUtils.hasLength(value)?value+&34;:&34;)+HttpMethod.PATCH.name();\n}\nsuper.setHeader(name,value);\n}\n});\n}\n

使用场景:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTPOPTIONS请求头,用以判断实际发送的请求是否安全

doTrace

doTrace(HttpServletRequestrequest,HttpServletResponseresponse)方法,用于处理TRACE类型的请求,方法如下:

protectedvoiddoTrace(HttpServletRequestrequest,HttpServletResponseresponse)\nthrowsServletException,IOException{\n\n//如果dispatchTraceRequest为true,则处理该请求,默认为false\nif(this.dispatchTraceRequest){\n//处理请求\nprocessRequest(request,response);\n//如果响应的内容类型为&34;,则不需要交给父方法处理\nif(&34;.equals(response.getContentType())){\n//ProperTRACEresponsecomingfromahandler-we&34;Requestprocessingfailed&34;请求描述:{}&34;请求路径:{}&34;开始时间:{}&34;请求耗时:{}&34;状态码:{}&34;失败原因:{}&34;DispatcherServlet.properties&34;Couldnotload&34;+DEFAULT_STRATEGIES_PATH+&39;:&org.springframework.web.servlet.DispatcherServlet.properties\n\n39;sstrategyinterfaces.\nNotmeanttobecustomizedbyapplicationdevelopers.\n\norg.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver\n\norg.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver\n\norg.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\\\n\torg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping\n\norg.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\\\n\torg.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\\\n\torg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter\n\norg.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\\\n\torg.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\\\n\torg.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver\n\norg.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator\n\norg.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver\n\norg.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager\n\n39;sstrategyinterfaces.\nNotmeanttobecustomizedbyapplicationdevelopers.\n\norg.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver\n\norg.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver\n\norg.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\\\n\torg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping\n\norg.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\\\n\torg.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\\\n\torg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter\n\norg.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\\\n\torg.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\\\n\torg.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver\n\norg.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator\n\norg.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver\n\norg.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager\n

可以看到各个组件的默认实现类

构造方法

/**MultipartResolverusedbythisservlet.multipart数据(文件)处理器*/\n@Nullable\nprivateMultipartResolvermultipartResolver;\n\n/**LocaleResolverusedbythisservlet.语言处理器,提供国际化的支持*/\n@Nullable\nprivateLocaleResolverlocaleResolver;\n\n/**ThemeResolverusedbythisservlet.主题处理器,设置需要应用的整体样式*/\n@Nullable\nprivateThemeResolverthemeResolver;\n\n/**ListofHandlerMappingsusedbythisservlet.处理器匹配器,返回请求对应的处理器和拦截器们*/\n@Nullable\nprivateList<HandlerMapping>handlerMappings;\n\n/**ListofHandlerAdaptersusedbythisservlet.处理器适配器,用于执行处理器*/\n@Nullable\nprivateList<HandlerAdapter>handlerAdapters;\n\n/**ListofHandlerExceptionResolversusedbythisservlet.异常处理器,用于解析处理器发生的异常*/\n@Nullable\nprivateList<HandlerExceptionResolver>handlerExceptionResolvers;\n\n/**RequestToViewNameTranslatorusedbythisservlet.视图名称转换器*/\n@Nullable\nprivateRequestToViewNameTranslatorviewNameTranslator;\n\n/**FlashMapManagerusedbythisservlet.FlashMap管理器,负责重定向时保存参数到临时存储(默认Session)中*/\n@Nullable\nprivateFlashMapManagerflashMapManager;\n\n/**ListofViewResolversusedbythisservlet.视图解析器,根据视图名称和语言,获取View视图*/\n@Nullable\nprivateList<ViewResolver>viewResolvers;\n\npublicDispatcherServlet(){\nsuper();\nsetDispatchOptionsRequest(true);\n}\n\npublicDispatcherServlet(WebApplicationContextwebApplicationContext){\nsuper(webApplicationContext);\nsetDispatchOptionsRequest(true);\n}\n

定义了九个组件,在组件预览中已经做过简单介绍了

构造方法中都会设置dispatchOptionsRequest为true,在父类FrameworkServlet中可以看到,如果请求是OPTIONS则会处理请求

onRefresh

onRefresh(ApplicationContextcontext)方法,初始化SpringMVC的各个组件,方法如下:

@Override\nprotectedvoidonRefresh(ApplicationContextcontext){\ninitStrategies(context);\n}\n\n/**\n*Initializethestrategyobjectsthatthisservletuses.\n*<p>Maybeoverriddeninsubclassesinordertoinitializefurtherstrategyobjects.\n*/\nprotectedvoidinitStrategies(ApplicationContextcontext){\n//初始化MultipartResolver\ninitMultipartResolver(context);\n//初始化LocaleResolver\ninitLocaleResolver(context);\n//初始化ThemeResolver\ninitThemeResolver(context);\n//初始化HandlerMapping\ninitHandlerMappings(context);\n//初始化HandlerAdapter\ninitHandlerAdapters(context);\n//初始化HandlerExceptionResolver\ninitHandlerExceptionResolvers(context);\n//初始化RequestToViewNameTranslator\ninitRequestToViewNameTranslator(context);\n//初始化ViewResolver\ninitViewResolvers(context);\n//初始化FlashMapManager\ninitFlashMapManager(context);\n}\n

创建ServletWebApplicationContext容器后会触发该方法,在《WebApplicationContext容器的初始化》FrameworkServlet小节的onRefresh方法中提到过

可以看到每个方法会初始化构造方法中的每个组件

1.doService

doService(HttpServletRequestrequest,HttpServletResponseresponse)方法,DispatcherServlet的处理请求的入口方法,代码如下:

@Override\nprotectedvoiddoService(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{\n//<1>如果日志级别为DEBUG,则打印请求日志\nlogRequest(request);\n\n//Keepasnapshotoftherequestattributesincaseofaninclude,\n//tobeabletorestoretheoriginalattributesaftertheinclude.\n//<2>保存当前请求中相关属性的一个快照\nMap<String,Object>attributesSnapshot=null;\nif(WebUtils.isIncludeRequest(request)){\nattributesSnapshot=newHashMap<>();\nEnumeration<?>attrNames=request.getAttributeNames();\nwhile(attrNames.hasMoreElements()){\nStringattrName=(String)attrNames.nextElement();\nif(this.cleanupAfterInclude||attrName.startsWith(DEFAULT_STRATEGIES_PREFIX)){\nattributesSnapshot.put(attrName,request.getAttribute(attrName));\n}\n}\n}\n\n//Makeframeworkobjectsavailabletohandlersandviewobjects.\n//<3>设置Spring框架中的常用对象到request属性中\nrequest.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE,getWebApplicationContext());\nrequest.setAttribute(LOCALE_RESOLVER_ATTRIBUTE,this.localeResolver);\nrequest.setAttribute(THEME_RESOLVER_ATTRIBUTE,this.themeResolver);\nrequest.setAttribute(THEME_SOURCE_ATTRIBUTE,getThemeSource());\n\n//<4>FlashMap的相关配置\nif(this.flashMapManager!=null){\nFlashMapinputFlashMap=this.flashMapManager.retrieveAndUpdate(request,response);\nif(inputFlashMap!=null){\nrequest.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE,Collections.unmodifiableMap(inputFlashMap));\n}\nrequest.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE,newFlashMap());\nrequest.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE,this.flashMapManager);\n}\n\ntry{\n//<5>执行请求的分发\ndoDispatch(request,response);\n}\nfinally{\n//<6>异步处理相关\nif(!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()){\n//Restoretheoriginalattributesnapshot,incaseofaninclude.\nif(attributesSnapshot!=null){\nrestoreAttributesAfterInclude(request,attributesSnapshot);\n}\n}\n}\n}\n

调用logRequest(HttpServletRequestrequest)方法,如果日志级别为DEBUG,则打印请求日志保存当前请求中相关属性的一个快照,作为异步处理的属性值,防止被修改,暂时忽略设置Spring框架中的常用对象到request属性中,例如webApplicationContext、localeResolver、themeResolverFlashMap的相关配置,暂时忽略【重点】调用doDispatch(HttpServletRequestrequest,HttpServletResponseresponse)方法,执行请求的分发异步处理相关,暂时忽略

2.doDispatch【核心】

doDispatch(HttpServletRequestrequest,HttpServletResponseresponse)方法,行请求的分发,在开始看具体的代码实现之前,我们再来回味下这张图片:

这张图,更多的反应的是DispatcherServlet的doDispatch(…)方法的核心流程,方法如下:

protectedvoiddoDispatch(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{\nHttpServletRequestprocessedRequest=request;\nHandlerExecutionChainmappedHandler=null;\nbooleanmultipartRequestParsed=false;\n\n//<1>获取异步管理器\nWebAsyncManagerasyncManager=WebAsyncUtils.getAsyncManager(request);\n\ntry{\nModelAndViewmv=null;\nExceptiondispatchException=null;\n\ntry{\n//<2>检测请求是否为上传请求,如果是则通过multipartResolver将其封装成MultipartHttpServletRequest对象\nprocessedRequest=checkMultipart(request);\nmultipartRequestParsed=(processedRequest!=request);\n\n//Determinehandlerforthecurrentrequest.\n//<3>获得请求对应的HandlerExecutionChain对象(HandlerMethod和HandlerInterceptor拦截器们)\nmappedHandler=getHandler(processedRequest);\nif(mappedHandler==null){//<3.1>如果获取不到,则根据配置抛出异常或返回404错误\nnoHandlerFound(processedRequest,response);\nreturn;\n}\n\n//Determinehandleradapterforthecurrentrequest.\n//<4>获得当前handler对应的HandlerAdapter对象\nHandlerAdapterha=getHandlerAdapter(mappedHandler.getHandler());\n\n//Processlast-modifiedheader,ifsupportedbythehandler.\n//<4.1>处理有Last-Modified请求头的场景\nStringmethod=request.getMethod();\nbooleanisGet=&34;.equals(method);\nif(isGet||&34;.equals(method)){//不清楚为什么要判断方法类型为&39;\n//获取请求中服务器端最后被修改时间\nlonglastModified=ha.getLastModified(request,mappedHandler.getHandler());\nif(newServletWebRequest(request,response).checkNotModified(lastModified)&&isGet){\nreturn;\n}\n}\n\n//<5>前置处理拦截器\n//注意:该方法如果有一个拦截器的前置处理返回false,则开始倒序触发所有的拦截器的已完成处理\nif(!mappedHandler.applyPreHandle(processedRequest,response)){\nreturn;\n}\n\n//Actuallyinvokethehandler.\n//<6>真正的调用handler方法,也就是执行对应的方法,并返回视图\nmv=ha.handle(processedRequest,response,mappedHandler.getHandler());\n\n//<7>如果是异步\nif(asyncManager.isConcurrentHandlingStarted()){\nreturn;\n}\n\n//<8>无视图的情况下设置默认视图名称\napplyDefaultViewName(processedRequest,mv);\n//<9>后置处理拦截器\nmappedHandler.applyPostHandle(processedRequest,response,mv);\n}\ncatch(Exceptionex){\ndispatchException=ex;//<10>记录异常\n}\ncatch(Throwableerr){\n//Asof4.3,we&34;Handlerdispatchfailed&34;Handlerprocessingfailed&34;RequestalreadyresolvedtoMultipartHttpServletRequest,e.g.byMultipartFilter&34;Multipartresolutionpreviouslyfailedforcurrentrequest-&34;skippingre-resolutionforundisturbederrorrendering&34;Multipartresolutionfailedforerrordispatch&34;Noadapterforhandler[&34;]:TheDispatcherServletconfigurationneedstoincludeaHandlerAdapterthatsupportsthishandler&34;ModelAndViewDefiningExceptionencountered&34;Noviewrendering,nullModelAndViewreturned.&34;Usingresolvederrorview:&34;Usingresolvederrorview:&resolveException(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)方法,解析异常,生成ModelAndView对象

<b>处,情况一,生成了ModelAndView对象,逻辑比较简单

<c>处,情况二,未生成ModelAndView对象,则抛出异常

2.5.2render

render(ModelAndViewmv,HttpServletRequestrequest,HttpServletResponseresponse)方法,渲染ModelAndView,方法如下:

protectedvoidrender(ModelAndViewmv,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{\n//Determinelocaleforrequestandapplyittotheresponse.\n//<1>解析request中获得Locale对象,并设置到response中\nLocalelocale=(this.localeResolver!=null?this.localeResolver.resolveLocale(request):request.getLocale());\nresponse.setLocale(locale);\n\n//获得View对象\nViewview;\nStringviewName=mv.getViewName();\n//情况一,使用viewName获得View对象\nif(viewName!=null){\n//Weneedtoresolvetheviewname.\n//<2.1>使用viewName获得View对象\nview=resolveViewName(viewName,mv.getModelInternal(),locale,request);\nif(view==null){//获取不到,抛出ServletException异常\nthrownewServletException(&39;&34;&39;&34;&34;);\n}\n}\n//情况二,直接使用ModelAndView对象的View对象\nelse{\n//Noneedtolookup:theModelAndViewobjectcontainstheactualViewobject.\n//<2.2>直接使用ModelAndView对象的View对象\nview=mv.getView();\nif(view==null){//获取不到,抛出ServletException异常\nthrownewServletException(&34;+mv+&34;+\n&39;&34;&34;);\n}\n}\n\n//DelegatetotheViewobjectforrendering.\n//打印日志\nif(logger.isTraceEnabled()){\nlogger.trace(&34;+view+&34;);\n}\ntry{\n//<3>设置响应的状态码\nif(mv.getStatus()!=null){\nresponse.setStatus(mv.getStatus().value());\n}\n//<4>渲染页面\nview.render(mv.getModelInternal(),request,response);\n}\ncatch(Exceptionex){\nif(logger.isDebugEnabled()){\nlogger.debug(&34;+view+&34;,ex);\n}\nthrowex;\n}\n}\n

调用LocaleResolver的resolveLocale(HttpServletRequestrequest)方法,从request中获得Locale对象,并设置到response中获得View对象,有两种情况调用resolveViewName方法,使用viewName通过获得View对象,方法如下:@NullableprotectedViewresolveViewName(StringviewName,@NullableMap<String,Object>model,Localelocale,HttpServletRequestrequest)throwsException{if(this.viewResolvers!=null){//遍历ViewResolver数组for(ViewResolverviewResolver:this.viewResolvers){//根据viewName+locale参数,解析出View对象Viewview=viewResolver.resolveViewName(viewName,locale);//解析成功,直接返回View对象if(view!=null){returnview;}}}returnnull;}直接使用ModelAndView对象的View对象设置响应的状态码调用View的render(Map<String,?>model,HttpServletRequestrequest,HttpServletResponseresponse)方法,渲染视图

总结

本文对SpringMVC处理请求的整个过程进行了分析,核心就是通过DispatcherServlet协调各个组件工作,处理请求,因为DispatcherServlet是一个Servlet,在Servlet容器中,会将请求交由它来处理。

通过本文对DispatcherServlet是如何处理请求已经有了一个整体的认识,不过在整个处理过程中涉及到的各个SpringMVC组件还没有进行分析,对于许多细节存在疑惑,不要慌,那么接下来会对每一个SpringMVC组件进行分析。这样,便于我们对SpringMVC的理解,然后再回过头来思考DispatcherServlet这个类,能够更好的将这些组件串联在一起。先整体,后局部,逐步逐步抽丝剥茧,看清理透。

流程示意图,来自SpringMVC-运行流程图及原理分析

代码序列图

流程示意图,来自《看透SpringMVC源代码分析与实践》书籍中的第123页

好了,文章到此结束,希望可以帮助到大家。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平