Spring Boot
非常适合
Web
應用程式開發,可以使用嵌入式
Tomcat
、
Jetty
、
Undertow
或
Netty
建立一個
HTTP
伺服器,大多數
Servlet Web
應用程式使用
spring-boot-starter-web
子產品來快速啟動和運作,還可以選擇使用
spring-boot-starter-webflux
子產品建構響應式(
Reactive
)
Web
應用程式。
Spring Web MVC
架構(通常稱為
Spring MVC
)是一個豐富的模型(
Model
)、視圖(
View
)、控制器(
Controller
)
Web
架構,
Spring MVC
允許建立特殊的
Bean
(控制器,使用
@Controller
或
@RestControllerbean
注解的類)來處理傳入的
HTTP
請求,控制器中的方法通過使用
@RequestMapping
注解映射到對應的
HTTP
請求。
Servlet Web子產品
spring-boot-starter-web
子產品依賴
spring-web
子產品和
spring-webmvc
子產品。
-
提供了核心的Spring Web
內建,包括一些友善的HTTP
過濾器、Servlet
調用程式、與其他Spring HTTP
架構和Web
技術(如HTTP
、Hessian
)內建的基礎結構。Burlap
-
是Spring Web MVC
的一個實作,Spring MVC
依賴于Spring Web MVC
。如果不使用Spring Web
,但需要使用Spring MVC
支援的其他與Spring
相關的技術,那麼應該依賴Web
。Spring Web
spring-web
子產品提供了大多數處理
HTTP
請求的注解。
spring-context
子產品提供了
Controller
注解。
HTTP
請求方法的
Java
枚舉類
RequestMethod
,旨在與
RequestMapping
注解的
method
屬性一起使用。
package org.springframework.web.bind.annotation;
public enum RequestMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}
示範代碼
pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
</parent>
<packaging>jar</packaging>
<groupId>com.kaven</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot</name>
<description>springboot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
啟動類:
package com.kaven.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(SpringbootApplication.class);
application.run(args);
}
}
GET
package com.kaven.springboot.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HTTPMethodController {
@RequestMapping(path = "/get1", method = RequestMethod.GET)
public String get1() {
return "GET1";
}
@GetMapping(path = "/get2")
public String get2() {
return "GET2";
}
}
@RequestMapping(path = "/get1", method = RequestMethod.GET)
和
@GetMapping(path = "/get2")
是一樣的效果,都是在控制器中定義一個處理
GET
請求的方法,隻是處理請求的路徑不同而已。啟動應用,使用
Postman
進行測試:
POST
package com.kaven.springboot.controller;
import org.springframework.web.bind.annotation.*;
@RestController
public class HTTPMethodController {
@RequestMapping(path = "/post1", method = RequestMethod.POST)
public String post1() {
return "POST1";
}
@PostMapping(path = "/post2")
public String post2() {
return "POST2";
}
}
DELETE
package com.kaven.springboot.controller;
import org.springframework.web.bind.annotation.*;
@RestController
public class HTTPMethodController {
@RequestMapping(path = "/delete1", method = RequestMethod.DELETE)
public String delete1() {
return "DELETE1";
}
@DeleteMapping(path = "/delete2")
public String delete2() {
return "DELETE2";
}
}
PUT
package com.kaven.springboot.controller;
import org.springframework.web.bind.annotation.*;
@RestController
public class HTTPMethodController {
@RequestMapping(path = "/put1", method = RequestMethod.PUT)
public String put1() {
return "PUT1";
}
@PutMapping(path = "/put2")
public String put2() {
return "PUT2";
}
}
PATCH
package com.kaven.springboot.controller;
import org.springframework.web.bind.annotation.*;
@RestController
public class HTTPMethodController {
@RequestMapping(path = "/patch1", method = RequestMethod.PATCH)
public String patch1() {
return "PATCH1";
}
@PatchMapping(path = "/patch2")
public String patch2() {
return "PATCH2";
}
}
HEAD
HEAD
請求類似于
GET
請求,隻不過傳回的響應中沒有具體的内容,用于擷取請求頭。
package com.kaven.springboot.controller;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
public class HTTPMethodController {
@RequestMapping(path = "/head1", method = RequestMethod.HEAD)
public String head1(@RequestHeader Map<String, String> header) {
StringBuilder builder = new StringBuilder();
for(Map.Entry entry : header.entrySet()) {
builder.append(entry.getKey() + " : " + entry.getValue() + "\n");
}
builder.append("head1\n");
System.out.println(builder);
return builder.toString();
}
@GetMapping(path = "/head2")
public String head2(@RequestHeader Map<String, String> header) {
StringBuilder builder = new StringBuilder();
for(Map.Entry entry : header.entrySet()) {
builder.append(entry.getKey() + " : " + entry.getValue() + "\n");
}
builder.append("head2\n");
System.out.println(builder);
return builder.toString();
}
}
雖然傳回了字元串,但用戶端接收到的還是空的響應。
OPTIONS
package com.kaven.springboot.controller;
import org.springframework.web.bind.annotation.*;
@RestController
public class HTTPMethodController {
@RequestMapping(path = "/options1", method = RequestMethod.OPTIONS)
public String options1() {
return "OPTIONS1";
}
}
TRACE
package com.kaven.springboot.controller;
import org.springframework.web.bind.annotation.*;
@RestController
public class HTTPMethodController {
@RequestMapping(path = "/trace1", method = RequestMethod.TRACE)
public String trace1() {
return "TRACE1";
}
}