ZetCode

Java Undertow

最后修改于 2024 年 1 月 27 日

Java Undertow 教程展示了如何使用 Undertow 在 Java 中创建 Web 应用程序。 示例可以在作者的 存储库 中找到。

Undertow

Undertow 是一个用 Java 编写的灵活高性能 Web 服务器。它由 JBoss 赞助,是 Wildfly 应用服务器中的默认 Web 服务器。

Undertow 的特性

要使用 Undertow,我们需要 undertow-core 依赖项。

Java Undertow 简单示例

以下是使用 Undertow 服务器的简单示例。

com/zetcode/UndertowSimple.java
package com.zetcode;

import io.undertow.Undertow;
import io.undertow.util.Headers;

public class UndertowSimple {

    public static void main(String[] args) {

        Undertow server = Undertow.builder()
                .addHttpListener(8080, "localhost")
                .setHandler(exchange -> {
                    exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                    exchange.getResponseSender().send("Hello there");
                }).build();

        server.start();
    }
}

在本例中,我们创建了一个嵌入式 Web 服务器,它监听 8080 端口。 我们设置了一个简单的处理程序,该处理程序返回纯文本消息。

$ curl localhost:8080
Hello there

应用程序运行后,我们使用 curl 工具向 Web 服务器创建一个 GET 请求。

Java Undertow 欢迎页面

在以下示例中,我们将展示如何发送 HTML 欢迎页面。

pom.xml
src
├── main
│   ├── java
│   │   └── com
│   │       └── zetcode
│   │           └── WelcomePage.java
│   └── resources
│       └── public
│           └── index.html
└── test
    └── java

这是项目结构。

src/main/resources/public/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home page</title>
</head>
<body>
<p>
    Home page.
</p>

</body>
</html>

这是一个简单的欢迎页面。

com/zetcode/WelcomePage.java
package com.zetcode;

import io.undertow.Undertow;
import io.undertow.server.handlers.resource.ClassPathResourceManager;

import static io.undertow.Handlers.path;
import static io.undertow.Handlers.resource;

public class WelcomePage {

    public static void main(String[] args) {

        Undertow server = Undertow.builder()
                .addHttpListener(8080, "localhost")
                .setHandler(path().addPrefixPath("/",
                        resource(new ClassPathResourceManager(
                                    WelcomePage.class.getClassLoader()))
                                .addWelcomeFiles("public/index.html")))
                .build();

        server.start();
    }
}

我们使用 resourceaddWelcomeFiles 添加了欢迎页面。

Java Undertow 查询字符串

查询字符串是统一资源定位符 (URL) 的一部分,它为指定的参数分配值。 查询字符串通常包含由浏览器或其他客户端应用程序添加到基本 URL 的字段。 这通常在 HTML 表单中完成。

com/zetcode/UndertowQueryParam.java
package com.zetcode;

import io.undertow.Undertow;
import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;
import io.undertow.util.Headers;

import static io.undertow.Handlers.path;

class ItemHandler implements HttpHandler {

    @Override
    public void handleRequest(HttpServerExchange exchange) {

        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");

        var value = exchange.getQueryParameters().get("name");

        String msg;

        if (value == null) {

            msg = "Hello there";
        } else {

            msg = String.format("Hello %s", value.getFirst());
        }

        exchange.getResponseSender().send(msg);
    }
}

public class UndertowQueryParam {

    public static void main(String[] args) {

        Undertow server = Undertow.builder()
                .addHttpListener(8080, "0.0.0.0")
                .setHandler(path().addPrefixPath("/greet", new ItemHandler()))
                .build();
        server.start();
    }
}

该示例从查询字符串中读取 name 参数,构建一条消息并将其发送回客户端。

var value = exchange.getQueryParameters().get("name");

我们获取查询参数。

$ curl localhost:8080/greet?name=Peter
Hello Peter

Java Undertow 路由

路由是从 URL 路径到处理程序的映射。 例如,/about URL 被映射到 about 处理程序。

com/zetcode/PlainTextHandler.java
package com.zetcode;

import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;
import io.undertow.util.Headers;

public class PlainTextHandler implements HttpHandler {

    private final String value;

    public PlainTextHandler(String value) {
        this.value = value;
    }

    @Override
    public void handleRequest(HttpServerExchange exchange) {

        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
        exchange.getResponseSender().send(value + "\n");
    }
}

PlainTextHandler 向客户端发送纯文本消息。

com/zetcode/RoutingHandlers.java
package com.zetcode;

import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;
import io.undertow.util.Headers;

public class RoutingHandlers {

    public static HttpHandler plainTextHandler(String value) {

        return new PlainTextHandler(value);
    }

    public static void notFoundHandler(HttpServerExchange exchange) {

        exchange.setStatusCode(404);
        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
        exchange.getResponseSender().send("Page Not Found");
    }
}

RoutingHandlers 中,我们对现有路由进行分组。 我们有一个纯文本处理程序和一个未找到的处理程序。

com/zetcode/UndertowRouting.java
package com.zetcode;

import io.undertow.Undertow;
import io.undertow.server.HttpHandler;
import io.undertow.server.RoutingHandler;

public class UndertowRouting {

    public static void main(String[] args) {

        Undertow server = Undertow.builder()
                .addHttpListener(8080, "localhost", ROUTES)
                .build();

        server.start();
    }

    private static HttpHandler ROUTES = new RoutingHandler()
            .get("/", RoutingHandlers.plainTextHandler("GET - My Homepage"))
            .get("/about", RoutingHandlers.plainTextHandler("GET - about"))
            .post("/about", RoutingHandlers.plainTextHandler("POST - about"))
            .get("/new*", RoutingHandlers.plainTextHandler("GET - new*"))
            .setFallbackHandler(RoutingHandlers::notFoundHandler);
}

我们设置了几个 get 和 post 路由。 如果路径未被识别,则请求由 notFoundHandler 处理。

$ curl localhost:8080/about
GET - about
$ curl -X POST localhost:8080/about
POST - about
$ curl  localhost:8080/contact
Page Not Found

我们向应用程序生成三个请求。

来源

Java Undertow 文档

在本文中,我们使用嵌入式 Untertow 服务器创建了简单的 Web 应用程序。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程