處理器是對(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)換剃袍。