Spring项目中已存在的JSP文件为何无法被访问?
问题背景
在基础Spring应用中编写了请求处理控制器,但访问对应路径时出现404错误,JSP文件实际存在却无法被加载。
代码与配置
Controller代码 (SayHelloController.java)
@Controller public class SayHelloController { @RequestMapping("say-hello-jsp") public String sayHelloJsp() { return "sayHello"; } }
配置文件 (application.properties)
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp logging.level.org.springframwork=debug
JSP页面 (sayHello.jsp)
<html> <head> My first JSP file! </head> <body> <h1>Hello</h1> <p> This is the text we want to show <br/> <p> </body> </html>
错误日志
访问http://localhost:8080/say-hello-jsp时,日志输出如下:
: GET "/say-hello-jsp", parameters={} : Mapped to com.in28minutes.springboot.myfirstwebapp.hello.SayHelloController#sayHelloJsp() : Selected 'text/html' given [text/html, application/xhtml+xml, image/avif, image/webp, image/apng, application/xml;q=0.9, application/signed-exchange;v=b3;q=0.9, */*;q=0.8] : View name 'sayHello', model {} : Forwarding to [/WEB-INF/jsp/sayHello.jsp] : "FORWARD" dispatch for GET "/WEB-INF/jsp/sayHello.jsp", parameters={} : Mapped to ResourceHttpRequestHandler [classpath [META-INF/resources/], classpath [resources/], classpath [static/], classpath [public/], ServletContext [/]] : "Path with "WEB-INF" or "META-INF": [WEB-INF/jsp/sayHello.jsp]" : Resource not found
文件位置验证
JSP文件确实存在,路径信息如下:
macbook-air:jsp gerald$ pwd /Users/gerald/IdeaProjects/myfirstwebapp/src/main/resources/META-INF/resources/WEB-INF/jsp macbook-air:jsp gerald$ ls sayHello.jsp
依赖配置
pom.xml中已添加Jasper依赖:
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency>
问题原因与解决办法
1. JSP文件存放路径错误
Spring Boot中,JSP文件需要放在src/main/webapp/WEB-INF/jsp/目录下,而非src/main/resources下。resources目录的资源会被打包到classpath,但JSP需要Tomcat的Jasper引擎直接处理,必须放在webapp目录下才能被正确转发加载。
解决:手动创建src/main/webapp/WEB-INF/jsp/目录,将sayHello.jsp移至该路径。
2. Jasper依赖范围问题
tomcat-embed-jasper的scope设为provided,表示依赖由运行容器提供,但本地开发用的嵌入式Tomcat需要这个依赖编译JSP,provided会导致依赖未被加载。
解决:删除<scope>provided</scope>(默认scope为compile),或改为<scope>compile</scope>。
3. 配置文件拼写错误
application.properties中logging.level.org.springframwork=debug存在拼写错误,正确应为logging.level.org.springframework=debug。该错误不影响JSP访问,但建议修正以保证日志正常输出。
最后步骤
修改完成后重启应用,重新访问http://localhost:8080/say-hello-jsp即可正常加载JSP页面。
内容的提问来源于stack exchange,提问作者user5819768

