springmvc9大组件_小程序组件源码

springmvc9大组件_小程序组件源码前面几篇文章都是针对于SpringMVC中的具体组件进行源码分析的;本文主要用于补充记录一下关于SpringMVC中九大组件的学习。这个会牵扯出除之前的几篇HandlerMapping之外的其他一些基础组件。 之前简单的有介绍过DispatcherServlet这个类的体系结构…

SpringMVC源码系列:九大组件小记"

前面几篇文章都是针对于SpringMVC中的具体组件进行源码分析的;本文主要用于补充记录一下关于SpringMVC中九大组件的学习。这个会牵扯出除之前的几篇HandlerMapping之外的其他一些基础组件。

之前简单的有介绍过DispatcherServlet这个类的体系结构,此处就不再赘述了。在DispatcherServlet类中,其在mvc子容器进行初始化时就会完成对九大组件的初始化工作,具体哪九大组件后面会慢慢说到。先来看下在DispatcherServlet中是通过哪些方法来完成初始化工作的,先贴一段代码:

protected void onRefresh(ApplicationContext context) {
    this.initStrategies(context);
}

protected void initStrategies(ApplicationContext context) {
    this.initMultipartResolver(context);
    this.initLocaleResolver(context);
    this.initThemeResolver(context);
    this.initHandlerMappings(context);
    this.initHandlerAdapters(context);
    this.initHandlerExceptionResolvers(context);
    this.initRequestToViewNameTranslator(context);
    this.initViewResolvers(context);
    this.initFlashMapManager(context);
}

上面代码中的onRefresh方法就是DispatcherServlet的入口方法。在onRefresh中又通过调用initStrategies方法来将各个组件的初始化逻辑进行整合,个人理解其实就是策略套策略,在一个就是职责也明确。

initStrategies方法中又通过调用组件各自的初始化方法来完成具体的初始化工作。从这个地方其实就可以清楚的看出SpringMVC中的9个组件名称了。下面就来捋一捋这九大组件的基本职责。

HandlerMapping

关于handlermapping在下面几篇文章中做过一些基本介绍,但是还不是很全,对于handlermapping的子类还没有分析完,这个会后期更新的。

  • SpringMVC源码系列:HandlerMapping
  • SpringMVC源码系列:AbstractHandlerMapping
  • SpringMVC源码系列:AbstractUrlHandlerMapping

对于HandlerMapping来说,其作用就是根据request找到相应的处理器HandlerIntecepter拦截器。具体细节参数上面第一篇文章。

HandlerAdapter

如果说HandlerMapping是一支笔,那么HandlerAdapter就是用笔的人。也就是说HandlerAdapter就是使用处理器干活的人。为什么呢?来看下代码:

public interface HandlerAdapter {
    boolean supports(Object var1);
    ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
    long getLastModified(HttpServletRequest var1, Object var2);
}

是不是一目了然了,在HandlerAdapter接口中提供了handle这样一个方法,参数中Object handler第三个参数其实就是一个处理器,那我们就知道了,handle方法就是使用handler来处理逻辑的。处理之后返回一个ModelAndView

HandlerExceptionResolver

这个是SpringMVC中的异常处理组件,HandlerExceptionResolver这个组件的作用就是根据异常设置ModelAndView,然后再将处理结果交给render方法进行渲染。当然render也仅仅只是负责将ModelAndView渲染成页面,ModelAndView的具体来源它不关心。

这里需要说明一下,加入在渲染过程中发生异常怎么办?从上面的分析我们可以清楚的知道,HandlerExceptionResolver这个组件对异常的处理结果是ModelAndView,然后再由render方法进行渲染,也就是说HandlerExceptionResolver是在渲染之前工作的,因此渲染过程中发生异常,HandlerExceptionResolver是不会处理的。

public interface HandlerExceptionResolver {
    ModelAndView resolveException(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4);
}

HandlerExceptionResolver中也只有一个方法,这个方法就是从异常中解析出ModelAndView

ViewResolver

ViewResolver的作用是将String类型的逻辑视图根据local解析为View视图的。下面是ViewResolver的源码接口定义:

public interface ViewResolver {
    View resolveViewName(String viewName, Locale local) throws Exception;
}

从代码中可以看到,在ViewResolver中也是只有一个方法,从resolveViewName方法的参数和返回结果就很好的解释了其作用。

  • viewName String类型的视图名
  • local 区域,可以用来做国际化。

View实际上是用来渲染页面的,也就是说将程序返回的结果填入到具体的模板里面,生成具体的视图文件,比如:jsp,ftl,html等。

但是这里又会牵扯出两个问题:

  • 用什么模板?
  • 参数怎么填入?

当然,这两个问题也就是本小节说的ViewResolver需要解决的问题。大体分为两种:

针对单一视图类型的解析器

  • InternalResourceViewResolver
  • FreeMarkerViewResolver

上面两种是用的最多的两种,InternalResourceViewResolver用来解析jsp,而FreeMarkerViewResolver则是针对FreeMarker。

针对同时解析多种类型视图的解析器

  • BeanNameViewResolver

    需要同时使用视图名和对应的local来解析视图。它需要将每一个视图名和对应的视图类型配置到相应的properties文件中。(后面讲组件实现细节时给出列子)

  • XmlViewResolver

    XmlViewResolver和BeanNameViewResolver有点差不多,BeanNameViewResolver使用的是xml格式的配置文件。

  • ResourceBundleViewResolver

    这个其实就是根据viewName从Spring容器中查找bean,再根据这个bean来找到对应的视图。

LocalResolver

在上面的ViewResolver中提到,解析视图需要两个参数,一个是String类型的逻辑视图名,另外一个是local。LocalResolver的作用就是从request中解析出local的。

public interface LocaleResolver {
    Locale resolveLocale(HttpServletRequest request);

    void setLocale(HttpServletRequest request, HttpServletResponse response, Locale local);
}

第一个方法是从request中解析出local,第二个方法是将local设置到request中。

关于local大多数情况下都是用来做国际化处理的。

ThemeResolver

解析主题的。这个我平时除了SpringMVC自己提供的功能外,很少自己去扩展使用,即使是换主题也没有做过。不过既然存在肯定是有存在的原因的。对于我们常见的网页界面活着手机界面来说,一套主题无非就是换一套图片,活着css样式文件等等。我们通过ThemeResolver这个就可以实现这样的功能。具体使用其实也就是配一套properties文件供系统在不同的时候读取切换;当然使用这个也是可以实现国际化的。

public interface ThemeResolver {
    String resolveThemeName(HttpServletRequest request);

    void setThemeName(HttpServletRequest request, HttpServletResponse response, String themeName);
}

RequestToViewNameTranslator

这个其实还是挺有意思的,就是将request请求转换为视图名称。

public interface RequestToViewNameTranslator {
    String getViewName(HttpServletRequest request) throws Exception;
}

RequestToViewNameTranslator只有一个默认的实现类DefaultRequestToViewNameTranslator

DefaultRequestToViewNameTranslator具体实现了getViewName(HttpServletRequest request)方法:

public String getViewName(HttpServletRequest request) {
    String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
    return this.prefix + this.transformPath(lookupPath) + this.suffix;
}

主要是委派给urlPathHelper帮助类得到请求的后缀名称,比如通过 请求路径比如/glmapper/login.do转换得到/login.do ;具体怎么转换成视图也会在后面的组件介绍中给出具体的例子。

MultipartResolver

这个相应小伙伴们也不陌生,做网站多多少少会涉及到文件上传。MultipartResolver就是用来处理上传请求的。其处理方式就是将request包装成MultipartHttpServletRequest。然后我们就可以用MultipartHttpServletRequest这个直接调用getFile获取的文件了。

FlashMapManager

这个在redirect是进行参数传递需要用到。

public interface FlashMapManager {
    FlashMap retrieveAndUpdate(HttpServletRequest request, HttpServletResponse response);

    void saveOutputFlashMap(FlashMap flashMap, HttpServletRequest request, HttpServletResponse response);
}

retrieveAndUpdate这个方法是用来恢复参数的,对于恢复过的和超时的参数将都会被删除掉。

saveOutputFlashMap这个方法是用来保存参数的。

FlashMapManager的默认实现机制中参数的存储是放在session中的。我之前在一个项目中就有遇到过这种情况,对于一些我们不想暴露在url中的参数,在进行请求转发时,可以使用@RedirectAttributes将参数保存,然后在下一个处理器中获取到。

小结

本篇主要是来对九大组件做一个笼统的介绍,细节实现及案例均不涉及;在后续的SpringMVC源码系列中对各个组件的实现细节分析时再一探究竟吧。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13910.html

(0)

相关推荐

  • MySQL学习 2019-12

    MySQL学习 2019-12启动mysql服务: net start mysql 关闭mysql服务: net stop mysql cmd清屏: cls mysql -V 输出版本信息并且退出 mysql -u 用户

    2022-12-29
    160
  • Python Assert:优化代码调试与测试

    Python Assert:优化代码调试与测试Python Assert是Python中的一种断言语句,用于在代码中进行自动化测试。通过在代码中插入assert语句,可以对代码做出各种前置条件的检查,以确保代码的正确性。当assert语句的条件返回False时,程序将会中止并抛出异常,以提醒开发人员代码存在问题。

    2024-03-15
    76
  • Python参数解析器应用实例

    Python参数解析器应用实例Python是一门非常强大的编程语言,但是如果不能提高工作效率,那么Python也无法发挥出它的全部威力。在Python中,参数解析器(Argument Parser)是一个非常实用也非常重要的模块。本文将通过实例介绍Python参数解析器的功能和使用方法。

    2024-03-21
    88
  • PostgreSQL源码学习(2)插入数据#0

    PostgreSQL源码学习(2)插入数据#0以一条insert into test values (123,'abc');的SQL语句为例,跟踪插入数据的代码逻辑。(PG版本为12.2) 插入数据主要的实现在bufpage…

    2023-02-15
    159
  • Unity软件安装过程(保姆级教程)「建议收藏」

    Unity软件安装过程(保姆级教程)「建议收藏」Unity3D 是一个专业游戏开发引擎,可以用来进行游戏开发、动画制作、工程仿真、VR/AR。 本文将详细介绍Unity3D的安装过程,其中包含了本人经历的坑,相信对大家有帮助。 备注:不建议在该网站下载,首先网站是英文的,其次下载速度慢到怀疑人生。本人3年前就是在该网站安装的…

    2023-07-24
    131
  • Oracle解析逗号分隔的字符串,或者01110110101此类数据

    Oracle解析逗号分隔的字符串,或者01110110101此类数据– 1.提取此类数据中的1的索引位置,从1开始 例: 0001100001100 –> 4,5,10,11 create or replace function hazq_instr_con

    2022-12-22
    126
  • 编程电子书(计算机书本与教材电子版)

    编程电子书(计算机书本与教材电子版)

    2023-10-19
    130
  • Python工程师如何在Linux上搭建MongoDB

    Python工程师如何在Linux上搭建MongoDB作为一位 Python 工程师,你可能会需要使用 MongoDB 来存储你的数据。在本文中,我们将探讨如何在 Linux 平台上搭建 MongoDB 数据库。我们将提供 MongoDB 的一些背景信息、安装和配置 MongoDB、以及如何连接和使用 MongoDB。

    2024-06-15
    57

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注