Spring MVC是构建在Spring理念上的Web框架,基于模型-视图-控制器模式实现。
1、跟踪Spring MVC请求
- DispatcherServlet:Spring MVC中的前端控制器,将请求发送给对应的Spring MVC控制器。
- 处理器映射:根据请求所携带的URL信息来决定将请求发送给哪个控制器。
- 控制器:处理请求的负载(用户提交的信息),设计良好的控制器本身只处理很少甚至不处理工作,而是将业务逻辑委托给一个或多个服务对象进行处理。
- 模型:控制器完成逻辑处理后产生的需要返回用户并显示的信息称为模型。
- 视图:将信息以用户友好的形式进行格式化的文件。
- 视图解析器:将逻辑视图名匹配为一个特定的视图实现,可能是也可能不是JSP,此处体现了松耦合。
2、搭建Spring MVC
2.1、配置DispatcherServlet
例子:
package spittr.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected String[] getServletMappings() {
return new String[] {"/"}; //默认的Servlet,处理进入应用的所有请求
}
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class };
}
}
扩展AbstractAnnotationConfigDispatcherServletInitializer的任意类都会自动配置DispatcherServlet和Spring应用上下文,Spring应用上下文会位于应用程序的Servlet上下文中。
2.2、两个应用上下文
DispatcherServlet创建的应用上下文,加载getServletConfigClasses()方法中配置文件所定义的bean(希望是包含web组件的bean,如:控制器,视图解析器以及处理器映射等)。
ContextLoaderListener创建的应用上下文,加载通常驱动应用后端的中间层和数据层组件。
AbstractAnnotationConfigDispatcherServletInitializer会同时创建DispatcherServlet和ContextLoaderListener。
2.3、启用Spring MVC
WebConfig例子:
@Configuration
@EnableWebMvc
@ComponentScan("spittr.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(); //DispatcherServlet将对静态资源的请求发送到Servlet容器中默认的Servlet上
}
}
控制器不在配置类中进行显示声明,通过@Controller配合组件扫描进行配置即可。
RootConfig例子:
@Configuration
@ComponentScan(basePackages= {"spittr"}, excludeFilters= {@Filter(type=FilterType.ANNOTATION, value=EnableWebMvc.class)})
public class RootConfig {
}