配置DispatcherServlet
DispatcherServlet是Spring MVC的核心,它负责接收request,并且决定request将转给哪个组件。历史上,包括DispatcherServlet的servlet是web.xml文件配置,而web.xml文件包含在war里。现在仍然可以用这种方式进行配置,但更好用的方式是使用java文件来配置servlet容器中的DispatcherServlet。
任何继承了AbstractAnnotationConfigDispatcherServletInitializer的类都会自动被用来在应用程序上下文中配置DispatcherServlet和Spring应用上下文。
1 | package spittr.config; |
在Servlet 3.0环境中,容器会在classpath下查找任何实现了javax.servlet .ServletContainerInitializer接口的类,并用这些类来配置servlet容器。Spring提供了一个实现这个接口的类:SpringServletContainerInitializer,这个类会查找实现了WebApplicationInitializer接口的类,并且作为后者的代理,对servlet上下文进行配置。Spring 3.2引进了AbstractAnnotationConfigDispatcherServletInitializer,这个类实现了WebApplicationInitializer接口。在上面的程序中,由于SpittrWebAppInitializer继承了AbstractAnnotationConfigDispatcherServletInitializer,也就实现了WebApplicationInitializer接口。所以当程序在servlet 3.0容器中部署时,SpittrWebAppInitializer会被自动查找到,并且用来配置servlet上下文。
尽管名字很长,AbstractAnnotationConfigDispatcherServletInitializer很容易使用。SpittrWebAppInitializer继承AbstractAnnotationConfigDispatcherServletInitializer,并覆盖了三种方法。第一个方法,getServletMappings(),确定了DispatcherServlet将会被映射到哪些路径。例子中被映射到/,表示DispatcherServlet将会是应用程序的默认servlet,它将处理这个应用接收到的所有的请求。
两个应用程序上下文
当DispatcherServlet启动的时候,它创建并加载应用程序上下文,并且加载在配置文件中定义的bean。上面例子中的getServletMappings方法,使得DispatcherServlet将加载应用上下文,以及WebConfig这个java配置文件中加载的bean。
但在Spring的web应用程序中,有另一个应用上下文。这个上下文由ContextLoaderListener创建。
DispatcherServlet用来加载Controller,视图解析器和handler映射。而ContextLoaderListener是用来加载应用程序中的其它bean。这些bean是典型的中间层和数据层的bean,这些bean构成了应用程序的后端。AbstractAnnotationConfigDispatcherServletInitializer同时创建了DispatcherServlet和ContextLoaderListener。从getServletConfigClasses()返回的带@Configuration标签的类将为DispatcherServlet的应用上下文定义bean。从getRootConfigClasses()返回的带@Configuration标签的类将会用来配置ContextLoaderListener创建的应用上下文。
在上面的例子中,根配置定义在RootConfig中。而DispatcherServlet的配置定义在WebConfig中。
使Spring MVC生效
使Spring MVC生效的最简单方式是使用EnableWebMvc标签。
1 | package spittr.config; |
上面的代码将启用Spring MVC,但至少留下了下面的问题:
- 没有指定视图解析器,Spring将会使用默认的BeanNameViewResolver,这个解析器将根据id查找实现了View接口的类。
- 没有启用组件扫描,Spring只能找到在配置文件中显式定义的controller。
- DispatcherServlet被指定为应用程序的默认servlet,它将处理这个应用接收到的所有的请求,包括对图片、stylesheet等静态文件的请求也会被处理,而这往往是没有必要的。
为了解决这几个问题,可以将程序进行如下修改:
1 |
|
首先,使用@ComponentScan标签标注了WebConfig,将会在spitter.web自动扫描组件。当然,相应的controller类也要加上@Controller标签。
其次,加了一个ViewResolver,指定在/WEB-INF/views/下查找jsp后缀的文件。
最后,这个新的WebConfig继承了WebMvcConfigurerAdapter,并且覆盖了configureDefaultServletHandling方法,通过调用参数DefaultServletHandlerConfigurer的enable方法,DispatcherServlet会将对静态资源的请求转发给servlet容器的默认servlet,DispatcherServlet本身不会尝试处理它们。
本文讲述了如何对Spring MVC进行基础配置,关于filter和multipart等可选的内容,将在后续文章进行讲解。