Javalin - A simple web framework for Java and Kotlin
The project webpage is javalin.io.
Documentation: javalin.io/documentation
Chatroom: https://gitter.im/javalin-io/general
Contributions are very welcome: CONTRIBUTING.md
Java quickstart
Add dependency (maven)
<dependency>
<groupId>io.javalin</groupId>
<artifactId>javalin</artifactId>
<version>1.6.1</version>
</dependency>
Start programming:
import io.javalin.Javalin;
public class HelloWorld {
public static void main(String[] args) {
Javalin app = Javalin.start(7000);
app.get("/", ctx -> ctx.result("Hello World"));
}
}
Kotlin quickstart
Add dependency (gradle)
compile 'io.javalin:javalin:1.6.1'
Start programming
import io.javalin.Javalin
fun main(args: Array<String>) {
val app = Javalin.start(7000)
app.get("/") { ctx -> ctx.result("Hello World") }
}
Examples
This section contains a few examples, mostly just extracted from the docs. All examples are in Kotlin, but you can find them in Java in the documentation (it's just syntax changes).
Api structure and server config
val app = Javalin.create().apply {
enableStandardRequestLogging()
enableDynamicGzip()
port(port)
}.start()
app.routes {
path("users") {
get(UserController::getAllUserIds)
post(UserController::createUser)
path(":user-id") {
get(UserController::getUser)
patch(UserController::updateUser)
delete(UserController::deleteUser)
}
}
}
Filters and Mappers
app.before("/some-path/*") { ctx -> ... } // runs before requests to /some-path/*
app.before { ctx -> ... } // runs before all requests
app.after { ctx -> ... } // runs after all requests
app.exception(Exception.class) { e, ctx -> ... } // runs if uncaught Exception
app.error(404) { ctx -> ... } // runs if status is 404 (after all other handlers)
WebSockets
app.ws("/websocket") { ws ->
ws.onConnect { session -> println("Connected") }
ws.onMessage { session, message ->
println("Received: " + message)
session.remote.sendString("Echo: " + message)
}
ws.onClose { session, statusCode, reason -> println("Closed") }
ws.onError { session, throwable -> println("Errored") }
}
JSON-mapping
var todos = arrayOf(...)
app.get("/todos") { ctx -> // map array of Todos to json-string
ctx.json(todos)
}
app.put("/todos") { ctx -> // map request-body (json) to array of Todos
todos = ctx.bodyAsClass(Array<Todo>::class.java)
ctx.status(204)
}
File uploads
app.post("/upload") { ctx ->
ctx.uploadedFiles("files").forEach { (contentType, content, name, extension) ->
content.copyTo(File("upload/" + name))
}
}
Special thanks
- Blake Mizerany, for creating Sinatra
- Per Wendel, for creating Spark
- Christian Rasmussen, for being a great guy
- Per Kristian Kummermo, also for being a great guy