JSP 正在下载而不是渲染

Posted

技术标签:

【中文标题】JSP 正在下载而不是渲染【英文标题】:JSP is downloading instead of rendering 【发布时间】:2021-10-12 17:21:15 【问题描述】:

我的应用程序首先下载 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 而不是实际显示页面。

【问题讨论】:

如果您为手头的问题添加更多解释会很好。也许一些代码?您收到的错误的更多详细信息? 我们还需要查看Network选项卡的输出(尤其是响应的Content-Type)。 这只是一个 WhiteLabel 错误页面,类型为 none,状态为 404 【参考方案1】:

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 使用 )。包括后者会导致类似this question 中的问题。 Jasper 10.1 实现了 JSP 3.0,它与 Tomcat 9.0 提供的 Servlet 4.0 不兼容(参见this question)。由于spring-boot-parent 管理这些依赖项,因此您应该省略&lt;version&gt; 标记并使用Spring Boot 选择的版本(您正在使用的版本为9.0.48,但在您更新Spring Boot 时它将保持同步), 如果您将应用程序作为 WAR 文件部署在外部 servlet 容器中,您希望使用 servlet 容器提供的 JSP 引擎版本,而不是您自己的版本。因此,您应该将范围设置为provided

【讨论】:

谢谢!这解决了它!

以上是关于JSP 正在下载而不是渲染的主要内容,如果未能解决你的问题,请参考以下文章

struts2 使用 Spring Boot - JSP 未呈现

浏览器控件 NavigateToString 显示 HTML 代码而不是渲染页面

React 正在渲染 [object object] 而不是 JSX

GeometryRenderer 为啥渲染线,而不是三角形

直接渲染一个CGImage(而不是UIImage)?

如何在 grails 中使用渲染插件