我正在尝试制作一个带有嵌入式 Jetty 12.0.7 的应用程序,该应用程序应该提供静态内容(如 html 和 css 文件)和动态内容(如 servlet 和过滤器)。到目前为止,我拥有的代码位于此处:
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();
}
现在我想添加对 jsp 文件以及 /web/ 下的其他内容的支持(顺便说一下,它位于 /src/main/resources/ 路径下)。有谁知道如何为上面的功能添加jsp支持吗?到目前为止,我的依赖项如下所示:
<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“理解”jsp 文件,但没有成功。
我没有使用
WebAppContext
,而是使用ServletContextHandler
,但希望不会有太大不同。
首先,除了
JettyJasperInitializer
之外还必须添加JettyJspServlet
:
handler.addServletContainerInitializer(JettyJasperInitializer.class);
handler.addServlet(JettyJspServlet.class, "*.jsp");
但这实际上还不够,您还必须显式设置处理程序的类加载器:
handler.setClassLoader(Thread.currentThread().getContextClassLoader());
(你也可以使用
Start.class.getClassLoader()
)
我还设置了一个特定的临时目录,尽管这是必需的:
var tempdir = Files.createTempDirectory("jsp").toFile();
tempdir.deleteOnExit();
handler.setAttribute(ServletContext.TEMPDIR, tempdir);
当然,您可以配置
JettyJspServlet
的各种初始化参数(请参阅文档 https://eclipse.dev/jetty/documentation/jetty-12/operations-guide/index.html#og-configuration-of- the-jsp-servlet 和默认配置 – 使用非嵌入式 Jetty 时,因此要使用嵌入式 Jetty 进行复制 – 位于 https://github.com/jetty/jetty.project/blob/ea8139e94a6918b6edb2a3a1e8e83af45f0057ab/jetty-ee10/jetty -ee10-webapp/src/main/config/etc/webdefault-ee10.xml#L181-L219)。在生产中运行时,您至少需要将 "development"
设置为 false
。上面的临时目录也可以配置为 Servlet 上的 "scratchDir"
init 参数。