Java Undertow
最后修改于 2024 年 1 月 27 日
Java Undertow 教程展示了如何使用 Undertow 在 Java 中创建 Web 应用程序。 示例可以在作者的 存储库 中找到。
Undertow
Undertow 是一个用 Java 编写的灵活高性能 Web 服务器。它由 JBoss 赞助,是 Wildfly 应用服务器中的默认 Web 服务器。
Undertow 的特性
- 提供阻塞和非阻塞 API
- 提供对 Servlet 4.0 API 的支持
- 包含易于使用的流畅构建器 API
- 它是可嵌入的
- 提供 HTTP 升级支持
- 包含 Websocket 支持
要使用 Undertow,我们需要 undertow-core 依赖项。
Java Undertow 简单示例
以下是使用 Undertow 服务器的简单示例。
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
这是项目结构。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home page</title>
</head>
<body>
<p>
Home page.
</p>
</body>
</html>
这是一个简单的欢迎页面。
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();
}
}
我们使用 resource 和 addWelcomeFiles 添加了欢迎页面。
Java Undertow 查询字符串
查询字符串是统一资源定位符 (URL) 的一部分,它为指定的参数分配值。 查询字符串通常包含由浏览器或其他客户端应用程序添加到基本 URL 的字段。 这通常在 HTML 表单中完成。
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 处理程序。
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 向客户端发送纯文本消息。
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 中,我们对现有路由进行分组。 我们有一个纯文本处理程序和一个未找到的处理程序。
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
我们向应用程序生成三个请求。
来源
在本文中,我们使用嵌入式 Untertow 服务器创建了简单的 Web 应用程序。
作者
列出所有Java教程。