Javalin 概述
Javalin 是一个轻量级的 Web 框架,适用于 Kotlin 和 Java,设计简单且默认阻塞式,支持 WebSockets、HTTP2 和异步请求。Javalin 最初是 SparkJava 框架的一个分支,但很快转变为受 JavaScript 框架 koa.js 启发的全面重写。
主要特点
- 基于 Jetty:Javalin 构建在 Jetty 之上,性能与原生 Jetty 代码相当。
- 无类继承和注解:开发者无需扩展任何类或使用注解,且 Java 和 Kotlin 使用同一版本。
- 简单启动:通过
public static void main方法即可启动应用。 - 配置灵活:支持多种配置选项,如默认内容类型、自动生成 Etags、静态文件服务、异步请求超时、动态 Gzip 和强制 SSL 等。
- 路由定义:通过简洁的 DSL 定义路由,支持 RESTful 风格的路由和 WebSocket 事件处理。
- 参数验证:支持路径参数、查询参数和表单参数的验证,且可以验证 JSON 请求体。
- 处理器:提供多种处理器,包括前置处理器、端点处理器、后置处理器、异常处理器和错误处理器。
- 认证与授权:通过
AccessManager接口实现自定义的访问管理。 - OpenAPI 支持:从 3.0 版本开始,支持 OpenAPI(Swagger)规范,提供 DSL 和注解两种实现方式。
示例代码
简单启动
public static void main(String[] args) {
var app = Javalin.create().start(7000);
app.get("/", ctx -> ctx.result("Hello World"));
}配置示例
var app = Javalin.create(config -> {
config.defaultContentType = "application/json";
config.autogenerateEtags = true;
config.addStaticFiles("/public");
config.asyncRequestTimeout = 10_000L;
config.dynamicGzip = true;
config.enforceSsl = true;
}).routes(() -> {
path("users", () -> {
get(UserController::getAll);
post(UserController::create);
path(":user-id"(() -> {
get(UserController::getOne);
patch(UserController::update);
delete(UserController::delete);
});
ws("events", userController::webSocketEvents);
});
}).start(port);参数验证
var myQpStr = ctx.queryParam("my-qp"); // 无验证,返回 String 或 null
var myQpInt = ctx.pathParam("my-qp", Integer.class).get(); // 返回 Integer 或抛出异常
var myQpInt = ctx.formParam("my-qp", Integer.class).check(i -> i > 4).get(); // 返回大于 4 的 Integer处理器示例
app.before(ctx -> {
// 在所有请求之前运行
});
app.get("/", ctx -> {
// 处理根路径请求
ctx.json(object);
});
app.after(ctx -> {
// 在所有请求之后运行
});认证与授权
app.accessManager((handler, ctx, permittedRoles) -> {
MyRole userRole = getUserRole(ctx);
if (permittedRoles.contains(userRole)) {
handler.handle(ctx);
} else {
ctx.status(401).result("Unauthorized");
}
});OpenAPI 支持
val addUserDocs = document()
.body()
.result("400")
.result("204")
fun addUserHandler(ctx: Context) {
val user = ctx.body()
UserRepository.addUser(user)
ctx.status(204)
}部署
开发者只需创建一个包含依赖的 jar 文件(使用 maven-assembly-plugin),然后通过 java -jar filename.jar 启动应用。Javalin 内置了 Jetty 服务器,无需额外的应用服务器。
教育资源
Javalin 提供了一个专门为教育者设计的页面,强调学生可以从 Javalin 中受益,因为无需配置 Servlet 容器或应用服务器即可开始编码。此外,Javalin 提供了丰富的教程,如《在 GraalVM 上运行》和《Kotlin CRUD REST API》,更多教程可在 tutorials 页面 找到。
文档与下载
更多关于 Javalin 的详细信息可在 文档页面 查看。用户可以通过 Maven 或从 Maven Central 手动下载 Javalin。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。