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註解:
-
@RestController
-
public class PersonController {
-
@RequestMapping("mytest")
-
public String indexHtml(Map<String, Object> map) {
-
map.put("msg", "this is a thymeleaf test");
-
return "hello";
-
}
-
@RequestMapping("mymodelviewtest")
-
public ModelAndView hello(Map<String, Object> map) {
-
map.put("msg", "this is model view test");
-
return new ModelAndView("hello");
-
}
-
}
return "hello" 返回檢視名hello,並沒有渲染檢視hello.html。
return new ModelAndView("hello") 正常顯示了檢視內容。
b) 使用@Controller註解:
-
@Controller
-
public class PersonController {
-
@RequestMapping("mytest")
-
public String indexHtml(Map<String, Object> map) {
-
map.put("msg", "this is a thymeleaf test");
-
return "hello";
-
}
-
@RequestMapping("mymodelviewtest")
-
public ModelAndView hello(Map<String, Object> map) {
-
map.put("msg", "this is model view test");
-
return new ModelAndView("hello");
-
}
-
}
return "hello" 正常顯示了檢視內容。
return new ModelAndView("hello") 正常顯示了檢視內容。