Javalin هو إطار عمل ويب خفيف الوزن جدًا لـ Kotlin وJava ويدعم طلبات WebSockets وHTTP2 والطلبات غير المتزامنة. الأهداف الرئيسية لـ Javalin هي البساطة، وتجربة مطور رائعة، وقابلية التشغيل البيني من الدرجة الأولى بين Kotlin وJava.
Javalin هي مكتبة أكثر من كونها إطارًا. بعض النقاط الرئيسية:
لا تحتاج إلى تمديد أي شيء
لا توجد تعليقات توضيحية
لا يوجد انعكاس
لا يوجد سحر آخر. مجرد رمز.
صفحة ويب المشروع هي javalin.io (المصدر موجود في javalin/javalin.github.io).
اقرأ الوثائق على: javalin.io/documentation
يمكن العثور على ملخص الترخيص في TLDR Legal
قضايا مثيرة للاهتمام
لدينا خادم Discord نشط للغاية حيث يمكنك الحصول على المساعدة بسرعة. لدينا أيضًا Slack (أقل نشاطًا بكثير) إذا كنت تفضل ذلك.
نرحب بشدة بالمساهمات، ويمكنك قراءة المزيد حول المساهمة في دليلنا: المساهمة
يرجى النظر في رعاية Javalin أو تمثيله إذا كنت ترغب في دعم المشروع.
<التبعية>io.javalin جافالين <الإصدار>6.3.0الإصدار> التبعية>
التنفيذ ("io.javalin:javalin:6.3.0")
import io.javalin.Javalin;public class HelloWorld { public static void main(String[] args) { var app = Javalin.create(/*config*/) .get("/"، ctx -> ctx.result("مرحبا بالعالم")) .start(7070); } }
import io.javalin.Javalinfun main() { val app = Javalin.create(/*config*/) .get("/") { it.result("Hello World") } .ابدأ(7070) }
يحتوي هذا القسم على بعض الأمثلة، معظمها مستخرج للتو من المستندات. جميع الأمثلة موجودة في Kotlin، ولكن يمكنك العثور عليها في Java في الوثائق (إنها مجرد تغييرات في بناء الجملة).
يمكنك العثور على المزيد من الأمثلة في مستودع عينات جافالين.
import io.javalin.Javalinimport io.javalin.apibuilder.ApiBuilder.*fun main() { val app = Javalin.create { config -> config.useVirtualThreads = صحيح config.http.asyncTimeout = 10_000L config.staticFiles.add("/public") config.staticFiles.enableWebjars() التكوين. جهاز التوجيه.apiBuilder { المسار("/المستخدمين") { الحصول على (UserController::getAll) نشر (UserController::إنشاء) المسار("/{معرف المستخدم}") { الحصول على (UserController::getOne) التصحيح (UserController::update) حذف (UserController::delete) } ws("/الأحداث"، userController::webSocketEvents) } } .بدء(7070) }
app.ws("/websocket/{path}") { ws -> ws.onConnect { ctx -> println("متصل") } ws.onMessage { ctx -> val user = ctx.message() // التحويل من سلسلة json إلى كائن ctx.send(user) // تحويل إلى سلسلة json وإرسالها مرة أخرى } ws.onClose { ctx -> println("مغلق") } ws.onError { ctx -> println("خطأ") } }
app.before("/some-path/*") { ctx -> ... } // يتم تشغيله قبل الطلبات إلى /some-path/*app.before { ctx -> ... } // يتم تشغيله قبل جميع طلبات التطبيق .after { ctx -> ... } // يعمل بعد كل الطلباتapp.exception(Exception.class) { e, ctx -> ... } // يعمل إذا لم يتم اكتشاف Exceptionapp.error(404) { ctx -> .. } // يعمل إذا الحالة هي 404 (بعد جميع المعالجات الأخرى)app.wsBefore("/some-path/*") { ws -> ... } // يتم تشغيله قبل أحداث ws على /some-path/*app.wsBefore { ws -> ... } // يتم تشغيله قبل كافة أحداث wsapp.wsAfter { ws -> ... } // يتم تشغيله بعد جميع أحداث wsapp.wsException(Exception.class) { e, ctx -> ... } // يتم تشغيله إذا استثناء لم يتم اكتشافه في معالج ws
فار تودوس = صفيف (...) app.get("/todos") { ctx -> // تعيين مجموعة من Todos إلى سلسلة json ctx.json(جميع) } app.put("/todos") { ctx -> // تعيين نص الطلب (json) إلى مجموعة Todos جميع المهام = ctx.body>() الحالة(204) }
app.post("/upload") { ctx -> ctx.uploadedFiles("files").forEach { uploadFile -> FileUtil.streamToFile(uploadedFile.content(), "upload/${uploadedFile.filename()}") } }
يحتوي Javalin على نظام إضافي يسمح لك بإضافة وظائف إلى المكتبة الأساسية. يمكنك العثور على قائمة بالمكونات الإضافية هنا.
يعد تثبيت المكون الإضافي أمرًا سهلاً مثل إضافة تبعية إلى مشروعك وتسجيله في Javalin:
Javalin.create { التكوين -> config.registerPlugin(MyPlugin()) }
بعض المكونات الإضافية الأكثر شيوعًا هي:
يسمح لك المكون الإضافي Javalin OpenAPI بإنشاء مواصفات OpenAPI 3.0 لواجهة برمجة التطبيقات (API) الخاصة بك في وقت الترجمة.
قم بإضافة تعليقات توضيحية إلى مساراتك باستخدام @OpenApi
لإنشاء المواصفات:
@OpenApi( ملخص = "الحصول على كافة المستخدمين"، معرف العملية = "getAllUsers"، العلامات = ["المستخدم"]، الاستجابات = [OpenApiResponse("200", [OpenApiContent(Array::class)])], المسار = "/المستخدمين"، الأساليب = [HttpMethod.GET] )متعة getAll(ctx: السياق) { ctx.json(UserService.getAll()) }
تتوفر أيضًا تطبيقات Swagger UI وReDoc UI لعرض المواصفات التي تم إنشاؤها في متصفحك.
لمزيد من المعلومات، راجع Javalin OpenAPI Wiki.
يسمح لك مكون Javalin SSL الإضافي بتكوين SSL بسهولة لخادم Javalin الخاص بك، ويدعم مجموعة متنوعة من التنسيقات مثل PEM، وPKCS12، وDER، وP7B، وJKS.
يعد تمكين SSL على منفذ 443 أمرًا سهلاً كما يلي:
val plugin = SSLPlugin { conf -> conf.pemFromPath("/path/to/cert.pem", "/path/to/key.pem") }Javalin.create { javalinConfig -> javalinConfig.plugins.register(plugin) }.يبدأ()
الشعار | راعي |
---|---|
@barbarysoftware (50 دولارًا أمريكيًا/م) | |
كاب كاش (50 دولارًا أمريكيًا/م) |
بليك ميزيراني، لإنشاء سيناترا
لكل ويندل، لإنشاء سبارك
كريستيان راسموسن، لكونه رجل عظيم
بير كريستيان كوميرمو، أيضًا لكونه رجلًا رائعًا