You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为嵌入式Jetty 12添加JSP支持?

嵌入式Jetty 12.0.7添加JSP支持实现方案

问题描述

基于嵌入式Jetty 12.0.7开发的应用,已实现静态资源(HTML/CSS等)、Servlet及Filter服务,但在/src/main/resources/web/目录添加JSP文件后无法正常解析,现有代码及Maven依赖如下:

现有初始化代码

public static void init() throws Exception {
    Server server = new Server();

    ServerConnector connector = new ServerConnector(server);
    connector.setPort(8080);
    server.addConnector(connector);

    // Create and configure a ResourceHandler.
    WebAppContext handler = new WebAppContext();

    // Configure the directory where static resources are located.
    URL r = Start.class.getResource("/web/");
    System.out.println(r);
    handler.setBaseResource(ResourceFactory.of(handler).newResource(r));

    server.setHandler(handler);
    handler.addServlet(HelloServlet.class, "/hi");
    handler.addFilter(LoggerFilter.class, "/*",
            EnumSet.of(INCLUDE, ASYNC, FORWARD, ERROR, REQUEST));

    server.start();
}

当前Maven依赖

<properties>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
    <jetty.version>12.0.7</jetty.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.eclipse.jetty.ee10</groupId>
        <artifactId>jetty-ee10-webapp</artifactId>
        <version>${jetty.version}</version>
    </dependency>

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>${jetty.version}</version>
    </dependency>

    <dependency>
        <groupId>org.eclipse.jetty.ee10</groupId>
        <artifactId>jetty-ee10-apache-jsp</artifactId>
        <version>${jetty.version}</version>
    </dependency>
</dependencies>

解决方案

Jetty 12(EE10分支)的JSP支持需补充依赖并配置关键参数,具体步骤如下:

1. 完善Maven依赖

添加JSP API兼容包及Apache Jasper实现(Jetty EE10依赖该引擎处理JSP):

<dependency>
    <groupId>org.eclipse.jetty.ee10</groupId>
    <artifactId>jetty-ee10-jsp-api</artifactId>
    <version>${jetty.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jasper</artifactId>
    <version>10.1.18</version> <!-- 与Jetty 12.0.7兼容的版本 -->
    <scope>runtime</scope>
</dependency>

2. 修改初始化代码,配置JSP组件

在WebAppContext中添加JSP Servlet注册及必要参数配置,修改后的代码如下:

import org.eclipse.jetty.ee10.servlet.ServletHolder;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.ee10.jsp.JspServlet;
import java.nio.file.Path;
import java.util.EnumSet;

public static void init() throws Exception {
    Server server = new Server();

    ServerConnector connector = new ServerConnector(server);
    connector.setPort(8080);
    server.addConnector(connector);

    WebAppContext handler = new WebAppContext();

    // 配置静态资源根目录
    URL webRootUrl = Start.class.getResource("/web/");
    Resource webRoot = ResourceFactory.of(handler).newResource(webRootUrl);
    handler.setBaseResource(webRoot);

    // 设置JSP编译临时目录(必须可写,用于存储编译后的class文件)
    Path tempDir = Path.of(System.getProperty("java.io.tmpdir"), "jetty-jsp-work");
    handler.setAttribute("javax.servlet.context.tempdir", tempDir.toFile());

    // 注册JSP Servlet,处理所有.jsp后缀请求
    ServletHolder jspHolder = handler.addServlet(JspServlet.class, "*.jsp");
    // 传入当前应用类路径,确保JSP能访问应用内的Java类
    jspHolder.setInitParameter("classpath", System.getProperty("java.class.path"));
    // 开启预编译(可选,优化首次访问速度)
    jspHolder.setInitParameter("precompilation", "true");

    // 保留原有Servlet和Filter配置
    handler.addServlet(HelloServlet.class, "/hi");
    handler.addFilter(LoggerFilter.class, "/*",
            EnumSet.of(INCLUDE, ASYNC, FORWARD, ERROR, REQUEST));

    server.setHandler(handler);
    server.start();
}

3. 验证JSP功能

在src/main/resources/web/目录下创建测试JSP文件(如index.jsp):

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Jetty JSP Test</title>
</head>
<body>
    <h1>Hello from Jetty 12 JSP!</h1>
    <p>Current time: <%= new java.util.Date() %></p>
</body>
</html>

启动应用后访问http://localhost:8080/index.jsp,若能正常渲染页面则说明配置成功。

关键注意事项

  • 所有Jetty依赖需统一使用org.eclipse.jetty.ee10前缀,避免EE8与EE10分支冲突。
  • JSP临时目录必须确保应用有读写权限,否则会导致编译失败。
  • Tomcat Jasper版本需与Jetty版本兼容,Jetty 12.0.7对应Tomcat Jasper 10.x系列(符合EE10规范)。

内容的提问来源于stack exchange,提问作者user2303818

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:29:58