写点什么

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

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

Vue3:显示markdown文档

空城机

markdown Vue3 7月月更

Verilog HDL

贾献华

7月月更

Google上网神器Ghelper

源字节1号

软件开发 小程序开发

vueCli3.x版本中如何修改打包好的css、js、img文件名

木叶🐱

7月月更

面试官:你确定Redis是单线程的进程吗?

Java永远的神

Java redis 程序员 架构 面试

2022年浙江省等保备案流程指南

行云管家

等保 等保备案

uni-app进阶之内嵌应用【day14】

恒山其若陋兮

7月月更

易周金融 | 邮惠万家银行开业;微信公众号叫停四类金融营销宣传

易观分析

金融

动手实践丨手把手教你用STM32做一个智能鱼缸

华为云开发者联盟

物联网 IoT

不是我说,Nacos和Apollo中的长轮询定时机制,真的太好用了

Java全栈架构师

Java 程序员 面试 微服务 nacos

怎么学自动化测试

和牛

测试

Mria+RLOG新架构下的EMQX 5.0如何实现1亿MQTT连接

EMQ映云科技

物联网 IoT mnesia emqx 7月月更

快速构建企业级应用的开发平台

力软低代码开发平台

云计算和大数据的关系以及区别详细讲解

行云管家

云计算 大大数据

模块七

Geek_2ce415

Redis 持久化 - RDB 源码详细分析|保姆级别分析!全网最全

领创集团Advance Intelligence Group

持久化 rdb redis 底层原理

不吹不黑JAVA Stream的collect用法与原理,远比你想象的更强大

程序员小毕

Java 程序员 程序人生 stream collect

易观千帆银行用户体验中心成立,助力银行业用户体验升级

易观分析

银行 用户体验

值得一看的智能运维AIOps关键核心技术概览!

云智慧AIOps社区

人工智能 机器学习 运维 智能运维 自动化运维

四个简单例子教你通过用户行为记录提高用户体验

观测云

JAVA编程规范之控制语句

源字节1号

后端开发

全新出品!阿里P5工程师~P8架构师晋升路线揭秘

程序员小毕

Java 程序员 面试 架构师 学习路线

短视频直播系统源码——如何优化满足用户需求?

开源直播系统源码

直播系统源码 开源源码 短视频直播系统源码

软件研发落地实践,要从设计就开始

华为云开发者联盟

云计算 后端 开发

李宏毅《机器学习》丨2. Regression(回归)

AXYZdong

机器学习 7月月更

模块七作业 - 王者荣耀商城异地多活架构设计

算法题每日一练---第1天:猴子分香蕉

知心宝贝

算法 前端 后端 云开发 7月月更

2022年5月视频用户洞察:用户使用时长增长 平台降本增效初见成效

易观分析

视频行业

如何使用IDEA数据库工具连接TDengine?

TDengine

数据库 tdengine 时序数据库

万物皆可Cassandra:HUAWEI Tag背后的神仙数据库

华为云开发者联盟

数据库 后端

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