Есть ли способ использовать Servlet API с Undertow?

Я только что узнал, как работает 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, который использует API-интерфейс сервлета от Undertow, но после прочтения документации и источника я не могу найти способ сделать это. Я не использую файлы .war, а только встроенный Jetty. У кого-нибудь есть указатели?


person Adam Arold    schedule 08.02.2016    source источник
comment
Создание развертывания сервлета в undertow.io/undertow -docs/undertow-docs-1.3.0/ ?   -  person BalusC    schedule 08.02.2016
comment
Как я уже сказал, у меня нет файлов .war, я просто хочу интегрировать Undertow в существующую структуру (веб-инфраструктуру искры), которая использует классы API сервлета (запрос и ответ).   -  person Adam Arold    schedule 08.02.2016
comment
А где сказано, что вам нужен файл .war? имя развертывания != физический файл войны.   -  person BalusC    schedule 08.02.2016
comment
Помните о роли/области/требованиях ServletContext в среде сервлетов, тогда вся документация начнет иметь смысл.   -  person Joakim Erdfelt    schedule 08.02.2016


Ответы (1)


Это описано в разделе Создание развертывания сервлета.. Вот MCVE, основанный на документации, при условии, что у вас есть право на зависимости вместе с 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();
    }

}

Когда вы открываете http://localhost:8888/myapp/myservlet в своем любимом веб-браузере после копирования вставьте и запустите приведенный выше код, вы увидите

Привет, мир!

person BalusC    schedule 08.02.2016