Spring Boot Web 開發註解篇

本文提綱
1. spring-boot-starter-web 依賴概述
1.1 spring-boot-starter-web 職責
1.2 spring-boot-starter-web 依賴關係
2. Spring MVC on Spring Boot
2.1 Spring MVC 體系溫故知新
2.2 重要的類
2.3 Spring Boot MVC
2.3.1 控制器
2.3.2 數據綁定
2.3.3 視圖和視圖解析

1、spring-boot-starter-web 依賴概述

在 Spring Boot 快速入門中,只要在 pom.xml 加入了 spring-boot-starter-web 依賴,便可快速開發 web 應用。可見,Spring Boot 極大地簡化了 Spring 應用從搭建到開發的過程,作到了「開箱即用」的方式。Spring Boot 已經提供不少「開箱即用」的依賴,如上面開發 web 應用使用的 spring-boot-starter-web ,都是以 spring-boot-starter-xx 進行命名的。
Spring Boot 「開箱即用」 的設計,對開發者很是便利。簡單來講,只要往 Spring Boot 項目加入相應的 spring-boot-starter-xx 依賴,就可使用對應依賴的功能,好比加入 spring-boot-starter-data-jpa 依賴,就可使用數據持久層框架 Spring Data JPA 操做數據源。相比 Spring 之前須要大量的XML配置以及複雜的依賴管理,極大的減小了開發工做量和學習成本。 
當開發一個特定類型的應用程序時,特定的 Starter 提供所需的依賴關係,而且將對應的 Bean 註冊到 Spring 容器中。spring-boot-starter-web 依賴就是提供開發 Web 應用的。

1.1 spring-boot-starter-web 職責

spring-boot-starter-web 是一個用於構建 Web 的 Starter ,包括構建 RESTful 服務應用、Spring MVC 應用等。而且不須要額外配置容器,默認使用 Tomcat 做爲嵌入式容器。

1.2 spring-boot-starter-web 依賴關係

spring-boot-starter-web 這麼強大,它的組成以下表:
spring-boot-starter  核心包,包括了自動化配置支持、日誌、YAML 文件解析的支持等。
spring-boot-starter-json 讀寫 JSON 包
spring-boot-starter-tomcat Tomcat 嵌入式 Servlet 容器包
hibernate-validator Hibernate 框架提供的驗證包
spring-web Spring 框架的 Web 包
spring-webmvc Spring 框架的 Web MVC 包
 
spring-boot-starter-web 包含了 Tomcat 和 Spring MVC ,那啓動流程是這樣的。 標識 @SpringBootApplication 的應用,初始化通過 spring-boot-starter  核心包中的自動化配置,構建了 Spring 容器,並經過 Tomcat 啓動 Web 應用。不少 Starters 只支持 Spring MVC,通常會將 spring-boot-starter-web 依賴加入到應用的 Classpath。
另外,spring-boot-starter-web 默認使用 Tomcat 做爲嵌入式 Servlet 容器,在 pom.xml 配置 spring-boot-starter-jetty 和 spring-boot-starter-undertow 就能夠替換默認容器。

2、Spring MVC on Spring Boot

Spring MVC 是 Spring Web 重要的模塊。內容包括 MVC 模式的實現和 RESTful 服務的支持。
2.1 Spring MVC 體系溫故知新
spring-webmvc 模塊裏面包:
- org.springframework.web.servlet 提供與應用程序上下文基礎結構集成的 Servlet,以及 Spring web MVC 框架的核心接口和類。
- org.springframework.web.servlet.mvc Spring 附帶的 Servlet MVC 框架的標準控制器實現。
- org.springframework.web.servlet.mvc.annotation 用於基於註解的 Servlet MVC 控制器的支持包。
- org.springframework.web.servlet.mvc.condition 用於根據條件匹配傳入請求的公共 MVC 邏輯。
- org.springframework.web.servlet.mvc.method 用於處理程序方法處理的基於 Servlet 的基礎結構,基於在 org.springframework.web.method 包上。
- org.springframework.web.servlet.view 提供標準的 View 和 ViewResolver 實現,包括自定義實現的抽象基類。
- org.springframework.web.servlet.view.freemarker 支持將 FreeMarker 集成爲 Spring Web 視圖技術的類。
- org.springframework.web.servlet.view.json 支持提供基於 JSON 序列化的 View 實現的類。

上面列出來核心的包。org.springframework.web.servlet.view 包中, View 視圖實現有常見的:JSON 、FreeMarker 等。org.springframework.web.servlet.mvc 包中,Controller 控制層實現包括了註解、程序方法處理等封裝。天然,看源碼先從 org.springframework.web.servlet 包看其核心的接口和類。javascript

2.2 重要的類

DispatcherServlet 類:調度 HTTP 請求控制器(或者處理器 Handler)。
View 視圖層 ModelAndView 類:模型和視圖的持有者。
View 接口:MVC WEB 交互。該接口的實現負責呈現視圖或者暴露模型。
Controller 控制層 HandlerMapping 接口: 請求從 DispacherServlet 過來,該接口定義請求和處理程序對象之間的映射。
HandlerInterceptor 接口:處理程序的執行連接口。
 
Spring MVC 框架模型

2.3 Spring Boot MVC

之前 Spring MVC 開發模式是這樣的:
1. 在 web.xml 配置 DispatcherServlet,用於截獲並處理全部請求
2. 在 Spring MVC 配置文件中,聲明預約義的控制器和視圖解析器等
3. 編寫預約義的處理請求控制器
4. 編寫預約義的視圖對象,好比 JSP、Freemarker 等

在 Spring Boot MVC 中,Web 自動化配置會幫你減小上面的兩個步驟。默認使用的視圖是 ThymeLeaf,在下面小節會具體講css

1. 編寫預約義的處理請求控制器
2. 編寫默認 ThymeLeaf 視圖對象
 
例以下面會展現用戶列表案例:
第一步:處理用戶請求控制器
UserController.java
/**
 * 用戶控制層
 *
 * Created by bysocket on 24/07/2017.
 */
@Controller
@RequestMapping(value = "/users")     // 經過這裏配置使下面的映射都在 /users
public class UserController {
 
    @Autowired
    UserService userService;          // 用戶服務層
 
    /**
     *  獲取用戶列表
     *    處理 "/users" 的GET請求,用來獲取用戶列表
     *    經過 @RequestParam 傳遞參數,進一步實現條件查詢或者分頁查詢
     */
    @RequestMapping(method = RequestMethod.GET)
    public String getUserList(ModelMap map) {
        map.addAttribute("userList", userService.findAll());
        return "userList";
    }
}
 @Controller 註解在 UserController 類上,標識其爲一個可接收 HTTP 請求的控制器
@RequestMapping(value = "/users") 註解 ,標識 UserController 類下全部接收的請求路由都是 /users 開頭的。注意:類上的 @RequestMapping 註解是沒必要需的
@RequestMapping(method = RequestMethod.GET) 註解,標識該 getUserList(ModelMap map) 方法會接收並處理 /users 請求,且請求方法是 GET
getUserList(ModelMap map) 方法返回的字符串 userList ,表明着是視圖,會有視圖解析器解析成爲一個具體的視圖對象,而後通過視圖渲染展現到瀏覽器

第二步:用戶列表 ThymeLeaf 視圖對象html

<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <script type="text/javascript" th:src="@{https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js}"></script>
        <link th:href="@{https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css}" rel="stylesheet"/>
        <link th:href="@{/css/default.css}" rel="stylesheet"/>
        <link rel="icon" th:href="@{/images/favicon.ico}" type="image/x-icon"/>
        <meta charset="UTF-8"/>
        <title>用戶列表</title>
    </head>
 
    <body>
 
        <div class="contentDiv">
 
            <h5> 《 Spring Boot 2.x 核心技術實戰》第二章快速入門案例</h5>
 
            <table class="table table-hover table-condensed">
                <legend>
                    <strong>用戶列表</strong>
                </legend>
                <thead>
                    <tr>
                        <th>用戶編號</th>
                        <th>名稱</th>
                        <th>年齡</th>
                        <th>出生時間</th>
                        <th>管理</th>
                    </tr>
                </thead>
                <tbody>
                    <tr th:each="user : ${userList}">
                        <th scope="row" th:text="${user.id}"></th>
                        <td><a th:href="@{/users/update/{userId}(userId=${user.id})}" th:text="${user.name}"></a></td>
                        <td th:text="${user.age}"></td>
                        <td th:text="${user.birthday}"></td>
                        <td><a class="btn btn-danger" th:href="@{/users/delete/{userId}(userId=${user.id})}">刪除</a></td>
                    </tr>
                </tbody>
            </table>
 
            <div><a class="btn btn-primary" href="/users/create" role="button">建立用戶</a></div>
        </div>
 
    </body>
</html>
一個 table 展現用戶列表,引入了 jquery.min.js 和 bootstrap.min.css ,更好的展現頁面效果。具體 ThymeLeaf 語法下面會講到。

2.3.1 控制器

什麼是控制器?控制器就是控制請求接收和負責響應到視圖的角色。
@Controller 註解標識一個類做爲控制器。DispatcherServlet 會掃描全部控制器類,並檢測 @RequestMapping 註解配置的方法。Web 自動化配置已經處理完這一步驟。

@RequestMapping 註解標識請求 URL 信息,能夠映射到整個類或某個特定的方法上。該註解能夠代表請求須要的。java

使用 value 指定特定的 URL ,好比 @RequestMapping(value = "/users」) 和 @RequestMapping(value = "/users/create」) 等
使用 method 指定 HTTP 請求方法,好比 RequestMethod.GET 等
還有使用其餘特定的參數條件,能夠設置 consumes 指定請求時的請求頭須要包含的 Content-Type 值、設置 produces 可確保響應的內容類型

MVC on REST ful 場景jquery

在 HTTP over JSON (天然 JSON、XML或其餘自定義的媒體類型內容等都可)場景,配合上先後端分離的開發模式,咱們常常會用 @ResponseBody 或 @RestController 兩種方式實現 RESTful HTTP API 。
老方式:
@ResponseBody 註解標識該方法的返回值。這樣被標註的方法返回值,會直接寫入 HTTP 響應體(而不會被視圖解析器認爲是一個視圖對象)。
新方式:
@RestController 註解,和 @Controller 用法一致,整合了 @Controller 和 @ResponseBody 功能。這樣不須要每一個 @RequestMapping 方法上都加上 @ResponseBody 註解,這樣代碼更簡明。
使代碼更簡明,還有經常使用便捷註解 @GetMapping、@PostMapping 和 @PutMapping 等
HTTP 協議相關知識回顧,能夠看看我之前的博文《圖解 HTTP 協議》 http://www.bysocket.com/?p=282

2.3.2 數據綁定

數據綁定,簡單的說就是 Spring MVC 從請求中獲取請求入參,賦予給處理方法相應的入參。主要流程以下:
1. DataBinder 接受帶有請求入參的 ServletRequest 對象
2. 調用 ConversionService 組件,進行數據類型轉換、數據格式化等工做
3. 而後調用 Validator 組件,進行數據校驗等工做
4. 綁定結果到 BindingResult 對象
5. 最後賦予給處理方法相應的入參

@ModelAttribute 註解添加一個或多個屬性(類對象)到 model 上。例如git

    @RequestMapping(value = "/create", method = RequestMethod.POST)
    public String postUser(@ModelAttribute User user)

@PathVariable 註解經過變量名匹配到 URI 模板中相對應的變量。例如github

    @RequestMapping(value = "/update/{id}", method = RequestMethod.GET)
    public String getUser(@PathVariable("id") Long id, ModelMap map)
@RequestParam 註解將請求參數綁定到方法參數。
@RequestHeader 註解將請求頭屬性綁定到方法參數。

2.3.3 視圖和視圖解析

視圖的職責就是渲染模型數據,將模型裏面的數據展現給用戶。
請求到通過處理方法處理後,最終返回的是 ModeAndView 。能夠從 Spring MVC 框架模型 看出,最終通過 ViewResolver 視頻解析器獲得視圖對象 View。多是咱們常見的 JSP ,也多是基於 ThymLeaf 、FreeMarker 或 Velocity 模板引擎視圖,固然還有多是 JSON 、XML 或者 PDF 等各類形式。
業界流行的模板引擎有以下的 Starters 支持:
spring-boot-starter-thymeleaf Thymeleaf 模板視圖依賴,官方推薦
spring-boot-starter-freemarker Freemarker 模板視圖依賴
spring-boot-starter-groovy-templates Groovy 模板視圖依賴
spring-boot-starter-mustache Mustache 模板視圖依賴
具體,spring-boot-starter-thymeleaf 使用案例在 GitHub : https://github.com/JeffLi1993/spring-boot-core-book-demo 的 chapter-2-spring-boot-quick-start 工程。

3、小結

本文主要介紹了 Spring Boot 在 Web 開發中涉及到的 HTTP 協議,還有一些 Spring MVC 相關的知識。
推薦:
資料:
相關文章
相關標籤/搜索