Javalin 是一个非常轻量级的 Kotlin 和 Java Web 框架,支持 WebSockets、HTTP2 和异步请求。 Javalin 的主要目标是简单性、出色的开发人员体验以及 Kotlin 和 Java 之间一流的互操作性。
Javalin 与其说是一个框架,不如说是一个库。一些关键点:
你不需要扩展任何东西
没有@Annotations
没有反射
没有其他魔法;只是代码。
项目网页是javalin.io(源代码位于javalin/javalin.github.io)。
阅读以下文档:javalin.io/documentation
许可证摘要可在 TLDR Legal 中找到
有趣的问题
我们有一个非常活跃的 Discord 服务器,您可以在其中快速获得帮助。如果您愿意的话,我们还有一个(不太活跃的)Slack。
非常欢迎贡献,您可以在我们的指南中阅读有关贡献的更多信息:贡献
如果您想支持该项目,请考虑赞助或主演 Javalin。
<依赖关系>io.javalin javalin <版本>6.3.0版本> 依赖>
实现(“io.javalin:javalin:6.3.0”)
导入 io.javalin.Javalin;public class HelloWorld { public static void main(String[] args) { var app = Javalin.create(/*config*/) .get("/", ctx -> ctx.result("Hello World")) .开始(7070); } }
导入 io.javalin.Javalinfun main() { val app = Javalin.create(/*config*/) .get("/") { it.result("Hello World") } .开始(7070) }
本节包含一些示例,大部分只是从文档中提取的。所有示例均采用 Kotlin 语言,但您可以在文档中找到 Java 语言版本(只是语法更改)。
您可以在 javalin-samples 存储库中找到更多示例。
导入 io.javalin.Javalinimport io.javalin.apibuilder.ApiBuilder.*fun main() { val app = Javalin.create { 配置 -> config.useVirtualThreads = true config.http.asyncTimeout = 10_000L config.staticFiles.add("/public") config.staticFiles.enableWebjars() config.router.apiBuilder { 路径(“/用户”){ 获取(用户控制器::getAll) 发布(用户控制器::创建) 路径(“/{userId}”){ 获取(用户控制器::getOne) 补丁(用户控制器::更新) 删除(用户控制器::删除) } ws("/events", userController::webSocketEvents) } } }.开始(7070) }
app.ws("/websocket/{path}") { ws -> ws.onConnect { ctx -> println("已连接") } ws.onMessage { ctx -> val user = ctx.message() // 从 json 字符串转换为对象 ctx.send(user) // 转换为json字符串并发回 } ws.onClose { ctx -> println("已关闭") } ws.onError { ctx -> println("错误") } }
app.before("/some-path/*") { ctx -> ... } // 在对 /some-path/*app 的请求之前运行 app.before { ctx -> ... } // 在所有请求之前运行app .after { ctx -> ... } // 在所有请求之后运行app.exception(Exception.class) { e, ctx -> ... } // 如果未捕获则运行 Exceptionapp.error(404) { ctx -> .. . } // 运行如果status 为 404(在所有其他处理程序之后)app.wsBefore("/some-path/*") { ws -> ... } // 在 /some-path/*app.wsBefore 上的 ws 事件之前运行 { ws -> ... } // 在所有 ws events 之前运行 app.wsAfter { ws -> ... } // 在所有 ws events 之后运行 app.wsException(Exception.class) { e, ctx -> ... } // 如果未捕获则运行ws 处理程序中的异常
var todos = arrayOf(...) app.get("/todos") { ctx -> // 将 Todos 数组映射到 json 字符串 ctx.json(待办事项) } app.put("/todos") { ctx -> // 将 request-body (json) 映射到 Todos 数组 todos = ctx.body>() ctx.状态(204) }
app.post("/上传") { ctx -> ctx.uploadedFiles("files").forEach { uploadedFile -> FileUtil.streamToFile(uploadedFile.content(), "upload/${uploadedFile.filename()}") } }
Javalin 有一个插件系统,允许您向核心库添加功能。您可以在此处找到插件列表。
安装插件就像向项目添加依赖项并使用 Javalin 注册一样简单:
Javalin.create { 配置 -> config.registerPlugin(MyPlugin()) }
一些最流行的插件是:
Javalin OpenAPI 插件允许您在编译时为您的 API 生成 OpenAPI 3.0 规范。
使用@OpenApi
注释您的路由以生成规范:
@OpenApi( 摘要 =“获取所有用户”, 操作Id = "获取所有用户", 标签= [“用户”], 响应 = [OpenApiResponse("200", [OpenApiContent(Array::class)])], 路径=“/用户”, 方法 = [HttpMethod.GET] )fun getAll(ctx: 上下文) { ctx.json(UserService.getAll()) }
还可以使用 Swagger UI 和 ReDoc UI 实现来在浏览器中查看生成的规范。
有关更多信息,请参阅 Javalin OpenAPI Wiki。
Javalin SSL 插件允许您轻松地为 Javalin 服务器配置 SSL,支持多种格式,例如 PEM、PKCS12、DER、P7B 和 JKS。
在 443 端口上启用 SSL 非常简单:
val 插件 = SSLPlugin {conf -> conf.pemFromPath("/path/to/cert.pem", "/path/to/key.pem") }Javalin.create { javalinConfig -> javalinConfig.plugins.register(插件) }。开始()
标识 | 赞助 |
---|---|
@barbarysoftware(50 美元/月) | |
KabCash (50 美元/月) |
布莱克·米泽拉尼 (Blake Mizerany),创作辛纳屈 (Sinatra)
Per Wendel,创建 Spark
克里斯蒂安·拉斯穆森(Christian Rasmussen),因为他是一个伟大的人
Per Kristian Kummermo,也是一个伟大的人