最近看了spring mvc的工作流程,怕忘,所以要记录一下。
- 首先客户端提交请求,请求包含URL以及可能的内容信息。这些将会被传递给DispatcherServlet。Spring MVC的所有请求都会通过DispatcherServlet。它将请求委托给应用程序的其他组件来执行实际的处理。
- DispatcherServlet需要将请求发给控制器(Controller),DispatcherServlet通过URL来查询处理器映射(Handler Mapping),然后就知道要发送给哪个控制器。
- 选择合适的控制器后,DispatcherServlet会将请求发送给选中的控制器。
- 请求到达控制器后,会卸下其负载(用户提交的信息),并等待控制器处理这些信息。控制器通常会把信息交给一个或多个服务(service)来完成具体工作。控制器完成工作后,会返回一个Model以及一个View的逻辑名称。最后会将ModelAndView发送回DispatcherServlet。
- DispatcherServlet把逻辑视图名称发送给视图解析器(View Resolver),后者会根据配置的规则,通过逻辑视图名称来确认真实的视图。
- DispatcherServlet 确认真实视图后,会把Model丢入真实的视图中,通过视图渲染给客户端。
注:Model是一个Map(key-value)的集合。可以作为请求方法的参数。这样,该方法就能将处理的结果添加到model中。如果model.addAttribute不指定key类型,那么会根据返回的结果类型进行推定判定。
如:返回结果是个List<User>,那么model中key的判定结果就是userList。
同理:如果不显示的指明返回的view逻辑名称,同样会根据返回类型进行推定。
如:返回结果是个List<User>,那么视图的逻辑名称判定就是:“userList”。
DispatcherServlet 是整个SpringMVC的核心。第一步就要学会配置DispatcherServlet。有两种方式配置它:
1.DispatcherServlet 被配置在web.xml文件中,并被打包进应用的war包。
- 使用Java将DispatcherServlet 配置在Servlet容器中。
servlet容器:
servlet容器是通过实现了javax.servlet.ServletContainerInitializer接口的类来完成配置的。
Spring 提供了这个接口的实现,名字叫做SpringServletContainerInitializer,这个类(SpringServletContainerInitializer)又依赖于实现了WebApplicationInitializer接口的类,后者会负责完成创建配置的任务。
Spring 3.2 引入了WebApplicationInitializer的实现,名字叫做AbstractAnnotationConfigDispatcherServletInitializer,所以,它最终负责具体的配置任务。
新建一个类,扩展AbstractAnnotationConfigDispatcherServletInitializer,就等于实现了WebApplicationInitializer接口。因此当它部署到Servlet 3.0 容器中时,容器会自动发现它,并用它来配置Servlet 上下文。
配置Servlet说明:
任何继承(扩展)了AbstractAnnotationConfigDispatcherServletInitializer的类,会自动配置DispatcherServlet和 ContextLoaderListener。
DispatcherServlet启动时,会创建SpringApplicationContext,并加载配置类(文件)中所声明的Bean。如Handler Mapping,Controller,以及ViewResolver等。
然而,Spring Web程序还有一个应用上下文,是由ContextLoaderListener创建的,它负责创建驱动应用后端的中间层和数据库组件。
因此,AbstractAnnotationConfigDispatcherServletInitializer的扩展类需要overwrite两个方法,来完成这2个不同应用上下文的创建:
//中间层和数据库组件
@Nullable
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] {RootConfig.class};
}
//指定配置类,Handler Mapping,Controller,以及ViewResolver等
@Nullable
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] {WebConfig.class};
}
RootConfig和WebConfig都是具有@Configuration注解的类。
启动Spring MVC
通过配置一个带有@EnableWebMvc注解的类,来完成启动。
之后,完成配置视图解析器、
启用组件扫描(类上添加@ComponentScan("包路径"))、
设置静态资源等操作。
这一切,如果放在上面的WebConfig.class里,就再好不过了。
一个最简单的Spring MVC的框架就搭建完成了。