springmvc全体系图
2025-01-22 14:00:43 0 举报
Spring MVC是Spring框架的一部分,它遵循MVC(模型-视图-控制器)设计模式来实现Web应用程序的分层架构。Spring MVC通过 DispatcherServlet作为前端控制器来处理所有来自客户端的HTTP请求,并将其分发给不同的处理器(控制器)。控制器将请求的数据绑定到Model对象,并通过视图解析器选择一个视图来渲染模型数据,最终生成HTTP响应返回给客户端。 核心组件包括: - DispatcherServlet:负责请求分发,是Spring MVC中的中枢。 - HandlerMapping:负责URL到Handler的映射。 - Controller:处理用户请求的具体业务逻辑层。 - ModelAndView:包含模型数据和视图信息的对象。 - ViewResolver:解析视图名,将逻辑视图名映射到具体的视图。 - View:负责渲染模型数据,向用户呈现响应结果。 Spring MVC支持多种视图技术,如JSP, HTML, XML, PDF等,并且容易与Spring的其他模块集成,如Spring Security用于安全管理。 修饰语描述:高度灵活、支持多种视图技术、易于扩展和集成其他框架的现代Web开发框架。
作者其他创作
大纲/内容
getHandler(processedRequest)span style=\"font-size: inherit;\
1、设置id值
处理GET、HEAD请求的Last-Modified
invokeHandlerMethod执行真正调用Handler的方法
不为空
参数类型为自定义javabean类型
是
直接抛出异常
2、根据不同的配置方式来选择合理的创建方式创建springmvc容器
@ModelAttribute
1、设置父容器parent也就是spring容器
3、createWebApplicationContext根据当前选择当前方式创建springmvc容器
直接new,同时将model和view进行封装
首先判断handlerAdapters是否为空,如果不为空,则遍历handlerAdapters,根据当前请求查找对应的Handler对象,匹配成功,则返回,不进行下一个的匹配,匹配不成功,则返回空
1.参数绑定、请求以及对返回值的处理2.对@ResponseStatus注解的处理
3、设置4个属性到request中,属性在后面的handler和view中使用
进行FlashMap的值设置工作
3、获取异步管理器
创建ModelFactory对象
整个流程全结束
1、判断是否有ModelAttribute注解以及做相关逻辑处理
15个返回值处理器
判断是否包含root属性,也就是spring容器
直接跳过不做任何操作
执行contextInitialized方法,进行上下文初始化
无论的数据模型是modelAndView类型还是model类型还是map类型,最终都会封装成BindingAwareModelMap,且返回进行数据渲染
说明:servlet的生命周期:init,service,destroy
getModelAndView获取modelAndView对象
LocaleContext
2.创建执行器链对象mappedHandler
获取@ModelAttribute注解修饰的方法包含的属性值并且设置到ModelAndViewContainer对象中
render渲染页面
doDelete
4.设置参数名称发现器
doOptions
2、从请求中解析相关的属性值
创建对应的实现类对以及初始化相关属性
参数处理器为MapMethodProcessor
创建一个新的modelAndView对象
bindRequestParameters() 利用web数据绑定器里面的 Converters 将请求数据转成指定的数据类型。再次封装到JavaBean中
initServletBean完成了springMVC容器的创建工作
doPost
解释
当进行具体的方法调用之前会创建一个HandleMethod对象,创建此对象过程中会解析@ResponseStatus注解
5、调用doService方法
判断context是否为空
finishRefresh此方法用于创建容器之后进行刷新,同时调用ContextRefreshEvent事件
4.获取异步管理器asyncManager
applyDefaultViewName设置默认视图
noHandlerFound根据配置抛出异常或返回404错误
PathExposingHandlerInterceptor
RequestMappingHandlerAdapterSimpleControllerHandlerAdapterHttpRequestHandlerAdapter
首先从缓存中查询参数处理器
循环判断参数处理器集合根据参数匹配出最佳的参数处理器
BeanNameUrlHandlerMappingRequestMappingHandlerMappingsimpleUrlHandlerMapping
判断请求方法是否为PATCH或者为为空
请求开始,发送一个http请求
getHandler获取处理器
使用ContextRefreshListener执行ContextRefreshedEvent事件,
否
该方法如果有一个拦截器的前置处理返回false,则开始倒序触发所有的拦截器的 已完成处理
getHandlerAdapter获取对应的的处理器适配器
发布ContextRefreshedEvent事件,用于初始化九大组件
doGet
自定义interceptor
为空
创建XmlWebApplicationContext对象
判断session是否为空
判断Handler是否为空
3.定义是不是上传请求标志变量multipartRequestParsed
3、binderFactory.createBinder()创建web数据绑定器,将请求参数的值绑定到指定的JavaBean里面
doDispatch方法执行开始
参数处理器为ModelMethodProcessor
把参数处理器放入缓存中
5.判断是否是上传请求
遍历所有的转换转换器,找到最合适转换器
如果方法参数被@ModelAttribute注解修饰同时又在SessionAttributes注解修饰的类中,那么将其name属性值添加到ModelAndViewContainer对象中
创建handlerMethod执行对象,后续请求的处理调用都是由当前对象完成的
4、将当前请求中包含的参数值设置LocaleContext和RequestAttributes两个对象中,方便后续获取
processDispatchResult处理返回结果,包括处理异常、渲染页面等工作
false
说明:在初始化九大内置组件的时候会调用initHandlerMappings方法,此方法内部会向handlerMappings设置好具体的属性值,方便后续过程中识别调用,完成controller信息设置工作
initBeanWrapper初始化包装类,并封装PropertyValues对象设置到BeanWrapper包装类中
RequestMappingHandlerAdapter用于处理RequestMapping注解
根据查找的具体返回值处理器进行返回值的处理处理方法:handleReturnValue
getDataBinderFactory
3.参数名称发现器
注册自定义属性编辑器,并设置到BeanWrapper包装类中
configureAndRefreshWebApplicationContext
参数处理器为ModelAttributeMethodProcessor
1.获取当前所在Handler(controller)类中所有被@ModelAttribute注解修饰的方法2.获取@ControllerAdvice修饰的类中被@ModelAttribute的方法
4、refresh创建springmvc容器
initModel
抛出异常,程序运行结束
2、createAttribute()创建自定义javabean类型的参数对象,该对象属性值全为空
26个参数处理器
ServletWebRequest:类似于工具类,里面封装了对requset请求与response请求的具体操作方法
UriTemplateVariablesHandlerInterceptor
super.service处理请求方法
创建ModelAndViewContainer对象,将所有的数据都放在 ModelAndViewContainer;包含要去的页面地址View。还包含Model数据。
抛出异常
将web.xml文件中配置的springmvc.xml配置文件封装成PropertyValues,
走创建springmvc容器流程
getModelFactory
1.先获取,当前控制器定义的被@initBinder,@ModelAttribute修饰的方法,再获取@ControllerAdvice修饰的类中被@initBinder,@ModelAttribute修饰的方法
启动tomcat容器
判断是否为空
创建对应的实现类对以及初始化相关属性使用监听器初始化九大组件
ServletInvocableHandlerMethod将handlerMethod对象包装一个可执行对象
直接跳过,返回原生请求
创建springmvc容器,初始化九大组件
1.mavContainer.getModel()返回BindingAwareModelMap对象2.无论参数是map类型还是model类型最都会返回变量为defaultModel的BindingAwareModelMap对象3.如果在同一方法中既有map类型参数又有model类型参数。那么它们将返回同一个BindingAwareModelMap实例对象,并且其数据都会据封装到该对象中
initWebApplicationContext
循环遍历返回值处理器参数集合,为返回值匹配最佳的参数值处理器匹配方法:supportsReturnType
tomcat执行DispatcherServlet父类HttpServletBean的init
1、获取root容器,也就是spring容器
RequestAttributes
执行监听器ContextLoaderListener
加载应用程序中Web.xml文件
对创建的ModelAndViewContainer对象进行赋值操作
把request请求与response请求封装成ServletWebRequest对象
doTrace
向request设置相关属性以及调用doDispatch方法
tomcat通过web.xml加载DispatcherServlet类
将创建好的spring容器赋值给root属性,就是说spring容器变成父容器
在浏览器里面显示
在后续处理的时候一般都是使用:defaultModel实质就是BindingAwareModelMap对象
1.设置参数处理器
processRequest此方法做了一些操作
创建WebDataBinderFactory对象
调用onRefresh)方法的initStrategies(context)方法初始化springMvc九大组件
执行resolveArgument方法用于解析自定义javabean类型的参数
否为空
设置requestHandled标志位,表示当前请求是否顺利执行完成
2、 设置wac的servletContext、servletConfig、namespace属性
是否有合适的返回值处理器
1.获取当前所在Handler(controller)类中所有被initBinder注解修饰的方法2.获取@ControllerAdvice修饰的类中被@initBinder的方法
为创建的XmlWebApplicationContext对象做赋值操作
查找返回值处理器进行返回值的处理
1、 如果日志级别为 DEBUG,则打印请求日志
getMethodArgumentValues()获取方法的参数值
参数类型为model类型
创建context对象createWebApplicationContext
1、记录请求开始时间
判断是否是上传请求
通过tomcat内部执行流程会调用DispatcherServlet的service方法service方法实际在父类FrameworkServlet中
这里以RequestMappingHandlerAdapter为例处理controller注解
参数解析完成
参数解析完成或者没有参数
使用转换器请求中的参数直,并且封装到javabean对象中的
refresh3、创建spring容器
进行实际方法调用invokeAndHandle
1.updateModel设置sessionAttributes和给model设置BindingResult
handlerMethod执行对象赋值操作
getHandlerAdapter获取处理器适配器
httpMethod获取请求方法
将 request请求封装成 MultipartHttpServletRequest 对象
checkMultipart(request)判断是否是上传请求
@initBinder
设置ignoreDefaultModelOnRedirect属性值
加锁
preHandler执行拦截器的前置处理方法
2、如果当前请求是include,为当前请求做快照备份
processRequest
processedRequest
判断当前model是否是RedirectAttributes
ha.handle()通过处理器适配器来执行具体的handler,调用真正的业务方法
invokeForRequest()执行具体的方法逻辑
2.获取getConversionService获取服务
handler有三种实现方式:1.实现Controller接口2.实现HttpRequestHandler接口3.添加@Controller注解
循环遍历方法参数集合,为每一个参数匹配最佳的参数值处理器
1.要根据不同的controller实现方式来选择合适的适配器才能够执行,2.如果实现controller的方式是实现Controller接口或者HttpRequestHandler接口是,则直接执行handleRquest方法即可,3.如果是@controller注解的方式则无法确定要调的方法是哪一个,必须通过适配器的方式来进行具体方法的调用
true
当成功获得handler处理器之后,会向HandlerExecutionChain里面添加interceptor
有
doPut
如果匹配到的是BeanNameUrlHandlerMapping对象,那么会根据请求设置两个springmvc自带的拦截器
1.将原生的request请求赋值processedRequest
获取SessionAttribute设置的属性值并且设置到ModelAndViewContainer对象中
解析当前web.xml配置文件
doInvoke(args)调用具体的业务方法
遍历handlerMappings是否为空,不为空,则根据当前请求查找对应的Handler对象,匹配成功,则返回,不进行下一个的匹配,匹配不成功,则返回空
上面创建好的对象
适配器的执行正式结束并且返回modelAndView对象
创建的是 XmlWebApplicationContext的对象,第一次创建的对象没有父亲,parent==null
2.设置返回值处理器
2、加载spring相关配置文件
获取对应的方法参数并且判断是否为空
使用具体argumentResolvers参数处理器,处理参数
applyPostHandle执行拦截器的后置处理方法
父类处理了不同的请求方式之后,还是调用了processRequest方法
4、FlashMap的相关配置,主要用于Redirect转发时参数的传递,并且设置到request请求中
2、设置springmvc配置文件
3.设置参数绑定工厂对象
参数类型为map类型
添加重定向请求中的参数传递的flashmap属性
本次请求结束
创建spring容器对象,也就是父容器
九大组件有些是有默认值的,有些没有默认值,如果有默认值会从Dispatcher.properties加载,如果没有返回空
doBind(mpvs)
发送请求前准备工作全部执行结束,接下来发送请求
1.通过反射对象请求中的值进行相关处理
0 条评论
下一页