目录
一.基本介绍
二.接收参数相关注解应用实例
1.需求:
2.应用实例演示
2.1演示@PathVariable 使用
2.2.演示@RequestHeader 使用
2.3演示@RequestParam 使用
2.4演示@CookieValue 使用
2.5演示@RequestBody 使用
2.6演示@RequestAttribute,SessionAttribute 使用
三.复杂参数
1.基本介绍
2.复杂参数应用实例
2.1说明 :
2.2代码演示
四.自定义对象参数-自动封装
1.基本介绍
2.自定义对象参数-应用实例
2.1需求说明 :
2.2代码实现
一.基本介绍
二.接收参数相关注解应用实例
1.需求:
演示各种方式提交数据/参数给服务器,服务器如何使用注解接收
2.应用实例演示
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h1>hello, 海绵hong</h1>
基本注解:
<hr/>
<a href="/monster/200/jack">@PathVariable-路径变量 monster/200/jack</a><br/><br/>
<a href="/requestHeader">@RequestHeader-获取Http请求头 </a><br/><br/>
<a href="/hi?name=hong&fruit=apple&fruit=pear&id=300&address=深圳">@RequestParam-获取请求参数</a><br/><br/>
<a href="/cookie">@CookieValue-获取cookie值</a><br/><br/>
<a href="/login">@RequestAttribute-获取request域属性-</a>
<hr/>
<h1>测试@RequestBody获取数据: 获取POST请求体</h1>
<form action="/save" method="post">
姓名: <input name="name"/> <br>
年龄: <input name="age"/> <br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
需求: 演示各种方式提交数据/参数给服务器,服务器如何使用注解接收
2.1演示@PathVariable 使用
@RestController
public class ParameterController {
/**
* /monster/{id}/{name} 解读
* 1. /monster/{id}/{name} 构成完整请求路径
* 2. {id} {name} 就是占位变量
* 3. @PathVariable("name"): 这里name 和{name} 命名保持一致
* 4. String name_ 这里自定义,故意这样写下
* 5. @PathVariable Map<String, String> map 把所有传递的值传入map
* 6. 可以看下@PathVariable源码
*/
@GetMapping("/monster/{id}/{name}")
public String pathVariable(@PathVariable("id") Integer id,
@PathVariable("name") String name,
@PathVariable Map<String, String> map) {
System.out.println("id-" + id);
System.out.println("name-" + name);
System.out.println("map-" + map);
return "success";
}
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
2.2.演示@RequestHeader 使用
/**
* @RequestHeader("Host") 获取http请求头的 host信息
* @RequestHeader Map<String, String> header: 获取到http请求的所有信息
*@RequestHeader("host") String host,将请求头中的变量值host映射到控制器参数host中
*/
@GetMapping("/requestHeader")
public String requestHeader(@RequestHeader("host") String host,
@RequestHeader Map<String, String> header,
@RequestHeader("accept") String accept) {
System.out.println("host-" + host);
System.out.println("header-" + header);
System.out.println("accept-" + accept);
return "success";
}
@RequestHeader 是获取请求头中的数据,通过指定参数 value 的值来获取请求头中指定的参数值
2.3演示@RequestParam 使用
/**
* 解读
* 如果我们希望将所有的请求参数的值都获取到,可以通过
*
* @param username
* @param fruits
* @param paras
* @return
* @RequestParam Map<String, String> paras 获取
*/
@GetMapping("/hi")
public String hi(@RequestParam(value = "name") String username,
@RequestParam("fruit") List<String> fruits,
@RequestParam Map<String, String> paras) {
System.out.println("username-" + username);
System.out.println("fruit-" + fruits);
System.out.println("paras-" + paras);
return "success";
}
将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
value:参数名
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
2.4演示@CookieValue 使用
/**
* 因为我的浏览器目前没有cookie,我们可以自己设置cookie[技巧还是非常有用]
* 如果要测试,可以先写一个方法,在浏览器创建对应的cookie
* 说明 1. value = "cookie_key" 表示接收名字为 cookie_key的cookie
* 2. 如果浏览器携带来对应的cookie , 那么 后面的参数是String ,则接收到的是对应对value
* 3. 后面的参数是Cookie ,则接收到的是封装好的对应的cookie
*/
@GetMapping("/cookie")
public String cookie(@CookieValue(value = "cookie_key", required = false) String cookie_value,
HttpServletRequest request,
@CookieValue(value = "username", required = false) Cookie cookie) {
System.out.println("cookie_value-" + cookie_value);
if (cookie != null) {
System.out.println("username-" + cookie.getName() + "-" + cookie.getValue());
}
System.out.println("-------------------------");
Cookie[] cookies = request.getCookies();
for (Cookie cookie1 : cookies) {
System.out.println(cookie1.getName() + "=>" + cookie1.getValue());
}
return "success";
}
@CookieValue的作用
用来获取Cookie中的值
@CookieValue参数
1、value:参数名称
2、required:是否必须,获取不到则为空
3、defaultValue:默认值
2.5演示@RequestBody 使用
**
* @RequestBody 是整体取出Post请求内容
*/
@PostMapping("/save")
public String postMethod(@RequestBody String content) {
System.out.println("content-" + content);
return "success";
}
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
注:一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。
2.6演示@RequestAttribute,SessionAttribute 使用
@GetMapping("/login")
public String login(HttpServletRequest request) {
request.setAttribute("user", "hong~");//向request域中添加的数据
request.getSession().setAttribute("website", "http://www.baidu.com"); //向session中添加数据
return "forward:/ok"; //请求转发到 /ok
}
@GetMapping("/ok")
@ResponseBody
public String ok(
HttpServletRequest request,
@SessionAttribute(value = "website", required = false) String website,
@RequestAttribute(value = "user", required = false) String username
) {
//获取到request域中的数据
System.out.println("username-" + username);
System.out.println("通过servlet api 获取 username-" + request.getAttribute("user"));
System.out.println("website-" + website);
System.out.println("通过servlet api 获取 website-" + request.getSession().getAttribute("website"));
return "success";
}
获取HTTP的请求(request)对象属性值,用来传递给控制器的参数。
三.复杂参数
1.基本介绍
2.复杂参数应用实例
2.1说明 :
2.2代码演示
//响应一个注册请求
@GetMapping("/register")
public String register(Map<String,Object> map,
Model model,
HttpServletResponse response) {
//如果一个注册请求,会将注册数据封装到map或者model
//map中的数据和model的数据,会被放入到request域中
map.put("user","hspedu");
map.put("job","java架构师");
model.addAttribute("sal", 80000);
//一会我们再测试response使用
//我们演示创建cookie,并通过response 添加到浏览器/客户端
Cookie cookie = new Cookie("email", "hspedu@sohu.com");
response.addCookie(cookie);
//请求转发
return "forward:/registerOk";
}
@ResponseBody
@GetMapping("/registerOk")
public String registerOk(HttpServletRequest request) {
System.out.println("user-" + request.getAttribute("user"));
System.out.println("job-" + request.getAttribute("job"));
System.out.println("sal-" + request.getAttribute("sal"));
return "success";
}
四.自定义对象参数-自动封装
1.基本介绍
2.自定义对象参数-应用实例
2.1需求说明 :
演示自定义对象参数使用,完成自动封装,类型转换
2.2代码实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加妖怪</title>
</head>
<body>
<h1>添加妖怪-坐骑[测试封装POJO;]</h1>
<form action="/savemonster" method="post">
编号: <input name="id" value="100"><br/>
姓名: <input name="name" value="牛魔王"/> <br/>
年龄: <input name="age" value="500"/> <br/>
婚否: <input name="isMarried" value="true"/> <br/>
生日: <input name="birth" value="2000/11/11"/> <br/>
<!-- 使用自定义转换器关联car, 字符串整体提交, 使用,号间隔 -->
坐骑:<input name="car" value="避水金晶兽,666.6"><br/>
<!-- 坐骑名称:<input name="car.name" value="法拉利"/><br/>-->
<!-- 坐骑价格:<input name="car.price" value="9999.9"/>-->
<input type="submit" value="保存"/>
</form>
</body>
</
Car.java
@ToString
@Data
public class Car {
private String name;
private Double price;
}
Monster.java
@ToString
@Data
public class Monster {
private Integer id;
private String name;
private Integer age;
private Boolean isMarried;
private Date birth;
private Car car;
}
@PostMapping("/savemonster")
public String saveMonster(Monster monster){
System.out.println("monster= " + monster);
return "success";
}