Spring MVC獲取控制器參數(shù)的幾種姿勢(shì)

處理器是對(duì)控制器(Controller)的包裝,在處理運(yùn)行過(guò)程中會(huì)調(diào)度控制器的方法僧界,只是它進(jìn)入控制器方法之前會(huì)對(duì)HTTP的參數(shù)進(jìn)行解析敌买,將他們轉(zhuǎn)換為控制器所需的參數(shù)。那么控制器獲取HTTP請(qǐng)求參數(shù)有幾種方式呢靠欢?我們來(lái)總結(jié)一下。

1.無(wú)注解下獲取參數(shù)

在沒(méi)有注解的情況下铜跑,Spring MVC可以獲取參數(shù)门怪,且參數(shù)允許為空,唯一的要求是參數(shù)名稱和HTTP請(qǐng)求參數(shù)保持一致锅纺,代碼清單如下:

@Controller
@RequestMapping("/my")
public class MyController {

    /**
     * 在無(wú)注解下獲取參數(shù)掷空,要求參數(shù)名稱和HTTP請(qǐng)求參數(shù)名稱一致
     * @param intVal 整數(shù)
     * @param longVal 長(zhǎng)整型
     * @param str 字符串
     * @return 響應(yīng)JSON參數(shù)
     */
    @GetMapping("/no/annotation")
    @ResponseBody
    public Map<String, Object> noAnnotation(Integer intVal, Long longVal, String str) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("intVal", intVal);
        paramMap.put("longVal", longVal);
        paramMap.put("str", str);
        return paramMap;
    }
}

啟動(dòng)Spring Boot應(yīng)用后,在瀏覽器中請(qǐng)求URL: http://localhost:8080/my/no/annotation?intVal=10&longVal=100
從代碼中可以看出控制器方法參數(shù)中還有一個(gè)字符串參數(shù)str囤锉,但因?yàn)閰?shù)在默認(rèn)情況下的規(guī)則可以為空坦弟,多以這個(gè)請(qǐng)求并不會(huì)報(bào)錯(cuò),因?yàn)榉椒?biāo)注了@ResponseBody官地,所以控制器返回的結(jié)果會(huì)轉(zhuǎn)化為JSON數(shù)據(jù)集酿傍。

2.使用@RequestParam獲取參數(shù)

在無(wú)需注解的情況下,就要求HTTP參數(shù)和控制器方法名稱保持一致驱入。然而在前后來(lái)分離的趨勢(shì)下赤炒,前端的命名規(guī)則可能與后端規(guī)則不同氯析,這時(shí)需要把前端的參數(shù)與后端對(duì)應(yīng)起來(lái)。Spring MVC提供了@RequestParam來(lái)確定前后端的參數(shù)名稱的映射關(guān)系莺褒,代碼清單如下:

@Controller
@RequestMapping("/my")
public class MyController {

    /**
     * @param intVal 整數(shù)
     * @param longVal 長(zhǎng)整型
     * @param strVal 字符串
     * @return 響應(yīng)JSON參數(shù)
     */
    @GetMapping("/annotation")
    @ResponseBody
    public Map<String, Object> requestParam(
            @RequestParam("int_val") Integer intVal,
            @RequestParam("long_val") Long longVal,
            @RequestParam("str_val") String strVal) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("intVal", intVal);
        paramMap.put("longVal", longVal);
        paramMap.put("str", strVal);
        return paramMap;
    }
}

在方法參數(shù)處使用了@RequestParam掩缓,其目的是指定HTTP參數(shù)和方法參數(shù)的映射關(guān)系,這樣處理器就會(huì)按照其配置的映射關(guān)系來(lái)得到參數(shù)遵岩,然后調(diào)用控制器的方法你辣。啟動(dòng)Spring Boot應(yīng)用后,在瀏覽器地址欄中輸入:http://localhost:8080/my/annotation?int_val=10&long_val=100&str_val=str,就能看到請(qǐng)求的結(jié)果了尘执。但是如果把三個(gè)HTTP參數(shù)中的任意一個(gè)去掉舍哄,就會(huì)得到異常信息,因?yàn)槟J(rèn)的情況下@RequestParam標(biāo)注的參數(shù)是不能為空的誊锭,為了讓他能夠?yàn)榭沾老ǎ梢耘渲闷鋵傩詒equired為fasle,例如字符串參數(shù)修改為:

@RequestParam(value = "str_val", required = false) String strVal

3.傳遞數(shù)組

在Spring MVC中炉旷,除了可以像上面那樣傳遞一些簡(jiǎn)單的值外签孔,還可以傳遞數(shù)組。Spring MVC內(nèi)部已經(jīng)能夠支持用逗號(hào)分隔的數(shù)組參數(shù)窘行,代碼清單如下:

@Controller
@RequestMapping("/my")
public class MyController {

    @GetMapping("/array")
    @ResponseBody
    public Map<String, Object> array(Integer[] intVal, Long[] longVal, String[] strVal) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("intVal", intVal);
        paramMap.put("longVal", longVal);
        paramMap.put("str", strVal);
        return paramMap;
    }
}

方法里定義了采用數(shù)組饥追,那么前端就需要依照一定規(guī)則傳遞給這個(gè)方法,例如罐盔,輸入http://localhost:8080/my/array?intVal=1,2,3&longVal=4,5,6&strVal=str1,str2,str3,可以看到需要傳遞數(shù)組參數(shù)時(shí)但绕,每個(gè)參數(shù)的數(shù)組元素只需要通過(guò)逗號(hào)分隔即可。

4.傳遞JSON

在當(dāng)前前后端分離的趨勢(shì)下惶看,使用JSON已經(jīng)十分普遍了捏顺。對(duì)于前端的頁(yè)面或者手機(jī)應(yīng)用,可以通過(guò)請(qǐng)求后端獲取JSON數(shù)據(jù)集纬黎,這樣他們就能很方便地將數(shù)據(jù)渲染到試圖中幅骄。有時(shí)前端也需要提交較為復(fù)雜的數(shù)據(jù)到后端,為了更好組織和提高代碼的可讀性本今,可以將數(shù)據(jù)裝維JSON數(shù)據(jù)集拆座,通過(guò)HTTP請(qǐng)求體提交給后端,對(duì)此Spring MVC也提供了良好的支持冠息。代碼清單如下:

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 新增用戶
     *
     * @param User
     */
    @PostMapping(value = "/insert")
    @ResponsetBody
    public User insert(@RequestBody User User) {
        userService.save(user);
        return user;
    }
}

這個(gè)方法的參數(shù)標(biāo)注為@RequestBody挪凑,意味著它將接受前端提交的JSON請(qǐng)求體,而JSON請(qǐng)求體與 User類之間的屬性名稱是保持一致的逛艰,這樣Spring MVC就會(huì)通過(guò)這層映射關(guān)系將JSON請(qǐng)求體轉(zhuǎn)換為User對(duì)象了躏碳。

5.通過(guò)URL傳遞參數(shù)

在一些網(wǎng)站中,提供了REST風(fēng)格散怖,這時(shí)參數(shù)往往通過(guò)URL進(jìn)行傳遞菇绵。例如獲取編號(hào)為1的用戶肄渗,就要寫成/user/1,這里1代表的是用戶標(biāo)號(hào)(id)脸甘。Spring MVC對(duì)此也提供了良好的支持,可以通過(guò)處理器映射和注解@PathVariable的組和獲取URL參數(shù)偏灿。首先通過(guò)處理器映射可以定位參數(shù)位置和名稱丹诀,而@PathVariable則可以通過(guò)名稱開獲取參數(shù)。代碼清單如下:

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 通過(guò)Id查詢用戶
     */
    @GetMapping("/{id}")
    @ResponsetBody
    public User query(@PathVariable("id") Long id) {
        return userService.getById(id);
    }
}

首先通過(guò)@GetMapping指定一個(gè)URL翁垂,然后用{}來(lái)標(biāo)明參數(shù)的位置和名稱铆遭。這里指定名稱為id,這樣Spring MVC就能根據(jù)請(qǐng)求來(lái)匹配這個(gè)方法了沿猜。@PathVariable配置字符串為id枚荣,它對(duì)應(yīng)URL的參數(shù)聲明,這樣Spring MVC就知道如何從URL中獲取參數(shù)了啼肩。請(qǐng)求http://localhost:8080/user/1就能獲取參數(shù)了橄妆。

6.獲取格式化參數(shù)

在一些應(yīng)用中往往需要格式化數(shù)據(jù),其中最為典型的當(dāng)屬日期和貨幣了祈坠。例如在一些系統(tǒng)中日期格式約定為yyyy-MM-dd害碾,金額約定為貨幣符號(hào)且用逗號(hào)隔開。同樣的而Spring MVC對(duì)此也提供了良好的支持赦拘。對(duì)日期和數(shù)字類型的轉(zhuǎn)換注解進(jìn)行處理慌随,分別為@DateTimeFormat@NumberFormat。其中@DateTimeFormat是針對(duì)日期進(jìn)行格式化的躺同,@NumberFormat是針對(duì)數(shù)字進(jìn)行格式化的阁猜。代碼清單如下:

@Controller
@RequestMapping("/my")
public class MyController {
    
    @GetMapping("/format")
    @ResponseBody
    public Map<String, Object> format(@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date date,
            @NumberFormat(pattern = "#,###.##") Double number) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("intVal", date);
        paramMap.put("longVal", number);
        return paramMap;
    }
}

他們配置了格式化所約定的格式,所以Spring MVC會(huì)根據(jù)約定的格式把數(shù)據(jù)轉(zhuǎn)換出來(lái)蹋艺,這樣就可以完成轉(zhuǎn)換剃袍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市捎谨,隨后出現(xiàn)的幾起案子笛园,更是在濱河造成了極大的恐慌,老刑警劉巖侍芝,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件研铆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡州叠,警方通過(guò)查閱死者的電腦和手機(jī)棵红,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咧栗,“玉大人逆甜,你說(shuō)我怎么就攤上這事虱肄。” “怎么了交煞?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵咏窿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我素征,道長(zhǎng)集嵌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任御毅,我火速辦了婚禮根欧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘端蛆。我一直安慰自己凤粗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布今豆。 她就那樣靜靜地躺著嫌拣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呆躲。 梳的紋絲不亂的頭發(fā)上亭罪,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音歼秽,去河邊找鬼应役。 笑死,一個(gè)胖子當(dāng)著我的面吹牛燥筷,可吹牛的內(nèi)容都是我干的箩祥。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼肆氓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼袍祖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起谢揪,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蕉陋,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后拨扶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凳鬓,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年患民,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缩举。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仅孩,靈堂內(nèi)的尸體忽然破棺而出托猩,到底是詐尸還是另有隱情,我是刑警寧澤辽慕,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布京腥,位于F島的核電站,受9級(jí)特大地震影響溅蛉,放射性物質(zhì)發(fā)生泄漏公浪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一温艇、第九天 我趴在偏房一處隱蔽的房頂上張望因悲。 院中可真熱鬧堕汞,春花似錦勺爱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至人灼,卻和暖如春围段,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背投放。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工奈泪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灸芳。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓涝桅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親烙样。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冯遂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

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