Servlets / Undertow – 访问HttpServletRequest和HttpServletResponse

我正在尝试创建一个简单的servlet-servlet,但是我有一些想要实例化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

我得到的解决方案是创建一个“存根”小服务程序,通过服务器。

  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初始化阶段加载servicer:

 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

我不熟悉Undertow,但通过快速浏览他们的文档说,它是一个应用程序服务器(网络以及),你可以混合使用Servlet和Undertow处理程序。 这很可能意味着您需要使用HttpServerExchange Handler或者定义一个Servlet来使用HttpServletRequest或HttpServletResponse。