一、Spring MVC执行原理和基于Java配置的配置过程
(一)Spring MVC执行过程,大致为7步。
- 所有的请求都会经过Spring的一个单例的DispacherServlet。
- DispatcherServlet会查询一个或多个处理器映射,找到请求的URL所对应的控制器。
- 把请求的内容传递给控制器后等待控制器处理这些内容。
- 控制器在逻辑处理后会产生一些数据(例如查询所有的用户信息),这些数据存在在模型(Model)中,同时返回一个视图名用作渲染数据。
- DispacherServlet找到视图解析器,视图解析器通过视图名找到真正的视图实现。
- DispacherServlet找到视图实现后再把模型(Model)的数据渲染到视图中。
- 把最终的视图通过响应对象传递给客户端
(二)搭建Spring MVC
- 配置DispacherServletServlet
DispatcherServlet是SpringMVC的核心,所有请求通过它来接触到框架,它又把请求转发到其他的组件。
按照传统的方式,Servlet需要配置在web.xml的文件中。但是,在Servlet3和Spring3.1之后,又提供了另外一种依据Java类配置的方式。我们先看看这种方式的代码是什么样的。
public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
System.out.println("用来加载spring管理的中间层和数据层组件,下面会给出具体代码");
return new Class[]{RootConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
System.out.println("用来加载web相关的组件,如控制器、视图解析器等,下面会给出具体代码");
return new Class[]{WebConfig.class};
}
protected String[] getServletMappings() {
System.out.println("如果映射是/,代表DispacherServlet是默认的Servlet");
return new String[]{"/"};
}
}
“SpittrWebAppInitializer”是我们自定义的类名,它继承了AbstractAnnotationConfigDispatcherServletInitializer并且实现了三个方法,下图解释了为什么需要继承这个类,以及为什么继承了这个类后,请求就能自动的转到DispacherServlet来处理。
- 启用SpringMVC
当配置完DispacherServlet后,还需要启用SpringMVC组件。
如果使用XML启动,可以使用<mvc:annotation-driven>。
当基于Java配置时,需要在配置类上添加@EnableWebMvc注解:
但是如果只添加一个注解的话,会出现下面的问题:
(1)没有配置视图解析器,Spring会使用BeanNameView-Resolver,这个视图解析器会查找ID与视图名相同的Bean,并且这个Bean需要实现View接口,通过这种方式来解析视图。
(2)没有启动组件扫描。Spring只能使用显式配置的控制器
(3)DispacherServlet会映射为应用默认Servlet,会处理所有请求,包括静态资源,如图片和样式表。
下面是一个更完整的Config,解决了上面的问题。
除了WebConfig还有一个RootConfig,由于现在只关注web,RootConfig很简单: