1. 程式人生 > >Spring Boot中的return new ModelAndView("xxx") 和 return "xxx"的區別

Spring Boot中的return new ModelAndView("xxx") 和 return "xxx"的區別

1. return new modelAndView("XXX") 是包括檢視和資料的,
  而return "XXX" 只是檢視,他會根據你配置檔案裡試圖解析器的配置,幫你匹配好字首,字尾然後跳轉到XXX這個頁面。
  比如 return "index",你配置檔案裡的字首是“/templates/”,字尾是“.html,就會跳轉到XXX/templates/index.html頁面。
  return new modelAndView("index"),這個modelAndView 裡面包括檢視名view,和資料model,
  裡面的view 和return "index"是一樣的流程,只不過同時也會傳遞過去model這個資料。


2. return "XXX"  只能使用@Controller註解,不能使用 @RestController註解,否則就會返回把檢視名稱當字串返回,並不會渲染檢視。return new modelAndView("XXX")  使用 @RestController 和 @Controller註解都可以正常渲染檢視。
   比如 一個類class加了@RestController, @RestController註解內包含了@ResponseBody。 
   @ResponseBody的意思是返回的不是檢視,也就是檢視解析器不回去查詢該檢視名的模板,

   而是以response.getWriter().write("這裡就是你寫的字串");方式返回,常用於ajax求情的返回內容。

 

示例:

a) 使用@RestController註解:

 

 
  1. @RestController

  2. public class PersonController {

  3.  
  4. @RequestMapping("mytest")

  5. public String indexHtml(Map<String, Object> map) {

  6. map.put("msg", "this is a thymeleaf test");

  7. return "hello";

  8. }

  9.  
  10. @RequestMapping("mymodelviewtest")

  11. public ModelAndView hello(Map<String, Object> map) {

  12. map.put("msg", "this is model view test");

  13. return new ModelAndView("hello");

  14. }

  15. }

 

 

return "hello" 返回檢視名hello,並沒有渲染檢視hello.html。

 

return new ModelAndView("hello") 正常顯示了檢視內容。

b) 使用@Controller註解:

 

 
  1. @Controller

  2. public class PersonController {

  3. @RequestMapping("mytest")

  4. public String indexHtml(Map<String, Object> map) {

  5. map.put("msg", "this is a thymeleaf test");

  6. return "hello";

  7. }

  8.  
  9.  
  10. @RequestMapping("mymodelviewtest")

  11. public ModelAndView hello(Map<String, Object> map) {

  12. map.put("msg", "this is model view test");

  13. return new ModelAndView("hello");

  14. }

  15. }

 

return "hello"  正常顯示了檢視內容。

return new ModelAndView("hello") 正常顯示了檢視內容。