Servlets / Undertow - 访问HttpServletRequest和HttpServletResponse

时间:2017-06-27 20:31:19

标签: java servlets kotlin undertow

我试图创建一个简单的下载servlet-server,但是我想要实例化servlet时遇到一些问题。我不一定需要使用HttpServlet,我只需要访问HttpServletRequestHttpServletResponse,因此我可以通过myServicer运行它们。实现这一目标的最佳方法是什么? 我目前的代码:

myServicer = ...
undertow = Undertow.builder()
    .addHttpListener(port, host)
    .setHandler(Handlers.path(Handlers.redirect("/")).addPrefixPath("/",
        Servlets.defaultContainer().addDeployment(
            Servlets.deployment()
                .setClassLoader(EmbeddedUndertowServer::class.java.classLoader)
                .setDeploymentName("myDeployment").setContextPath("/")
                .addServlets(Servlets.servlet("myServlet",
                    object : HttpServlet() {
                        override fun service(request: HttpServletRequest, response: HttpServletResponse) {
                            myServicer.service(request, response) // doesn't work
                        }
                    }.javaClass).addMapping("/"))
        ).apply { deploy() }.start()
    ))
    .build()
undertow.start()

这不起作用,因为它只想要一个它试图实例化的类。

此处的完整代码/项目:https://github.com/tipsy/javalin/pull/25/files

2 个答案:

答案 0 :(得分:2)

我得到的解决方案是创建一个" stub"通过服务商的servlet。

    val servletBuilder = Servlets.deployment()
            .setClassLoader(EmbeddedUndertowServer::class.java.getClassLoader())
            .setContextPath("/")
            .setDeploymentName("javalinDeployment")
            .addServletContextAttribute("javalin-servlet", javalinServlet)
            .addServlets(Servlets.servlet("javalinServlet", UndertowServlet::class.java).addMapping("/"))
    val manager = Servlets.defaultContainer().addDeployment(servletBuilder)
    manager.deploy()
    val httpHandler = manager.start()
    val path = Handlers.path(Handlers.redirect("/")).addPrefixPath("/", httpHandler)
    this.undertow = Undertow.builder().addHttpListener(port, host).setHandler(path).build()
    undertow.start()

然后可以在每个servlet初始化阶段加载服务器:

private var javalinServlet: JavalinServlet? = null

@Throws(ServletException::class)
override fun init(config: ServletConfig) {
    this.config = config
    javalinServlet = config.servletContext.getAttribute("javalin-servlet") as JavalinServlet
}

您可以在此处查看更改:https://github.com/osmundf/javalin-undertow/commit/30487196f2dd7a44d3ef524f642040a7330caf4e

答案 1 :(得分:0)

我不熟悉Undertow,但是通过快速查看他们的文档说它是一个应用程序服务器(Web也是如此),您可以将Servlet和Undertow处理程序混合在一起。这很可能意味着您需要使用Handler与HttpServerExchange或定义Servlet以使用HttpServletRequest或HttpServletResponse。