Servlets/Undertow - 访问 HttpServletRequest 和 HttpServletResponse
Servlets/Undertow - Accessing HttpServletRequest and HttpServletResponse
我正在尝试创建一个简单的 undertow servlet-server,但我在想要实例化 servlet 的 undertow 方面遇到了一些问题。我不一定需要使用 HttpServlet
,我只需要访问 HttpServletRequest
和 HttpServletResponse
,这样我就可以通过 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()
这不起作用,因为 undertow 只需要一个 class,它会尝试实例化。
完整 code/project 此处:https://github.com/tipsy/javalin/pull/25/files
我对 Undertow 不熟悉,但通过快速查看他们的文档,我发现它是一个应用程序服务器(也是 Web),您可以将 Servlet 和 Undertow 处理程序混合在一起。这很可能意味着您需要将 Handler 与 HttpServerExchange
一起使用,或者定义一个 Servlet 以便使用 HttpServletRequest 或 HttpServletResponse。
我得到的解决方案是创建一个 "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
我正在尝试创建一个简单的 undertow servlet-server,但我在想要实例化 servlet 的 undertow 方面遇到了一些问题。我不一定需要使用 HttpServlet
,我只需要访问 HttpServletRequest
和 HttpServletResponse
,这样我就可以通过 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()
这不起作用,因为 undertow 只需要一个 class,它会尝试实例化。
完整 code/project 此处:https://github.com/tipsy/javalin/pull/25/files
我对 Undertow 不熟悉,但通过快速查看他们的文档,我发现它是一个应用程序服务器(也是 Web),您可以将 Servlet 和 Undertow 处理程序混合在一起。这很可能意味着您需要将 Handler 与 HttpServerExchange
一起使用,或者定义一个 Servlet 以便使用 HttpServletRequest 或 HttpServletResponse。
我得到的解决方案是创建一个 "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