天天看點

REST風格,@PathVariable注解

REST(Representational State Transfer,表述性狀态轉移)是一種軟體風格。所謂的REST風格可以簡單了解為:使用url表示資源時,每個資源都用一個獨一無二的url來表示,并使用http方法表示操作,即準确描述伺服器對資源的處理動作(get、post、put、delete),實作資源的增删改差。舉例如下

/user/view/12  /userview.html?id=12

/user/delete/12  /userdelete.html?id=12

/user/modify/12   /usermodify.html?id=12

我們可以發現REST風格的url中最明顯的就是參數不再使用“ ?”傳遞。這種風格可讀性好,項目結構清晰,springmvc也提供對這種風格的支援。

由于url參數有時會傳遞中文,那麼就會出現中文亂碼問題,是以要根據實際情況靈活處理,混搭使用。

@RequestMapping(value = "/view/{id}", method = RequestMethod.GET)
public String view(@PathVariable String id, Model model){
    User user = userService.getUserById(id);
    model.addAttribute(user);
    return "userview";
}      

@PathVariable在spring-web依賴下,所在包如下

REST風格,@PathVariable注解

對于REST風格url中的參數接受,springmvc提供了@PathVariable注解,可以将url中的{xxx}占位符參數綁定到控制器處理方法的入參中。

和?的使用相比較:

spingMvc REST的風格:

/user_show?id=120

/user/120

/user_delete?id=123

/user/123/delete

/user_updateInput?id=123

/user/123/update

@RequestMapping(value="/{username}",method=RequestMethod.GET)
	public String show(@PathVariable String username,Model model) {
		model.addAttribute(users.get(username));
		return "user/show";
	}
	
	@RequestMapping(value="/{username}",method=RequestMethod.GET,params="json")
	@ResponseBody
	public User show(@PathVariable String username) {
		return users.get(username);
	}
	
	@RequestMapping(value="/{username}/update",method=RequestMethod.GET)
	public String update(@PathVariable String username,Model model) {
		model.addAttribute(users.get(username));
		return "user/update";
	}
	
	@RequestMapping(value="/{username}/update",method=RequestMethod.POST)
	public String update(@PathVariable String username,@Validated User user,BindingResult br) {
		if(br.hasErrors()) {
			//如果有錯誤直接跳轉到add視圖
			return "user/update";
		}
		users.put(username, user);
		return "redirect:/user/users";
	}
	
	@RequestMapping(value="/{username}/delete",method=RequestMethod.GET)
	public String delete(@PathVariable String username) {
		users.remove(username);
		return "redirect:/user/users";
	}           

繼續閱讀