Spring MVC的基础配置

末蓝、 2022-09-10 05:13 279阅读 0赞

配置DispatcherServlet

DispatcherServlet是Spring MVC的核心,它负责接收request,并且决定request将转给哪个组件。历史上,包括DispatcherServlet的servlet是web.xml文件配置,而web.xml文件包含在war里。现在仍然可以用这种方式进行配置,但更好用的方式是使用java文件来配置servlet容器中的DispatcherServlet。

任何继承了AbstractAnnotationConfigDispatcherServletInitializer的类都会自动被用来在应用程序上下文中配置DispatcherServlet和Spring应用上下文。

  1. package spittr.config;
  2. import org.springframework.web.servlet.support.
  3. AbstractAnnotationConfigDispatcherServletInitializer;
  4. public class SpittrWebAppInitializer
  5. extends AbstractAnnotationConfigDispatcherServletInitializer {
  6. @Override
  7. protected String[] getServletMappings() {
  8. return new String[] { "/" };
  9. }
  10. @Override
  11. protected Class<?>[] getRootConfigClasses() {
  12. return new Class<?>[] { RootConfig.class };
  13. }
  14. @Override
  15. protected Class<?>[] getServletConfigClasses() {
  16. return new Class<?>[] { WebConfig.class };
  17. }
  18. }

在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;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  4. @Configuration
  5. @EnableWebMvc
  6. public class WebConfig {
  7. }

上面的代码将启用Spring MVC,但至少留下了下面的问题:

  • 没有指定视图解析器,Spring将会使用默认的BeanNameViewResolver,这个解析器将根据id查找实现了View接口的类。
  • 没有启用组件扫描,Spring只能找到在配置文件中显式定义的controller。
  • DispatcherServlet被指定为应用程序的默认servlet,它将处理这个应用接收到的所有的请求,包括对图片、stylesheet等静态文件的请求也会被处理,而这往往是没有必要的。

为了解决这几个问题,可以将程序进行如下修改:

  1. @Configuration
  2. @EnableWebMvc
  3. @ComponentScan("spitter.web")
  4. public class WebConfig extends WebMvcConfigurerAdapter {
  5. @Bean
  6. public ViewResolver viewResolver() {
  7. InternalResourceViewResolver resolver =
  8. new InternalResourceViewResolver();
  9. resolver.setPrefix("/WEB-INF/views/");
  10. resolver.setSuffix(".jsp");
  11. resolver.setExposeContextBeansAsAttributes(true);
  12. return resolver;
  13. }
  14. @Override
  15. public void configureDefaultServletHandling(
  16. DefaultServletHandlerConfigurer configurer) {
  17. configurer.enable();
  18. }
  19. }

首先,使用@ComponentScan标签标注了WebConfig,将会在spitter.web自动扫描组件。当然,相应的controller类也要加上@Controller标签。

其次,加了一个ViewResolver,指定在/WEB-INF/views/下查找jsp后缀的文件。

最后,这个新的WebConfig继承了WebMvcConfigurerAdapter,并且覆盖了configureDefaultServletHandling方法,通过调用参数DefaultServletHandlerConfigurer的enable方法,DispatcherServlet会将对静态资源的请求转发给servlet容器的默认servlet,DispatcherServlet本身不会尝试处理它们。

本文讲述了如何对Spring MVC进行基础配置,关于filter和multipart等可选的内容,将在后续文章进行讲解。

欢迎扫描下方二维码关注微信公众号【谈谈IT】,第一时间获取最新文章。
欢迎关注同名公众号

发表评论

表情:
评论列表 (有 0 条评论,279人围观)

还没有评论,来说两句吧...

相关阅读