Spring MVC的基础配置

配置DispatcherServlet

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

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

package spittr.config;
import org.springframework.web.servlet.support.
              AbstractAnnotationConfigDispatcherServletInitializer;
public class SpittrWebAppInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
  protected String[] getServletMappings() {
    return new String[] { "/" };
  }
  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[] { RootConfig.class };
  }
  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { WebConfig.class };
  }
}

在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标签。

package spittr.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@EnableWebMvc
public class WebConfig {
}

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

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

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

@Configuration
@EnableWebMvc
@ComponentScan("spitter.web")
public class WebConfig extends WebMvcConfigurerAdapter {
  @Bean
  public ViewResolver viewResolver() {
    InternalResourceViewResolver resolver =
            new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    resolver.setExposeContextBeansAsAttributes(true);
    return resolver;
  }

  @Override
  public void configureDefaultServletHandling(
        DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }
}

首先,使用@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】,第一时间获取最新文章。
Spring MVC的基础配置

上一篇:SpringMVC初见


下一篇:Java之SpringMVC基础