当前位置: 代码迷 >> 综合 >> SpringMVC基础--常用注解-@RequestParam、@RequestBody、@PathVariable、@ModeAttribute
  详细解决方案

SpringMVC基础--常用注解-@RequestParam、@RequestBody、@PathVariable、@ModeAttribute

热度:16   发布时间:2024-02-25 04:11:20.0

@RequestParam

处理请求参数与控制器处理方法形参不一致的问题。
下面的请求中,参数名为username

<a href="hello?username=mcs">请求<a>

而处理函数中形参名为name

@RequestMapping("/hello")public String requestParamTest(String name) {
    System.out.println("username:" +name);return "hello";}

两个参数名称不一致,无法获取到请求中参数的值,使用@RequestParam来处理

@RequestMapping("/hello")public String requestParamTest(@RequestParam("username") String name) {
    System.out.println("username:" +name);return "hello";}

注意:指定的value值一定要和请求中参数名称一样。

@RequestBody

如果直接作用于函数上,将控制器处理请求方法返回值显示在网页上,默认是覆盖跳转到的网页内容。

@ResponseBody
@RequestMapping("/testRequestParam")public String requestParamTest(@RequestParam("username") String name) {
    System.out.println("username:" +name);return "hello";}

将返回值hello打印在网页上。
还可以作用于参数上,获取请求中参数的请求体。

@ResponseBody
@RequestMapping("/testRequestBody")public String requestParamTest(@RequestBody String body) {
    System.out.println("body:" +body);return "hello";}

请求

<a href="testRequestBody?username=123&password=123"></a>

对bod形参加上@RequestBody注解后,body的内容就被赋值为请求中参数的请求体:username=123&password=123

@PathVariable

@RequestMapping在处理请求时只能处理固定的请求,如果我们根据id获取数据,100个人要写100个控制器处理请求方法岂不是太麻烦了,使用@PathVariable可以实现REST风格的请求,它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
例如:根据不同的id来处理不同的请求

@RequestMapping("/testPathVariable/{id}")public String PathVariableTest(@PathVariable("id") String id) {
    System.out.println("id:" + id);return "hello";}

请求

<a href="testPathVariable/1">PathVariable</a>

在数据库根据id查询单的时候经常应用这种
另外,也可以请求路径相同,根据不同的请求方式(PUT、GET、POST等)来找到对应的请求处理。

@ModelAttribute

加上该注解的方法会在控制器处理请求方法前执行,可以利用该属性处理表单提交时一些不能输入的表单属性,比如:
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数 据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。
第一种方法:没有返回值
请求

<form action="anno/testModelAttribute" method="post">年龄:<input type="text" name="uage"/><br/>出生日期:<input type="text" name="date"/><br/><input type="submit" value="提交"></form>

我们将表单中的年龄和出生日期封装成一个User类,该类还有一个不可修改属性叫做address,那么我们就可以使用该注解创建个执行前执行的方法,先处理address属性,再通过控制器。

@ModelAttributepublic User ModelAttribute(String uage) {
    // 模拟数据库查询System.out.println("先执行了");User user = new User();user.setUage(uage);Date date = new Date();user.setDate(date);user.setAddress("宿州");System.out.println("先执行:user:"+ user);return user;}
@RequestMapping("/testModelAttribute")public String ModelAttributeTest(User user) {
    System.out.println("user:" + user);return "hello";}

在这里插入图片描述

注意:先执行的方法只能对没有复制的属性就行修改生效,其他属性一概不生效,如果表单中有该属性,就算不输入赋值,也不能对该属性进行修改。>

第二种方法:
利用Map集合对User进行封装

@ModelAttributepublic void ModelAttribute(String uage, Map<String,User> map) {
    // 模拟数据库查询System.out.println("先执行了");User user = new User();user.setUage(uage);Date date = new Date();user.setDate(date);user.setAddress("宿州");System.out.println("先执行:user:"+ user);map.put("change",user);
}

如果Map集合保存的键名和控制器形参不一样,需要使用@ModeAttribute进行绑定。

@RequestMapping("/testModelAttribute")public String ModelAttributeTest(@ModeAttribute("change") User user) {
    System.out.println("执行后user:" + user);return "hello";}
  相关解决方案