この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
javalinって何?
javalinとは、Java/Kotlin用のシンプルなWebフレームワークです。
定番のHelloWorldは↓のように記述してサーバを起動(HelloWorldクラスの実行)すれば、
//HelloWorld.java
import io.javalin.Javalin;
public class HelloWorld {
public static void main(String[] args) {
Javalin app = Javalin.create().start(7000);
app.get("/", ctx -> ctx.result("Hello World"));
}
}
簡単に動作を確認することができます。
% curl http://localhost:7000/
Hello World
javalinは、最初はSparkのforkとして作成されたそうですが、
その後すぐにkoa.js(こことかここ参照)の影響を受けて大幅に修正されたようです。
元々javalinはSparkのサブセットとして開発されていましたが、
一気にポピュラーになって機能もSparkと同等になりました。
javalinの特徴
公式サイトにある記述にならって、javalinの特徴をざっと説明します。
- Simple&Lightweight
javalinはシンプル。
新しく学ぶ概念もなく、クラスをextendsすることもインターフェイスを
implementsする必要もありません。
また、javalinはJettyにのっている数千行程度のコードであり、とても軽量。 -
Active&Interoperable
javalinにおいて、メジャーバージョンアップ以外はすべて後方互換性があります。
そしてinteroperability(相互的な運用性)を考慮して開発されているので、
アプリケーションはJavaとKotlinどちらも同じように構築されています。 -
Flexible
javalinはデフォルトで同期モードで動作しますが、
結果としてFutureを設定した場合には非同期で動かすこともできます。
ではjavalinのセットアップから動作確認までをやってみましょう。
環境
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.12.6
- Java : 1.8.0_121
- Gradle : 5.2.1
setup javalin
Gradleのinitタスクで雛形となるプロジェクトを作成します。
% mkdir javalin-example && cd javalin-example
% gradle init --type java-application
build.gradleの記述を、下記のように修正します。
plugins {
id 'java'
}
repositories {
jcenter()
}
dependencies {
implementation 'com.google.guava:guava:27.0.1-jre'
// add Javalin libs
compile 'io.javalin:javalin:2.8.0'
compile "org.slf4j:slf4j-simple:1.7.26"
testImplementation 'junit:junit:4.12'
}
javalinには簡単にCRUD用コントローラを作成するinterfaceを提供しています。
javalin-example/src/main/java/javalin/exampleに、MyCrudController.javaファイルを作成しましょう。
package javalin.example;
import io.javalin.Context;
import io.javalin.apibuilder.CrudHandler;
import org.jetbrains.annotations.NotNull;
public class MyCrudController implements CrudHandler {
@Override
public void create(@NotNull Context ctx) {
ctx.json("created : " + ctx.body());
}
@Override
public void delete(@NotNull Context ctx, @NotNull String s) {
ctx.json("deleted : " + s);
}
@Override
public void getAll(@NotNull Context ctx) {
ctx.json("get All");
}
@Override
public void getOne(@NotNull Context ctx, @NotNull String s) {
ctx.json("get One : " + s);
}
@Override
public void update(@NotNull Context ctx, @NotNull String s) {
ctx.json("updated : " + s);
}
}
CrudHandlerを実装すると、CRUDの各種処理を簡単に実装できます。
今回は手抜きしてCRUDのメッセージを返すだけにします。
そしてサーバの起動やroutes定義を記述する、Main.javaを作成します。
package javalin.example;
import io.javalin.Javalin;
import static io.javalin.apibuilder.ApiBuilder.*;
public class Main {
public static void main(String[] args) {
Javalin app = Javalin.create().start(7000);
app.routes(() -> {
crud("hello/:hello_id", new MyCrudController());
});
}
}
上記のように記述すれば、MyCrudControllerのCRUD処理が適切なパスに関連付けられます。
ではjavalinを起動して動作を確認してみましょう。
objc[51774]: Class JavaLaunchHelper is implemented in both・・・
[main] INFO org.eclipse.jetty.util.log - Logging initialized @497ms to org.eclipse.jetty.util.log.Slf4jLog
[main] INFO io.javalin.Javalin -
__ __ _
/ /____ _ _ __ ____ _ / /(_)____
__ / // __ `/| | / // __ `// // // __ \
/ /_/ // /_/ / | |/ // /_/ // // // / / /
\____/ \__,_/ |___/ \__,_//_//_//_/ /_/
https://javalin.io/documentation
[main] INFO io.javalin.Javalin - Starting Javalin ...
[main] INFO io.javalin.Javalin - Listening on http://localhost:7000/
[main] INFO io.javalin.Javalin - Javalin started in 620ms \o/
下記のように各種APIが動作しているのがわかります。
%curl -X POST http://localhost:7000/hello -d {}
"created : {}"
%curl -X PATCH http://localhost:7000/hello/1 -d {}
"updated : 1"
%curl -X GET http://localhost:7000/hello/1
"get One : 1"
%curl -X GET http://localhost:7000/hello
"get All"
%curl -X DELETE http://localhost:7000/hello/1
"deleted : 1"
まとめ
今回はJavaの軽量フレームワークjavalinを使ってみました。
チュートリアルをみれば
必要そうなことはだいたい書いてあるので、すぐに使い始めることができると思います。