先贴个图 …
在SpringBoot中,会默认在容器中注入 视图解析器。
1.如果 没有 在配置文件中配置视图解析器的前后缀,
@RequestMapping("/success")
public String success(){
System.out.println("controller - success 执行");
return "hello";
}
① handler返回的ModelAndView 是”hello” ,默认是请求转发的方式。
② 如果返回的ModelAndView是 “forward:ok" ,也是请求转发。
2.如果在配置文件中配置了视图解析器的前后缀:
spring:
mvc:
view:
prefix: /
suffix: .html
① handler返回的 ModelAndView 会只去和视图解析器进行匹配前后缀,即匹配路径是 hello.html
如果return后面的 ModelAndView在完成前后缀匹配完后没有找到某个页面,会怎么样?
@RequestMapping("/success")
public String success(){
System.out.println("controller - success 执行");
return "ok";
}
如上图,按理说会匹配一个 ok.html 页面的路径,但是在classpath下发现没有这个ok.html
那么直接会报错!!!它不会去再找有没有路径是 “/ok” 的 handler!!而是只报错!!!
同理 , SpringMVC也是这样的!
② 如果handler返回的ModelAndView 是 “forward:ok” ,就不会去匹配前后缀,直接就走请求转发。
@RequestMapping("/success")
public String success(){
System.out.println("controller - success 执行");
return "forward:ok";
}
@RequestMapping("/ok")
@ResponseBody
public String ok(){
System.out.println("Controller - ok 执行");
return "ok";
}
综上:
在handler方法中,return返回的就是ModelAndView。
① 如果没有配置视图解析器的前后缀,不管ModelAndView是 “ok" 还是 ”foreword:ok",都是走请求转发。
② 如果配置了视图解析器的前后缀,如果ModelAndView是 “ok” ,视图解析器给它加上前后缀再去找这个页
面。 如果ModelAndView是“forward:ok” ,视图解析器就走请求转发。
所以,为了不引起矛盾,也不让自己困惑是请求转发还是去添加前后缀找页面。以后想通过请求转发匹配
handler,就在ModelAndView中加上 “forward“ ;如果是想去找某一个页面,在写好前后缀后,就直接写
ModelAndView就行。