SpringMVC 現(xiàn)在算是 Java 領(lǐng)域的一個基礎(chǔ)性框架了践宴,很多人天天用,可是對于 SpringMVC 方法的返回值爷怀,你又是否完全清楚呢阻肩?今天松哥就來和大家聊一聊 SpringMVC 中四種不同類型的返回值,看看有沒有 get 到你的知識盲點运授?
1. ModelAndView
以前前后端不分的情況下烤惊,ModelAndView 應(yīng)該是最最常見的返回值類型了,現(xiàn)在前后端分離后吁朦,后端都是以返回 JSON 數(shù)據(jù)為主了柒室。后端返回 ModelAndView 這個比較容易理解,開發(fā)者可以在 ModelAndView 對象中指定視圖名稱逗宜,然后也可以綁定數(shù)據(jù)雄右,像下面這樣:
@RequestMapping("/book")publicModelAndViewgetAllBook(){? ? ModelAndView mv =newModelAndView();? ? List books =newArrayList<>();? ? Book b1 =newBook();? ? b1.setId(1);? ? b1.setName("三國演義");? ? b1.setAuthor("羅貫中");? ? books.add(b1);? ? Book b2 =newBook();? ? b2.setId(2);? ? b2.setName("紅樓夢");? ? b2.setAuthor("曹雪芹");? ? books.add(b2);//指定數(shù)據(jù)模型mv.addObject("bs", books);? ? mv.setViewName("book");//指定視圖名returnmv;}
返回 ModelAndView ,最常見的兩個操作就是指定數(shù)據(jù)模型+指定視圖名 纺讲。
2. Void
返回值為 void 時擂仍,可能是你真的沒有值要返回,也可能是你有其他辦法熬甚,松哥將之歸為如下四類逢渔,大伙來看下。
2.1 沒有值
如果確實沒有返回值乡括,那就返回 void 复局,但是一定要注意,此時粟判,方法上需要添加 @ResponseBody 注解亿昏,像下面這樣:
@RequestMapping("/test2")@ResponseBodypublicvoidtest2(){//你的代碼}
2.2 重定向
由于 SpringMVC 中的方法默認(rèn)都具備 HttpServletResponse 參數(shù),因此可以重拾 Servlet/Jsp 中的技能档礁,可以實現(xiàn)重定向角钩,像下面這樣手動設(shè)置響應(yīng)頭:
@RequestMapping("/test1")@ResponseBodypublicvoidtest1(HttpServletResponse resp){? ? resp.setStatus(302);? ? resp.addHeader("Location","/aa/index");}
也可以像下面這樣直接調(diào)用重定向的方法:
@RequestMapping("/test1")@ResponseBodypublicvoidtest1(HttpServletResponse resp){? ? resp.sendRedirect("/aa/index");}
當(dāng)然,重定向無論你怎么寫,都是 Servlet/Jsp 中的知識點递礼,上面兩種寫法都相當(dāng)于是重回遠(yuǎn)古時代惨险。
2.3 服務(wù)端跳轉(zhuǎn)
既然可以重定向,當(dāng)然也可以服務(wù)端跳轉(zhuǎn)脊髓,像下面這樣:
@GetMapping("/test5")publicvoidtest5(HttpServletRequest req,HttpServletResponse resp){? ? req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req,resp);}
2.4 返回字符串
當(dāng)然也可以利用 HttpServletResponse 返回其他字符串?dāng)?shù)據(jù)辫愉,包括但不局限于 JSON,像下面這樣:
@RequestMapping("/test2")@ResponseBodypublicvoidtest2(HttpServletResponse resp)throwsIOException{? ? resp.setContentType("application/json;charset=utf-8");? ? PrintWriter out = resp.getWriter();? ? List books =newArrayList<>();? ? Book b1 =newBook();? ? b1.setId(1);? ? b1.setName("三國演義");? ? b1.setAuthor("羅貫中");? ? books.add(b1);? ? Book b2 =newBook();? ? b2.setId(2);? ? b2.setName("紅樓夢");? ? b2.setAuthor("曹雪芹");? ? books.add(b2);? ? String s =newGson().toJson(books);? ? out.write(s);? ? out.flush();? ? out.close();}
這是返回值為 void 時候的情況将硝,方法返回值為 void 恭朗,不一定就真的不返回了,可能還有其他的方式給前端數(shù)據(jù)依疼。
3. String
當(dāng) SpringMVC 方法的返回值為 String 類型時痰腮,也有幾種不同情況。
3.1 邏輯視圖名
返回 String 最常見的是邏輯視圖名律罢,這種時候一般利用默認(rèn)的參數(shù) Model 來傳遞數(shù)據(jù)膀值,像下面這樣 :
@RequestMapping("/hello")publicStringaaa(Model model){? ? model.addAttribute("username","張三");return"hello";}
此時返回的?hello?就是邏輯視圖名,需要攜帶的數(shù)據(jù)放在 model 中误辑。
3.2 重定向
也可以重定向沧踏,事實上,如果在 SpringMVC 中有重定向的需求巾钉,一般采用這種方式:
@RequestMapping("/test4")publicStringtest4(){return"redirect:/aa/index";}
3.3 forward 轉(zhuǎn)發(fā)
也可以 forward 轉(zhuǎn)發(fā)悦冀,事實上,如果在 SpringMVC 中有 forward 轉(zhuǎn)發(fā)的需求睛琳,一般采用這種方式:
@RequestMapping("/test3")publicStringtest3(){return"forward:/WEB-INF/jsp/order.jsp";}
3.4 真的是 String
當(dāng)然盒蟆,也有一種情況,就是你真的想返回一個 String 师骗,此時历等,只要在方法上加上 @ResponseBody 注解即可,或者 Controller 上本身添加的是組合注解 @RestController辟癌,像下面這樣:
@RestControllerpublicclassHelloController{@GetMapping("/hello")publicStringhello(){return"hello provider!";? ? }}
也可以像下面這樣 :
@ControllerpublicclassHelloController{@GetMapping("/hello")@ResponseBodypublicStringhello(){return"hello provider!";? ? }}
這是返回值為 String 的幾種情況寒屯。
4. JSON
返回 JSON 算是最最常見的了,現(xiàn)在前后端分離的趨勢下黍少,大部分后端只需要返回 JSON 即可寡夹,那么常見的 List 集合、Map厂置,實體類等都可以返回菩掏,這些數(shù)據(jù)由 HttpMessageConverter 自動轉(zhuǎn)為 JSON ,如果大家用了 Jackson 或者 Gson 昵济,不需要額外配置就可以自動返回 JSON 了智绸,因為框架幫我們提供了對應(yīng)的 HttpMessageConverter 野揪,如果大家使用了 Alibaba 的 Fastjson 的話,則需要自己手動提供一個相應(yīng)的 HttpMessageConverter 的實例瞧栗,方法的返回值像下面這樣:
@GetMapping("/user")@ResponseBodypublicUsergetUser(){? ? User user =newUser();? ? List favorites =newArrayList<>();? ? favorites.add("足球");? ? favorites.add("籃球");? ? user.setFavorites(favorites);? ? user.setUsername("zhagnsan");? ? user.setPassword("123");returnuser;}@GetMapping("/users")@ResponseBodypublicListgetALlUser(){? ? List users =newArrayList<>();for(inti =0; i <10; i++) {? ? ? ? User e =newUser();? ? ? ? e.setUsername("zhangsan:"+ i);? ? ? ? e.setPassword("pwd:"+ i);? ? ? ? users.add(e);? ? }returnusers;}
總結(jié)
好了斯稳,為大伙總結(jié)的 SpringMVC 方法四種不同類型的返回值,難倒是不難迹恐!有問題歡迎大伙留言討論挣惰。