Javalin adalah kerangka web yang sangat ringan untuk Kotlin dan Java yang mendukung permintaan WebSockets, HTTP2, dan async. Tujuan utama Javalin adalah kesederhanaan, pengalaman pengembang yang luar biasa, dan interoperabilitas kelas satu antara Kotlin dan Java.
Javalin lebih merupakan perpustakaan daripada kerangka kerja. Beberapa poin penting:
Anda tidak perlu memperpanjang apa pun
Tidak ada @Annotations
Tidak ada refleksi
Tidak ada keajaiban lain; hanya kode.
Halaman web proyek adalah javalin.io (sumbernya ada di javalin/javalin.github.io).
Baca dokumentasi di: javalin.io/documentation
Ringkasan lisensi dapat ditemukan di TLDR Legal
Masalah yang menarik
Kami memiliki server Discord yang sangat aktif tempat Anda bisa mendapatkan bantuan dengan cepat. Kami juga memiliki Slack (yang kurang aktif) jika Anda menginginkannya.
Kontribusi sangat kami harapkan, Anda dapat membaca lebih lanjut tentang berkontribusi dalam panduan kami: KONTRIBUSI
Harap pertimbangkan untuk mensponsori atau membintangi Javalin jika Anda ingin mendukung proyek ini.
io.javalin javalin 6.3.0
implementasi("io.javalin:javalin:6.3.0")
impor io.javalin.Javalin;kelas publik HelloWorld { public static void main(String[] args) { var app = Javalin.create(/*config*/) .mendapatkan("/", ctx -> ctx.hasil("Halo Dunia")) .mulai(7070); } }
impor io.javalin.Javalinfun main() { val app = Javalin.create(/*config*/) .mendapatkan("/") { it.hasil("Halo Dunia") } .mulai(7070) }
Bagian ini berisi beberapa contoh, sebagian besar hanya diambil dari dokumen. Semua contoh ada di Kotlin, tetapi Anda dapat menemukannya di Java di dokumentasi (ini hanya perubahan sintaksis).
Anda dapat menemukan lebih banyak contoh di repositori javalin-samples.
impor io.javalin.Javalinimport io.javalin.apibuilder.ApiBuilder.*fun main() { val app = Javalin.create { config -> config.useVirtualThreads = benar config.http.asyncTimeout = 10_000L config.staticFiles.add("/publik") config.staticFiles.enableWebjars() config.router.apiBuilder { jalur("/pengguna") { dapatkan(Pengontrol Pengguna::getSemua) posting(UserController::buat) jalur("/{userId}") { dapatkan(Pengontrol Pengguna::getOne) tambalan(Pengontrol Pengguna::perbarui) hapus(UserController::hapus) } ws("/acara",pengontrol pengguna::webSocketEvents) } } }.mulai(7070) }
aplikasi.ws("/websocket/{path}") { ws -> ws.onConnect { ctx -> println("Tersambung") } ws.onMessage { ctx -> val user = ctx.message() // mengonversi dari string json ke objek ctx.send(user) // konversikan ke string json dan kirim kembali } ws.onClose { ctx -> println("Tutup") } ws.onError { ctx -> println("Kesalahan") } }
app.before("/some-path/*") { ctx -> ... } // dijalankan sebelum permintaan ke /some-path/*app.before { ctx -> ... } // dijalankan sebelum semua permintaanapp .after { ctx -> ... } // dijalankan setelah semua requestapp.Exception(Exception.class) { e, ctx -> ... } // dijalankan jika tidak tertangkap Exceptionapp.error(404) { ctx -> .. } // berjalan jika statusnya 404 (setelah semua penangan lainnya)app.wsBefore("/some-path/*") { ws -> ... } // dijalankan sebelum acara ws di /some-path/*app.wsBefore { ws -> .. } // dijalankan sebelum semua ws eventsapp.wsAfter { ws -> ... } // dijalankan setelah semua ws eventsapp.wsException(Exception.class) { e, ctx -> ... } // dijalankan jika tidak tertangkap Pengecualian di. adalah penangan
var semua yang harus dilakukan = arrayOf(...) app.get("/todos") { ctx -> // memetakan array Todos ke json-string ctx.json(semua) } app.put("/todos") { ctx -> // memetakan badan permintaan (json) ke array Todos semua yang harus dilakukan = ctx.body>() ctx.status(204) }
aplikasi.post("/unggah") { ctx -> ctx.uploadedFiles("file").forEach { uploadFile -> FileUtil.streamToFile(uploadedFile.content(), "upload/${uploadedFile.namafile()}") } }
Javalin memiliki sistem plugin yang memungkinkan Anda menambahkan fungsionalitas ke perpustakaan inti. Anda dapat menemukan daftar plugin di sini.
Memasang plugin semudah menambahkan ketergantungan pada proyek Anda dan mendaftarkannya ke Javalin:
Javalin.buat { config -> config.registerPlugin(PluginSaya()) }
Beberapa plugin yang paling populer adalah:
Plugin Javalin OpenAPI memungkinkan Anda membuat spesifikasi OpenAPI 3.0 untuk API Anda pada waktu kompilasi.
Beri anotasi pada rute Anda dengan @OpenApi
untuk menghasilkan spesifikasi:
@OpenApi( ringkasan = "Dapatkan semua pengguna", operasiId = "getAllUsers", tag = ["Pengguna"], tanggapan = [OpenApiResponse("200", [OpenApiContent(Array::kelas)])], jalur = "/pengguna", metode = [HttpMethod.GET] )fun getAll(ctx: Konteks) { ctx.json(UserService.getAll()) }
Implementasi Swagger UI dan ReDoc UI untuk melihat spesifikasi yang dihasilkan di browser Anda juga tersedia.
Untuk informasi lebih lanjut, lihat Javalin OpenAPI Wiki.
Plugin Javalin SSL memungkinkan Anda mengonfigurasi SSL dengan mudah untuk server Javalin Anda, mendukung berbagai format seperti PEM, PKCS12, DER, P7B, dan JKS.
Mengaktifkan SSL pada port 443 semudah:
val plugin = SSLPlugin { konf -> conf.pemFromPath("/path/to/cert.pem", "/path/to/key.pem") }Javalin.buat { javalinConfig -> javalinConfig.plugins.register(plugin) }.awal()
logo | Sponsor |
---|---|
@barbarysoftware (50 USD/m) | |
KabCash (50 USD/m) |
Blake Mizerany, untuk menciptakan Sinatra
Per Wendel, untuk membuat Spark
Christian Rasmussen, karena telah menjadi pria yang hebat
Per Kristian Kummermo, juga karena telah menjadi pria yang baik