SpringMVC初体验

85 阅读4分钟
1. 鸟瞰Spring MVC

通过引入Front Controller的概念来分离流程控制逻辑与具体的web请求处理逻辑。org.springframework.web.servlet.DispatcherServlet就是spring MVC框架中的Front Controller,它负责接收并处理所有的Web请求,只不过针对具体的处理逻辑,它会委派给它的下一级控制器去实现,即org.springframework.web.servlet.mvc.Controller。

servlet常见的功能简单归纳就是有以下三点:

  • 获取请求信息,比如请求的路径、各种参数值
  • 根据请求信息,调用具体的服务对象处理具体的web请求
  • 处理完成之后,将要在视图中显示的模型数据通过request进行传递,最后通过Request-Dispather选择具体的jsp视图并显示

DispatherServlet的处理流程可以简单概括如下:

1.1. HandlerMapping(web请求的处理协调人)

在web请求到达DispatcherServlet之后,Dipatcher将寻求具体的HandlerMapping实例,以获取对应当前web请求的具体处理类,即org.springframework.web.servlet.Controller。

1.2. org.springframework.web.servlet.Controller(web请求的具体处理者)

Controller处理方法执行完毕之后将返回一个org.springframework.web.servlet.ModelAndView实例。

1.3. ViewResolver和View(视图独立战争的领导者)
1.4. Spring MVC中各角色交互图

图片.png

2. 实践出真知

从web.xml作为出发点,它是整个web应用程序的部署描述符文件,下面是Spring MVC有关的部门。

2.1. ContextLoaderListener与/WEB-INF/applicationContext.xml

从web.xml开始,我们首先通过<listener>元素增加了一个ServletContextListener 的定义,org.springfrarnework.Web.context.ContextLoaderListener。ContextLoaderListener的职责在于,它将为整个的Web应用程序加载顶层的WebApplicationContext(ROOTWebApplicationContext)。该顶层WebApplicationContext主要用于提供应用所使用的中间层服务。我们所使用的数据源(DataSource)定义、数据访问对象(DAO)定义、服务对象(Services)定义等,都在 该WebApplicationContext 中注册。你完全可以将其比作独立运行的应用程序中我们所使用的 ClassPathXmlApplicationContext 或者FileSystemXmlApplicationContext。只不过 ,WebapplicationContext专门用于Web环境下,在这种容器中 ,我们可以使用在讲解Spring 的loC容 器部分提到的自定义scope来注册相应的bean 定义了,包括request 、session等。

ContextLoaderListener加载的WebApplicationContext的默认配置文件路径为/WEB-INF/ applicationContext.xml ,实际开发中,不管是出于团队 并行开发效率的考虑,还是出于便于管理的因素考虑 ,很少会使用默认的单 的/WEB-INF/applicationContext.xml来管理整个Web应用程序的所有中问层服务对象。我们要么会按照应用程序的层次进行配置文件的分割,要么会按照系统功能模块进行配置文件的分割 。当存在多个分割后的配置文件的时候,ContextLoaderListener 的默认加载行为将成为我们的制约。这时,我们可以通过在web.xml中指定名称为 contextConfigLocation
的配置参数来打破默认行为的制约 。

2.2 DispatcherServlet与XXX-servlet.xml

DispatcherServlet也使用了一个外部化的配置文件,用来配置Spring MVC框架在处理web请求过程中所涉及的各个组件,包括HandlerMapping定义、Controller定义、ViewResolver定义等。

该外部化的配置文件存在的默认路径是/WEB-INF/,名称需要参照web.xml中定义的DispatcherServlet的<servlet-name>来决定。DispatcherServlet对应的默认配置文件名称,将在<servlet-name>的值的基础上后缀-servlet.xml。

XXX-servlet.xml主要负责配置基于Spring MVC框架的web应用程序所使用的各种web层组件。

DispatcherServlet启动之后将加载<servlet-name>-servlet.xml配置文件,并构建相应的WebApplicationContext。该WebApplicationContext将之前通过ContextLoaderListener加载的顶层WebApplicationContext(ROOT WebApplicationContext)作为父容器(Parent ApplicationContext)。 这样,如果需要,<servlet-narne>-servlet.xml中注册的各种面向Web层的组件,也可以注入来自顶层WebApplicationContext的依赖了。所以,我们也就不难想象出<servlet-name>-servlet.xml对应的WebApplicationContext和默认的/WEB-INF/applicationContext.xml对应的顶层WebApplicationContext之间的逻辑依赖关系了,如下图所示。

图片.png

3. 忙碌的协调人HandlerMapping
4. 我们的亲密伙伴Controller
5. Handler与HandlerAdaptor

DispatcherServlet从HandlerMapping获得一个Handler之后,将询问HandlerAdaptor的supports(..)方法,以便了解当前HandlerAdaptor是否支持HandlerMapping刚刚返回的Handler类型的调用。如果supports(..)返回true,DispatcherServlet则调用HandlerAdaptor的handler(..)方法,同时将刚才的Handler作为参数传入。方法执行后将返回ModelAndView,之后的工作就由ViewResolver接手了。