目录
@Controller注解
@Controller注解是Spring MVC中用于标记一个类为Controller的注解。被@Controller注解的类会自动被Spring容器扫描并识别为一个控制器类。该类中可以定义多个处理HTTP请求的方法,并通过其他相关注解来指定请求映射和处理逻辑。
@ResponseBody注解
该注解告诉Spring将方法的返回值直接写入HTTP响应的body中。如果返回类型是实体类型是实体对象/集合,转为json格式响应
@RestController注解
该注解是@Controller和@ResponseBody的结合体,一般用于类,作用等于在类上面添加了
@ResponseBody和@Controller
@RequestMapping
@RequestMapping注解用于映射HTTP请求到特定的处理方法上。它可以作用在类或者方法上,当作用在类上时,表示该类中的所有方法都将映射到指定的URL路径下。@RequestMapping注解可以指定请求的URL路径、请求方法(GET、POST等)、请求参数等信息。通过灵活地使用@RequestMapping注解,可以实现复杂的请求映射需求。
@GetMapping和@PostMapping
@GetMapping和@PostMapping注解是@RequestMapping注解的特例,分别用于处理HTTP的GET请求和POST请求。这两个注解简化了常用的HTTP请求方法的映射配置,使得代码更加简洁易读。@GetMapping注解用于处理查询操作,通常用于获取数据;而@PostMapping注解则用于处理提交操作,通常用于新增或更新数据。
需要编写Resful风格还有@PutMapper、@DeleteMapper等注解
@RequestParam
这个注解主要用于将请求中的参数绑定到控制器方法的参数上。使用 @RequestParam
注解,可以指定请求参数的名称,以便从请求中获取对应的参数值。
@RequestParam
注解有几个重要的属性:
- value:指定请求参数的名称。这是必须的属性,但如果请求参数的名称和方法参数的名称相同,则可以省略。
- required:指定请求参数是否必需。默认为
true
,表示参数是必需的。如果请求中没有提供该参数,且该参数被标记为必需,那么将会抛出异常。如果设置为false
,则表示参数是可选的。如果不提供这个可选参数,Spring Boot将不会报错,而是会为该参数设置一个默认值或者为null(如果没有默认值且参数类型是原始类型,比如int,则会报错)。
- defaultValue:指定请求参数的默认值。如果请求中没有提供该参数,那么将使用该默认值。需要注意的是,如果设置了
defaultValue
,那么required
属性会自动被设置为false
,无论你是否显式设置了required
。
简单参数请求
- 参数名与形参变量名相同,定义形参就可以接收参数
- 如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam
实体参数请求
请求参数名与形参属性名相同,定义POJO接收即可
复杂实体参数请求
请求参数名与形参属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
数组集合参数请求
- 数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数封装,如多选框
- 集合参数:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系
@DateTimeFormat
主要用于格式化日期和时间。这个注解通常应用在方法参数或属性上,以便将字符串类型的日期时间数据转换为 java.util.Date
、java.util.Calendar
、java.time.LocalDateTime
等日期时间类型。
使用场景
在 Web 应用程序中,用户输入的日期和时间通常都是字符串形式,而后端程序往往需要将这些字符串转换为日期时间对象进行处理。@DateTimeFormat
注解可以帮助我们自动完成这个转换过程。
@DateTimeFormat
注解有一些重要的属性,如:
- pattern:自定义日期时间的格式,例如
"yyyy-MM-dd HH:mm:ss"
。 - iso:使用 ISO 日期时间格式。
- style:日期时间的样式,可以是
DEFAULT
、SHORT
、MEDIUM
、LONG
或FULL
。
日期参数请求
@RequestBody
@RequestBody
是 Spring Framework 中用于处理 HTTP 请求体内容的一个重要注解。这个注解主要应用在控制器(Controller)类的方法参数上,它指示一个方法参数应该被绑定到请求体的内容。通常,这是在使用 HTTP POST 或 PUT 请求发送 JSON、XML 或其他媒体类型数据时使用的。
当使用 @RequestBody
注解时,Spring 的 HttpMessageConverter
负责将请求体的内容转换为方法参数所指定的类型。最常见的场景是将 JSON 数据转换为 Java 对象(如 DTOs 或简单的 POJOs)。
使用场景
假设你有一个 REST API,客户端通过 POST 请求发送 JSON 数据来创建一个新的用户。在服务器端,你可以使用 @RequestBody
注解来自动将 JSON 数据转换为相应的 Java 对象。
注意事项
- 使用
@RequestBody
时,通常请求头的Content-Type
应该设置为application/json
(或其他媒体类型,如application/xml
,取决于你发送的数据类型)。 @RequestBody
和@RequestParam
可以在同一个方法中使用,但@RequestBody
最多只能有一个,而@RequestParam
可以有多个。- 如果请求体为空或无法转换为指定的类型,Spring 将抛出一个异常。你可以通过全局异常处理或控制器级别的异常处理来处理这些异常。
Json参数请求
键名与形参对象属性名相同,定义POJO类型形参即可接收参数,层级嵌套json即可
@PathVariable
@PathVariable
是 Spring Framework 提供的注解,用于将 URI 模板变量绑定到控制器方法的参数上。当你需要构建 RESTful 风格的 Web 服务时,@PathVariable
是非常有用的,因为它允许你通过 URI 路径中的值来传递参数。
使用场景
假设你有一个用于检索用户信息的 REST API,并且你希望通过用户的 ID 来获取用户数据。你可以将用户 ID 作为 URI 路径的一部分,并使用 @PathVariable
来获取这个值。
@PathVariable
注解有一个主要的属性:
- value:指定 URI 模板变量的名称。如果方法参数的名称与 URI 模板变量的名称相同,则可以省略该属性。
注意事项
- 如果 URI 模板变量的值无法转换为方法参数的类型,Spring 将抛出一个异常。确保 URI 模板变量的值与方法参数的类型兼容。
- 你可以在一个控制器方法中使用多个
@PathVariable
注解,以便从 URI 路径中提取多个值。
路径参数请求:通过请求URL直接传递参数,使用{...}来标识路径参数
@RequestHeader
它允许开发者从 HTTP 请求的头部获取特定的信息,并将其注入到控制器方法的参数中。这个注解对于需要读取和使用请求头信息的场景非常有用,比如根据客户端发送的 User-Agent
信息来定制响应内容,或者获取其他自定义的请求头数据。
使用场景
- 当你的应用程序需要根据 HTTP 请求头中的信息(如
Accept-Language
、User-Agent
等)来定制响应时。 - 当客户端通过请求头发送自定义的数据,而服务器端需要读取这些数据以进行进一步处理时。
主要属性
- value:指定要获取的请求头的名称。
- required:指定请求头是否为必需。默认为
true
,如果请求中没有包含该请求头且此属性设置为true
,将会抛出异常。如果设置为false
,则在没有该请求头时,方法参数将被设置为null
或默认值(如果指定了defaultValue
)。 - defaultValue:指定当请求中没有包含该请求头时的默认值。如果没有设置此属性且请求中没有包含该请求头,当
required
为false
时,方法参数将被设置为null
。
@CookieValue
它用于从 HTTP 请求的 Cookie 中获取指定的值,并将其注入到控制器方法的参数中。这个注解在处理需要读取 Cookie 信息的场景时非常有用,比如验证用户的会话状态、获取用户的偏好设置等。
主要属性
- value:指定要获取的 Cookie 的名称。这是必需的属性,用于标识要从请求中提取的 Cookie。
- required:指定是否必须存在该 Cookie。默认为
true
,如果请求中没有包含该 Cookie 且此属性设置为true
,将会抛出异常。如果设置为false
,则在请求中没有该 Cookie 时,方法参数将被设置为null
或默认值(如果指定了defaultValue
)。 - defaultValue:指定当请求中没有包含该 Cookie 时的默认值。如果没有设置此属性且请求中没有包含该 Cookie,当
required
为false
时,方法参数将被设置为null
。
注意事项
- 如果请求的 Cookie 中没有包含所需的 Cookie,且
required
属性设置为true
(默认值),Spring 将抛出一个异常。为了避免这种情况,可以确保客户端发送了正确的 Cookie,或者将required
属性设置为false
并提供一个默认值。 @CookieValue
注解只能用于控制器方法的参数上,不能用于字段或方法上。此外,它通常与@RequestMapping
(或@GetMapping
、@PostMapping
等)注解一起使用,以指定处理哪些 HTTP 请求。
统一响应结果
在前面所编写的这些Controller方法中,返回值各种各样,没有任何的规范。前端人员如果拿到的响应数据没有统一的规范,就需要针对不同的响应数据使用不同的解析方式。这样就会造成开发成本高,项目管理不方便,维护难。
所以,在开发中,无论有多少的方法,都应该定义一个统一的返回结果,如下定义的话,前端就只需要按照统一格式的返回结果进行解析(仅一种解析方案),就可以拿到数据。
统一的返回结果使用类来描述,在这个结果中包含:
-
响应状态码:当前请求是成功,还是失败
-
状态码信息:给页面的提示信息
-
返回的数据:给前端响应的数据(字符串、对象、集合)
定义在一个实体类Result来包含以上信息。代码如下:
package com.itheima.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
private Integer code;//响应码,1 代表成功; 0 代表失败
private String msg; //响应码 描述字符串
private Object data; //返回的数据
//增删改 成功响应(不需要给前端返回数据)
public static Result success(){
return new Result(1,"success",null);
}
//查询 成功响应(把查询结果做为返回数据响应给前端)
public static Result success(Object data){
return new Result(1,"success",data);
}
//失败响应
public static Result error(String msg){
return new Result(0,msg,null);
}
}
controller代码:
package com.itheima.controller;
import com.itheima.pojo.Address;
import com.itheima.pojo.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
public class ResponseController {
@RequestMapping("/hello")
public Result hello(){
return Result.success("helloworld");
}
@RequestMapping("/getAddr")
public Result getAddr(){
Address addr = new Address("广州","广东");
return Result.success(addr);
}
@RequestMapping("/listAddr")
public Result listAddr(@RequestParam(value = "err", required = false) String err){
List<Address> list = new ArrayList<>();
Address addr = new Address("深圳","广东");
Address addr2 = new Address("韶关","广东");
list.add(addr);
list.add(addr2);
if (err != null)
return Result.error("参数错误!");
return Result.success(list);
}
}
postman测试结果