说起 Java 语言下的 Web 框架那就非 Spring Framework 不可了,但是今天在和别人在聊天的过程中发现了一个新奇的项目 Javalin。Javalin 是一个轻量的 Web 框架。支持 WebSocket, HTTP2 和异步请求。简单的看了一下官方的说明文档,确实非常轻量,几行代码就可以启动一个 HTTP 服务。

Javalin 最初是 SparkJava 的一个分支,后来受到 JavaScript 框架 koa.js 的影响,逐渐独立成一个新的项目发展。

首先来看看一个比 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"); // 没有验证,返回字符串或空
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();

handler

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

使用 AccessManager 接口来实现验证和授权。

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

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

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

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

部署执行

通过 mvn package 就可以打包一个 jar 文件,直接运行 java -jar xxx.jar 就可以启动。

启动 7000 端口占用问题

因为我在 macOS 下启动 Javalin 程序,默认是使用的 7000 端口,但是起来的时候发现端口被占用了。

用 lsof 查看

❯ sudo lsof -nP -i4TCP |grep 7000
Password:
Swinsian   1563 einverne   36u  IPv4 0xa107511eb4d4e74b      0t0  TCP 127.0.0.1:50677->127.0.0.1:7000 (CLOSED)
Swinsian   1563 einverne   37u  IPv4 0xa107511eb4d4e74b      0t0  TCP 127.0.0.1:50677->127.0.0.1:7000 (CLOSED)
ControlCe  1578 einverne   29u  IPv4 0xa107511eb42171fb      0t0  TCP *:7000 (LISTEN)

查看进程

❯ sudo ps aux | grep 1578
einverne         46918   0.7  0.0 34253900    968 s000  S+    2:37PM   0:00.00 grep --color=auto 1578
einverne          1578   0.0  0.1 36594320  36324   ??  S    Sun12PM   1:24.15 /System/Library/CoreServices/ControlCenter.app/Contents/MacOS/ControlCenter

发现竟然是系统的 ControlCenter 占用了本地 7000 端口,用如下的方法禁用。

参考文档

  • 官方文档:https://javalin.io/documentation

  • 官方教程:https://javalin.io/tutorials/

  • Running Javalin on GraalVM:https://javalin.io/2018/09/27/javalin-graalvm-example.html

转自:@einverne,

链接:einverne.github.io/post/2022/09/javalin-first-impression.htm

------

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取!

推荐阅读

  • 10.1K Star,值得推荐的企业级开源低代码引擎!

  • 40岁还在做程序员是好还是坏?

  • 苹果 M1/M2 Mac 正式支持运行Win11

··································

你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。

点击领取2022最新10000T学习资料

Javalin:一个轻量的 Web Framework相关推荐

  1. 我们开源了一个轻量的 Web IDE UI 框架 - Molecule

    Molecule , 一个轻量的 Web IDE UI 框架 https://github.com/DTStack/molecule​github.com/DTStack/molecule 简介 Mo ...

  2. 基于轻量型Web服务器Raspkate的RESTful API的实现

    在上一篇文章<Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器>中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkat ...

  3. Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器

    最近在业余时间玩玩树莓派,刚开始的时候在树莓派里写一些基于wiringPi库的C语言程序来控制树莓派的GPIO引脚,从而控制LED发光二极管的闪烁,后来觉得,是不是可以使用HTML5+jQuery等流 ...

  4. 在 C++ 中实现一个轻量的标记清除 gc 系统

    在 C++ 中实现一个轻量的标记清除 gc 系统 最近想把 engine 做一个简单 C++ 封装,结合 QT 使用.engine 本身是用纯 C 实现的,大部分应用基于 lua 开发.对对象生命期管 ...

  5. 关于VSCode中工作区的讲解与使用工作区还你一个轻量 的VSCode

    VSCode的使用率在逐渐提高,但安装太多的插件会使得VSCode变得臃肿,甚至运行变慢,占用太多内存,此文章介绍了工作区,并如何来使用工作区更好地体验VSCode. 初次使用VSCode,肯定有很多 ...

  6. windows中常用的一个轻量的扫描软件xray_windows_amd64

    1.xray_windows_amd64现在windows中常用的一个轻量的扫描软件,用法要求各位同学通过物联网查找使用方式 完成对文章管理系统cms页面进行漏洞扫描. ①安装证书,在命令框xray_ ...

  7. Multipass - 一个轻量虚拟机管理器

    Multipass 是一个轻量虚拟机管理器,是由 Ubuntu 运营公司 Canonical 所推出的开源项目.运行环境支持 Linux.Windows.macOS.在不同的操作系统上,使用的是不同的 ...

  8. 轻量的web框架Bottle

    简洁的web框架Bottle 简介 Bottle是一个非常简洁,轻量web框架,与django形成鲜明的对比,它只由一个单文件组成,文件总共只有3700多行代码,依赖只有python标准库.但是麻雀虽 ...

  9. Nancy总结(一)Nancy一个轻量的MVC框架

    Nancy是一个基于.net 和Mono 构建的HTTP服务框架,是一个非常轻量级的web框架. 设计用于处理 DELETE, GET, HEAD, OPTIONS, POST, PUT 和 PATC ...

最新文章

  1. error: Upgrade DB using Essex release first.
  2. 领域驱动设计在互联网业务开发中的实践
  3. 碎片化学习前端资料分享~
  4. C# 2.0对现有语法的改进
  5. Flask安装首页显示
  6. 车牌号专用键盘设计和正则验证
  7. MFC开发IM-第十一篇、MFC设置对话框的背景颜色及设置透明
  8. 通过流程构建组织的【个人能力】和【团队能力】
  9. String、StringBuiler、StringBuffer的区别
  10. Java-NIO(一):简介
  11. 整合hibernate4到spring4mvc框架
  12. 进击高手【第五期】思维题
  13. Kafka生产者是如何发送消息的?
  14. 从零编写基于MATLAB的GNSS_SDR程序(GNSS软件接收机)——学习记录(2)
  15. java微信小程序音乐播放器分享系统
  16. 迷路的奶牛 Farmer John C++
  17. 大学计算机基础实验指导第一章答案,(教材)大学计算机基础实验指导与习题解答...
  18. 常州php学校排名,常州重点中学初中排名2019,常州重点初中学校名单及排行榜
  19. 关于R语言中的恒等==解释
  20. 精密空调维护如何维护

热门文章

  1. SQL Server(解决问题)已成功与服务器建立连接,但是在登录过程中发生错误
  2. 使用virtuoso和calibre对版图进行DRC LVS的检查
  3. 从大厂出来的几个产品朋友,现如今怎么样了?
  4. 半双工通信是指c语言,Linux下C语言实现半双工的UDP通信
  5. 张鹏:腾讯云直播PCDN加速方案(附视频回放)
  6. win11怎么关闭自动更新系统
  7. 向5岁小朋友解释什么是微服务
  8. CF赛后总结——一个自闭症患者的心路历程
  9. APNS部署教程2(证书配置)
  10. Python全局变量的隐藏“窍门”