SpringMVC-方法四種類型返回值總結(jié),你用過幾種屿岂?

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 方法四種不同類型的返回值,難倒是不難迹恐!有問題歡迎大伙留言討論挣惰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市殴边,隨后出現(xiàn)的幾起案子憎茂,更是在濱河造成了極大的恐慌,老刑警劉巖找都,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唇辨,死亡現(xiàn)場離奇詭異廊酣,居然都是意外死亡能耻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門亡驰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晓猛,“玉大人,你說我怎么就攤上這事凡辱〗渲埃” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵透乾,是天一觀的道長洪燥。 經(jīng)常有香客問我,道長乳乌,這世上最難降的妖魔是什么捧韵? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮汉操,結(jié)果婚禮上再来,老公的妹妹穿的比我還像新娘。我一直安慰自己磷瘤,他們只是感情好芒篷,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著采缚,像睡著了一般针炉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扳抽,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天糊识,我揣著相機與錄音绩社,去河邊找鬼。 笑死赂苗,一個胖子當(dāng)著我的面吹牛愉耙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拌滋,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼朴沿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了败砂?” 一聲冷哼從身側(cè)響起赌渣,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昌犹,沒想到半個月后坚芜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡斜姥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年鸿竖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铸敏。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡缚忧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杈笔,到底是詐尸還是另有隱情闪水,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布蒙具,位于F島的核電站球榆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏禁筏。R本人自食惡果不足惜持钉,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望融师。 院中可真熱鬧右钾,春花似錦、人聲如沸旱爆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怀伦。三九已至脆烟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間房待,已是汗流浹背邢羔。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工驼抹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拜鹤。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓框冀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親敏簿。 傳聞我的和親對象是個殘疾皇子明也,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361

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

  • SpringMVC介紹 Spring web mvc 和Struts2都屬于表現(xiàn)層的框架,它是Spring框架的一...
    day_Sunny閱讀 756評論 0 0
  • 對于java中的思考的方向惯裕,1必須要看前端的頁面温数,對于前端的頁面基本的邏輯,如果能理解最好蜻势,不理解也要知道幾點撑刺。 ...
    神尤魯?shù)婪?/span>閱讀 819評論 0 0
  • Spring框架對于Java后端程序員來說再熟悉不過了,以前只知道它用的反射實現(xiàn)的握玛,但了解之后才知道有很多巧妙的設(shè)...
    Java小鋪閱讀 1,362評論 3 23
  • 到安徽九華山燒香拜佛還愿够傍,順路游玩了一天,孩子們一路聽到同行的朋友家孩子說起漂流的事败许,非常向往王带,于是安排這兩天去漂...
    文馨_閱讀 553評論 4 3
  • 4.2.1介紹 在有向圖中,邊是單向的.實際上組合性的結(jié)構(gòu)對算法有深遠(yuǎn)影響,使得有向圖和無向圖之間的處理大有不同....
    浩林Leon閱讀 2,508評論 0 1