最近在做项目的时候发想一个jsp 找不到的问题,很头痛, 先还原一下问题
先上一张图吧 :
然后呢我的控制器是这样的
当然我这个是还原错误,所以就简单的写了一个Demo
这个呢是我的Config 所以我很确定的以为它肯定能显示出来 但是事与愿违 它永远都是404 然后我问了一下同事,他告诉了我一个方法 :
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
打包 mvn -Dmaven.test.skip -U clean package
在maven项目中加入 打包的插件 在用如上命令打包一下,在控制台用jar 命令去启动war 包就可以成功的访问到
然后果然成功了,但是本人我思前想后 不知道为什么
所谓知其然得知起所以然, 于是我就开始掰扯源码 : 问题的关键在于它的实现的原理
首先我们确定的是 由于用了jsp 它到页面渲染的时候肯定是用到
这个类是用来处理JSP模板的 转发到 JSPServlet这个类
InternalResourceViewResolver -> forward -> JspServlet
JspServlet 这个类 ,然后呢从这个类我又找到了
这个类,那么就来debug一下来看看到底发生了什么?
private File getCommonDocumentRoot() { for (String commonDocRoot : COMMON_DOC_ROOTS) { File root = new File(commonDocRoot); if (root.exists() && root.isDirectory()) { return root.getAbsoluteFile(); } } return null; }
ok我们发现这儿有个循环 那么我就看它里面是什么东西
这个Newfile 的时候肯定不用是他是去找文件,去了
那么这里就拿工具获取一下他的数据
这个参数呢是获取到他的工作的目录
好的那么看看这个时候这个new File 的绝对目录:
好的我们看到这边这个newFile的时候呢 找到的是这个目录,所以问题就显而易见了,由于我们这个工程是父字工程,所以它在找目录的时候呢,一直用的父 pom 的名字,所以肯定是404啦!!
因此包404是很正常的了我们需要的目录是 它的子工程,
所以我们怎么去修复呢?
问题是我们的Springboot 后台设置嵌入式tomcat的时候它会给到一个临时的路径
所哟找到了这个类:
WebServerFactoryCustomizer这个类呢就是tomcat的自定义器,我们在这儿定义好之后,就不会找不到啦
@Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> customizer() { return (factory) -> { factory.addContextCustomizers((context) -> { //当然这里要写你自己的 String relativePath = "springboot-view/src/main/webapp"; // 相对于 user.dir = D:\javawork\dive-in-spring-boot File docBaseFile = new File(relativePath); // 路径是否存在 if (docBaseFile.exists()) { context.setDocBase(docBaseFile.getAbsolutePath()); } } ); }; }
加上这个配置