当前位置:网站首页>10. Notes on receiving parameters

10. Notes on receiving parameters

2022-08-10 23:48:00 If you want to learn, learn Big Wolf


10.1 基本介绍

  1. SpringBoot 接收客户端提交数据/参数会使用到相关注解
  2. 详解 @PathVariable, @RequestHeader,@ModelAttribute , @RequestParam,@MatrixVariable,@CookieValue,@RequestBody

10.2 接收参数相关注解应用实例

  • 需求说明:演示各种方式提交数据/参数给服务器,服务器如何使用注解接收

  • 应用实例演示:

在这里插入图片描述


10.2.1 @PathVariable

  1. 创建 D:\xjs_springboot\springbootweb\src\main\resources\public\index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
<h1>Receive parameter related explanation demo</h1>
基本注解:
<hr/>
<!--http://localhost:8080/monster/100/king-->
<a href="/monster/100/king">@PathVariable-(路径变量)monster/100/king</a> <br/><br/>
</body>
</html>
  1. 演示@PathVariable 使用,创建 D:\xjs_springboot\springbootweb\src\main\java\com\xjs\springboot\controller\ParameterController.java ,完成测试
package com.xjs.springboot.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/** * @Author: 谢家升 * @Version: 1.0 */
@RestController
public class ParameterController {
    

    /** * 解读: * 1. /monster/{id}/{name} Forms the complete request path * 2. {id} {name} 就是占位变量 * 3. @PathVariable("name") 这里是name 和 {name}里面的 name要保持一致 * 4. @PathVariable Map<String, String> map Indicates that all passed values ​​are passed inmap */
    @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";
    }

}

在这里插入图片描述

10.2.2 @RequestHeader

  1. 演示@RequestHeader 使用,修改 ParameterController.java ,完成测试
  • 修改 index.html
<a href="/requestHeader">@RequestHeader-获取Http请求头 </a><br/><br/>
  • 修改 ParameterController.java
    /** * 解读: * 1. @RequestHeader("Host") String host : 表示 获取http请求头的 host信息 * 2. @RequestHeader Map<String, String> header 获取到http请求的所有信息 */
    @GetMapping("/requestHeader")
    public String requestHeader(@RequestHeader("Host") String host,
                                @RequestHeader Map<String, String> header,
                                @RequestHeader("accept") String accept) {
    
        System.out.println("host--" + host); //ip + port
        System.out.println("header--" + header);
        System.out.println("accept--" + accept);
        return "success";
    }
  • 完成测试

10.2.3 @RequestParam

  1. 演示@RequestParam 使用,修改 ParameterController.java , 完成测试
  • 修改 index.html
<a href="/requestParam?name=灰太狼&fruit=apple&fruit=pear&id=200&address=青青草原">@RequestParam-获取请求参数</a><br/><br/>
  • 修改 ParameterController.java
    /** * 解读: * 1. 如果我们希望将所有的请求参数的值都获取到,可以通过 @RequestParam Map<String, String> params * 2. 注意如果使用map来获取,A parameter name can only correspond to one value * 3. If a parameter name corresponds to multiple parameter values,可以用list获取 如 : @RequestParam("fruit") List<String> fruits */
    @GetMapping("/requestParam")
    public String requestParam(@RequestParam(value = "name") String username,
                               @RequestParam("fruit") List<String> fruits,
                               @RequestParam Map<String, String> params) {
    
        System.out.println("username--" + username);
        System.out.println("fruits--" + fruits);
        System.out.println("params--" + params);
        return "success";
    }

在这里插入图片描述

10.2.4 @CookieValue

  1. 演示@CookieValue 使用
  • 修改 index.html
<a href="cookie">@CookieValue-获取 cookie 值</a><br/><br/>
  • 修改 ParameterController.java
    /** * 因为我的浏览器目前没有 cookie , We can set it ourselvescookie[这个技巧很有用!] * 如果要测试,可以先写一个方法,在浏览器创建对应的 cookie * 说明 * 1. value = "cookie_key" 表示接收名字为 cookie_key 的 cookie * 2. 如果浏览器携带来对应的 cookie , The latter parameter type is  String ,则接收到的是对应对 value * 3. The latter parameter type is  Cookie ,则接收到的是封装好的对应的 cookie */
    @GetMapping("/cookie")
    public String cookie(@CookieValue(value = "cookie_key", required = false) String cookie_value,
                         @CookieValue(value = "username", required = false) Cookie cookie,
                         HttpServletRequest request) {
    
        System.out.println("cookie_value--" + cookie_value);
        System.out.println("username--" + cookie.getName() + "-" + cookie.getValue());
        //也可以用原生的servlet API来获取
        System.out.println("---------------");
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie1 : cookies) {
    
            System.out.println(cookie1.getName() + "=>" + cookie1.getValue());
        }
        return "success";
    }
  • 完成测试

在这里插入图片描述


在这里插入图片描述

10.2.5 @RequestBody

  1. 演示@RequestBody 使用
  • 修改 index.html
<hr/>
<h1>测试@RequestBody 获取数据: 获取 POST 请求体</h1>
<form action="/save" method="post">
    姓名: <input name="name"/> <br>
    年龄: <input name="age"/> <br/>
    <input type="submit" value="提交"/>
</form>
  • 修改 ParameterController.java
    /** * @RequestBody 是整体取出 Post 请求内容 */
    @PostMapping("/save")
    public String postMethod(@RequestBody String content) {
    
        System.out.println("content--" + content);
        return "success";
    }
  • 完成测试

在这里插入图片描述


在这里插入图片描述

10.2.6 @RequestAttribute

  1. 演示@RequestAttribute 使用
  • 修改 index.html
<a href="/login">@RequestAttribute-获取 request 域属性-</a>
  • 创建 D:\xjs_springboot\springbootweb\src\main\java\com\xjs\springboot\controller\RequestController.java
package com.xjs.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

/** * @Author: 谢家升 * @Version: 1.0 */
@Controller
public class RequestController {
    

    @GetMapping("/login")
    public String login(HttpServletRequest request) {
    
        request.setAttribute("user", "红太狼"); //向request域中存放数据
        return "forward:/ok"; //请求转发到 /ok 
    }

    @GetMapping("/ok")
    @ResponseBody
    public String ok(@RequestAttribute(value = "user", required = false) String username,
                     HttpServletRequest request) {
    
        //获取到request域中的数据
        System.out.println("username--" + username);
        System.out.println("通过servlet api 获取 username--" + request.getAttribute("user"));
        return "success";
    }

}

  • 完成测试

在这里插入图片描述

10.2.7 @SessionAttribute

  • 根据原生 java web ,举一反三,类比学习
  • 修改 RequestController.java

在这里插入图片描述

在这里插入图片描述

package com.xjs.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttribute;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/** * @Author: 谢家升 * @Version: 1.0 */
@Controller
public class RequestController {
    

    @GetMapping("/login")
    public String login(HttpServletRequest request) {
    
        request.setAttribute("user", "红太狼"); //向request域中存放数据
        //向session域中添加数据
        request.getSession().setAttribute("website","https://www.baidu.com");
        return "forward:/ok"; //请求转发到 /ok
    }

    @GetMapping("/ok")
    @ResponseBody
    public String ok(@RequestAttribute(value = "user", required = false) String username,
                     HttpServletRequest request,
                     @SessionAttribute(value = "website", required = false) String website) {
    
        //获取到request域中的数据
        System.out.println("username--" + username);
        System.out.println("通过servlet api 获取 username--" + request.getAttribute("user"));

        //获取到session域中的数据
        System.out.println("website--" + website);
        System.out.println("通过servlet api 获取 website--" + request.getSession().getAttribute("website"));
        return "success";
    }

}

  • 完成测试

在这里插入图片描述

10.3 复杂参数

10.3.1 基本介绍

  1. 在开发中,SpringBoot 在响应客户端请求时,也支持复杂参数
  2. MapModel、Errors/BindingResult、RedirectAttributesServletResponse、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder、HttpSession
  3. Map、Model 数据会被放在 request 域, 底层 request.setAttribute()
  4. RedirectAttributes 重定向携带数据

10.3.2 复杂参数应用实例

  • 需求说明:演示复杂参数的使用,重点: Map、Model、ServletResponse
  • 代码实现:
  1. 修改 D:\xjs_springboot\springbootweb\src\main\java\com\xjs\springboot\controller\RequestController.java
package com.xjs.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttribute;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Map;

/** * @Author: 谢家升 * @Version: 1.0 */
@Controller
public class RequestController {
    

    //响应一个注册请求
    @GetMapping("/register")
    public String register(Map<String, Object> map,
                           Model model,
                           HttpServletResponse response) {
    

        //If a registration request is sent,会将注册数据封装到map或者model
        //map中的数据和model中的数据,会放入到 request域 中
        map.put("user", "xjs");
        map.put("job", "java架构师");
        model.addAttribute("salary", 80000);

        //演示创建cookie,并通过response 添加到 浏览器/客户端
        Cookie cookie = new Cookie("email", "[email protected]");
        response.addCookie(cookie);

        //请求转发
        return "forward:/registerOk";
    }

    @GetMapping("/registerOk")
    @ResponseBody
    public String registerOk(HttpServletRequest request) {
    

        //获取 request域 中的 map/model 数据
        System.out.println("user= " + request.getAttribute("user"));
        System.out.println("job= " + request.getAttribute("job"));
        System.out.println("salary= " + request.getAttribute("salary"));
        return "success";
    }

}

  • 完成测试

在这里插入图片描述

在这里插入图片描述


10.4 自定义对象参数-自动封装

10.4.1 基本介绍

  1. 在开发中,SpringBoot 在响应客户端请求时,也支持自定义对象参数
  2. 完成自动类型转换与格式化
  3. 支持级联封装

10.4.2 自定义对象参数-应用实例

  • 需求说明:演示自定义对象参数使用,完成自动封装,类型转换

在这里插入图片描述


  • 代码实现:
  1. 创建 public/save.html
<!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="120"/> <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="99999.9"/>
    <input type="submit" value="保存"/>
</form>
</body>
</html>
  1. 创建 D:\xjs_springboot\springbootweb\src\main\java\com\xjs\springboot\bean\Car.java
  • 注意要引入 Lombok
 <!--引入Lombok-->
 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
 </dependency>
package com.xjs.springboot.bean;

import lombok.Data;

/** * @Author: 谢家升 * @Version: 1.0 */
@Data
public class Car {
    
    private String name;
    private Double price;
}

  1. 创建 D:\xjs_springboot\springbootweb\src\main\java\com\xjs\springboot\bean\Monster.java
package com.xjs.springboot.bean;

import lombok.Data;

import java.util.Date;

/** * @Author: 谢家升 * @Version: 1.0 */
@Data
public class Monster {
    
    private Integer id;
    private String name;
    private Integer age;
    private Boolean isMarried;
    private Date birth;
    private Car car;
}

  1. 修改 D:\xjs_springboot\springbootweb\src\main\java\com\xjs\springboot\controller\ParameterController.java ,Added handling of add requests
package com.xjs.springboot.controller;

import com.xjs.springboot.bean.Monster;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/** * @Author: 谢家升 * @Version: 1.0 */
@RestController
public class ParameterController {
    

    //处理添加monster的方法
    @PostMapping("/saveMonster")
    public String saveMonster(Monster monster) {
    

        System.out.println("monster-" + monster);
        return "success";
    }

}

  1. 完成测试, 浏览器 http://localhost:8080/save.html

在这里插入图片描述


在这里插入图片描述

原网站

版权声明
本文为[If you want to learn, learn Big Wolf]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/222/202208102335003033.html