如何为嵌入式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
相关产品推荐
相关产品推荐

