为嵌入式 Jetty 12 添加 jsp 支持

问题描述 投票:0回答:1

我正在尝试制作一个带有嵌入式 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 文件,但没有成功。

java embedded-jetty
1个回答
0
投票

我没有使用

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 参数。

© www.soinside.com 2019 - 2024. All rights reserved.