Spring MVC 的基础配置

字数1,141 大约花费5分钟

目录

  1. 1. 配置 DispatcherServlet
  2. 2. 两个应用程序上下文
  3. 3. 使 Spring MVC 生效

配置 DispatcherServlet

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 标签。

1
2
3
4
5
6
7
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 等静态文件的请求也会被处理,而这往往是没有必要的。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@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的文章均为原创或翻译(翻译会注明外文来源),转载请以链接形式标明本文地址: http://tantanit.com/spring-mvc-basic-config/

谈谈IT

欢迎关注官方微信公众号获取最新原创文章