飞天发布时刻:2024年 Forrester 公有云平台Wave™评估报告解读 了解详情
写点什么

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:0012278
用户头像

发布了 199 篇内容, 共 87.7 次阅读, 收获喜欢 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
回复
没有更多了
发现更多内容

【小知识】云管理平台与一般管理系统有什么区别?

行云管家

云计算 云管理平台 云管理

盲盒APP开发的六大功能模式基础设置

WDL22119

盲盒商城 盲盒 盲盒开发 盲盒小程序开发 小程序开发

许北林:我为什么加入OpenHarmony生态?又为什么要做“启航KP”开发套件?

OpenHarmony开发者

OpenHarmony 开发者故事

如何在 Web 应用里消费 SAP Leonardo 的机器学习 API

汪子熙

机器学习 前端开发 前端框架 SAP 5月月更

AI简报-Image Colorization调研

AIWeker

深度学习 5月月更 AI简报 Image Colorization

Tech Talk 活动预告丨云原生 DevOps 的 Kubernetes 技巧

亚马逊云科技 (Amazon Web Services)

云原生

解读分布式调度平台Airflow在华为云MRS中的实践

华为云开发者联盟

Python spark airflow 华为云MRS 大数据集群

年薪80W,在大厂呆了10年的我,被裁得心服口服

博文视点Broadview

Seata 企业版正式开放公测

阿里巴巴云原生

阿里云 开源 云原生 seata

520,用Python定制你的《本草纲目女孩》

华为云开发者联盟

Python 华为云 modelarts 本草纲目女孩 MoXing

如何在30分钟完成表格增删改查的前后端框架搭建

葡萄城技术团队

前端 前后端 系统搭建 表格系统

使用 jMeter 对需要 User Authentication 的 Restful API 进行并发负载测试

汪子熙

Java Jmeter 性能测试 SAP 5月月更

业务逻辑的灵魂在哪里?

清林情报分析师

数据分析 数据建模 数据可视化 分析软件 分析思维

作为软件工程师,给年轻时的自己的建议(上)

禅道项目管理

程序员 工程师 职业成长

JavaScript类型转换

源字节1号

架构实战营 第 6 期 模块六课后作业

火钳刘明

#架构实战营 「架构实战营」

2022年广州市等保测评公司新排名看这里!

行云管家

网络安全 等保 等保测评 广州 等保测评公司

Niobe开发板:基于OpenHarmony操作系统进行多线程(多任务)开发

拓维信息

OpenHarmony

FinClip 前端之 VUE 核心原理总结

FinClip

比渗透测试更有用,红队演练该如何开展?

青藤云安全

31点经验分享与吐槽

老白鹿

涛思数据与中天钢铁签署战略合作协议,加速钢铁行业的数字化发展

TDengine

数据库 tdengine

FlyFish|前端数据可视化开发避坑指南(一)

云智慧AIOps社区

JavaScript 前端 node,js 数据可视化工具

【直播回顾】OpenHarmony知识赋能第五期第五课——多媒体子系统之视频解读

OpenHarmony开发者

OpenHarmony 多媒体

代码重构,真的只有复杂化一条路吗?

华为云开发者联盟

代码 代码重构 过度设计 代码设计

520,解锁开发者的专属浪漫

葡萄城技术团队

情人节 520

飞书、钉钉和企微的三巨头之争下,其他厂商在移动平台赛道如何奋起直追?

BeeWorks

Google Guava中EventBus使用不当会导致什么故障?

BUG侦探

kafka Guava EventBus

数据分析软件有哪些分类?

清林情报分析师

数据分析 数据可视化 知识图谱 分析软件 分析工具

大数据培训在 Presto 中使用哈希改善动态集群缓存命中率

@零度

音视频开发进阶课程|第一期:音频要素

ZEGO即构

RTC 音视频开发 音视频课程 音视频基础入门

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