spring boot存放views的默认路径在哪呢?

写了一个简单Controller的ExceptionHandler,代码如下:

  • 目的是访问/demoexception时估计抛出exception,被controller中定义的exceptionhandler捕获并返回给view error3来显示。
@Controller
public class SelfExceptionController {

    @RequestMapping("/demoexception")
    public String demoException() throws Exception {
        if(true){
            throw new Exception("This is for Demo Exception");
        }
        return "demo";
    }

    @ExceptionHandler
    public String exceptionHandler(Exception e){
        return "error3";
    }
}

那么这个error3 view 应该存放在什么地方呢?

当使用spring boot的默认配置时(没有添加过任何template engine,以及没有修改过spring.resources.static-locations,也没有配置spring mvc view.  如spring.mvc.view.prefix和spring.mvc.view.suffix)时,它只是forward到/error3这个地址。如果没有任何定义urlmapping 到这个地址,则会找不到,然后就会forward到默认的server.error.path中去,即/error这个地址,如果没有disable server.error.whitelabel.enable这个设置的话,就是显示默认的whitelable。

如果设置了spring.mvc.view.suffix的话,比如设置为.html。 那么当exception发生时,ContentNegotiatingViewResolver最终会认为是jstlview. 就会farward/error3.html这个地址上来。他就会在默认的static-locations下先查找error3.html这个文件,如果没有找到的话就会到servlet的document目录下去查找,tomcat的默认路径就是webapp(注意:webapp目录与resources目录是平级的)下查找。spring.mvc.view.prefix和spring.mvc.view.suffix的设置就是对jsp servlet context的,而且是相对路径。而其他template engine的prefix则是classpth下的路径,设置时需要添加classpath:

如果spring boot在使用任何一个template engine时,ContentNegotiatingViewResolver就会认为这个是一个特定的template engine view,就会到默认配置的resources/templates/目录下查找。如果找不到就会跑出错误。

在ContentNegotiatingViewresolver的resolveViewName中,先获取candidateViews, 然后再获取最佳View。(注意:这里选择的最佳view有可能在templates下根本就不存在,从而导致view.render()的时候就会抛出Error resolving template [hello], template might not exist or might not be accessible by any of the configured Template Resolvers的错误)

 

 

发表评论