目录
2.6演示@RequestAttribute,SessionAttribute 使用
演示各种方式提交数据/参数给服务器,服务器如何使用注解接收
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>indextitle>
- head>
- <body>
- <h1>hello, 海绵hongh1>
- 基本注解:
- <hr/>
- <a href="/monster/200/jack">@PathVariable-路径变量 monster/200/jacka><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>
需求: 演示各种方式提交数据/参数给服务器,服务器如何使用注解接收
- @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
map 把所有传递的值传入map - * 6. 可以看下@PathVariable源码
- */
- @GetMapping("/monster/{id}/{name}")
- public String pathVariable(@PathVariable("id") Integer id,
- @PathVariable("name") String name,
- @PathVariable Map
map) { - System.out.println("id-" + id);
- System.out.println("name-" + name);
- System.out.println("map-" + map);
- return "success";
- }
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
- /**
- * @RequestHeader("Host") 获取http请求头的 host信息
- * @RequestHeader Map
header: 获取到http请求的所有信息 - *@RequestHeader("host") String host,将请求头中的变量值host映射到控制器参数host中
- */
- @GetMapping("/requestHeader")
- public String requestHeader(@RequestHeader("host") String host,
- @RequestHeader Map
header, - @RequestHeader("accept") String accept) {
- System.out.println("host-" + host);
- System.out.println("header-" + header);
- System.out.println("accept-" + accept);
- return "success";
- }
@RequestHeader 是获取请求头中的数据,通过指定参数 value 的值来获取请求头中指定的参数值
-
- /**
- * 解读
- * 如果我们希望将所有的请求参数的值都获取到,可以通过
- *
- * @param username
- * @param fruits
- * @param paras
- * @return
- * @RequestParam Map
paras 获取 - */
- @GetMapping("/hi")
- public String hi(@RequestParam(value = "name") String username,
- @RequestParam("fruit") List
fruits, - @RequestParam Map
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,如果没有传该参数,就使用默认值
- /**
- * 因为我的浏览器目前没有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:默认值
- **
- * @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。
- @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)对象属性值,用来传递给控制器的参数。
- //响应一个注册请求
- @GetMapping("/register")
- public String register(Map
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";
- }
演示自定义对象参数使用,完成自动封装,类型转换
- 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/>
- 坐骑名称:<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";
- }
