SpringMVC(官网翻译,不全)

传统的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...
}

本节没写完!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值