【问题标题】:Jetty 7.6 does not compile JSP filesJetty 7.6 不编译 JSP 文件
【发布时间】:2019-01-24 16:21:39
【问题描述】:

我是 Jetty 和 JSP 的新手。我现在正在尝试使用 Embedded Jetty 和 JSP 创建简单的服务器以生成 html。

我首先应该提到的是,我受限于 Jetty 版本。我必须使用的版本是 Jetty 7.6.x.x。

我需要创建一些 servlet,我可以在其中将请求/响应分派给 JSP 文件。问题是 JSP 文件似乎没有被编译,而不是评估表达式,而是将整个脚本作为纯文本扔到浏览器中。让我们看看。

public void start() throws Exception {
    server = new Server();
    SelectChannelConnector connector = new SelectChannelConnector();
    connector.setPort(port);
    server.addConnector(connector);

    // Base URI to webapp, where jsp files are located
    URI baseUri = getWebRootResourceUri();

    // Create Servlet context
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setContextPath("/");
    context.setResourceBase(baseUri.toASCIIString());

    // Default Servlet (always last, always named "default")
    ServletHolder holderDefault = new ServletHolder("default", DefaultServlet.class);
    holderDefault.setInitParameter("resourceBase", baseUri.toASCIIString());
    holderDefault.setInitParameter("dirAllowed", "true");
    context.addServlet(holderDefault, "/");
    server.setHandler(context);

    server.start();

}

这是JSP文件

    <!DOCTYPE html>
<html>
    <head>
        <title>Coin Flipper</title>
    </head>
    <body>
        <h1>Coin Flipper</h1>
        <p>Flipping a coin...</p>
        <% if(Math.random() < .5){ %>
            <p>Heads!</p>
        <% }
        else{ %>
            <p>Tails!</p>
        <% } %>
        <hr />
        <p>Refresh to flip again.</p>
    </body>
</html>

结果如下:

我没有使用 web.xml,但如果它可以解决我的问题,我不介意使用它。

这也是我的 maven 依赖项:

<dependencies>
        <!-- Embedded web server -->
        <!-- https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server -->
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>7.6.21.v20160908</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-servlet -->
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-servlet</artifactId>
            <version>7.6.21.v20160908</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.glassfish.web/jsp-impl -->
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jsp-impl</artifactId>
            <version>2.1.3-b10</version>
        </dependency>

    </dependencies>

【问题讨论】:

  • Jetty 7 is EOL (End of Life),考虑升级到当前受支持的版本。
  • Jetty 9 从 Glassfish JSP 迁移到 Apache Jasper JSP,因为 Glassfish 实现中有太多未合并/未解决的错误。
  • @JoakimErdfelt “我首先要提到的是,我受限于 Jetty 版本。我必须使用的版本是 Jetty 7.6.x.x。”
  • 继续使用 Jetty 7 的第一个原因是 Android,如果是这样,您必须使用 jetty 中的 jspc 和 jetty 中的 glassfish 实现,并在部署之前预编译您的 JSP。另请注意,由于 Jetty 7 是 EOL,因此针对它的现有/已知/公共漏洞未修复。
  • @JoakimErdfelt 是的,我知道。这应该只是我实际项目所需的临时物品

标签: java maven jsp embedded-jetty end-of-life


【解决方案1】:

来自https://wiki.eclipse.org/Jetty/Howto/Configure_JSP

在 7.5.0 之前的 Jetty 版本中,JSP 基础结构使用 $JETTY_HOME/lib/jsp 中提供的 Eclipse Java 编译器 (ecj.jar)。对于 jetty-7.5.0,我们将 JSP 版本升级到 jsp-impl-2.1.3.b10(来自 Glassfish)。在此版本中,如果 Java 版本为 1.6 或更高版本,JSP 基础结构总是尝试从 JVM 获取 Java 编译器。因此,如果您使用的是 JRE,JSP 将无法编译,因此您必须使用完整的 JDK。或者,您可以预编译您的 JSP(无论如何这在生产部署中都是可取的)。 Jetty JSPC Maven 插件有助于预编译。

这听起来与您的问题完全一样。按照上面链接的说明,使用 JDK 或预编译 JSP。

【讨论】:

  • 预编译在这里很重要。当 WEB-INF/web.xml 更新为包含对新 servlet 的静态引用(预编译的 jsps 的结果)时,您就会知道是否正确。
  • @eis 我正在使用 JDK
  • @vnkid 好的,那么您至少需要添加 jsp servlet setup 作为 Joakim 链接。但预编译是首选。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多