Spring 实战 Web 一: Spring MVC

Spring MVC 请求流程

Spring 将请求在调度 Servlet、处理器映射、控制器以及视图解析器之间移动。
请求从离开浏览器到获取响应返回会经历好多站点,如下图展示了使用 Spring MVC 时经历的所有站点。

  1. DsipatcherServlet
    Spring MVC 的所有请求都会通过一个前端请求控制器 Servlet 来映射需要交给 Spring MVC 进行处理的请求,并处理整个请求并获得响应。

  2. 控制器、处理器映射
    前端控制器会将请求发送给 Spring MVC 控制器(Controller),DispatcherServlet 会通过查询一个或多个处理器映射(handler mapping)来确定具体的控制器及处理器。

  3. 处理器进行逻辑处理(业务)
    处理器进行业务逻辑处理,通常会产生模型(model),通常还需要将模型对应到一个视图(view),控制器所做的最后一件事就是将模型数据打包,将模型和视图信息发送回 DispatcherServlet,这样,控制器就不会与具体的视图耦合。

  4. 视图解析器解析和渲染 ModelAndView
    DispatcherServlet 已经知道应该由哪个视图(view)来渲染数据(model),不过还需要通过视图解析器(view resolver)来找到具体的视图实现。

两个应用上下文

搭建 Spring MVC 有两种方式,在 web.xml 中进行配置,或 Java 中继承 AbstractAnnotationConfigDispatcherServletInitializer。

  1. 当 DsipatcherServlet 启动时,它会创建 Spring 应用上下文,并加载配置文件或配置类中声明的 bean。
  2. 但在 Spring 中通常还有另外一个上下文,该上下文由 ContextLoaderListener 创建。

我们期望 DispatcherServlet 加载包含 web 组件的 bean,如控制器、视图解析器以及处理器映射,而 ContextLoaderListener 加载其他的 bean,这些 bean 通常是驱动后端的中间层和数据层组件。

使用 AbstractAnnotationConfigDispatcherServletInitializer(Servlet 3.0) 使用 Spring MVC 时,会同时创建两个上下文。

启用 Spring MVC

  1. 使用 xml 进行配置时可通过 启用注解驱动的 Spring MVC
  2. 基于 java 进行配置时使用 @EnableWebMvc 注解进行启用,通过继承 WebMvcConfigurerAdapter 来进行一些初始配置(否则将使用默认的配置),如视图解析器、静态资源处理
@Configuration // 定义 DispatcherServlet 应用上下文中的 bean
@EnableWebMvc // 启用 spring mvc
@ComponentScan("com.duan.springmvcdemo") // 启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable(); // 静态资源处理
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
    }

    @Override
    public void configureMessageConverters(List> converters) {
    }

}

使用 Thymeleaf

使用 Thymeleaf 前需要做的配置:
1. ThymeleafViewResolver 将逻辑视图名转为 Thymeleaf 模板视图名
2. SpringTemplateEngine 处理模板并渲染结果
3. TemplateResolver 加载 Thymeleaf 模板

使用 xml 中声明 bean 的方式也可完成。
Thymeleaf 便签对应到标准的 HTML 属性(th:xxx),并且能够直接加载到浏览器中进行查看(区别于 JSP)。


<html xmlns:th="http://www.thymeleaf.org" lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>HOMEtitle>
    <link rel="stylesheet"
          type="text/css"
          th:href="@{/resources/style.css}">

head>
<body>


<img th:src="${spitterAvatar}">

<form method="post" enctype="multipart/form-data" action="/spitter/doRegister">
    <label>
        Profile Picture
    label>
    <input type="file" name="profilePicture" accept="image/jpeg,image/png,image/gif"><br>

    <input type="submit" value="提交">
form>

body>
html>

你可能感兴趣的:(Spring,Web)