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教程。