QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

Java 和 Kotlin 轻量级 Web 框架 Javalin 简介

  • 2019-07-26
  • 本文字数:2231 字

    阅读完需:约 7 分钟

Java 和 Kotlin 轻量级 Web 框架 Javalin 简介

Javalin 是一款 Kotlin 和 Java 轻量级 Web 框架,它设计简单,默认情况下是阻塞的,支持 WebSocket、HTTP2 和异步请求。Javalin 最初是 SparkJava 框架的一个分支,后来受 JavaScript 框架 koa.js 的影响进行了彻底的重写。


Javalin 构建于 Jetty 之上,其性能相当于原始的 Jetty。此外,开发人员不需要扩展任何类、使用 @Annotations,也不需要为 Java 或 Kotlin 下载不同版本的 Javalin。


要在 Java 中使用 Javalin,开发人员只需要一个如下所示的 public static void main  :


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);
复制代码


在 Javalin 中验证路径参数、查询参数和表单参数等都非常简单:


var myQpStr = ctx.queryParam("my-qp"); // 没有验证,返回字符串或空var myQpInt = ctx.pathParam("my-qp", Integer.class).get(); // 返回一个整数或抛出异常var myQpInt = ctx.formParam("my-qp", Integer.class).check(i -> i > 4).get(); // 整数 > 4
// 验证两个依赖的查询参数 :var fromDate = ctx.queryParam("from", Instant.class).get();var toDate = ctx.queryParam("to", Instant.class) .check(it -> it.isAfter(fromDate), "'to' has to be after 'from'") .get();
// 验证一个json消息体:var myObject = ctx.bodyValidator(MyObject.class) .check(obj -> obj.myObjectProperty == someValue) .get();
复制代码


Javalin 另一个有趣的功能是 handler。Javalin 引入了前置 handler(before-handler)、端点 handler(endpoint-handler)、后置 handler(after-handler)、异常 handler(exception-handler)和错误 handler(error-handler)。


//前置handlerapp.before(ctx -> {    // 在所有请求之前运行});app.before("/path/*", ctx -> {    // 在/path/*请求之前运行});
//端点handlerapp.get("/", ctx -> { // 一些代码 ctx.json(object);});
app.get("/hello/*, ctx -> { // 捕获所有对/hello/子路径的请求 });
//后置handlerapp.after(ctx -> { // 在所有请求之后运行});app.after("/path/*", ctx -> { // 在/path/*请求之后运行 });
复制代码


为了处理验证/授权,Javalin 引入了功能性接口 AccessManager,程序开发人员可以根据需要实现自己的访问管理。


// 设置Javalin应该使用的access-managerapp.accessManager((handler, ctx, permittedRoles) -> {    MyRole userRole = getUserRole(ctx);    if (permittedRoles.contains(userRole)) {        handler.handle(ctx);    } else {        ctx.status(401).result("Unauthorized");    }});
Role getUserRole(Context ctx) { // 基于请求确定用户角色 // 通常通过检查标头来完成}
enum MyRole implements Role { ANYONE, ROLE_ONE, ROLE_TWO, ROLE_THREE;}
app.routes(() -> { get("/un-secured", ctx -> ctx.result("Hello"), roles(ANYONE)); get("/secured", ctx -> ctx.result("Hello"), roles(ROLE_ONE));});
复制代码


从版本 3.0 开始,Javalin 还引入了 OpenAPI(Swagger)插件。OpenAPI 3.0 规范的完整实现提供了 DSL 和注解两种使用方式。


OpenAPI DSL:


val addUserDocs = document()        .body()        .result("400")        .result("204")
fun addUserHandler(ctx: Context) { val user = ctx.body() UserRepository.addUser(user) ctx.status(204)}
复制代码


OpenAPI 注解:


@OpenApi(    requestBody = OpenApiRequestBody(User::class),    responses = [        OpenApiResponse("400", Unit::class),        OpenApiResponse("201", Unit::class)    ])fun addUserHandler(ctx: Context) {    val user = ctx.body()    UserRepository.createUser(user)    ctx.status(201)}
复制代码


要部署 Javalin 应用程序,开发人员只需创建一个有依赖项(使用 maven-assembly-plugin)的 jar,然后用 Java -jar filename.jar 发布该 jar。Javalin 带有一个嵌入式 Jetty 服务器,所以无需额外的应用程序服务器。


Javalin 还有专门为教育工作者准备的页面,该页面强调学生可以从 Javalin 受益,因为 Javalin 提供了嵌入式的 Jetty 服务器,所以不需要 Servlet Container/Application 服务器配置就可以开始编码。


有一系列教程可供使用,如Running on GraalVMKotlin CRUD REST API。可以在教程页面找到完整的列表。


文档页面提供了有关 Javalin 的更多细节。用户可以通过 maven 或从手动maven中央库下载 Javalin。


原文链接:


Introducing Javalin: a Lightweight Web Framework for Java and Kotlin


2019-07-26 08:0012157
用户头像

发布了 199 篇内容, 共 86.3 次阅读, 收获喜欢 295 次。

关注

评论 2 条评论

发布
用户头像
用同学用javalin吗,当考虑对javalin提供的rest api进行认证鉴权保护时,是否无从下手
这里自荐一个针对restful api保护的认证鉴权框架 - sureness, 完美适配javalin 并提供了javalin使用sureness的demo
https://su.usthe.com - https://github.com/tomsun28/sureness
demo地址: https://github.com/tomsun28/sureness/tree/master/samples/javalin-sureness
非常欢迎使用和贡献!!
展开
2020-09-24 22:42
回复
用户头像
挺轻量级的
2019-07-26 09:45
回复
没有更多了
发现更多内容

科大讯飞air2pro和airpro的区别,科大讯飞air2pro和airpro哪个好

妙龙

科大讯飞 学习机

基于MicroBlocks的"双模态"遥控智能小车

积木思维

用阿里通义灵码对MicroBlocks代码AI重构

积木思维

科大讯飞t30pro和lumie10pro有什么区别

妙龙

科大讯飞 学习机

科大讯飞air2和x3区别,科大讯飞air2和x3哪个好

妙龙

科大讯飞 学习机

科大讯飞s30功能配置介绍,科大讯飞s30怎么样优缺点分析

妙龙

科大讯飞 学习机

科大讯飞T30 Lite和步步高S8的区别

妙龙

科大讯飞 学习机 步步高 步步高家教机

科大讯飞air2和air区别,科大讯飞air2和air哪个好

妙龙

科大讯飞 学习机

科大讯飞智能办公本Air 2 评测 使用感受

妙龙

科大讯飞 学习机

如何做好一个中层管理

易成研发中心

企业管理 企业管理软件

SEO 搜索引擎优化核心名词全解析

恩爸编程

搜索引擎 百度 SEO SEO伪静态 SEO 优化

《Django 5 By Example》阅读笔记:p521-p542

codists

Python django

鸿蒙NEXT开发案例:颜文字搜索器

zhongcx

科大讯飞X3 LAMY、X3 Pro和X3的区别

妙龙

科大讯飞 办公本

团队测试流程如何制定和实施

易成研发中心

团队管理 团队测试流程

“明星级”人形机器人[波士顿动力]宣布裁员!

机器人头条

波士顿动力 特斯拉 人形机器人 具身智能

教学培训小程序软件开发,协助机构管理招生工作

V\TG【ch3nguang】

科大讯飞T30Lite配置参数 科大讯飞学习机哪款好

妙龙

科大讯飞 学习机

科大讯飞air2和air2pro哪个好,科大讯飞air2和air2pro区别

妙龙

科大讯飞 学习机

科大讯飞X3和X3LAMY区别

妙龙

科大讯飞 办公本

停车位预约APP开发为用户省时省力

V\TG【ch3nguang】

科大讯飞T30 Ultra,T30pro,T30 Lite选哪个好

妙龙

科大讯飞 学习机

科大讯飞Air 2 Pro和Air 2、Air Pro哪款好

妙龙

科大讯飞 学习机

科大讯飞学习机和小猿学练机区别对比

妙龙

科大讯飞 学习机

科大讯飞x3和x3pro哪个值得买

妙龙

科大讯飞 办公本

Java 和 Kotlin 轻量级 Web 框架 Javalin 简介_语言 & 开发_Diogo Carleto_InfoQ精选文章