21.2 DispatcherServlet
下图展示了Spring Web MVC的DispatcherServlet
处理请求的工作流。熟悉设计模式的朋友会发现,DispatcherServlet
应用的其实就是一个“前端控制器”的设计模式(其他很多优秀的web框架也都使用了这个设计模式)。
DispatcherServlet
其实就是个Servlet
(它继承自HttpServlet
基类),同样也需要在你web应用的web.xml
配置文件下声明。你需要在web.xml
文件中把你希望DispatcherServlet
处理的请求映射到对应的URL上去。这就是标准的Java EE Servlet配置;下面的代码就展示了对DispatcherServlet
和路径映射的声明:
WebApplicationInitializer
是Spring MVC提供的一个接口,它会查找你所有基于代码的配置,并应用它们来初始化Servlet 3版本以上的web容器。它有一个抽象的实现AbstractDispatcherServletInitializer
,用以简化DispatcherServlet
的注册工作:你只需要指定其servlet映射(mapping)即可。若想了解更多细节,可以参考基于代码的Servlet容器初始化一节。
上面只是配置Spring Web MVC的第一步,接下来你需要配置其他的一些bean(除了DispatcherServlet
以外的其他bean),它们也会被Spring Web MVC框架使用到。
在一节中我们聊到,Spring中的ApplicationContext
实例是可以有范围(scope)的。在Spring MVC中,每个DispatcherServlet
都持有一个自己的上下文对象WebApplicationContext
,它又继承了根(root)WebApplicationContext
对象中已经定义的所有bean。这些继承的bean可以在具体的Servlet实例中被重载,在每个Servlet实例中你也可以定义其scope下的新bean。
看看下面这个DispatcherServlet
的Servlet配置(定义于web.xml文件中):
有了以上的Servlet配置文件,你还需要在应用中的/WEB-INF/
路径下创建一个golfing-servlet.xml
文件,在该文件中定义所有Spring MVC相关的组件(比如bean等)。你可以通过servlet初始化参数为这个配置文件指定其他的路径(更多细节请参考下文)。
当你的应用中只需要一个DispatcherServlet
时,只配置一个根context对象也是可行的。
WebApplicationContext
继承自ApplicationContext
,它提供了一些web应用经常需要用到的特性。它与普通的ApplicationContext
不同的地方在于,它支持主题的解析(详见21.9 主题Themes一小节),并且知道它关联到的是哪个servlet(它持有一个该ServletContext
的引用)。WebApplicationContext
被绑定在ServletContext
中。如果需要获取它,你可以通过工具类中的静态方法来拿到这个web应用的上下文WebApplicationContext
。