注解控制器

Same in Spring MVC

Spring WebFlux 提供一个基于注解的编程模型。@Controller和@RestController注解来表达请求,请求输入、异常处理等。带注解的控制器具有灵活的方法签名,不必扩展基类,也不需要实现特定的接口。

这里是基本的例子:

@RestController
public class HelloController{
    @GetMapping("/hello")
    public String handle() {
        return "Hello WebFlux";
    }
}

上面的例子返回response body.

@Controller

Same in Spring MVC

你可以使用标准的Spring bean定义来定义控制器bean,@Controller支持自动检测,对类路径中的@ component类进行检测,并对其进行自动注册bean定义。它还作为标注类的原型,指示其作为web组件的角色。

要启用这种@Controller bean的自动检测,您可以向Java配置添加组件扫描:

@Configuration
@ComponentScan("org.example.web")
public class WebConfig {}

@RestController 由 @Controller 和 @ResponseBody 注解构成。并且指定一个控制器都继承了类型级别@ResponseBody注解,并且写入响应(以model-and-view呈现)

Request Mapping

Same in Spring MVC

@RequestMapping注解用于将请求映射到控制器的方法上。它有不同的属性用来匹配URL、HTTP方法、请求参数、头和媒体类型。也可以在类级别使用它来表示共享映射或在方法级上缩小到特定的端点映射。

基于@RequestMapping的方法变体

  • @GetMapping

  • @PostMapping

  • @PutMapping

  • @DeleteMapping

  • @PatchMapping

简便方法变体是@RequestMapping的组合注解,通常用于方法级别。在类级别上,使用 @RequestMapping更有效。

@RestController
@RequestMapping("/persons")
class PersonController{

    @GetMapping("/{id}")
    public Person getPerson(@PathVariableLongid) {
        // ...
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)  
    public voidadd(@RequestBodyPerson person) {
    // ...
    }
}

URI模式

Same in Spring MVC

可以使用glob模式和通配符来映射请求:

  • ?匹配一个字符

  • *在同一路径匹配0个或多个字符

  • **匹配0个或多个路径段

可以通过@PathVariable访问它们路径变量

@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 当然,你也可以注册其他变量类型

URI变量命名明确。例如:@PathVariable("customId") 如果名称相同你可以将变量名保存下来或者你的代码是通过debug方式编译的,在Java 8上使用-parameters标记

{* varName}表示匹配零个或多个剩余路径段的URI变量。例如:/resources/{*path} 全部匹配成文件路径是/resources/和path变量捕获完整的相对路径

{varName:regex}声明URI正则表达式。例如:一个URL "/spring-web-3.0.5 .jar" 可以提取出名称、方法和扩展名

@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")

URI路径模式还可以使用嵌入式$ {…}占位符,通过PropertyPlaceHolderConfigureragainst本地系统,环境,和其他来源。这可以用于以一些外部配置为基础来参数化一个基本URL。

Spring WebFlux使用PathPattern和PathPatternParser为URI路径匹配支持,它们都位于Spring web中,并特意设计用于在web应用程序中使用HTTP URL路径,在运行时进行大量URI路径模式匹配。

Spring WebFlux不支持后缀模式匹配。与Spring MVC不同,在这里,例如:/ person也可以与/ person匹配。

基于URL内容协商,如果需要,我们建议使用查询参数,更简单,更明确,更不容易受到URL路径的攻击。

模式比较

Same in Spring MVC

当多个模式匹配一个URL时,必须通过比较以找到最佳匹配,才算完成。SPECIFICITY_COMPARATOR用于查找更精确的模式

对于每个模式,分数是根据URI变量的数量计算的,其中URI变量得分低于通配符,总得分较低的模式获胜。如果有两个同样的分数,选择更长的。

万能模式。例如:**, {*varName} 被排除在得分之外,并且总是排在最后。如果两种模式都是万能模式,那选择更长的。

可消费的媒体类型

Same in Spring MVC

可以根据请求的内容类型来缩小请求映射:

@PostMapping(path = "/pets", consumes = "application/json")

消费属性支持否定表达式——例如:!text/plain 代表任何类型都非文本类型

可以在类级别声明共享的消费属性。与大多数其他请求映射属性不同的是,在类级别使用时,方法级的消费属性将覆盖而不是扩展类级别的声明。

可生产的媒体类型

Same in Spring MVC

可以根据容纳请求头和控制器方法产生的内容类型列表缩小请求映射

@GetMapping(path = "/pets/{petId}", produces = "application/json;charset=UTF-8")

生产属性支持否定表达式——例如:!text/plain 代表任何类型都非文本类型

可以在类级别声明共享的消费属性。与大多数其他请求映射属性不同的是,在类级别使用时,方法级的消费属性将覆盖而不是扩展类级别的声明。

MediaType为常用的媒体类型提供常量——例如APPLICATION_JSON_VALUE、APPLICATION_JSON_UTF8_VALUE。

参数和头信息

Same in Spring MVC

可以根据查询参数条件缩小请求映射。你可以测试查询参数("myParam"),缺少("!myParam"),或者特定的值("myParam=myValue")

@GetMapping(path = "/pets/{petId}", params = "myParam=myValue")

头信息

@GetMapping(path = "/pets", headers = "myHeader=myValue")

HTTP请求头选项

Same in Spring MVC

@GetMapping —— 相当于 @RequestMapping(method= HttpMethod. GET),透明地支持HTTP头,用于请求映射。控制器方法不需要改变。是一个响应包装器,应用于HttpHandler服务器适配器,确保了Content-Length的内容长度,而没有编写其他响应。

默认情况下处理HTTP选项通过设置“Allow”响应头中,列出的HTTP方法列表所有@RequestMapping方法与匹配的URL。

@RequestMapping没有HTTP方法声明,内容设置为“Allow”,标题设置为“GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS”。控制器方法应该总是声明所支持的HTTP方法,例如使用HTTP方法特定的变体。@GetMapping, @PostMapping等。

@RequestMapping方法可以显式映射到HTTP HEAD 和 HTTP OPTIONS,但常见的情况是没有必要的。

处理器方法

Same in Spring MVC

@RequestMapping有一个灵活的签名并且可以从一系列的控制器方法和返回值中进行选择

方法参数

Same in Spring MVC

下面的表格列出了支持的控制器方法参数

响应类型(Reactor, RxJava, or other)支持需要阻塞I / O的参数.例如:读取请求体并得到解决。在表格中的描述中详细叙述的。在不需要阻塞的参数上不需要响应类型。

JDK 1.8的java.util.Optional支持作为一个带有可选属性的注解的方法参数,例如:@RequestParam、@RequestHeader的参数required=false

Controller method argument Description
ServerWebExchange 获取完整ServerWebExchange 的容器包括请求、响应、会话等方法
ServerHttpRequest,ServerHttpResponse 访问HTTP请求以及响应
WebSession 获取会话,除非新增了属性,否则不能强迫新会话的开始,支持响应类型
java.security.Principal 当前身份验证的用户,可能是一个特定的主要实现类
org.springframework.http.HttpMethod HTTP请求方法
java.util.Locale 当前请求时区。由最具体的LocaleResolver所决定,实际上,LocaleResolver / LocaleContextResolver配置。
Java 6+:java.util.TimeZone Java 8+:java.time.ZoneId 与当前请求相关联的时区,由aLocaleContextResolver决定。
@PathVariable URI变量模板
@MatrixVariable 获取URI路径段的名称-值对
@RequestParam 用于访问Servlet请求参数。参数值被转换为声明的方法参数类型。
@RequestHeader 用于访问请求头信息。HEAD被转换为声明的方法参数类型。
@RequestBody 访问HTTP请求体。请求内容转化为使用HttpMessageReader的声明方法参数类型。支持响应类型。
HttpEntity<B> 用于访问请求头和主体。主体通过HttpMessageReader的转换。支持响应类型。
@RequestPart 访问一个"multipart/form-data"的请求
java.util.Map,org.springframework.ui.Model,org.springframework.ui.ModelMap 用于访问和更新暴露在web视图中的隐式模型。
Command or form object (with optional@ModelAttribute) 命令对象其属性绑定到请求参数。用通过设置器或直接到字段,可定制类型转换,这取决于@InitBinderMethods或HandlerAdapter配置(在RequestMappingHandlerAdapter看到webBindingInitializer属性)。命令对象及其验证结果被作为模型属性公开,默认情况下使用命令类名。实体属性"orderAddress" 是 命令对象 “xxx.OrderAddress” 类型,可以使用@ modelattribute自定义模型属性名
Errors,BindingResult 命令/表单对象数据绑定的验证结果;这个参数必须在控制器方法签名中的命令/表单对象之后立即声明。
SessionStatus For marking form processing complete which triggers cleanup of session attributes declared through a class-level@SessionAttributesannotation.
UriComponentsBuilder For preparing a URL relative to the current request’s host, port, scheme, context path, and the literal part of the servlet mapping also taking into accountForwardedandX-Forwarded-*headers.
@SessionAttribute For access to any session attribute; in contrast to model attributes stored in the session as a result of a class-level@SessionAttributesdeclaration.
@RequestAttribute For access to request attributes.

results matching ""

    No results matching ""