《Spring技术内幕:深入解析Spring架构与设计原理》笔记之四(Spring MVC与web环境)

SSH:以Struts作为web框架来帮助应用构建UI,Spring作为应用平台,Hibernate作为O/R映射的数据持久化层实现。

Hibernate是一个独立的ORM数据持久化实现产品,对于ORM数据持久化实现,Spring本身并不提供独立的解决方案。

MVC模式

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之四(Spring MVC与web环境)

在使用Spring MVC的时候,需要在web.xml中配置DispatcherServlet,这个DispatcherServlet可以看成是一个前端控制器的具体实现,还需要在Bean定义中配置Web请求和Controller(控制器)的对应关系,以及各种视图的展现方式。在具体使用Controller的时候,会看到ModelAndView数据的生成,还会看到把ModelAndView数据交给相应的View来进行呈现。

Web环境中的Spring MVC

首先在Tomcat中进行web.xml的配置;

在这个配置描述中,首先定义一个Servlet对象,它是Spring MVC的DispatcherServlet。这个DispatcherServlet是MVC中最重要的一个类,起着分发请求的作用。然后,为这个DispatcherServlet定义了对应的URL映射,这些URL映射为这个Servlet指定了需要处理的HTTP请求。context-param参数的配置用来指定Spring IOC容器读取Bean定义的XML文件的路径,在这里,这个配置文件被定义为/WEBINF/applicationContext.xml。

DispatcherServlet和ContextLoaderListener提供了在Web容器中对Spring的接口,这些接口与web容器耦合是通过ServletContext来实现的。

上下文在Web容器中的启动

IOC容器启动的基本过程

web容器中启动Spring应用程序的过程

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之四(Spring MVC与web环境)

在web容器中,建立WebApplicationContext的过程,是在contextInitialized的接口实现中完成的。具体的载入IOC容器的过程是由ContextLoaderListenser交由ContextLoader来完成的,而ContextLoader本身就是ContextLoaderListener的基类,它们之间的类关系为:

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之四(Spring MVC与web环境)

在contextLoader中,完成了两个IOC容器建立的基本过程,一个是在Web容器中建立起双亲IOC容器,另一个是生成相应的WebApplicationContext并将其初始化。

web容器中的上下文设计

WebApplicationContext接口的类层次关系

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之四(Spring MVC与web环境)

在XmlWebApplicationContext的初始化过程中,Web容器中的IOC容器被建立起来,从而在Web容器中建立起整个Spring应用。

ContextLoader的设计与实现

在ContextLoaderListener中,实现的是ServletContextListener接口,这个接口里的函数会结合Web容器的生命周期被调用。因为ServletContextListener是ServletContext的监听者,如果ServletContext发生变化,会触发出相应的事件,而监听器一直在对这些事件进行监听,如果接收到了监听的事件,就会做出预先设计好的响应动作。由于ServletContext的变化而触发的监听器的响应具体包括:在服务器启动时,ServletContext被创建的时候,服务器关闭时,ServletContext将被销毁的时候。

在确定使用何种IOC容器的过程中可以看到,应用可以在部署描述符中指定使用什么样的IOC容器,这个指定操作是通过CONTEXT_CLASS_PARAM参数的设置完成的。如果没有指定特定的IOC容器,将使用默认的IOC容器,也就是XMLWebApplicationContext对象作为在Web环境中使用的IOC容器。

Spring MVC的设计与实现

Spring mvc的应用场景

比如常用的JSP视图、Excel视图、PDF视图等。

DispatcherServlet的处理过程

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之四(Spring MVC与web环境)

DispatcherServlet的启动和初始化

在初始化开始时,需要读取配置在ServletContext中的Bean属性参数,这些属性参数设置在web.xml的容器初始化参数中。

最后,DispatcherServlet给这个自己持有的上下文命名,并把它设置到Web容器的上下文中,这个名词和web.xml中设置的DispatcherServlet的Servlet名词有关,从而保证了这个上下文在web环境上下文体系中的唯一性。

MVC处理HTTP分发请求

1.HandlerMapping的配置和设计原理

                                                                            HandlerMapping的设计原理

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之四(Spring MVC与web环境)

这些映射关系是通过接口类HandlerMapping来封装的,在HandlerMapping接口中定义一个getHandler方法,通过这个方法,可以获得与HTTP请求对应的HandlerExecutionChain,在这个HandlerExecutionChain中,封装了具体的controller对象。

2.使用HandlerMapping完成请求的映射处理

继续通过SimpleURLHandlerMapping的实现来分析HandlerMapping的接口方法getHandler,该方法会根据初始化时得到的映射关系来生成DispatcherServlet需要的HandlerExecutionChian,也就是说,这个getHandler方法是实际使用HandlerMapping完成请求的映射处理的地方。

取得Handler的具体过程在getHandlerInternal方法中实现,这个方法接受HTTP请求作为参数,它的实现在AbstractHandlerMapping中,这个实现过程包括从HTTP请求得到URL,并根据URL到URLMapping中获得Handler。

3.Spring MVC对HTTP请求的分发处理

在MVC框架初始化完成后,对HTTP请求的处理是在doService()方法中完成的。DispatcherServlet是HttpServlet的子类,与其他HttpServlet一样,可以通过doService()来响应HTTP的请求。然而,依照Spring MVC的使用,业务逻辑的调用入口是handler的handler函数中实现的,这里是连接Spring MVC和应用业务逻辑实现的地方。

                                                            doDispatcher协同模型和控制器的过程

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之四(Spring MVC与web环境)

Spring MVC视图的呈现

1.DispatcherServlet视图呈现的设计

具体来说,在DispatcherServlet中,对视图呈现的处理是在render方法调用中完成的。为了完成视图的呈现工作,需要从ModelAndView对象中取得视图对象,然后调用视图对象的render方法,由这个试图对象来完成特定的视图呈现工作。同时,由于是在web的环境中,因此视图对象的呈现往往需要完成与HTTP请求和响应相关的处理,这些对象会作为参数传到视图对象的render方法中,供render方法使用。

Spring MVC的继承关系

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之四(Spring MVC与web环境)

JSP视图的实现

ExcelView的实现

POI和JExcelAPI两个方案在MVC框架中的整合,它们的使用分别对应两个view类:AbstractExcelView和AbstractJExcelView。

PDF视图的实现

小结:

Spring MVC的实现的步骤:

1)需要建立Controller控制器和HTTP请求之间的映射关系。

2)在初始化过程中,Controller对象和HTTP请求之间的映射关系建立好之后,为Spring MVC接收HTTP请求完成响应处理做好了准备。

3)得到ModelAndView以后,DispatcherServlet把获得的模型数据交给特定的视图对象,从而完成这些数据的视图呈现工作。