SpringMVC-方法四種類型返回值總結,你用過多少種?

2021-01-07 燭光學院EDU

SpringMVC 現在算是 Java 領域的一個基礎性框架了,很多人天天用,可是對於 SpringMVC 方法的返回值,你又是否完全清楚呢?

SpringMVC 中四種不同類型的返回值,看看有沒有 get 到你的知識盲點?

1. ModelAndView

以前前後端不分的情況下,ModelAndView 應該是最最常見的返回值類型了,現在前後端分離後,後端都是以返回 JSON 數據為主了。後端返回 ModelAndView 這個比較容易理解,開發者可以在 ModelAndView 對象中指定視圖名稱,然後也可以綁定數據,像下面這樣:

@RequestMapping("/book")

public ModelAndView getAllBook() {

ModelAndView mv = new ModelAndView();

List<Book> books = new ArrayList<>();

Book b1 = new Book();

b1.setId(1);

b1.setName("三國演義");

b1.setAuthor("羅貫中");

books.add(b1);

Book b2 = new Book();

b2.setId(2);

b2.setName("紅樓夢");

b2.setAuthor("曹雪芹");

books.add(b2);

//指定數據模型

mv.addObject("bs", books);

mv.setViewName("book");//指定視圖名

return mv;

}

返回 ModelAndView ,最常見的兩個操作就是指定數據模型+指定視圖名 。

2. Void

返回值為 void 時,可能是你真的沒有值要返回,也可能是你有其他辦法,松哥將之歸為如下四類,大夥來看下。

2.1 沒有值

如果確實沒有返回值,那就返回 void ,但是一定要注意,此時,方法上需要添加 @ResponseBody 註解,像下面這樣:

@RequestMapping("/test2")

@ResponseBody

public void test2(){

//你的代碼

}

2.2 重定向

由於 SpringMVC 中的方法默認都具備 HttpServletResponse 參數,因此可以重拾 Servlet/Jsp 中的技能,可以實現重定向,像下面這樣手動設置響應頭:

@RequestMapping("/test1")

@ResponseBody

public void test1(HttpServletResponse resp){

resp.setStatus(302);

resp.addHeader("Location","/aa/index");

}

也可以像下面這樣直接調用重定向的方法:

@RequestMapping("/test1")

@ResponseBody

public void test1(HttpServletResponse resp){

resp.sendRedirect("/aa/index");

}

當然,重定向無論你怎麼寫,都是 Servlet/Jsp 中的知識點,上面兩種寫法都相當於是重回遠古時代。

2.3 服務端跳轉

既然可以重定向,當然也可以服務端跳轉,像下面這樣:

@GetMapping("/test5")

public void test5(HttpServletRequest req,HttpServletResponse resp) {

req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req,resp);

}

2.4 返回字符串

當然也可以利用 HttpServletResponse 返回其他字符串數據,包括但不局限於 JSON,像下面這樣:

@RequestMapping("/test2")

@ResponseBody

public void test2(HttpServletResponse resp) throws IOException {

resp.setContentType("application/json;charset=utf-8");

PrintWriter out = resp.getWriter();

List<Book> books = new ArrayList<>();

Book b1 = new Book();

b1.setId(1);

b1.setName("三國演義");

b1.setAuthor("羅貫中");

books.add(b1);

Book b2 = new Book();

b2.setId(2);

b2.setName("紅樓夢");

b2.setAuthor("曹雪芹");

books.add(b2);

String s = new Gson().toJson(books);

out.write(s);

out.flush();

out.close();

}

這是返回值為 void 時候的情況,方法返回值為 void ,不一定就真的不返回了,可能還有其他的方式給前端數據。

3. String

當 SpringMVC 方法的返回值為 String 類型時,也有幾種不同情況。

3.1 邏輯視圖名

返回 String 最常見的是邏輯視圖名,這種時候一般利用默認的參數 Model 來傳遞數據,像下面這樣 :

@RequestMapping("/hello")

public String aaa(Model model) {

model.addAttribute("username", "張三");

return "hello";

}

此時返回的 hello 就是邏輯視圖名,需要攜帶的數據放在 model 中。

3.2 重定向

也可以重定向,事實上,如果在 SpringMVC 中有重定向的需求,一般採用這種方式:

@RequestMapping("/test4")

public String test4() {

return "redirect:/aa/index";

}

3.3 forward 轉發

也可以 forward 轉發,事實上,如果在 SpringMVC 中有 forward 轉發的需求,一般採用這種方式:

@RequestMapping("/test3")

public String test3() {

return "forward:/WEB-INF/jsp/order.jsp";

}

3.4 真的是 String

當然,也有一種情況,就是你真的想返回一個 String ,此時,只要在方法上加上 @ResponseBody 註解即可,或者 Controller 上本身添加的是組合註解 @RestController,像下面這樣:

@RestController

public class HelloController {

@GetMapping("/hello")

public String hello() {

return "hello provider!";

}

}

也可以像下面這樣 :

@Controller

public class HelloController {

@GetMapping("/hello")

@ResponseBody

public String hello() {

return "hello provider!";

}

}

這是返回值為 String 的幾種情況。

4. JSON

返回 JSON 算是最最常見的了,現在前後端分離的趨勢下,大部分後端只需要返回 JSON 即可,那麼常見的 List 集合、Map,實體類等都可以返回,這些數據由 HttpMessageConverter 自動轉為 JSON ,如果大家用了 Jackson 或者 Gson ,不需要額外配置就可以自動返回 JSON 了,因為框架幫我們提供了對應的 HttpMessageConverter ,如果大家使用了 Alibaba 的 Fastjson 的話,則需要自己手動提供一個相應的 HttpMessageConverter 的實例,方法的返回值像下面這樣:

@GetMapping("/user")

@ResponseBody

public User getUser() {

User user = new User();

List<String> favorites = new ArrayList<>();

favorites.add("足球");

favorites.add("籃球");

user.setFavorites(favorites);

user.setUsername("zhagnsan");

user.setPassword("123");

return user;

}

@GetMapping("/users")

@ResponseBody

public List<User> getALlUser() {

List<User> users = new ArrayList<>();

for (int i = 0; i < 10; i++) {

User e = new User();

e.setUsername("zhangsan:" + i);

e.setPassword("pwd:" + i);

users.add(e);

}

return users;

}

總結

為大夥總結的 SpringMVC 方法四種不同類型的返回值,難倒是不難!有問題歡迎大夥留言討論。

相關焦點

  • C#方法返回類型確定返回值的類型,方法都有哪些返回類型?
    方法返回類型在前面我們接觸過.NET控制臺應用程式的Main()方法,該方法的返回類型是void,而在上一節中,我們講解的Cal()方法,返回類型是int。C#方法的返回類型總結起來有如下3種:(1). void:不需要方法有返回值。(2). 數據類型:需要返回指定類型的值。(3).
  • SpringMVC的常用註解
    springmvc原理圖第一個:@RequestParam註解作用:是將請求參數綁定到你的控制器的方法參數上,是springmvc中的接收普通參數的註解required是請求參數是否必須提供參數,它的默認是true,意思是表示必須提供,假如你不提供就會報錯啦。第二個:@RequestBody註解作用:如果作用在方法上,就表示該方法的返回結果是直接按寫入的Http responsebody中(一般在異步獲取數據時使用的註解)。
  • 函數返回值的錯誤類型及用ISERROR函數避免返回值錯誤的方法
    今天講函數錯誤的產生及避免,先看下面幾個公式值的截圖:返回的結果:為什麼會出現這些錯誤結果呢?因為公式的本身有錯誤,下面我們逐個來分析各個錯誤代碼的產生原因。當使用錯誤的參數或運算對象類型時,或者當公式自動更正功能不能更正公式時,將產生錯誤值#VALUE!。如上實例中 =A3+1 對#VALUE!加上1令EXCEL無從下手。分析產生的原因:原因一:在需要數字或邏輯值時輸入了文本,Excel不能將文本轉換為正確的數據類型。
  • SpringMVC——最強王者
    一般是寫在方法上面的,不過建議給類上也寫一個防止不同的類有同樣的方法名。value的值是數組,可以將多個url映射到同一個方法。@RequestMapping(value = { "itemList", "itemListAll" })這樣你的請求是itemList或itemListAll便都可以找到這個方法。
  • Java程式設計師必會 springmvc框架實現異常處理與文件上傳
    方法裡面有一個參數Exception ex就是捕獲到的異常對象,通過ex.getMessage();方法能夠取到剛才我們對自己創建的異常的異常信息,添加給modelAndView,返回給dispatcherServlet。然後我們在jsp頁面中將該信息展示在某個位置。
  • Springmvc框架對json的支持 Java程式設計師必看
    但是在寫json的時候還是出現了許多問題,用eclipse寫js代碼經常除了bug卻不知道問題出來哪裡。我們可以使用alert()或console.info()函數來進行判斷問題出在哪一行上。解決了發送json的問題後,又遇到一個bug,發送的json字符串返回的確實一個http415錯誤代碼,大概是說後端接收的參數類型不正確的意思,下面請看java代碼。
  • springmvc攔截器及源碼分析
    核心控制器DispatcherServlet,由於需要加載springmvc.xml,所以需要創建一個springmvc.xml文件(文件參考源碼附件)放到classpath下<!//並且,interceptorIndex值會一次 + 1 (該值是給後面的最終攔截器使用的)for(int i = 0; i < interceptors.length; this.interceptorIndex = i++) {HandlerInterceptorinterceptor
  • Python返回值及參數
    returns="dsfadsfsadsa"defmy_len():i=0forkins:i+=1# print(i)returni# 返回值length=my_len()print(length)返回值問題返回值三種情況不寫返回值不寫return只寫return
  • Java學習-參數和返回值
    8下「汪」我們還可以從方法中取返回值目前我們都是用的void類型的方法,這表示沒有返回任何東西,如:void 呵呵(){........}但是我們可以聲明一個方法,回傳給調用方指定的類型值,如:int 返回個值(){return 42;}調用時:int num = xxx.返回個值();接受返回值的傢伙必須跟返回值是同一個類型如果你把一個方法聲明成有返回值,那麼就必須返回所聲明類型的值!
  • 面試官:你分析過SpringMVC的源碼嗎?
    相關閱讀面試官:你分析過mybatis工作原理嗎?面試官:你分析過線程池源碼嗎?1. MVC使用在研究源碼之前,先來回顧以下springmvc 是如何配置的,這將能使我們更容易理解源碼。contextConfigLocation和DispatcherServlet(用此類來攔截請求)的引用和配置。
  • SSM框架-SpringMVC詳解
    springmvc概述Springmvc是spring框架的一個模塊,spring和springmvc無需中間整合層整合。-- 配置springmvc前端控制器, 將所有請求交給springmvc來處理 --> <servlet> <servlet-name>springmvc</servlet-name> <servletclass>org.springframework.web.servlet.DispatcherServlet
  • SpringMVC如何接收數組?
    在SpringMVC中接收數組有接收值數組和對象數組2種。如果你對HTTP協議中的Content-Type沒有一個清晰的認識肯定會頭腦暈暈的。Content-Type表示請求時發送的數據的類型,Content-Type的值有很多,我們這裡需要區分的是application/json和application/x-www-form-urlencoded兩種類型。
  • 3000字詳解四種常用的缺失值處理方法
    當預測一個特徵時,其餘特徵的缺失值都需要用0暫時填補,每當預測完一列特徵,就用預測出的結果代替原數據集對應的特徵,然後預測下一特徵,直至最後一個含有缺失值的特徵,此時特徵矩陣中應該沒有需要利用0填補的缺失值了,表示數據集已經完整。以隨機森林算法為例,實現上面表述填充缺失值的過程。
  • 帶參數的無返回值(void)函數如何返回處理結果?(附代碼)
    在軟體開發過程中有一種很常見的編程方法,就是即使將參數傳給無返回值的void函數也能實現對原始參數值的修改,這句話到底說的什麼意思,且看示例。(附代碼)這是一個帶參數的普通函數,作用是統計字符串中的有效字符數('\0'不算有效字符),返回值即為字符串中的字符總數,類型為int,具體代碼入下:
  • SpringMvc @Validated註解執行原理
    1|2註解地方@Validated:可以用在類型、方法和方法參數上。但是不能用在成員屬性(欄位)上。@Valid:可以用在方法、構造函數、方法參數和成員屬性(欄位)上。兩者是否能用於成員屬性(欄位)上直接影響能否提供嵌套驗證的功能。
  • 五分鐘學Java:一篇文章搞懂spring和springMVC
    相信很多人和我一樣,第一次了解spring都不是做項目的時候用到,而是在網上看到或者是聽到過一個叫做spring的框架,這個框架號稱完爆之前的structs和structs2,吸引了不少人的注意。AOP的本質是利用動態代理完成統一切面的功能,利用AOP,我們可以把一些橫向的同一類型代碼進行復用,比如登錄攔截,身份校驗,安全管理等等,這些不需要內嵌到業務代碼中,但卻經常要用到的東西,就可以利用AOP來做成一個切面,然後指定需要攔截的方法,AOP通過動態代理會將切面代碼加入到代理對象中,於是你執行業務代碼時,相當於在執行代理對象,就會相應地調用切面方法。
  • 帶有返回值的線程怎麼實現?
    帶有返回值的線程怎麼實現?在Java線程開發中,有幾種方法開啟線程?假如需要得到線程返回的信息怎麼辦?可以實現嗎?凱哥將通過源碼和大家一起分享下線程怎麼將返回值帶回來的。一:無返回值類型的1:繼承Thread類2:實現Runnable接口這兩種是大家常用的,代碼demo就截圖吧。
  • 黑馬程式設計師:JavaScript 中搜索數組元素的四種方法
    檢查數組中是否有特定值?在數組中找到指定值的索引?在本文中,我們將討論四種可用於搜索數組中項目的方法。這些方法是:filterfindincludesindexOf接下來,我們就一起來看一下這四種方式Array.filter()我們可以使用 Array.filter() 方法在數組中查找滿足特定條件的元素。
  • 你還在用for循環搜索數組嗎?JavaScript搜索數組的四種不同方法
    你可以使用JavaScript中的不同方法來搜索數組中的項目。選擇哪種方法取決於你的特定用例。例如,你是否要獲取數組中滿足特定條件的所有項目?檢查是否滿足條件?你是否要檢查數組中是否有特定值?還是要在數組中找到值的索引?
  • ​四種類型學生支撐學習時間
    六、第三、四種類型中學生科目知識深度調整白天學習數學幾何、化學公式。第一種類型學生,認真聽講就會了,很好學,一學就會;找到方法,學起來容易。第二種類型學生,感到難度適中,學得輕鬆;能聽懂,題難,做題著急;考不出好成績。第三種類型學生,感到最難學:費腦子、吃力;能聽懂、聽不下去;太過靈活變通的題,難以理解;做題著急、做不下去。