谈谈你对Spring MVC中的九大组件的理解?

网站建设5年前发布
12 0 0

20230306011725f5e118008d0a6d92636094d1fb7fcaa932d04d639,一位应届毕业生被问到这样一道面试题,说谈谈你对Spring MVC中的九大组件的理解。,今天,我给大家分享一下我的理解。,202303060117266545ad6503f0fa09d2d3932b37868a639d8000506,使用Spring MVC框架时,它的主要入口是DispatcherServlet类,Spring MVC子容器初始化时,会调用DispatcherServlet的onRefresh()方法,而onRefresh()方法只做了一件事,就是调用initStrategies()方法来初始化Spring MVC的九大组件,如源码所示:,顾名思义,initStrategies()方法直译过来就是初始化策略,Spring MVC把九大组件设计成九大策略,其实就是为了明确各个组件的职责,达到解耦的目的。,2023030601172751238e95425822108645789c8453cc42c20594830,Spring MVC的九大组件按照初始化顺序分别为:MultipartResolver多文件上传组件、LocaleResolver多语言支持组件、ThemeResolver主题模板处理组件、HandlerMappings URL映射组件、HandlerAdapters业务逻辑适配组件、HandlerExceptionResolvers异常处理组件、RequestToViewNameTranslator视图名称提取组件、ViewResolvers视图渲染组件和FlashMapManager闪存管理组件。,下面给大家详细分析一下,每个组件的功能和职责。,20230306011904957574047062b3593fb41712f5c22c443ace31792,用于支持多文件上传,如代码所示:,主要逻辑就是将enctype为"multipart/form-data"的表单request请求包装成MultipartHttpServletRequest。程序员在开发的时候,只需要调用MultipartHttpServletRequest的 getFile()方法,就可以获取客户端上传的文件列表了。,20230306011728b3d442319e854829db754496eef727dc807ed0487,用于支持国际化多语言切换,LocaleResolver的主要作用就是从 request 中解析出 local 参数的值,如源码所示:,resolveLocale()方法是从 request 中解析出 local,setLocale()方法是将指定的 local 值设置到 request 中。而 local 大多数情况下都是用来做国际化处理的,配合多语言字典properties来使用,例如中国的Local值为zh_CN。,202303060117282194f9680c1c9b70244369c2c7bd647efbceaa777,主要用于支持Web页面的多主题风格。可以通过ThemeResolver来读取和解析页面主题样式配置。实现原理和LocaleResolver类似,也是配置一套 properties 文件,根据不同参数来切换读取;当然,使用ThemeResolver也是可以实现国际化。如源代码所示:,它的主要方法也和LocaleResolver类似,一个从request提取主题名称的方法,一个设定主题名称的方法。,202303060119057691e1720caba33b80d691945295e4acf717e3240,主要是用来保存Url和业务逻辑的对应关系,它本质上就是一个Map,Key为URL值就是对应Controller中配置了@RequestMapping注解的方法。但是在Spring源码中,被封装成了一个HandlerMapping对象。然后,每个HandlerMapping对象都被缓存在一个List中。如源码所示:,20230306011728985b14c536a39b23d7f430754fda04c70e9ebb591,主要功能是动态解析参数以及动态适配业务逻辑对应的Handler,如源码所示:,在HandlerAdapter中提供了一个叫做handle()这样一个方法,第三个参数 Object handler 第三个参数其实就是业务处理器。在DispatcherServlet中的doDispath()方法中被调用。而handler对象就是根据用户请求的Url从HandlerMapping获取的HandlerMapiping对象。,202303060119056886248890d4bda6a7d133b0381bd382f408b2611,在HandlerApdater的handle()方法中,首先会动态解析用户传过来的参数,并完成数据类型转化。然后,反射调用HandlerMapiping封装的Controller中的方法,最后,将调用方法的返回结果统一封装为ModelAndView。,20230306095344749dcb54223fb4caaf437489b827f98636155f322,主要用于拦截对不同异常的个性化处理,Spring可以给不同的异常配置不同的ModelAndView,HandlerExceptionResolver根据异常类型,的将处理封装为一个ModelAndView从而将异常信息转换为更加友好的Web页面展示,如源码所示:,HandlerExceptionResolver组件只有一个方法,就是将异常解析为ModelAndView。,20230306011730b7d5abb24d8e6426a2f6693c7b376a1314a91b894,当然,HandlerExceptionResolver自己发生异常或者在异常页面渲染过程中发生异常HandlerExceptionResolver不会处理。Spring可以配置一个全局的500页面或者404页面来处理这个问题。,20230306011730f19700163200e8ccd0d97057d762a3f38f9d1f377,这个组件的主要功能是可从request中提取viewName。这个viewName设置在url参数上,也可以设置在request的header上。如源码所示:,这个其实还是挺有意思的,就是将 request 请求转换为视图名称。它只有一个getViewName()方法。,20230306011731f315de3724049d7f669507eb08170a216957d3861,它的作用相当于模板引擎,就是根据视图名称找到视图对应的模板文件,然后进行解析,如源码所示:,ViewResolvers组件只有一个resolveViewName()方法,,我们看到resolveViewName()方法有两个参数。,2023030601173168e6bda579094a63e6a624ba804dd9b4281f4c652,第一个参数viewName,是String类型,它其实就是视图名称,对应的就是模板文件的名称。第二个参数local,前面我们讲过代表的是本地语言环境,可以用来做国际化。,resolveViewName()方法的放回值是一个View对象。而View对象就是用来渲染页面的,也就是说将程序返回的结果填入到具体的模板里面,生成具体的视图文件,比如:jsp,ftl,html 等等。,20230306011906836a4fc80e03e4bad0a987a07aab0b32111989556,它相当于一个参数缓存器,用来保证请求跳转过程中参数不丢失,和Struts 2中的ValueStack值栈非常类似。主要是 redirect重定向的时候,参数传递会丢失,FlashMapManage就能大显身手,可以做到Redirect重定向和Forward转发同样的效果,如源码所示:,FlashMapManage主要有两个方法,,202303060117320102fb940347bdd606760207f7f3476b4c7e02428,retrieveAndUpdate()方法是用来恢复参数的,而且对于恢复过的和超时的参数都会被删除掉。saveOutputFlashMap() 这个方法是用来保存参数的。,FlashMapManager默认会将参数保存在 Session 中,在日常开发中,如果不想将参数暴露在 Url路径中,那就可以在请求转发时,在参数中添加@RedirectAttributes注解将参数缓存,然后在下一个处理器中就可以获取到。,以上就是我对Spring MVC中的九大组件的理解。,20230306011733d298cca8064ff0edc70205e87bd15178299f33913,需要注意的是ModelAndView和View并不属于MVC的九大组件之中,ModelAndView只是对ViewName和Model的封装,然后作为返回值把信息反馈给用户。并没有包含任何执行逻辑。而View只是对模板文件的封装,它是用作参数来传递。

© 版权声明

相关文章