深入解读Spring Framework Web MVC(第六弹:定义@RequestMapping处理方法)

本文介绍了Spring MVC中如何使用@RequestParam进行请求参数绑定,包括基本用法、可选参数设置及类型转换等内容。此外还探讨了@RequestBody、@ResponseBody以及HttpEntity的使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@RequestParam将请求参数绑定到方法参数

在控制器里,使用@RequestParam可以将请求参数绑定到方法参数。如:

@Controller
@RequestMapping("/pets")
@SessionAttributes("pet")
public class EditPetForm {

    // ...

    @GetMapping
    public String setupForm(@RequestParam("petId") int petId, ModelMap model) {
        Pet pet = this.clinic.loadPet(petId);
        model.addAttribute("pet", pet);
        return "petForm";
    }

    // ...

}

使用@RequestParam的参数默认是必须提供的,不过也可以指定其为可选的,将@RequestParam的reqired属性设置false即可。如,@RequestParam(value="id", required=false))
如果方法参数的类型不是String,如上例中的是int,类型转换会自动执行。
如果将@RequestParam用于Map

@RequestBody映射请求体

@RequestBody注解参数表示该参数将与HTTP请求体绑定。如:

@PutMapping("/something")
public void handle(@RequestBody String body, Writer writer) throws IOException {
    writer.write(body);
}

使用HttpMessageConverter将请求体转换为方法参数。HttpMessageConverter负责将请求信息转换为指定对象和将指定对象转换为请求体。RequestMappingHandlerAdapter默认支持@RequestBody使用以下HttpMessageConverters。
- ByteArrayHttpMessageConverter 转换为字节数组。
- StringHttpMessageConverter 转换为字符串。
- FormHttpMessageConverter 表单数据与 MultiValueMap

@ResponseBody映射响应体

@ResponseBody注解用在方法上,用来表示直接将返回数据写到HTTP响应体里。这样返回的数据不会放到Model中,也不会解析为视图名称。如:

@RequestMapping(value = "/something", method = RequestMethod.PUT)
@ResponseBody
public String helloWorld() {
    return "Hello World";
}

上述例子会将Hello World文本写到HTTP响应流中。
与@RequestBody一样,Spring使用HttpMessageConverter将返回对象转换为响应体。

@RestController创建REST控制器

有时我们会将控制器实现REST API,只会返回JSON、XML或其他自定义媒体类型。那我们就可以在控制器上添加@RestController注解,而不用在每一个@RequestMapping上使用@ResponseBody。
@RestController是一个结合了@ResponseBody和@Controller的注解。

HttpEntity

HttpEntity的用法类似于@RequestBody和@ResponseBody注解。除了可以访问请求/响应体,HttpEntity(和专门用于响应的子类ResponseEntity)还可以访问request和response的头字段。如:

@RequestMapping("/something")
public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException {
    String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader"));
    byte[] requestBody = requestEntity.getBody();

    // do something with request header and body

    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("MyResponseHeader", "MyValue");
    return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}

上述例子获取了MyRequestHeader头字段的值,以字节数组的形式读取了请求体,随后将MyRequestHeader添加到response,将Hello World写到响应流并设置响应状态码为201(Created)。
与@RequestBody和@ResponseBody一样,Spring使用HttpMessageConverter将数据与请求/响应流互转。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值