1. 程式人生 > >Spring 實戰 Web 一: Spring MVC

Spring 實戰 Web 一: Spring MVC

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 進行配置時可通過 啟用註解驅動的 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>