传统的Servlet编程模型开发Web应用的架构
本章节不再讲解如何运用XML配置文件如何开发,因为XML配置文件没有通过Java配置以及注解简便。
本文档的这部分内容涵盖了对使用Servlet API构建并部署到Servlet容器的Servlet-stack Web应用程序的支持。
各个章节包括Spring MVC、视图技术、CORS支持和WebSocket支持。
Spring MVC
Spring Web MVC
是基于Servlet API
构建的原始Web框架,从一开始就包含在Spring框架中。
与许多其他web框架一样,Spring MVC是围绕前端控制器模式设计的,在这种模式中,中心Servlet DispatcherServlet为请求处理提供共享算法,而实际工作则由可配置的委托组件执行。
Spring MVC,前端和后端的交互流程
1.客户端发送HTTP请求:发送HTTP请求,请求可以是GET、POST、PUT、DELETE等不同的方法。
2.DispatcherServlet接收请求:在Spring MVC中,DispatcherServlet是前端请求的入口点。它接收到所有的HTTP请求,并将其分派给适当的处理程序。
3.HandlerMapping选择处理程序:DispatcherServlet通过HandlerMapping将请求映射到具体的处理程序(也称为控制器)。HandlerMapping根据请求的URL或其他条件确定要执行的处理程序。
4.处理程序处理请求:处理程序是实际处理请求的组件,它可以是一个带有@RequestMapping注解的Java类或方法。处理程序根据请求的类型和参数执行相应的业务逻辑,并返回一个ModelAndView对象。
5.处理程序返回ModelAndView:处理程序执行完业务逻辑后,将结果封装在一个ModelAndView对象中。ModelAndView包含了处理结果的数据和视图的名称。
视图解析器解析视图:DispatcherServlet使用视图解析器将视图的逻辑名称解析为实际的视图对象。视图解析器可以根据配置文件或其他规则将逻辑视图名称解析为JSP、Thymeleaf、Freemarker等不同类型的视图。
视图渲染:视图渲染是将模型数据填充到视图中的过程。视图根据模型中的数据生成最终的HTML、XML或其他响应内容。
DispatcherServlet返回响应:视图渲染完成后,DispatcherServlet将最终的响应返回给客户端。响应可以是HTML页面、JSON数据、XML文档等不同的格式。
以上就是Spring MVC中前端和后端交互的整个流程。通过这个流程,前端和后端可以进行数据交互和业务处理,实现动态的Web应用程序。
DispatcherServlet
DispatcherServlet的工作流程:
客户端发送HTTP请求到服务器。 请求被服务器接收后,会将请求发送给DispatcherServlet。 DispatcherServlet是一个Servlet,由Servlet容器(如Tomcat)负责调用其service()方法。
在service()方法中,DispatcherServlet首先会通过HandlerMapping来确定请求应该由哪个处理程序(Handler)进行处理。 HandlerMapping是Spring
MVC框架中的组件之一,负责将请求映射到相应的处理程序。它根据一定的规则(如URL路径、请求参数等)来确定映射关系。 一旦确定了处理程序,DispatcherServlet会将请求传递给该处理程序。
处理程序是开发人员编写的具体业务逻辑代码,可以是一个Controller类或一个方法。 处理程序对请求进行处理,并返回一个ModelAndView对象,其中包含了处理结果和视图信息。
DispatcherServlet将ModelAndView对象传递给ViewResolver。 ViewResolver是Spring MVC框架中的另一个组件,负责将逻辑视图名解析为具体的视图对象。
ViewResolver根据配置的视图解析策略,将逻辑视图名解析为一个View对象。 View对象负责将处理结果渲染成HTML、JSON等格式,并返回给客户端。
DispatcherServlet将渲染后的结果返回给客户端,完成整个请求-响应周期。
- DispatcherServlet
- 充当前端控制器角色
- 主要职责包括:
- 接收客户端的HTTP请求,并将请求转发给适当的处理器(Controller)进行处理。
- 负责请求的解析,包括解析请求的URL、请求参数、请求头等。
- 根据请求的URL或者其他规则,选择合适的处理器来处理请求。
- 调用处理器的方法来处理请求,并将处理结果返回。
- 负责视图的解析和渲染,将处理结果转发给合适的视图进行展示。
- 处理异常情况,例如处理器方法抛出异常时的异常处理。
DispatcherServlet的主要职责包括:
接收客户端的HTTP请求,并将请求转发给适当的处理器(Controller)进行处理。
DispatcherServlet的主要职责包括:
接收客户端的HTTP请求,并将请求转发给适当的处理器(Controller)进行处理。 负责请求的解析,包括解析请求的URL、请求参数、请求头等。 根据请求的URL或者其他规则,选择合适的处理器来处理请求。
调用处理器的方法来处理请求,并将处理结果返回。 负责视图的解析和渲染,将处理结果转发给合适的视图进行展示。 处理异常情况,例如处理器方法抛出异常时的异常处理。
DispatcherServlet是Spring MVC框架的核心组件之一,它通过配置文件或者注解的方式进行配置,并与其他组件(如处理器适配器、视图解析器、处理器映射器等)协同工作,提供灵活、可定制的请求处理机制。
DispatcherServlet和其他Servlet一样,需要根据Servlet规范使用Java配置或在web.xml中进行声明和映射。
而DispatcherServlet则使用Spring配置来找到它需要的委托组件,如请求映射、视图解析、异常处理等。
以下 Java 配置示例注册并初始化DispatcherServlet,它由 Servlet 容器自动检测(请参阅Servlet Config):
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
// 加载Spring web应用程序配置
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
// 创建并注册DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(context);
ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/app/*");
}
}
/*这段代码是一个Web应用程序初始化器。它实现了WebApplicationInitializer接口,并重写了onStartup方法。
在onStartup方法中,首先创建了一个AnnotationConfigWebApplicationContext对象,用于加载Spring Web应用程序的配置。然后,通过调用context.register(AppConfig.class)来注册AppConfig类,该类是一个包含Spring配置的Java类。
接下来,创建了一个DispatcherServlet对象,并将之前创建的AnnotationConfigWebApplicationContext对象作为参数传入。然后,通过调用servletContext.addServlet()方法将DispatcherServlet注册到ServletContext中,并设置其在启动时加载,并将请求映射到"/app/*"路径。
这段代码的作用是在Web应用程序启动时,加载Spring配置并创建DispatcherServlet,并将其注册到ServletContext中,以便处理来自"/app/*"路径的请求。*/
笔记
Spring Boot遵循不同的初始化顺序。
Spring Boot没有挂接在Servlet容器的生命周期中,而是使用Spring configuration来引导自身和嵌入式Servlet容器。
在Spring配置中检测到过滤器和Servlet声明,并将其注册到Servlet容器。要了解更多细节,请参阅Spring Boot文档(http://spring Boot documentation)。
Context层次结构
DispatcherServlet需要一个WebApplicationContext用于它自己的配置。
WebApplicationContext有一个指向ServletContext及其关联的Servlet的链接。
它还绑定到ServletContext,如果它们需要访问它,应用程序可以使用RequestContextUtils上的静态方法来查找WebApplicationContext。
针对图片内容的解释:
Root Web ApplicationContext是整个Web应用程序的根上下文,它通常包含全局的共享bean,如数据访问对象和业务服务。
它与整个应用程序相关联,可以被多个Servlet Web ApplicationContext共享。
Servlet Web ApplicationContext是与特定Servlet相关联的上下文,它包含与该Servlet紧密相关的bean。
每个Servlet都有自己的Servlet Web ApplicationContext,它是Root Web ApplicationContext的子级。
Servlet Web ApplicationContext可以覆盖(重新声明)Root Web ApplicationContext中的bean,以满足特定Servlet的需求。
通过Root Web ApplicationContext和Servlet Web ApplicationContext的组合,可以实现在整个Web应用程序中共享一些bean,同时为每个Servlet提供独立的上下文,以满足其特定的需求。
以下示例配置WebApplicationContext层次结构:
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{App1Config.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/app1/*"};
}
}
/*这段代码是一个Web应用程序初始化器。它继承了AbstractAnnotationConfigDispatcherServletInitializer类,并重写了其中的三个方法。
在getRootConfigClasses方法中,返回了一个Class数组,其中包含了RootConfig类。RootConfig类是一个包含了应用程序的根配置的Java类。通常,根配置用于配置和初始化应用程序的核心组件,例如数据源、事务管理器等。
在getServletConfigClasses方法中,返回了一个Class数组,其中包含了App1Config类。App1Config类是一个包含了应用程序的Servlet配置的Java类。通常,Servlet配置用于配置和初始化与Servlet相关的组件,例如控制器、视图解析器等。
在getServletMappings方法中,返回了一个String数组,其中包含了"/app1/*"路径。这意味着所有以"/app1/"开头的请求将由这个DispatcherServlet处理。
这段代码的作用是在Web应用程序启动时,加载根配置和Servlet配置,并创建一个DispatcherServlet,并将其注册到ServletContext中,以处理以"/app1/*"开头的请求。*/
带注解的控制器
- Spring MVC 提供了基于注释的编程模型,其中@Controller组件 @RestController使用注释来表达请求映射、请求输入、异常处理等。
- 带注释的控制器具有灵活的方法签名,并且不必扩展基类或实现特定的接口。
使用注解注册bean
您可以通过使用 Servlet 的WebApplicationContext.该@Controller构造型允许自动检测,与 Spring 对检测@Component类路径中的类以及自动注册它们的 bean 定义的一般支持保持一致。它还充当带注释的类的构造型,表明其作为 Web 组件的角色。
要启用此类 Bean 的自动检测@Controller,您可以将组件扫描添加到 Java 配置中,如以下示例所示:
@Configuration
@ComponentScan("org.example.web")
public class WebConfig {
}
与下面的xml配置等效
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.example.web"/>
<!-- ... -->
</beans>
@RestController是一个组合注释,它本身是用@Controller和@ResponseBody进行元注释的,以指示其每个方法都继承了类型级别@response body注释的控制器,因此,它直接写入响应体,而不是使用HTML模板进行视图解析和渲染。
RequestMapping-请求映射
- 您可以使用@RequestMapping注释将请求映射到控制器方法。
- 它具有各种属性,可通过URL、HTTP方法、请求参数、标头和媒体类型进行匹配。
- 您可以在类级别使用它来表示共享映射,也可以在方法级别使用它将范围缩小到特定的端点映射
还有 HTTP 方法特定的快捷方式变体@RequestMapping:
-
@GetMapping
-
@PostMapping
-
@PutMapping
-
@DeleteMapping
-
@PatchMapping
大多数控制器方法都应该映射到特定的HTTP方法,而不是使用@RequestMapping,后者在默认情况下与所有HTTP方法匹配。类级别仍然需要@RequestMapping来表示共享映射。
以下示例具有类型和方法级别的映射:
@RestController
@RequestMapping("/persons")
class PersonController {
@GetMapping("/{id}")
public Person getPerson(@PathVariable Long id) {
// ...
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public void add(@RequestBody Person person) {
// ...
}
}
URI 模式
由于PathPatter
模式是web应用程序的推荐解决方案,因此本节着重讨论PathPatter
模式
@RequestMapping
方法可以使用URL模式进行映射。有两种选择:
PathPattern
— 与URL路径匹配的预解析模式也被预解析为路径容器。该解决方案专为网络使用而设计,可有效处理编码和路径参数,并有效匹配。
AntPathMatcher
— 将字符串模式与字符串路径相匹配。这是Spring配置中也用于选择类路径、文件系统和其他位置上的资源的原始解决方案。它的效率较低,字符串路径输入对于有效处理URL的编码和其他问题是一个挑战。
提示:PathPattern是web应用程序的推荐解决方案,也是SpringWebFlux中的唯一选择。
PathPattern支持支持捕获模式,例如{*spring
},用于匹配路径末端的0个或多个路径段。PathPattern还限制使用**
来匹配多个路径段,因此只允许在模式末尾使用**。这消除了为给定请求选择最佳匹配模式时的许多歧义情况。
一些示例模式:
“/resources/ima?e.png”-匹配路径段中的一个字符
“/resources/*.png”-在路径段中匹配零个或多个字符
“/resources/**”-匹配多个路径段
“/projects/{project}/versions”-匹配路径段并将其捕获为变量
“/projects/{project:[a-z]+}/versions”-使用正则表达式匹配并捕获变量
可以使用@PathVariable访问捕获的URI变量。例如:
@GetMapping("/owners/{ownerId}/pets/{petId}")
public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
// ...
}
也可以在类和方法级别声明URI变量,如下例所示:
@Controller
@RequestMapping("/owners/{ownerId}")
public class OwnerController {
@GetMapping("/pets/{petId}")
public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
// ...
}
}
URI变量会自动转换为适当的类型,或者引发TypeMismatchException。默认情况下支持简单类型(int、long、Date等),并且您可以注册对任何其他数据类型的支持。请参见类型转换和DataBinder。
语法{varName:regex}使用语法为{varName:正则表达式}的正则表达式声明URI变量。例如,给定URL“/spring-web-3.0.5.jar”,以下方法提取名称、版本和文件扩展名:
@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")
public void handle(@PathVariable String name, @PathVariable String version, @PathVariable String ext) {
// ...
}
URI路径模式也可以嵌入${…} 在启动时通过对本地、系统、环境和其他属性源使用PropertySourcesPlaceholderConfigurer解析的占位符。例如,您可以使用它来基于某些外部配置参数化基本URL。
Handler Methods - 处理程序方法
@RequestMapping处理程序方法具有灵活的签名,可以从一系列受支持的控制器方法参数和返回值中进行选择。
方法参数
下表描述了支持的控制器方法参数。任何参数都不支持响应类型。
JDK 8的java.util.Optionsal被支持作为方法参数,并与具有必需属性的注释(例如,@RequestParam、@RequestHeader和其他)结合使用,并且等效于required=false。
WebRequest,NativeWebRequest
对请求参数、请求和会话属性的通用访问,无需直接使用Servlet API。
jakarta.servlet.ServletRequest,jakarta-servlet.SservletResponse
选择任何特定的请求或响应类型 — 例如,Servlet请求、HttpServlet请求或Spring的MultipartRequest、MultipartHttpServlet请求。
jakarta.servlet.http.HttpSession
因为强制会话存在。这样的参数永远不会为null。请注意,会话访问不是线程安全的。如果允许多个请求并发访问会话,请考虑将RequestMappingHandlerAdapter实例的synchronizeOnSession标志设置为true。
jakarta.servlet.http.PushBuilder
用于编程HTTP/2资源推送的Servlet 4.0推送生成器API。请注意,根据Servlet规范,如果客户端不支持HTTP/2功能,则注入的PushBuilder实例可以为null。
java.security.Principal
当前已通过身份验证的用户 — 可能是特定的Principal实现类(如果已知的话)。
请注意,如果对该参数进行注释以允许自定义解析器在通过HttpServlet请求#getUserPrincipal返回默认解析之前对其进行解析,则该参数不会被急切地解析。例如,Spring Security Authentication实现Principal,并将通过HttpServlet请求#getUserPrincipal注入,除非它也用@AuthenticationPrincipal注释,在这种情况下,它由自定义Spring Security解析器通过Authentication#getPrincipal解析。
HttpMethod
请求的HTTP方法。
java.util.Locale
当前请求区域设置,由可用的最具体的LocaleResolver(实际上是配置的LocaleReselver或LocaleContextResolver)确定。
java.util.TimeZone+java.time.ZoneId
由LocaleContextResolver确定的与当前请求关联的时区。
java.io.InputStream、java.io.Reader
用于访问Servlet API公开的原始请求主体。
java.io.OutputStream、java.io.Writer
用于访问Servlet API公开的原始响应主体。
@PathVariable
用于访问URI模板变量。请参阅URI模式。
@MatrixVariable
用于访问URI路径段中的名称-值对。请参见矩阵变量。
@RequestParam
用于访问Servlet请求参数,包括多部分文件。参数值将转换为声明的方法参数类型。请参阅@RequestParam和Multipart。
请注意,对于简单的参数值,@RequestParam的使用是可选的。请参阅本表末尾的“任何其他参数”。
@请求标头
用于访问请求标头。标头值被转换为声明的方法参数类型。请参阅@RequestHeader。
@CookieValue
用于访问Cookie。Cookie值将转换为声明的方法参数类型。请参阅@CookieValue。
@RequestBody
用于访问HTTP请求正文。通过使用HttpMessageConverter实现将正文内容转换为声明的方法参数类型。请参阅@RequestBody。
HttpEntity<B>
用于访问请求标头和正文。正文是用HttpMessageConverter转换的。请参阅HttpEntity。
@RequestPart
为了访问多部分/表单数据请求中的一个部分,请使用HttpMessageConverter转换该部分的主体。请参见Multipart。
java.util.Map,org.springframework.ui.Model,org.springframework.ui.ModelMap
用于访问HTML控制器中使用的模型,并作为视图渲染的一部分公开给模板。
RedirectAttributes
指定重定向时要使用的属性(即,要附加到查询字符串中),以及在重定向后的请求之前要临时存储的flash属性。请参见重定向属性和闪烁属性。
@ModelAttribute
用于访问模型中的现有属性(如果不存在则实例化),并应用数据绑定和验证。请参见@ModelAttribute以及Model和DataBinder。
请注意,使用@ModelAttribute是可选的(例如,设置其属性)。请参阅本表末尾的“任何其他参数”。
Errors, BindingResult
用于访问命令对象(即@ModelAttribute参数)的验证和数据绑定中的错误,或访问@RequestBody或@RequestPart参数的验证中的错误。必须在经过验证的方法参数之后立即声明Errors或BindingResult参数。
SessionStatus + class-level @SessionAttributes
用于标记表单处理完成,这将触发通过类级别@SessionAttributes注释声明的会话属性的清理。有关更多详细信息,请参阅@SessionAttributes。
UriComponentsBuilder
用于准备相对于当前请求的主机、端口、方案、上下文路径和servlet映射的文本部分的URL。请参阅URI链接。
@SessionAttribute
对于任何会话属性的访问,与作为类级别@SessionAttributes声明的结果存储在会话中的模型属性不同。有关详细信息,请参见@SessionAttribute。
@RequestAttribute
用于访问请求属性。有关更多详细信息,请参阅@RequestAttribute。
Any other argument
如果方法参数与此表中的任何早期值都不匹配,并且它是一个简单类型(由BeanUtils#isSimpleProperty确定),则将其解析为@RequestParam。否则,它将被解析为@ModelAttribute。
return values - 返回值
下表描述了支持的控制器方法返回值。
@ResponseBody
返回值通过HttpMessageConverter实现转换并写入响应。请参阅@ResponseBody。
HttpEntity<B>,ResponseEntity<B>
指定完整响应(包括HTTP标头和正文)的返回值将通过HttpMessageConverter实现进行转换并写入响应。请参阅ResponseEntity。
HttpHeaders(HTTP标头)
用于返回具有标头但没有正文的响应。
ErrorResponse
要在正文中呈现具有详细信息的RFC 7807错误响应,请参阅错误响应
ProblemDetail
要在正文中呈现具有详细信息的RFC 7807错误响应,请参阅错误响应
String
要与ViewResolver实现一起解析并与隐式模型一起使用的视图名称 — 通过命令对象和@ModelAttribute方法确定。处理程序方法还可以通过声明model参数以编程方式丰富模型(请参见显式注册)。
View
用于与隐式模型一起渲染的View实例 — 通过命令对象和@ModelAttribute方法确定。处理程序方法还可以通过声明model参数以编程方式丰富模型(请参见显式注册)。
java.util.Map, org.springframework.ui.Model
要添加到隐式模型的属性,视图名称通过RequestToViewNameTranslator隐式确定。
@ModelAttribute
要添加到模型中的属性,视图名称通过RequestToViewNameTranslator隐式确定。
请注意,@ModelAttribute是可选的。请参阅本表末尾的“任何其他返回值”。
ModelAndView object
要使用的视图和模型属性,以及响应状态(可选)。
void
如果具有void返回类型(或null返回值)的方法也具有ServletResponse、OutputStream参数或@ResponseStatus注释,则认为该方法已完全处理响应。如果控制器进行了积极的ETag或lastModified时间戳检查,情况也是如此(有关详细信息,请参阅控制器)。
如果以上都不为真,则void返回类型还可以指示REST控制器的“无响应正文”或HTML控制器的默认视图名称选择。
DeferredResult<V>
从任何线程异步生成前面的任何返回值 — 例如,由于某些事件或回调。请参阅异步请求和DeferredResult。
Callable<V>
在SpringMVC托管线程中异步生成上述任何返回值。请参阅异步请求和可调用。
ListenableFuture<V>, java.util.concurrent.CompletionStage<V>, java.util.concurrent.CompletableFuture<V>
作为DeferredResult的替代,以方便使用(例如,当底层服务返回其中一个时)。
ResponseBodyEmitter, SseEmitter
使用HttpMessageConverter实现异步发出要写入响应的对象流。也支持作为ResponseEntity的主体。请参阅异步请求和HTTP流。
StreamingResponseBody
异步写入响应OutputStream。也支持作为ResponseEntity的主体。请参阅异步请求和HTTP流。
Reactor and other reactive types registered via ReactiveAdapterRegistry
单个值类型(例如Mono)相当于返回DeferredResult。根据所请求的媒体类型,例如“文本/事件流”、“应用程序/json+stream”,可以将多值类型(例如Flux)视为流,或者以其他方式收集到列表中并呈现为单个值。请参阅异步请求和无功类型。
其他返回值
如果返回值仍然以任何其他方式未解析,则将其视为模型属性,除非它是由BeanUtils#isSimpleProperty确定的简单类型,在这种情况下,它仍然未解析。
@RequestParam
您可以使用@RequestParam注释将Servlet请求参数(即查询参数或表单数据)绑定到控制器中的方法参数。
以下是使用案例
@Controller
@RequestMapping("/pets")
public class EditPetForm {
@GetMapping
public String setupForm(@RequestParam("petId") int petId, Model model) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet);
return "petForm";
}
}
使用@RequestParam绑定petId。
默认情况下,使用该注释的方法参数是必需的,但您可以通过将@RequestParam注释的required标志设置为false或通过使用java.util.optional包装器声明参数来指定方法参数是可选的。
如果目标方法参数类型不是String,则自动应用类型转换。请参见类型转换。
将参数类型声明为数组或列表允许解析同一参数名的多个参数值。
当@RequestParam注释声明为Map<String,String>或MultiValueMap时,如果注释中没有指定参数名称,则用每个给定参数名称的请求参数值填充映射。
请注意,使用@RequestParam是可选的(例如,设置其属性)。默认情况下,任何简单值类型(由BeanUtils#isSimpleProperty确定)且未由任何其他参数解析程序解析的参数都将被视为使用@RequestParam注释的参数。
@RequestHeader
您可以使用@RequestHeader注释将请求头绑定到控制器中的方法参数。
考虑以下具有请求头的请求:
Host localhost:8080
Accept text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language fr,en-gb;q=0.7,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
以下示例获取 Accept-Encoding 和 Keep-Alive 请求体的值:
@GetMapping("/demo")
public void handle(
@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") long keepAlive) {
}
获取Accept-Encoding标头的值。
获取Keep-Alive标头的值。
如果目标方法参数类型不是String,则自动应用类型转换。请参见类型转换。
当在Map<String、String>、MultiValueMap或HttpHeaders参数上使用@RequestHeader注释时,将用所有请求头值填充映射。
@CookieValue
您可以使用 @CookieValue 注释将 HTTP cookie 的值绑定到控制器中的方法参数。
考虑带有以下 cookie 的请求:
JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84
以下示例展示了如何获取 cookie 值:
@GetMapping("/demo")
public void handle(@CookieValue("JSESSIONID") String cookie) {
//...
}
获取 JSESSIONID cookie 的值。如果目标方法参数类型不是 String,则会自动应用类型转换。请参阅类型转换。
@ModelAttribute
您可以在方法参数上使用@ModelAttribute注释来访问模型中的属性,或者如果不存在,则将其实例化。
模型属性还覆盖了来自HTTPServlet请求参数的值,这些参数的名称与字段名匹配。这被称为数据绑定,它使您不必解析和转换单个查询参数和表单字段。
下面的示例演示了如何执行此操作:
@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@ModelAttribute Pet pet) {
// method logic...
}
本节没写完!!!