搭建SpringMVC的基础组件
为了方便理解和简化无关细节,我们要使用最简单的方式来配置SpringMVC:所要实现的功能仅限于运行我们所创建的控制器。
- 配置DispatcherServlet
DispatcherServlet是SpringMVC的核心。在这里请求会第一次接触到框架,它要负责将请求路由到其他的组件之中。配置DispatcherServlet的传统方式是在web.xml文件中配置,这个文件也会放到应用的war包里面。但是,借助于Servlet3规范和Spring3.1的功能增强,这种方式已经不是唯一的方案了,接下来就会讲解新方法。
我们使用Java将DispatcherServlet配置在Servlet容器中,而不会再使用web.xml文件。如下程序清单展示了所需的Java类。
package spittr.config;
public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected String[] getServletMappings(){ //将DispatcherServlet映射到"/"
return new String[]{"/"};
}
@Override
protected Class<?>[] getRootConfigClasses(){
return new Class<?>[]{ RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses(){ //指定配置类
return new Class<?>[] {WebConfig.class};
}
}
扩展AbstractAnnotationConfigDispatcherServletInitializer的任意类都会自动地配置DispatcherServlet和Spring应用上下文,Spring的应用上下文会位于应用程序的Servlet上下文之中。
启用SpringMVC
启用SpringMVC
当Spring使用XML配置时,可以使用
<mvc:annotation-driven>
启动注解驱动的SpringMVC。基于Java的配置中,使用@EnableWebMvc注解来启动SpringMVC,如:
package spittr.config;
@Configuration
@EnableWebMvc
public class WebConfig{
//视图解析器、启动组件扫描等等....
}
视图解析器
当没有配置视图解析器时,Spring默认会使用BeanNameViewResolver,这个视图解析器会查找ID与视图名称匹配的bean,并且查找的bean要实现View接口,它以这样的方式来解析视图。
组件扫描
在配置类中记得要启用组件扫描,否则Spring只能找到显式声明在配置类中的控制器。
映射分类
这样配置的话,DispatcherServlet会映射为应用的默认Servlet,所以它会处理所有的请求,包括对静态资源的请求,如图片和样式表(在大多数情况下,这可能并不是你想要的结果)。
配置完善
鉴于上面的种种欠缺,我们的配置类应该是这样的:
package spitrr.config;
@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(DefaultServletHandlerConfigrer configurer){ //配置静态资源的处理
configurer.enable();
}
}
组件扫描的作用
上面我们启动了组件扫描,因此将会扫描spitter.web下面的组件。稍后会看到,我们所编写的控制器将会带有@Controller注解,这会使其成为组件扫描时的候选bean。因此,我们不需要在配置类中显式声明任何控制器。
静态资源分流
需要注意,新的WebConfig类还拓展了WebMvcConfigurerAdapter并重写了其configureDefaultServletHandling()方法,通过调用DefaultServletHandlerConfigurer的enable()方法,我们要求DispatcherServlet将对静态资源的请求转发到Servlet容器中默认的Servlet上,而不是使用DispatcherServlet本身来处理此类请求。
上一篇: SpringMVC入门之一:SpringMVC基本原理及请求过程概述
下一篇: SpringMVC入门之三:控制器&模型