Spring MVC工作流程及简单搭建

  1. 首先客户端提交请求,请求包含URL以及可能的内容信息。这些将会被传递给DispatcherServlet。Spring MVC的所有请求都会通过DispatcherServlet。它将请求委托给应用程序的其他组件来执行实际的处理。
  2. DispatcherServlet需要将请求发给控制器(Controller),DispatcherServlet通过URL来查询处理器映射(Handler Mapping),然后就知道要发送给哪个控制器。
  3. 选择合适的控制器后,DispatcherServlet会将请求发送给选中的控制器。
  4. 请求到达控制器后,会卸下其负载(用户提交的信息),并等待控制器处理这些信息。控制器通常会把信息交给一个或多个服务(service)来完成具体工作。控制器完成工作后,会返回一个Model以及一个View的逻辑名称。最后会将ModelAndView发送回DispatcherServlet。
  5. DispatcherServlet把逻辑视图名称发送给视图解析器(View Resolver),后者会根据配置的规则,通过逻辑视图名称来确认真实的视图。
  6. 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包。

  1. 使用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的框架就搭建完成了。

猜你喜欢

转载自blog.csdn.net/weixin_43770982/article/details/89095649
今日推荐