springboot/springMVC中controller層設(shè)計(編解碼)

0.SpringMVC中參數(shù)解析原理

1.入?yún)⒊鰠㈩愋拖薅?/h1>

(此處以入?yún)⒊鰠閖son類型為例)
圖片.png

此外,還支持,xml,text等多種類型:
圖片.png

2.入?yún)⑹莏son類型,但是參數(shù)個數(shù)不確定

2.1方法一:

    @PostMapping("/master")
    public List<Stu> master(@RequestBody Map<String, Object> map){
        System.out.println(map);
        return stuService.hello();
    }

postman訪問,入?yún)⑹纠?
圖片.png

打印的結(jié)果示例:

{first_name=Douglas, last_name=Fir, age=35, about=I like to build cabinets, interests=forestry}

2.2方法二:

    @PostMapping("/master")
    public List<Stu> master(@RequestBody String params){
        Map<String, String> map = JSON.parseObject(params, Map.class);
        Set<String> keys = map.keySet();
        for (String key : keys){
            System.out.println(key + "=============" + map.get(key));
        }
        return stuService.hello();
    }

postman與上述2.1調(diào)用相同時,打印結(jié)果示例:

about=============I like to build cabinets
last_name=============Fir
interests=============forestry
first_name=============Douglas
age=============35

3.springMVC實現(xiàn)路徑的模糊匹配

奋隶?: 匹配一個字符
* : 匹配任意字符
**: 匹配多層路徑

3.1下述可以匹配的規(guī)則如:

http://localhost:8081/hello/tom/20/a/b/c/d/e/f
    @RequestMapping(path = "/hello/{name}/{age}/**")
    @ResponseBody
    public Object hello(@PathVariable("name") String name, 
                        @PathVariable("age") Integer age, 
                        HttpServletRequest request){
        return request.getRequestURL();
    }

3.2下述可以匹配的url為:

http://localhost:8081/world/abc
    @RequestMapping(path = "/world/{zzz:.*}")
    @ResponseBody
    public Object world(HttpServletRequest request){
        return request.getRequestURL();
    }

3.3采用代理模式修改RestTemplate

@AllArgsConstructor
public abstract class FilterRestTemplate implements RestOperations {
    @Delegate  // lombok的注解
    protected volatile RestTemplate restTemplate;
}

4.常見問題

4.1編解碼問題

服務(wù)端

controller層.png

前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>hello</title>
    <script type="text/javascript" src="../res/js/jquery-3.4.1.js"></script>
</head>
<body>
<div>
    <form id="addAddress">
        <input type="text" name="province" id="province">
        <input type="text" name="addName" id="addName">
        <input type="button" value="submit" id="submit"><br>
    </form>
</div>
</body>
<script>
    // 先引入 jquery
    $("#submit").click(function () {
        let str = {"province": $("#province").val(), "addName": $("#addName").val()};
        $.ajax({
            url: "http://localhost:8091/api/addAddress",
            type: 'POST',
            data: JSON.stringify(str),
            contentType: "application/json",
            success: function (msg) {
                console.log("msg-->" + msg);
            },
            error: function (msg) {
                console.log("msg-->" + msg);
            }
        })
    })
</script>
</html>

http://www.reibang.com/p/53b5bd0f1d44 (兩種POST格式)

5.常用注解

package com.zy.spring.controller;

import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@RestController
public class HiController {

    @RequestMapping("/pathVariable/{orderNo}/{orderMoney}")
    public void pathVariable(@PathVariable("orderNo") String orderNo, @PathVariable("orderMoney") String orderMoney, HttpServletRequest request) {
        System.out.println(orderNo);
        System.out.println(orderMoney);
    }

    /**
     * 表示這個參數(shù)是通過前端傳遞過來的,如果請求里沒有這個參數(shù)晌纫,則會報錯400 Bad Request劲件。
     * 這個注解用來解析請求路徑里的參數(shù)(get請求)或者post請求中form表單格式的請求參數(shù)嗓化。
     * 用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內(nèi)容。
     * @param orderNo
     * @param request
     */
    @RequestMapping("/requestParam")
    public void requestParam(@RequestParam("orderNo") String orderNo, HttpServletRequest request) {
        System.out.println(orderNo);
    }

    /**
     * 用來接收POST請求BODY里的參數(shù),格式為JSON格式于毙。
     * 用來處理Content-Type: 為 application/json皮迟、application/xml等格式的數(shù)據(jù)宪卿。
     * @param maps
     * @param request
     */
    @RequestMapping("/requestBody")
    public void requestBody(@RequestBody Map<String, String> maps, HttpServletRequest request) {
        System.out.println(maps);
    }

    @RequestMapping("/requestHeader")
    public void requestHeader(@RequestHeader Map<String, String> maps, HttpServletRequest request) {
        System.out.println(maps);
    }

    /**
     * @RequestAttribute 注解的參數(shù)在項目里是自己解析出來的,并不是前端傳遞的万栅。
     * 具體一點佑钾,在項目里的攔截器里會對Token信息進行解析,解析出來的參數(shù)重新放在請求里,
     * (用httpServletRequest.setAttribute(name, value))烦粒,后邊接口接收參數(shù)時就用這個注解休溶。
     * @param attr1
     * @param request
     */
    @RequestMapping("/requestAttribute")
    public void requestAttribute(@RequestAttribute(value = "attr1") String attr1, HttpServletRequest request) {
        System.out.println(attr1);
    }

    /**
     * 在 header 中的 cookie 中設(shè)置
     * @param authToken
     * @param request
     */
    @RequestMapping("/cookieValue")
    public void cookieValue(@CookieValue(value = "authToken") String authToken, HttpServletRequest request) {
        System.out.println(authToken);
    }

}

參考資源
https://www.cnblogs.com/007tangtao/p/9251861.html?utm_source=debugrun&utm_medium=referral

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扰她,隨后出現(xiàn)的幾起案子兽掰,更是在濱河造成了極大的恐慌,老刑警劉巖徒役,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孽尽,死亡現(xiàn)場離奇詭異,居然都是意外死亡忧勿,警方通過查閱死者的電腦和手機杉女,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸳吸,“玉大人熏挎,你說我怎么就攤上這事∩卫” “怎么了坎拐?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我哼勇,道長都伪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任积担,我火速辦了婚禮陨晶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磅轻。我一直安慰自己珍逸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布聋溜。 她就那樣靜靜地躺著谆膳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撮躁。 梳的紋絲不亂的頭發(fā)上漱病,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音把曼,去河邊找鬼杨帽。 笑死,一個胖子當(dāng)著我的面吹牛嗤军,可吹牛的內(nèi)容都是我干的注盈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叙赚,長吁一口氣:“原來是場噩夢啊……” “哼老客!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起震叮,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胧砰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后苇瓣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尉间,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年击罪,在試婚紗的時候發(fā)現(xiàn)自己被綠了哲嘲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡外邓,死狀恐怖撤蚊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情损话,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站丧枪,受9級特大地震影響光涂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拧烦,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一忘闻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恋博,春花似錦齐佳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疫衩,卻和暖如春硅蹦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背闷煤。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工童芹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲤拿。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓假褪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親近顷。 傳聞我的和親對象是個殘疾皇子生音,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)幕庐,斷路器久锥,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 1 窗外的雨,還在下著异剥,沒有一絲一毫想要停下來的意思瑟由。嘩嘩作響,拍打著屋瓦房檐冤寿。 可是歹苦,我不關(guān)心雨什么時候會停,也...
    文染時光閱讀 1,591評論 36 37
  • 如今的你有沒有想過督怜,身邊給你帶來資源的朋友有幾個殴瘦?也可以說當(dāng)你需要幫助的時候誰會給你幫助 1 今天上營運把美食分享...
    melody靜閱讀 156評論 0 0
  • 踐行整整一月了,這次的檢視就被稱為月檢視吧号杠。 所有的一切照常進行著蚪腋,之前看到的因為學(xué)習(xí)時間管理把自己弄成抑郁癥的故...
    吃青蛙的同學(xué)閱讀 92評論 0 0