Spring 实战 Web 一: Spring MVC

2018-08-21  本文已影响0人  DJN_

Spring MVC 请求流程

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


Image_112.png
  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 时,会同时创建两个上下文。


image.png

启用 Spring MVC

  1. 使用 xml 进行配置时可通过 <mvc:annotation-driven> 启用注解驱动的 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<HttpMessageConverter<?>> converters) {
    }

}

使用 Thymeleaf

使用 Thymeleaf 前需要做的配置:

  1. ThymeleafViewResolver 将逻辑视图名转为 Thymeleaf 模板视图名
  2. SpringTemplateEngine 处理模板并渲染结果
  3. TemplateResolver 加载 Thymeleaf 模板
image.png

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

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

</head>
<body>

<!--Not allowed to load local resource chrome 安全考虑,安装插件可解决-->
<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>
上一篇下一篇

猜你喜欢

热点阅读