首頁 > 軟體

SpringBoot接收引數使用的註解範例講解

2022-08-17 22:00:42

1.基本介紹

SpringBoot 接收使用者端提交資料/引數會使用到相關注解

詳 解 @PathVariable 、 @RequestHeader 、 @ModelAttribute 、 @RequestParam 、 @MatrixVariable、@CookieValue、@RequestBody

2.接收引數相關注解應用範例

1.需求: 演示各種方式提交資料/引數給伺服器,伺服器如何使用註解接收

2.應用範例演示

需求: 演示各種方式提交資料/引數給伺服器,伺服器如何使用註解接收

建立srcmainresourcesstaticindex.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
<h1>hello, llp</h1>
基本註解:
<hr/>
<a href="/monster/200/jack" rel="external nofollow" >@PathVariable-路徑變數 monster/200/jack</a><br/><br/>
</body>
</html>

@PathVariable 使用

演示@PathVariable 使用,建立srcmainjavacomllpspringbootcontrollerParameterController.java, 完成測試

@RestController
public class ParameterController {
    /**
     * /monster/{id}/{name} 解讀
     * 1. /monster/{id}/{name} 構成完整請求路徑
     * 2. {id} {name} 就是佔位變數
     * 3. @PathVariable("name"): 這裡name 和{name} 命名保持一致
     * 4. String name_ 這裡自定義,和{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";
    }
}

@RequestHeader 使用

演示@RequestHeader 使用,修改 ParameterController.java , 完成測試

√ 修改 index.html

<a href="/requestHeader" rel="external nofollow" >@RequestHeader-獲取Http請求頭 </a><br/><br/>

√ 修改 ParameterController.java

/**
 * @RequestHeader("Host") 獲取http請求頭的 host資訊
 * @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);
    System.out.println("header-" + header);
    System.out.println("accept-" + accept);
    return "success";
}

@RequestParam 使用

演示@RequestParam 使用,修改 ParameterController.java , 完成測試

√ 修改 index.html

<a href="/hi?name=wukong&fruit=apple&fruit=pear&id=300&address=北京" rel="external nofollow" >@RequestParam-獲取請求引數</a><br/><br/>

√ 修改 ParameterController.java

/**
 * @param username wukong
 * @param fruits  List<String> fruits 接收集合 [apple, pear]
 * @param paras Map<String, String> paras 如果我們希望將所有的請求引數的值都獲取到,
 *              可以通過@RequestParam Map<String, String> paras這種方式
 *             一次性的接收所有的請求引數 {name=wukong, fruit=apple, id=300, address=北京}
 *             如果接收的某個引數中有多個之值比如這裡fruits是一個集合,從map中只能拿到一個
 *              可以理解map底層會將相同的key的value值進行覆蓋
 * @return
 * @RequestParam
 */
@GetMapping("/hi")
public String hi(@RequestParam(value = "name") String username,
                 @RequestParam("fruit") List<String> fruits,
                 @RequestParam Map<String, String> paras) {
    //username-wukong
    System.out.println("username-" + username);
    //fruit-[apple, pear]
    System.out.println("fruit-" + fruits);
    //paras-{name=wukong, fruit=apple, id=300, address=北京}
    System.out.println("paras-" + paras);
    return "success";
}

@CookieValue 使用

演示@CookieValue 使用,修改 ParameterController.java , 完成測試

√ 修改 index.html

<a href="/cookie" rel="external nofollow" >@CookieValue-獲取cookie值</a><br/><br/>

√ 修改 ParameterController.java

/**
 * 因為我的瀏覽器目前沒有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";
}

@RequestBody 使用

演示@RequestBody 使用,修改 ParameterController.java , 完成測試

√ 修改 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";
}

@RequestAttribute 和 @SessionAttribute使用

演示@RequestAttribute @SessionAttribute使用,建立 com/hspedu/web/controller/RequestController.java , 完成測試

√ 修改 index.html

<a href="/login" rel="external nofollow" >@RequestAttribute、@SessionAttribute-獲取request域、session屬性-</a>

√ 建立 RequestController.java

    @GetMapping("/login")
    public String login(HttpServletRequest request) {
        request.setAttribute("user", "llp");
        //向session中新增資料
        request.getSession().setAttribute("website", "http://www.baidu.com");
        //這裡需要使用forward關鍵字,如果不適用則會走檢視解析器,這
        //裡檢視解析器字首設定的是/  字尾設定的.html  ---> /ok.html
        //而請求轉發在伺服器端執行,/被解析成 ip:port/工程路徑
        //進而最終得到的完整路徑是 ip:port/工程路徑/ok.html
        //但是我們這裡希望存取的是 ip:port/工程路徑/ok這個請求路徑
        //因此這裡手動的設定forward:/ok ,底層會根據我們設定的路徑進行請求轉發
        return "forward:/ok";
    }
    @GetMapping("ok")
    //返回字串,不走檢視解析器
    @ResponseBody
    public String ok(@RequestAttribute(value = "user", required = false) String username,
                     @SessionAttribute(value = "website",required = false) String website, HttpServletRequest 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";
    }
}

3.複雜引數

1.基本介紹

  • 在開發中,SpringBoot 在響應使用者端請求時,也支援複雜引數
  • Map、Model、Errors/BindingResult、RedirectAttributes、ServletResponse、SessionStatus、 UriComponentsBuilder、ServletUriComponentsBuilder、HttpSession
  • Map、Model 資料會被放在 request 域, 底層 request.setAttribute()
  • RedirectAttributes 重定向攜帶資料

2.複雜引數應用範例

####1.說明 : 演示覆雜引數的使用,重點: Map、Model、ServletResponse

2.程式碼實現

//響應一個註冊請求
@GetMapping("/register")
public String register(Map<String,Object> map,
                       Model model,
                       HttpServletResponse response) {
    //如果一個註冊請求,會將註冊資料封裝到map或者model
    //map中的資料和model的資料,會被放入到request域中
    map.put("user","llp");
    map.put("job","碼農");
    model.addAttribute("sal", 2500);
    //一會我們再測試response使用
    //我們演示建立cookie,並通過response 新增到瀏覽器/使用者端
    Cookie cookie = new Cookie("email", "123@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";
}

4.自定義物件引數-自動封裝

1.基本介紹

  • 在開發中,SpringBoot 在響應使用者端請求時,也支援自定義物件引數
  • 完成自動型別轉換與格式化
  • 支援級聯封裝

2.自定義物件引數-應用範例

1.需求說明 : 演示自定義物件引數使用,完成自動封裝,型別轉換

2.程式碼實現

1.建立srcmainresourcesstaticsave.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/>
    <!--注意這裡car物件是monster的屬性,給物件屬性賦值時需要以物件名.欄位名的方式-->
    坐騎:<input name="car.name" value="法拉利"/><br/>
    價格:<input name="car.price" value="99999.9"/>
    <input type="submit" value="儲存"/>
</form>
</body>
</html>

2.修改srcmainjavacomllpspringbootcontrollerParameterController.java

@PostMapping("/savemonster")
public String saveMonster(Monster monster) {
    System.out.println("monster= " + monster);
    return "success";
}

到此這篇關於SpringBoot接收引數使用的註解範例講解的文章就介紹到這了,更多相關SpringBoot接收引數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com