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";
}
}
Postman
没有提供TRACE
方法的请求类型选项,但该方法和上面的方法是类似的,是没问题的,这里就不演示了。Spring Boot
处理HTTP
请求就介绍到这里,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。