Существует несколько способов для достижения этой цели:
1) Основной подход: PathHandler
Handlers.path()
.addExactPath("/path1", handler1)
.addPrefixPath("/path2", handler2);
handler1
будет соответствовать только /path1 (или /path1/).
handler2
будет соответствовать на /путь2, /path2/ и все остальное, что начинается с /путь2/.
2) Маршрут подход: RoutingHandler
Если вы используете RoutingHandler
, у вас есть возможность легко извлечь переменные из путей. Это удобно для создания API REST, например (обратите внимание на использование метода get
удобства на RoutingHandler
).
Handlers.routing().get("/{test}/*", exchange -> {
PathTemplateMatch pathMatch = exchange.getAttachment(PathTemplateMatch.ATTACHMENT_KEY);
String itemId1 = pathMatch.getParameters().get("test"); // or exchange.getQueryParameters().get("test")
String itemId2 = pathMatch.getParameters().get("*"); // or exchange.getQueryParameters().get("*")
}))
Параметр *
может соответствовать что-нибудь (например, путь, например a/b/c
). Для использования параметра *
вам нужен фактический именованный параметр, определенный ранее в шаблоне маршрута (test
в моем примере).
Обратите внимание, что параметры, определенные в шаблоне маршрута, будут доступны вместе с параметрами запроса (exchange.getQueryParameters()
). Это поведение по умолчанию. Если вы этого не хотите, вы можете создать свой обработчик маршрутизации следующим образом: Handlers.routing(false).get(...)
, а затем получить параметры из вложений обмена.
Для любого маршрута, который не соответствует вашему обработчику маршрутизации, вы можете использовать fallbackHandler
, доступный в RoutingHandler
.
Handlers.routing()
.get("/", handler1)
.get("/index.html", handler1)
.setFallbackHandler(handler2);
По умолчанию fallbackHandler
просто возвращает пустое тело ответа с кодом 404 статуса. handler2
будет соответствовать любым другим запросам, а не только GET запросов.
Всестороннее Пример
Вы, конечно, можете комбинировать PathHandler
и RoutingHandler
в соответствии с вашими потребностями.
Вот небольшой пример более реалистичной настройки:
Undertow.builder().addHttpListener(8080, "0.0.0.0")
.setHandler(Handlers.path()
// REST API path
.addPrefixPath("/api", Handlers.routing()
.get("/customers", exchange -> {...})
.delete("/customers/{customerId}", exchange -> {...})
.setFallbackHandler(exchange -> {...}))
// Redirect root path to /static to serve the index.html by default
.addExactPath("/", Handlers.redirect("/static"))
// Serve all static files from a folder
.addPrefixPath("/static", new ResourceHandler(
new PathResourceManager(Paths.get("/path/to/www/"), 100))
.setWelcomeFiles("index.html"))
).build().start();
Это приложение также служит статические файлы из файловой системы. Это удобно для обслуживания приложения javascript или статических html-файлов, например.
Спасибо за ответ. Ваш ответ верен для моего примера, но я имел в виду общий способ обработки шаблона. Если у нас есть два '/ sample1/*' и '/ sample2/*', то один резервный обработчик не работает. – user1079877
Я отредактировал мой ответ – aramaki
Спасибо, он работает! – user1079877