雖然現(xiàn)在SpringBoot框架很火塑猖,但是SpringBoot并不能處理以及響應(yīng)客戶端的請求殴泰,最終還是要依賴SpringMVC框架暴凑,所以接下來介紹SpringMVC Controller方法的返回值類型凡泣,涵蓋所有返回值類型藏鹊。這篇博客只是掃盲點赔嚎,沒具體深入膘盖。
1. ModelAndView
- 我們在使用SpringMVC的時候,經(jīng)常返回ModelAndView類型尤误,現(xiàn)在前后端分離后侠畔,后端都是返回JSON格式數(shù)據(jù)為主。
- 返回 ModelAndView類型损晤,我們可以在ModelAndView對象中指定視圖名稱软棺,然后也可以綁定數(shù)據(jù),如下面代碼:
@RequestMapping("/userList")
public ModelAndView getAllUser(ModelAndView mv) {
List<User> users= userService.getAllUser();
//添加數(shù)據(jù)模型到request域中
mv.addObject("users", users);
mv.setViewName("userList");//指定視圖名
return mv;
}
2.void
如果返回值為void的話尤勋,并不是真正沒有返回值喘落,而是會出現(xiàn)以下幾種情況:
- 如果方法內(nèi)真的沒有返回值,那么SpringMVC默認把
deleteUser(映射的URL)
當成視圖名稱來解析最冰,如果存在該視圖瘦棋,就返回給客戶端;如果不存在該視圖暖哨,就會報視圖找不到異常赌朋。
@RequestMapping("/deleteUser")
public void deleteUser() {
//刪除操作
}
通過加@ResponseBody來修改默認行為,加上該注解表示返回JSON數(shù)據(jù)鹿蜀,這里返回空JSON數(shù)據(jù)箕慧,而不是把URL當成視圖名稱來解析
@RequestMapping("/deleteUser")
@ResponseBody
public void deleteUser() {
//刪除操作
}
- 請求轉(zhuǎn)發(fā)
@GetMapping("/")
public void root(HttpServletRequest req,HttpServletResponse resp) {
req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req,resp);
}
- 重定向
@RequestMapping("/")
@ResponseBody
public void root(HttpServletResponse resp){
resp.setStatus(302);
resp.addHeader("Location","/WEB-INF/jsp/index.jsp");
}
@RequestMapping("/")
@ResponseBody
public void root(HttpServletResponse resp){
resp.sendRedirect("/WEB-INF/jsp/index.jsp");
}
3. String
當方法的返回值為String的時候,也會出現(xiàn)下面幾種情況:
- 邏輯視圖名
返回String最常見的是邏輯視圖名茴恰,這種時候一般利用默認的參數(shù)Model來傳遞數(shù)據(jù)
@RequestMapping("/deleteUser")
//方法返回JSON數(shù)據(jù)
@ResponseBody
public String deleteUser(Model model) {
model.addAttribute("msg","刪除成功");
return "userList";
}
- 重定向
登錄失敗的時候重定向到登錄頁面颠焦。
@RequestParam("/login")
public String redirect(User user){
if{
//登錄成功...
}else{
//登錄失敗,重定向到登錄頁面
return "redirect:tologin";
}
}
- 請求轉(zhuǎn)發(fā)
登錄失敗的時候請求轉(zhuǎn)發(fā)到登錄頁面往枣。
@RequestParam("/login")
public String redirect(User user){
if{
//登錄成功...
}else{
//登錄失敗伐庭,轉(zhuǎn)發(fā)到登錄頁面
return "forward:tologin";
}
}
- 真的返回String,相當于JSON格式的數(shù)據(jù)
@RequestMapping("/deleteUser")
@ResponseBody
public String deleteUser() {
try{
//刪除成功
return "刪除成功";
}catch(Exception e){
return "刪除失敗";
}
}
4.JSON
現(xiàn)在前后端分離的情況下分冈,大部分后端只需要返回JSON數(shù)據(jù)即可圾另,List 集合、Map集合雕沉,實體類等都可以返回集乔,這些數(shù)據(jù)由 HttpMessageConverter自動轉(zhuǎn)為JSON ,如果使用了Jackson或者Gson坡椒,不需要額外配置就可以自動返回JSON了扰路,因為框架幫我們提供了對應(yīng)的HttpMessageConverter 尤溜,如果使用了Alibaba的Fastjson的話,則需要自己手動提供一個相應(yīng)的 HttpMessageConverter的實例汗唱,方法的返回值如下面代碼:
@GetMapping("/getUser")
@ResponseBody
public User getUser() {
User user = userService.getUser();
return user;
}
@RequestMapping("/userList")
@ResponseBody
public List<User> getAllUser() {
List<User> users = userService.getAllUser();
return users;
}
好了宫莱,關(guān)于SpringMVC的返回值類型就總結(jié)完了,我們開發(fā)中也就是使用這幾種返回值類型哩罪。