将 Javalin 嵌入到 Servlet 容器中

原文:https://javalin.io/2018/11/15/javalin-embedded-example.html

您将创建什么

一个包含 Javalin(不包含 Jetty)的 WAR 应用程序。您可以将此 WAR 文件放入任何 Servlet 3.0 容器中。

入门

最简单的入门方法是克隆 javalin-tomcat-embed-example 示例 应用程序:

git clone https://github.com/tipsy/javalin-tomcat-embed-example
cd javalin-tomcat-embed-example
./gradlew clean appRun

这将运行 Gradle Gretty 插件,该插件随后会在 Tomcat 中启动这个 WAR 应用。服务器启动后,您只需在终端中输入以下命令或打开 http://localhost:8080/rest 即可访问 REST 端点:

curl localhost:8080/rest/

查看来源

该项目使用 Gradle 来执行标准操作:将项目声明为 WAR,并使用Gradle Gretty 插件 在 Tomcat 中轻松启动 WAR 应用程序(使用appRun任务)。

有趣的是,该节dependencies包含 Javalin,但省略了 Jetty 依赖项:

dependencies {
    compile(kotlin("stdlib-jdk8"))
    compile("io.javalin:javalin:3.13.13") {
        exclude(mapOf("group" to "org.eclipse.jetty"))
        exclude(mapOf("group" to "org.eclipse.jetty.websocket"))
    }
    compile("org.slf4j:slf4j-simple:1.7.30")
}

servlet 本身非常简单:

@WebServlet(urlPatterns = ["/rest/*"], name = "MyRestServlet", asyncSupported = false)
class MyRestServlet : HttpServlet() {
    val javalin: JavalinServlet = Javalin.createStandalone()
            .get("/rest") { ctx -> ctx.result("Hello!") }
            .servlet()

    override fun service(req: HttpServletRequest, resp: HttpServletResponse) {
        javalin.service(req, resp)
    }
}

注意:请务必记住使用createStandalone()函数,该函数经过精心设计,使 Javalin 不依赖于 Jetty。使用Javalin.create() 会导致 WAR 应用无法启动java.lang.ClassNotFoundException: org.eclipse.jetty.server.Server。
Servlet 容器会自动发现该 Servlet(因为它带有 注释@WebServlet);任何针对该 Servlet 的请求都会直接转发到 Javalin,Javalin 会负责妥善处理该请求。请使用 @MultipartConfig 注释您的类,以便填充 UploadedFile 或 UploadedFiles Servlet 请求的 getter 方法。

作者:Jeebiz  创建时间:2025-05-04 00:44
最后编辑:Jeebiz  更新时间:2025-05-04 00:55