最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot開發(fā)詳解之Controller接收參數(shù)及參數(shù)校驗

 更新時間:2022年03月14日 10:40:22   作者:尼斯湖水鬼  
數(shù)據(jù)校驗是為了使系統(tǒng)更完整,數(shù)據(jù)更精確,同時也有利于維護數(shù)據(jù)的安全性,下面這篇文章主要給大家介紹了關于SpringBoot開發(fā)詳解之Controller接收參數(shù)及參數(shù)校驗的相關資料,需要的朋友可以參考下

Controller 中注解使用

接受參數(shù)的幾種傳輸方式以及幾種注解:

在上一篇中,我們使用了JDBC鏈接數(shù)據(jù)庫,完成了簡單的后端開發(fā)。但正如我在上文中拋出的問題,我們能不能更好的優(yōu)化我們在Controller中接受參數(shù)的方式呢?這一篇中我們就來聊一聊怎么更有效的接收Json參數(shù)。

傳輸參數(shù)的幾種Method

在定義一個Rest接口時,我們通常會使用GET,POST,PUT,DELETE幾種方式來完成我們所需要進行CRUD的一些操作,我們在這里羅列和教大家在實際開發(fā)中的使用,一些基本概念我們就不再贅述,例如使用POST的優(yōu)缺點,可使用參數(shù)的大小限制等地:

  • GET:一般用于查詢數(shù)據(jù),不辦函數(shù)據(jù)的更新以及插入操作。由于明文傳輸?shù)年P系,我們一般用來獲取一些無關用戶的信息。
  • POST:一般用于數(shù)據(jù)的插入操作,也是使用最多的傳輸方式,但是在H5調(diào)用時會有跨域的問題,一般使用JSONP來解決。
  • PUT:我們使用PUT方式來對數(shù)據(jù)進行更新操作。
  • DELETE:用于數(shù)據(jù)刪除,注意在數(shù)據(jù)庫內(nèi)是邏輯刪除(改變數(shù)據(jù)狀態(tài),用戶不再查詢得到,但還保留在數(shù)據(jù)庫內(nèi))還是物理刪除(真刪了)。

以上是很標準的REST風格的接口形式,其實我們可以進源碼看到,他們只不過封裝了

@RequestMapping(
method = {RequestMethod.POST}
)

這個方法,和我們使用以前的@RequestMapping后寫參數(shù)是一致的。但是在實際開發(fā)中我們一般是前后端分離開發(fā)的,像IOS以及ANDROID開發(fā)他們會固定使用同一套模版進行傳輸,這時可能你所有的接口都會是POST方法。這需要你在開發(fā)中事先和前端人員進行約定,這時接口文檔就會變得非常重要了。方法,入?yún)?,出參,報錯信息都必須清晰的描述在接口文檔中,所以不要小看編寫文檔的能力哦。當然,SpringBoot也為我們提供了強大的API模版,例如swagger。不過使用swagger也不是一勞永逸的,關于swagger,我們之后再聊。

獲取參數(shù)的幾種常用注解

在上一篇中我們使用了幾種注解來獲取參數(shù),例如@RequestParam,@PathVariable,@RequestBody。那我們現(xiàn)在來逐一看一下這些注解我們該如何使用。

  • @PathVariable:一般我們使用URI template樣式映射使用,即url/{param}這種形式,也就是一般我們使用的GET,DELETE,PUT方法會使用到的,我們可以獲取URL后所跟的參數(shù)。
  • @RequestParam:一般我們使用該注解來獲取多個參數(shù),在()內(nèi)寫入需要獲取參數(shù)的參數(shù)名即可,一般在PUT,POST中比較常用。
  • @RequestBody:該注解和@RequestParam殊途同歸,我們使用該注解將所有參數(shù)轉(zhuǎn)換,在代碼部分在一個個取出來,也是目前我使用到最多的注解來獲取參數(shù)(因為前端不愿意一個一個接口的調(diào)試)例如下代碼:
@PostMapping("/createUserByMap")
public void createUserByMap(@RequestBody Map<String,Object> reqMap){
    String tel = reqMap.get("tel").toString();
    String pwd = reqMap.get("pwd").toString();
    userService.createUser(tel,pwd);
}

當然,我們獲取參數(shù)不僅僅只有上面所提到的那些,還有@RequestHeader來獲取頭信息里的值,@CookieValue來獲取Cookie值等等。在這,我也僅僅說明一些較常用的取值方法而已。

使用對象直接獲取參數(shù)

當我們掌握以上幾種方式來獲取參數(shù)時,看似已經(jīng)毫無問題,其實還是有的,如果我們的入?yún)⑹侄嗄兀恳话賻资畟€參數(shù),你是血一百幾十個@RequestParam,還是@RequestBody之后取一百幾十個次呢?,明顯這些做法都十分麻煩,代碼太多,關鍵是我們懶啊……所以,我們也可以通過POJO來直接獲取參數(shù),之后通過GET方法直接把需要的參數(shù)取出就好。

我們來將上一次的方法給改變下:

/**
 * 添加用戶2
 * @param userInfo
 */
@PostMapping("/createUser2")
public void createUser2(UserInfo userInfo){
    userService.createUser(userInfo.getTel(),userInfo.getPassWord());
}

我們來測試一下,發(fā)現(xiàn)失敗了,通過錯誤信息,我們發(fā)現(xiàn)SQL提示password為null,也就是說我們沒有獲取到pwd這個參數(shù),這是因為如果使用對象接受參數(shù),那參數(shù)名必須喝對象的屬性名保持一致。

我們修改參數(shù)名為passWord后可以發(fā)現(xiàn),數(shù)據(jù)可以爭產(chǎn)的進行插入了。

使用@Valid對參數(shù)進行校驗

在使用對象進行參數(shù)接收時,我們可以對參數(shù)進行校驗,假設我們需要用戶輸入的密碼是整數(shù)型且在000000至999999之間的數(shù)值,我們可以對屬性passWord加上如下注解:

@Max(value = 999999,message = "超過最大數(shù)值")
@Min(value = 000000,message = "密碼設定不正確")
private String passWord;

這里舉的列子并不十分合適,請注意。我們只是針對表單驗證進行講解,在實際開發(fā)處理中要選擇合適的操作。message是反回的提示默認信息。
在controller中我們改寫一下,將返回值設為String,讓我們可以看到報錯信息。

然后我們給對象加入@Valid注解,并在參數(shù)中加入BindingResult來獲取錯誤信息。在邏輯處理中我們判斷BindingResult知否含有錯誤信息,如果有錯誤信息,則直接返回錯誤信息。

/**
 * 添加用戶2
 * @param userInfo
 */
@PostMapping("/createUser2")
public String createUser2(@Valid UserInfo userInfo, BindingResult bindingResult){
    if (bindingResult.hasErrors()){
        return bindingResult.getFieldError().getDefaultMessage();
    }
    userService.createUser(userInfo.getTel(),userInfo.getPassWord());
    return "OK";
}

我們繼續(xù)通過POSTMAN來測試一下,首先我們傳入-10000來設定密碼,發(fā)現(xiàn)提示錯誤密碼設定不正確:

發(fā)現(xiàn)無法完成用戶注冊,我們繼續(xù)通過添加密碼為1000000來設定密碼,發(fā)現(xiàn)提示錯誤信息超過最大數(shù)值:

以上就是我們通過簡單的表單驗證來預防一些惡意數(shù)據(jù)的侵入。不知道你有沒有掌握呢?當然,我們對于數(shù)據(jù)的驗證不僅僅只有表單驗證,我們一般通過數(shù)據(jù)簽名的方式來驗證一個請求是否合法,也可能是將整個參數(shù)進行對稱加密后進行傳輸以保證數(shù)據(jù)不被明文抓包。

那以上所說的處理模式就會用到Spring為我們提供的另一個強大的功能,也是我們使用Spring系列框架中不可或缺的一部分,AOP,切面編程。我們之前所說的統(tǒng)一報錯處理也是使用的AOP功能進行處理的,那關于AOP,我們下周再聊。(原諒我懶得要死,這篇文章也是被迫趕工的……捂臉,逃……)(???)?

以上所有的代碼我已經(jīng)上傳到GitHub

round1-springboot

如果心急的小伙伴也可以去clone我已經(jīng)完成的項目,這個項目中把一些常用功能都寫了,并且都寫注釋啦?。。?/p>

MySpringBoot

總結(jié)

到此這篇關于SpringBoot開發(fā)詳解之Controller接收參數(shù)及參數(shù)校驗的文章就介紹到這了,更多相關SpringBoot Controller接收參數(shù)及校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot配置動態(tài)數(shù)據(jù)源的實戰(zhàn)詳解

    SpringBoot配置動態(tài)數(shù)據(jù)源的實戰(zhàn)詳解

    Spring對數(shù)據(jù)源的管理類似于策略模式,不懂策略模式也沒關系,其實就是有一個全局的鍵值對,類型是Map<String, DataSource>,當JDBC操作數(shù)據(jù)庫之時,會根據(jù)不同的key值選擇不同的數(shù)據(jù)源,本文介紹了SpringBoot配置動態(tài)數(shù)據(jù)源的方法,需要的朋友可以參考下
    2024-08-08
  • java serialVersionUID解決序列化類版本不一致問題面試精講

    java serialVersionUID解決序列化類版本不一致問題面試精講

    這篇文章主要為大家介紹了serialVersionUID解決序列化類版本不一致問題的面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Lambda表達式的使用及注意事項

    Lambda表達式的使用及注意事項

    這篇文章主要介紹了Lambda表達式的使用及注意事項,主要圍繞?Lambda表達式的省略模式?Lambda表達式和匿名內(nèi)部類的區(qū)別的相關內(nèi)容展開詳情,感興趣的小伙伴可以參考一下
    2022-06-06
  • SpringBoot、mybatis返回樹結(jié)構(gòu)的數(shù)據(jù)實現(xiàn)

    SpringBoot、mybatis返回樹結(jié)構(gòu)的數(shù)據(jù)實現(xiàn)

    本文主要介紹了SpringBoot、mybatis返回樹結(jié)構(gòu)的數(shù)據(jù)實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • 十分簡單易懂的Java應用程序性能調(diào)優(yōu)技巧分享

    十分簡單易懂的Java應用程序性能調(diào)優(yōu)技巧分享

    這篇文章主要介紹了十分簡單易懂的Java性能調(diào)優(yōu)技巧分享,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 解決mybatis中order by排序無效問題

    解決mybatis中order by排序無效問題

    這篇文章主要介紹了解決mybatis中order by排序無效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java 字節(jié)數(shù)組(byte[])和整型(int)的相互轉(zhuǎn)換

    Java 字節(jié)數(shù)組(byte[])和整型(int)的相互轉(zhuǎn)換

    在Java編程中,有時需要將字節(jié)類型(byte)轉(zhuǎn)換為整數(shù)類型(int),或者反過來轉(zhuǎn)換,本文主要介紹了Java 字節(jié)數(shù)組(byte[])和整型(int)的相互轉(zhuǎn)換,感興趣的可以了解一下
    2023-12-12
  • ElasticSearch的完整安裝教程

    ElasticSearch的完整安裝教程

    這篇文章主要給大家分享介紹了ElasticSearch的完整安裝教程,文中通過示例代碼介紹的非常詳細,對大家學習或者使用ElasticSearch具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • Java中HashMap如何解決哈希沖突

    Java中HashMap如何解決哈希沖突

    本文主要介紹了Java中HashMap如何解決哈希沖突,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • springboot執(zhí)行延時任務之DelayQueue的使用詳解

    springboot執(zhí)行延時任務之DelayQueue的使用詳解

    DelayQueue是一個無界阻塞隊列,只有在延遲期滿時,才能從中提取元素。這篇文章主要介紹了springboot執(zhí)行延時任務-DelayQueue的使用,需要的朋友可以參考下
    2019-12-12

最新評論

马龙县| 慈溪市| 濮阳市| 宜昌市| 巴彦县| 弋阳县| 大田县| 安乡县| 章丘市| 珲春市| 抚顺市| 高陵县| 上蔡县| 河北省| 涪陵区| 安吉县| 雅安市| 双辽市| 澄迈县| 大洼县| 茂名市| 巴彦淖尔市| 日喀则市| 铜梁县| 万州区| 宣武区| 石门县| 申扎县| 乌拉特前旗| 盘山县| 塔河县| 荔浦县| 淳化县| 涞源县| 辽宁省| 民县| 紫金县| 遂平县| 南岸区| 闽清县| 塔河县|