1. @RequestParam
功能&属性介绍
作用:
把请求中指定名称的参数赋值给控制器中的形式参数
属性:
value:请求参数中的名称
required:请求参数中是否必须提供此参数。默认值
true
必须提供
实现测试
- 编写一个新的前端页面
<%--
Created by IntelliJ IDEA.
User: dell
Date: 2020/10/6
Time: 12:50
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/anno/testRequestParam?name=ffideal&pwd=123456">开始跳转</a>
</body>
</html>
- 在后端编写新的
controller
/**
* @Description: @RequestParam 注解
* 当前端传入参数的名称与后端接收的名称不对应的时候,
* 可以通过<code>@RequestParam("xxx")</code> 将xxx赋值给形式参数,
* 然后在进行传参
* @param: String username/String password
* @return:
* @auther: ffideal
* @date:
*/
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam("name") String username,@RequestParam("pwd") String password){
System.out.println(username);
System.out.println(password);
return "/success";
}
2. @RequestBody
功能&属性介绍
作用:
用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。但是,get 请求方式不适用。
属性:
required:
是否必须有请求体。默认值是:true。
当取值为 true 时,get 请求方式会报错。
如果取值为 false,get 请求得到是 null。
实现测试
- 首先在前端页面编写测试请求
<%--RequestBody的post请求--%>
<form action="/anno/testRequestBody" method="post">
姓名:<input type="text" name="uname"/> <br>
密码:<input type="text" name="upassword"/> <br>
价格:<input type="text" name="price"/> <br>
生日:<input type="text" name="birthday"/> <br>
<input type="submit" value="提交">
</form>
<a href="/anno/testRequestBody?body=test" methods="get">RequestBody的get请求</a>
- 在
controller
层编写逻辑处理
/**
* @Description: @RequestBody 注解
* @auther: ffideal
*/
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody(required = false) String body){
System.out.println(body);
return "/success";
}
3. @PathVariable
功能&属性介绍
作用:
用于绑定 url 中的占位符。例如:请求 url 中 /delete/{score},这个 {score} 就是 url 占位符。
属性:
value:用于指定 url 中占位符名称。
required:是否必须提供占位符。
实现测试
- 首先在前端页面编写测试请求
<a href="/anno/testPathVariable/452">@PathVariable 注解</a> <br>
- 在
controller
层编写逻辑处理
/**
* @Description: @RequestBody 注解
* @auther: ffideal
*/
@RequestMapping("/testPathVariable/{score}")
public String testPathVariable(@PathVariable(value = "score") Integer score){
System.out.println(score);
return "/success";
}
运行结果
4. @ModelAttribute
功能&属性介绍
作用:
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。出现在参数上,获取指定的数据给参数赋值。
属性:
value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如:
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。
实现测试1:修饰没有返回值的方法
- 首先在前端页面编写测试请求
<a href="/anno/testModelAttribute?uname=ffideal">@ModelAttribute 注解</a> <br>
- 在
controller
层编写逻辑处理
/**
* @Description: @ModelAttribute注解
* 优先执行
* @auther: ffideal
* @date:
*/
@ModelAttribute
public void showModel(Consumer consumer){
System.out.println("被@ModelAttribute修饰的方法:" + consumer.getUname());
}
@RequestMapping("testModelAttribute")
public String testModelAttribute(Consumer consumer){
System.out.println("testModelAttribute的方法:" + consumer.getUname());
return "/success";
}
运行结果1
实现测试2:修饰有具体返回值
- 首先在前端页面编写测试请求
<form action="/anno/updatePassword" method="post">
姓名:<input type="text" name="uname"/> <br>
密码:<input type="text" name="upassword"/> <br>
价格:<input type="text" name="price"/> <br>
生日:<input type="text" name="birthday"/> <br>
<input type="submit" value="提交">
</form>
- 在
controller
层编写逻辑处理
/**
* @Description: 以下的3个方法都是 ModelAttribute 修饰方法带返回值
* @auther: ffideal
* @date:
*/
/**
* @Description: 模拟数据库中的值
* @auther: ffideal
* @date:
*/
private Consumer simulateDB(String username){
Consumer consumer = new Consumer();
consumer.setUname("ffideal");
consumer.setUpassword("123456");
consumer.setPrice(BigDecimal.valueOf(3.14));
return consumer;
}
/**
* @Description: 优先执行被ModelAttribute注解修饰的方法
* @auther: ffideal
* @date:
*/
@ModelAttribute
public Consumer showConsumer(String username){
Consumer consumer = simulateDB(username);
System.out.println("Model 输出原始的数据" + consumer);
return consumer;
}
/**
* @Description: 更新密码
* @auther: ffideal
* @date:
*/
@RequestMapping("updatePassword")
public String updatePassword(Consumer consumer){
System.out.println("updatePassword中的Consumer对象值:" + consumer);
return "/success";
}
运行结果2
实现测试3:出现在参数上
前端请求与 实现测试2
相同,在 controller
层编写逻辑处理
/**
* @Description: 模拟数据库中的值
* @auther: ffideal
* @date:
*/
private Consumer simulateDB(String username){
Consumer consumer = new Consumer();
consumer.setUname("ffideal");
consumer.setUpassword("123456");
consumer.setPrice(BigDecimal.valueOf(3.14));
return consumer;
}
/**
* @Description: 优先执行被ModelAttribute注解修饰的方法
* @auther: ffideal
* @date:
*/
@ModelAttribute
public void showConsumer2(String username, Map<String, Consumer> map){
Consumer consumer = simulateDB(username);
System.out.println("Model 输出原始的数据" + consumer);
map.put("consumer", consumer);
}
/**
* @Description: 更新密码
* @auther: ffideal
* @date:
*/
@RequestMapping("updatePrice")
public String updatePassword2(@ModelAttribute("consumer") Consumer consumer){
System.out.println("updatePassword中的Consumer对象值:" + consumer);
return "/success";
}
运些结果3
5. @SessionAttributes
功能&属性介绍
作用:
用于多次执行控制器方法间的参数共享。
属性:
value:用于指定存入的属性名称
type:用于指定存入的数据类型
实现测试
- 首先在前端页面编写测试请求
<a href="/session/setSessionAttribute">设置SessionAttribute</a><br>
<a href="/session/getSessionAttribute">获取SessionAttribute</a><br>
<a href="/session/delSessionAttribute">删除SessionAttribute</a><br>
- 在
controller
层编写逻辑处理
@Controller
@RequestMapping("session")
@SessionAttributes(value = {"uname","upassword","price"},types = {Integer.class})
public class SessionAttributeController {
/**
* @Description: @SessionAttribute 注解
* 设置属性
* Model 是 spring 提供的一个接口,该接口有一个实现类 ExtendedModelMap
* 该类继承了 ModelMap,而 ModelMap 就是 LinkedHashMap 子类
* @auther: ffideal
* @date:
*/
@RequestMapping("setSessionAttribute")
public String setSessionAttribute(Model model){
model.addAttribute("uname","ffideal");
model.addAttribute("upassword","654321");
model.addAttribute("price", BigDecimal.valueOf(3.13));
System.out.println("setSessionAttribute设置完毕 ....");
return "/success";
}
@RequestMapping("getSessionAttribute")
public String getSessionAttribute(ModelMap model){
System.out.println("昵称:" + model.get("uname") + ",密码:" + model.get("upassword") + ",价格:" + model.get("price"));
return "/success";
}
@RequestMapping("delSessionAttribute")
public String delSessionAttribute(SessionStatus status){
status.setComplete();
System.out.println("setSessionAttribute 清除完毕 ....");
return "/success";
}
}
运些结果