Springboot解决JSP找不到的问题, 解决 Maven 多模块 JSP 无法读取的问题

最近在做项目的时候发想一个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());
                    }
                }
        );
    };
}

加上这个配置 

已标记关键词 清除标记
查了一天了也没查到问题,我配置了mvc的前缀和后缀,可就是返回不了jsp,是打的war包有问题吗, 还是缺少什么web的包,它只会报Circular view path [/main]: would dispatch back to the current handler URL [/main] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.),实在是查不到怎么解决了,照着springboot的官方web例子改也不行,直接返回了字符串而不是jsp页面,真心求各位帮帮忙。 yml配置文件里的源码 ``` mvc: view: prefix: /WEB-INF/jsp/ suffix: .jsp ``` gradle的依赖包引入 ``` compile 'org.springframework.boot:spring-boot-starter-data-jpa' compile 'org.springframework.boot:spring-boot-starter-freemarker' compile 'org.springframework.boot:spring-boot-starter-groovy-templates' compile 'org.springframework.boot:spring-boot-starter-jdbc' compile 'com.h2database:h2:1.4.190' compile 'com.alibaba:fastjson:1.2.7' compile 'com.google.guava:guava:18.0' compile 'org.springframework.boot:spring-boot-starter-redis' compile 'org.springframework.boot:spring-boot-starter-web' // compile 'org.springframework.boot:spring-boot-starter-jetty' compile 'org.springframework.boot:spring-boot-starter-tomcat' compile 'org.apache.tomcat.embed:tomcat-embed-jasper' compile 'javax.servlet:jstl' compile 'org.apache.directory.studio:org.apache.commons.lang:2.6' compile 'commons-io:commons-io:2.4' compile 'mysql:mysql-connector-java' testCompile 'org.springframework.boot:spring-boot-starter-test' compile 'org.springframework.boot:spring-boot-starter-data-rest' compile 'org.springframework.boot:spring-boot-configuration-processor' compile 'com.googlecode.xmemcached:xmemcached:2.0.0' ``` controller ``` @RequestMapping("/main") public ModelAndView welcome1() { logger.error("111111111111111") return new ModelAndView("/main") } ``` 日志能打出来,但是这个main.jsp不到 war包的目录结构 ![图片说明](https://img-ask.csdn.net/upload/201604/27/1461742939_597620.png) 又去查了一下,视频和例子都在说引入 compile 'org.springframework.boot:spring-boot-starter-tomcat' compile 'org.apache.tomcat.embed:tomcat-embed-jasper' 两个依赖后,注释为@Controller,直接return字符串类型的jsp名就可以 可就是还是不行,ViewResolver好像没有设置
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页