SpringMVC初体验一

1 SpringMVC简介

spring框架提供了构建Web应用程序的全功能MVC模块。通过策略接口,Spring框架是高度可配置的,而且支持多种视图技术。SpringMVC通过实现了Servlet接口的DispatcherServlet来封装核心功能的实现,具有处理程序映射,视图解析,主题解析等核心功能。

SpringMVC主要解决了以下三个问题 :

  • 将web页面的请求传给服务器
  • 根据不同的请求处理不同的逻辑单元
  • 返回处理结果并跳转至响应页面

2 一次SpringMVC的请求的处理路径

当浏览器发送一次请求到达SpringMVC的核心处理器DispatcherServlet之后,会经历很多次逻辑的封装,在每一段都会留下一些信息同时带走一部分信息。一次SpringMVC请求所经历的流程大致如下图所示:

  • 请求的第一站是Spring的DispatcherServlet。SpringMVC的所有请求都会通过一个前端控制器Servlet。前端控制器是常用的Web应用程序模式,在这里一个单实例的Servelt将请求委托给应用程序的其他组件来执行实际的处理。在SpringMVC中,DispatcherServlet就承担了这个责任。DispatcherServlet的任务就是将请求发送给controller,控制器是一个用于处理请求的Spring组件。
  • 请求的第二站是处理器映射,DispatcherServlet通过查询一个或者多个处理器映射(handler mapping)。处理器映射会根据请求所携带的URL信息进行决策。
  • 请求的第三站是控制器。DispatcherServlet带着映射器所返回的控制器信息将请求发送给选中的控制器,到了控制器这一层,请求会将用户所提交的信息交给控制器来进行逻辑的处理。完成逻辑处理后,控制器会将产生的信息返回给用户并在浏览器上面展示。
  • 请求的第四步是 控制器将数据连同视图名称一起返回给DispatcherServlet。通过这样的方式来进行视图与控制器之间的解耦,传递给DispatcherServlet的视图名称并不能代表某一个特定的页面。
  • 请求的第五步是 DispatcherServlet通过视图解析器来将逻辑视图名匹配为一个特定的视图实现。
  • 请求的第六步是视图的实现
  • 最后响应到页面进行输出。

3 DisPatcherServlet 初始化

我们简单介绍一个DisPatcherServlet,DisPatcherServlet是Servlet接口的实现类。Servlet是一个java编写的程序,基于HTTP协议。在服务器端运行,按照Servlet规范编写的一个Java类。主要是处理客户端请求并将结果发送到客户端。

3.1 servlet生命周期

  • 初始化阶段 servlet容器加载servlet类并且把servlet类的.class文件中的数据读到内存中。servlet容器创建一个ServletConfig对象,ServletConfig对象包含了servlet的初始化配置信息。servlet容器创建一个servlet对象,调用servlet对象的init方法进行初始化。
  • 运行阶段 servlet容器接收到一个请求时,servlet容器会针对这个请求创建servletRequest对象和servletResponse对象。然后调用service方法。并把这两个参数传递给service方法,service方法通过servletRequest对象获得请求的信息。处理该请求,再通过servletResponse对象生成这个请求的响应结果。然后销毁servletRequest和servletResponse对象。
  • 销毁阶段 当web应用被终止时,servlet容器会先调用servlet对象的destory方法,然后再销毁servlet对象,同时也会销毁与servlet对象关联的servletConfig对象。我们可以在destory方法的实现中,释放servlet所占用的资源。

3.2 DispatcherServlet初始化

DispatcherServlet的父类HttpServletBean重写了init方法,主要是将servlet实例转换为BeanWrapper类型的实例,以便使用Spring中提供的注入功能进行对应属性的注入。init方法主要执行了以下几步

  • 封装及验证初始化参数
  • 将当前servlet实例转换成BeanWrapper实例
  • 注册相对于Resource的属性编辑器
  • 属性注入
  • servletBean的初始化

3.3 WebApplicationContext初始化

servletBean将自己关键的初始化逻辑的实现委托给了initWebApplication(),这个方法的主要工作就是创建或刷新WebApplicationContext实例并对servlet功能所使用的变量进行初始化,这个方法主要执行了以下几步

  • 寻找或创建对应的WebApplicationContext实例

    • 通过构造函数的注入进行初始化
    • 通过contextAttribute进行初始化
    • 重新创建WebApplicationContext实例
  • 我们会发现最后都调用了configureAndRefreshWebApplicationContext方法 这个方法最后又都指向了ConfigureAndRefreshWebApplication 的 refresh方法。

  • refresh方法代码如下 :

    • 初始化MultipartResolver 用来文件上传
    • 初始化LocaleResolver 国际化参数配置
    • 初始化ThemeResolver 主题解析器
    • 初始化HandlerMapping 映射器
    • 初始化HandlerAdapters 适配器
    • 初始化RequestToViewNameTranslator 进行视图匹配的对象
    • 初始化ViewResolvers ViewResolver接口定义了resolverViewName方法,根据ViewName创建合适类型的View实现。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章