【问题标题】:Is there a way to use the Servlet API with Undertow?有没有办法将 Servlet API 与 Undertow 一起使用?
【发布时间】:2016-05-18 02:56:39
【问题描述】:

我刚刚发现 Undertow 是如何工作的,我对它的 api 感到惊讶:

Undertow server = Undertow.builder()
                .addHttpListener(8080, "localhost")
                .setHandler(new HttpHandler() {
                    @Override
                    public void handleRequest(final HttpServerExchange exchange) throws Exception {
                        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                        exchange.getResponseSender().send("Hello World");
                    }
                }).build();
        server.start();

有没有办法像这样使用更方便的servlet api

Undertow server = Undertow.builder()
                .addHttpListener(8080, "localhost")
                .setHandler(new HttpHandler() {
                    @Override
                    public void handleRequest(final HttpServletRequest request, final HttpServletResponse response) throws Exception {
                        // ...
                    }
                }).build();
        server.start();

我想要实现的是替换当前工作的 Jetty 容器,该容器使用 Undertow 的 servlet api,但在阅读了文档和源代码后,我似乎找不到解决方法这样做。我没有使用 .war 文件,只是一个嵌入式 Jetty。有人指点吗?

【问题讨论】:

  • undertow.io/undertow-docs/undertow-docs-1.3.0/… 中的“创建 Servlet 部署”?
  • 正如我所说我没有 .war 文件,我只想将 Undertow 集成到使用 servlet api 类(请求和响应)的现有框架(Spark Web 框架)中。
  • 呃,它在哪里说你需要一个 .war 文件? “部署名称”!=“物理战争文件”。
  • 了解 ServletContext 在 servlet 环境中的作用/范围/要求,那么所有文档都将开始有意义。

标签: java servlets undertow


【解决方案1】:

它记录在 Creating a Servlet Deployment 部分。这是一个基于文档的 MCVE,前提是您拥有 dependencies 权限,以及 Servlet API。

package com.stackoverflow.q35269763;

import io.undertow.Handlers;
import io.undertow.Undertow;
import io.undertow.server.handlers.PathHandler;
import io.undertow.servlet.Servlets;
import io.undertow.servlet.api.DeploymentInfo;
import io.undertow.servlet.api.DeploymentManager;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Test {

    public static void main(String... args) throws Exception {
        DeploymentInfo servletBuilder = Servlets.deployment().setClassLoader(Test.class.getClassLoader())
            .setDeploymentName("myapp").setContextPath("/myapp")
            .addServlets(Servlets.servlet("myservlet",
                new HttpServlet() {
                    @Override
                    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                        response.getWriter().write("Hello World!");
                    }
                }.getClass()).addMapping("/myservlet"));
        DeploymentManager manager = Servlets.defaultContainer().addDeployment(servletBuilder);
        manager.deploy();
        PathHandler path = Handlers.path(Handlers.redirect("/myapp")).addPrefixPath("/myapp", manager.start());
        Undertow server = Undertow.builder().addHttpListener(8888, "localhost").setHandler(path).build();
        server.start();
    }

}

当你复制'n'粘贴'n'运行上述代码后,在你最喜欢的网络浏览器中打开http://localhost:8888/myapp/myservlet,你会看到

世界你好!

【讨论】:

    猜你喜欢
    • 2018-03-15
    • 2016-11-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多