java - JSP 正在下载而不是渲染
问题描述
我的应用程序首先下载了 jsp 文件,而不是在页面上呈现它。我在控制台中收到 200 状态代码,但在页面上收到 404。我环顾四周,发现我应该为 tomcat-jasper 和 tomcat-embed 添加依赖项,但现在得到一个类转换异常,说 jspservlet 不能转换为 javax servlet。任何帮助表示赞赏。谢谢!
得到一个ApplicationContextException
:
Caused by: javax.servlet.ServletException: Class [org.apache.jasper.servlet.JspServlet] is not a Servlet
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1054) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:989) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedContext.load(TomcatEmbeddedContext.java:82) ~[spring-boot-2.5.2.jar:2.5.2]
... 32 common frames omitted
Caused by: java.lang.ClassCastException: org.apache.jasper.servlet.JspServlet cannot be cast to javax.servlet.Servlet
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1049) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
... 34 common frames omitted
当我在我的 pom 中有这个时会发生这种情况:
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>10.1.0-M2</version>
<scope>runtime</scope>
</dependency>
当这从我的 pom 中取出时,一切正常,点击控制器并返回 ModelAndView 但下载 jsp 而不是实际显示页面。
解决方案
TL;DR:使用
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
您添加的依赖项存在几个问题:
- 您应该使用
tomcat-embed-jasper
而不是tomcat-jasper
:它取决于tomcat-embed-core
(Spring Boot 已使用)而不是tomcat-catalina
( Spring Boot未使用)。包括后者会导致类似这个问题的问题。 - Jasper 10.1 实现了 JSP 3.0,它与 Tomcat 9.0 提供的 Servlet 4.0 不兼容(参见this question)。由于
spring-boot-parent
管理这些依赖关系,您应该省略<version>
标签并使用 Spring Boot 选择的版本(您正在使用的版本为 9.0.48,但在更新 Spring Boot 时它将保持同步), - 如果您将应用程序作为 WAR 文件部署在外部 servlet 容器中,您希望使用 servlet 容器提供的 JSP 引擎版本,而不是您自己的版本。因此,您应该将范围设置为
provided
.
推荐阅读
- javascript - 运行reduce,map函数
- python - Python类型中的Literal和Union有什么区别?
- node.js - 猫鼬异步/等待正确的方法
- php - PHP:当我保存 JPG 图像时,文件扩展名总是丢失
- c - 尽管使用了 signal() 函数,为什么 SIGUSR1 会终止我的子进程?
- opencart - Opencart 版本 2.0.3.1,产品页面上的查看按钮不起作用
- flutter - Flutter 在 null 上调用了方法“showSnackBar”
- c++ - Boost.program_options 生成的可执行文件太大
- javascript - Bluebird Promise each:如果 promise 被拒绝,则继续迭代
- javascript - JS函数在Django模板中不起作用