springboot搭建的web项目-Path with "WEB-INF" or "META-INF": [WEB-INF/hello.jsp]解决办法-关键在maven仓库里面的jar

最近搭建的springboot的web简单demo工程,能够正常返回Controller层的数据,就是无法返回指定的jsp页面。访问资源就报 404资源无法找到。

以下就是自己在核实问题时候的关键图文记录:
总的来说,
1 参考网上资源搭建一个web项目,为springboot搭建起来的项目添加webapp目录。主意是设置webapp的相关projectStruct
2 追加spingboot对web项目的依赖支持jar包

org.springframework.boot
spring-boot-starter-web

3 因为默认springboot 不支持jsp编译的。所以需要追加jasper的依赖tomcat-embed-jasper

4 最关键是要把 tomcat-embed-jasper这个里面包含的jar包给下载或者单独下载(或者更新现有的版本),再依赖到你的项目里面。这个步骤基本决定了,你是否能成功访问页面

5 建议问题定位前,开启项目的debug日志级别权限。能够从日志里面,看到当你访问不成功时候,后台的关键日志记录 forword请求路劲
基本可以看到报错【Path with “WEB-INF” or “META-INF”: [WEB-INF/hello.jsp]】

下面是web项目简单构造
1 添加web支持
只需在pom.xml中加入spring-boot-starter-web的依赖即可。自动配置在WebMvcAutoConfiguration和WebMvcProperties

2 在项目的resource 同一层,加一个文件夹webapp
springboot搭建的web项目-Path with
3 配置项目的web模块:web.xml配置和webapp作为 web resource的资源文件夹配置
springboot搭建的web项目-Path with
4 确定之后,你的项目里面webapp 注意看,【是带有蓝色的小圆点,这才证明你新加的文件夹,设置成功】 ,蓝色的小圆点,不是很明显,但是确实跟你刚刚建立的普通文件夹,是有这个差异存在的。
springboot搭建的web项目-Path with
5 保证了上面操作之后,你在webapp-进行new创建文件的时候,直接能看到jsp如果上面操作没成功,你直接在webapp下,是无法通过new 操作,看到jsp文件快捷创建选择项的(比较重要的)
springboot搭建的web项目-Path with
6 上面5个步骤基本就完成了webapp文件的创建,项目的modules配置,以及能够跟普通web项目一样,建立jsp文件了。 接下来就是springboot项目里面的
Controller层的代码了。简单模拟如下
springboot搭建的web项目-Path with
上面记录两点,第一个是我们的
springboot启动主类的路劲,一定要保证在我们所有controller控制层类的 上一层**。如图记录的,跟controller真正的控制类的上一级目录。 第二就是需要访问的jsp页面的返回方式,这个就很简单了,通过RequestMapping和服务的返回值就能确定。

7 完成Controller方法之后,需要配置视图解析层。在我们的application.properties文件里面直接描述你的view位置和类型即可

spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp

8 这个时候,我们能够基本可以正常启动springbooot。
按照这种操作或者网上的其他教程挨着挨着搭建,理论上是可以访问到jsp页面的。但是99%的可能,你的请求是失败的。但是最终都会报 404错误。
你能看到后台,每次请求之后,都会打印方法体里面的日志,但是就是找不到页面为了定位问题,建议将你的项目日志设置成debug模式。这样能详细看到请求和转发过程
在这里插入图片描述

但是你前台页面,始终是无法展示hello.jsp的内容。后台日志记录,有一个很关键的报错【Path with “WEB-INF” or “META-INF”: [WEB-INF/hello.jsp]

关于这个问题的解决方案和思路:
1 首先你简单确定下,你的项目里面,不去请求jsp页面。其他json串任意写一个请求,看看是否正常。
2 再回头检查你的请求url和controller代码写的是否一致。
3 前面2点,基本99%的伙伴都是ok的。那么参考网上其他教程会告诉你
springboot应用默认是不支持jsp的,但是可以通过其他插件为你服务。
会让加如下配置:
springboot搭建的web项目-Path with
看到这个是不是很熟悉了,很多解决方案里面都是这么写的。不错我也这么去试错的。但是不管我怎么更新maven,重启,重新请求,问题依然存在。
这不科学呀,后台还是找不到这个路劲下jsp,但代码配置都没问题啊???

问题到底出在哪儿了,不科学啊。
1 很关键的一步: 追加完pom.xml 关于tomcat-embed-jasper依赖之后。先确定你的仓库里面是否已经确定存在了(基本就是ctrl+点击是否能跳转)。

—PS: 我回头去自己的maven资源库找这个 org.apache.tomcat.embed下居然没有tomcat-embed-XXX的相关jar.尽管我多次更新maven依赖。但是最终仓库里面都没有,这个应该是 追加了pom依赖,任然无法完成jsp定向的根本原因!!!

2 那么为什么maven没有给我们下载依赖到本地仓库呢?

无法更新下对应tomcat-embed-XXX jar到本地,根本原因应该是这个配置依赖在 初次配置的时候,没有对应的版本号. ,导致maven去更新也没找到具体的jar。从而直接导致仓库里面没jar包。

(网上其他大佬的经验直接依赖不带版本号的,他们项目是可以的,很可能是他们本地仓库里面早就存在一个刚刚好可用的tomcat-enbed-xxx的jar包了)

多次试错之后,就确定了不是 因为网上建议的pom追加有问题,而是追加的方式不太严谨(尤其是第一次下载jar的同学,你压根不知道
需要下载哪个版本的jar)
所以最终我找到一个版本8.5.20 .你只要能把这个版本的相关jar(对应的pom里面可以看到包含了三个jar包)给抓到本地仓库,访问页面就能够搞定。

3 如果本地有这个tomcat-embed-xxx相关jar,那么还有一点需要试错,那么就你本地的版本问题,是否存在版本过低过高。目前我使用的是8.5.20

springboot搭建的web项目-Path with

	
		org.apache.tomcat.embed
		tomcat-embed-jasper
		8.5.20
	
最终的试错结果访问ok。  
这个问题我在网上看了很多很多解决方案,最终还是因为版本依赖的问题,
导致的。但同样的后台debug级别后的日志,也提供了很大帮忙,
让你至少知道是因为请求资源后,内部的handle无法处理导致。
从而发现是jar更新或者版本问题导致。

以上记录希望对有需要的同学,在排查这个问题的时候,有思路上的启发。
多谢阅读。转载。

你可能感兴趣的:(springboot搭建的web项目-Path with "WEB-INF" or "META-INF": [WEB-INF/hello.jsp]解决办法-关键在maven仓库里面的jar)