A simple and modern Java and Kotlin web framework
Javalin is a very lightweight web framework for Kotlin and Java which supports WebSockets, HTTP2 and async requests. Javalin’s main goals are simplicity, a great developer experience, and first class interoperability between Kotlin and Java.
Javalin is more of a library than a framework. Some key points: * You don't need to extend anything * There are no @Annotations * There is no reflection * There is no other magic; just code.
General information: * The project webpage is javalin.io (repo for webpage is at github.com/javalin/javalin.github.io). * Documentation: javalin.io/documentation * Chat on Gitter: https://gitter.im/javalin-io/general * Chat on Discord: https://discord.gg/sgak4e5NKv * Contributions are very welcome: CONTRIBUTING.md * License summary: https://tldrlegal.com/license/apache-license-2.0-(apache-2.0) * Interesting issues: /tipsy/javalin/issues?q=label:INFO
io.javalin javalin 3.13.3
compile "io.javalin:javalin:3.13.3"
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")); } }
import io.javalin.Javalinfun main() { val app = Javalin.create().start(7000) app.get("/") { ctx -> ctx.result("Hello World") } }
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).
val 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)
app.ws("/websocket/:path") { ws -> ws.onConnect { ctx -> println("Connected") } ws.onMessage { ctx -> val user = ctx.message(); // convert from json string to object ctx.send(user); // convert to json string and send back } ws.onClose { ctx -> println("Closed") } ws.onError { ctx -> println("Errored") } }
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)app.wsBefore("/some-path/") { ws -> ... } // runs before ws events on /some-path/ app.wsBefore { ws -> ... } // runs before all ws events app.wsAfter { ws -> ... } // runs after all ws events app.wsException(Exception.class) { e, ctx -> ... } // runs if uncaught Exception in ws handler
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.body>() ctx.status(204) }
app.post("/upload") { ctx -> ctx.uploadedFiles("files").forEach { (contentType, content, name, extension) -> FileUtil.streamToFile(content, "upload/$name") } }
Javalin has an OpenAPI (Swagger) plugin. Documentation can be enabled both through a DSL and through annotations, and Javalin can render docs using both SwaggerUI and ReDoc. Read more at https://javalin.io/plugins/openapi.