Spring MVC的核心就是DispatcherServlet类,Spring MVC处理请求的流程如下图所示
Spring MVC所有的请求都会通过一个前端控制器(front controller)Servlet。前端控制器是常用的Web应用程序模式,在这里一个单实例的Servlet将请求委托给应用程序的其他组件来执行实际的处理。在Spring MVC中,DispatcherServlet就是前端控制器。
请求过程
DispatcherServlet的任务是将请求发送给Spring MVC控制器,应用程序中可能会有多个控制器,DispatcherServlet需要知道应该将请求发送给哪个控制器。所以DispatcherServlet以会查询一个或多个处理器映射(handler mapping) 来确定请求的下一站在哪。
一旦选择了合适的控制器,DispatcherServlet会将请求发送给选中的控制器。到了控制器,请求会卸下其负载(用户提交的信息)并耐心等待控制器处理这些信息。
控制器所做的最后一件事就是将模型数据打包,并且标示出用于渲染输出的视图名。它接下来会将请求连同模型和逻辑视图名发送回DispatcherServlet。
DispatcherServlet将会使用视图解析器(view resolver)来将逻辑视图名匹配为一个特定的视图实现。
既然DispatcherServlet已经知道由哪个视图渲染结果,那请求的任务基本上也就完成了。它的最后一站是视图的实现(可能是JSP) ,在这里它交付模型数据。请求的任务就完成了。视图将使用模型数据渲染输出,这个输出会通过响应对象传递给客户端(不会像
听上去那样硬编码) 。
- 将 DispatcherServlet 配置在 Servlet 容器中而不再使用 web.xml
只要继承了AbstractAnnotationConfigDispatcherServletInitializer类并实现了相关方法即可实现注册一个DispatcherServlet类。
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
// TODO Auto-generated method stub
return new Class<?>[] {RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
// TODO Auto-generated method stub
return new Class<?>[] {WebConfig.class};
}
//将DispatcherServlet 映射到"/"
@Override
protected String[] getServletMappings() {
// TODO Auto-generated method stub
return new String[]{"/"};
}
}
2.定义RootConfig类
/**
*
* @author mm
* <p>相当于 applicationcontext.xml</p>
*/
@Configuration
@ComponentScan(basePackages= {"cn.mm.test"},
excludeFilters= {
@Filter(type=FilterType.ANNOTATION,value=EnableWebMvc.class)
})
public class RootConfig {
}
3.定义WebConfig类
/**
*
* @author mm
* <p> 这个类的配置相当于 springmvc-servlet.xml </p>
*/
@Configuration
@EnableWebMvc //启用Spring MVC
@ComponentScan("cn.mm.test.controller")
public class WebConfig extends WebMvcConfigurerAdapter{
//配置JSP视图解析器
@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();
}
}