Show HN: Я закінчив v5 фреймворку JVM, на створення якого витратив півдесяти років

Передмова

Javalin — це веб-фреймворк Java і Kotlin, який наголошує на простоті та сумісності Java/Kotlin. Він підтримує WebSockets і HTTP3, а також використовує віртуальні потоки ("Project Loom") за умовчанням. Javalin прагне бути дуже легким і має кодову базу з приблизно 7000 рядків коду Java/Kotlin, а також близько 10 000 рядків тесту (629 тестів). Проект був би неможливий без неймовірно підтримуючої спільноти JVM з відкритим кодом. . Javalin існує вже п’ять років і має 161 учасника та 497 розгалужень. 552 запити на отримання було об’єднано, а 990 запитань закрито. За останні 12 місяців проект мав три мільйони завантажень.

Я хотів би особливо подякувати одному з наших нових учасників, @dzikoysk, який дуже допоміг у підготовці до v5. Дякую, ваші внески дали мені велику мотивацію!

Добре, давайте подивимося на Javalin 5!

Привіт Javalin World

Основною метою Javalin є простота та продуктивність розробника. Приклад "Hello World" відображає це:

Java Котлін public static void main(String[] args) { var app = Javalin.create(/*config*/) .get("/", ctx -> ctx. result("Hello World")) .start(7070); } main fun() { val app = Javalin.create(/*config*/) .get("/", ctx -> ctx. result("Hello World")) .start(7070) } Відправлення даних клієнтам

Найпростіший спосіб надіслати вміст клієнту через ctx.result("Мій рядок"), який надсилає текстовий/звичайний результат. Javalin пропонує кілька варіантів надсилання відповідей:

Java Котлін ctx.result(stringOrStream)); // записуємо вхідний рядок або потік клієнту (`text/plain` за замовчуванням) ctx.json(myJson)); // серіалізація об'єкта в рядок JSON і запис до клієнта (наприклад, `application/json`) ctx.jsonStream(myJson)); // серіалізація JSON безпосередньо на клієнті (нічого не буферизовано) ctx.writeSeekableStream(myMediaFile)); // передавати аудіо та відео на клієнт (підтримує пошук/пропуск) ctx. майбутнє (myFutureSupplier); // просимо Javalin обробити запит асинхронно ctx.render("/file.ext", модель)); // візуалізація шаблону або файлу розмітки (наприклад, `text/html`) ctx.result(stringOrStream)) // записуємо вхідний рядок або потік клієнту (`text/plain` за замовчуванням) ctx.json(myJson)) // серіалізація об’єкта в рядок JSON і запис у клієнт (наприклад, `application/json`) ctx.jsonStream(myJson)); // серіалізація JSON безпосередньо на клієнті (нічого не буферизовано) ctx.writeSeekableStream(myMediaFile)) // потокове передавання аудіо та відео клієнту (підтримка пошуку/пропуску) ctx.future(myFutureSupplier) // наказує Javalin обробити запит асинхронно ctx.render("/file.ext", model)) // візуалізація моделі або файлу розмітки (наприклад, `text/html`) Обробка відгуків клієнтів

Javalin полегшує отримання та перевірку даних клієнтів за допомогою спеціальних методів:

Java Котлін ctx.body(); // отримати тіло запиту як рядок (кешувати тіло) ctx.formParam("ім'я"); // отримати параметр форми ctx.queryParam("ім'я"); // отримати параметр запиту ctx uploadedFile("ім'я"); // отримати завантажений файл // Методи JSON ctx.bodyAsClass(Clazz); // десеріалізація ctx.body() у класі ctx.bodyStreamAsClass(Clazz); // споживати вхідний потік із тіла запиту та десеріалізувати його в клас // перевірити Integer age = ctx.queryParamAsClass("age", Integer.class) // інкапсулювати параметр у валідатор .check(age -> age > 18, "NOT_OLD_ENOUGH") // додати перевірку з повідомленням про помилку .obtain(); // отримати перевірене значення або викинути ValidationException BananaBox bananaBox = ctx.bodyValidator(BananaBox.class) .check(box -> box.weight < 5, ValidationError("WEIGHT_TOO_HIGH", Map.of("MAX_WEIGHT", 5))) .check(box -> box.bananas.length > 20, ValidationError("NOT_ENOUGH_BANANAS", Map.of("MIN_BANANAS", 20))) .getOrDefault(defaultBananaBox) // використовувати значення за замовчуванням, якщо тіло має значення null, ...

Show HN: Я закінчив v5 фреймворку JVM, на створення якого витратив півдесяти років
Передмова

Javalin — це веб-фреймворк Java і Kotlin, який наголошує на простоті та сумісності Java/Kotlin. Він підтримує WebSockets і HTTP3, а також використовує віртуальні потоки ("Project Loom") за умовчанням. Javalin прагне бути дуже легким і має кодову базу з приблизно 7000 рядків коду Java/Kotlin, а також близько 10 000 рядків тесту (629 тестів). Проект був би неможливий без неймовірно підтримуючої спільноти JVM з відкритим кодом. . Javalin існує вже п’ять років і має 161 учасника та 497 розгалужень. 552 запити на отримання було об’єднано, а 990 запитань закрито. За останні 12 місяців проект мав три мільйони завантажень.

Я хотів би особливо подякувати одному з наших нових учасників, @dzikoysk, який дуже допоміг у підготовці до v5. Дякую, ваші внески дали мені велику мотивацію!

Добре, давайте подивимося на Javalin 5!

Привіт Javalin World

Основною метою Javalin є простота та продуктивність розробника. Приклад "Hello World" відображає це:

Java Котлін public static void main(String[] args) { var app = Javalin.create(/*config*/) .get("/", ctx -> ctx. result("Hello World")) .start(7070); } main fun() { val app = Javalin.create(/*config*/) .get("/", ctx -> ctx. result("Hello World")) .start(7070) } Відправлення даних клієнтам

Найпростіший спосіб надіслати вміст клієнту через ctx.result("Мій рядок"), який надсилає текстовий/звичайний результат. Javalin пропонує кілька варіантів надсилання відповідей:

Java Котлін ctx.result(stringOrStream)); // записуємо вхідний рядок або потік клієнту (`text/plain` за замовчуванням) ctx.json(myJson)); // серіалізація об'єкта в рядок JSON і запис до клієнта (наприклад, `application/json`) ctx.jsonStream(myJson)); // серіалізація JSON безпосередньо на клієнті (нічого не буферизовано) ctx.writeSeekableStream(myMediaFile)); // передавати аудіо та відео на клієнт (підтримує пошук/пропуск) ctx. майбутнє (myFutureSupplier); // просимо Javalin обробити запит асинхронно ctx.render("/file.ext", модель)); // візуалізація шаблону або файлу розмітки (наприклад, `text/html`) ctx.result(stringOrStream)) // записуємо вхідний рядок або потік клієнту (`text/plain` за замовчуванням) ctx.json(myJson)) // серіалізація об’єкта в рядок JSON і запис у клієнт (наприклад, `application/json`) ctx.jsonStream(myJson)); // серіалізація JSON безпосередньо на клієнті (нічого не буферизовано) ctx.writeSeekableStream(myMediaFile)) // потокове передавання аудіо та відео клієнту (підтримка пошуку/пропуску) ctx.future(myFutureSupplier) // наказує Javalin обробити запит асинхронно ctx.render("/file.ext", model)) // візуалізація моделі або файлу розмітки (наприклад, `text/html`) Обробка відгуків клієнтів

Javalin полегшує отримання та перевірку даних клієнтів за допомогою спеціальних методів:

Java Котлін ctx.body(); // отримати тіло запиту як рядок (кешувати тіло) ctx.formParam("ім'я"); // отримати параметр форми ctx.queryParam("ім'я"); // отримати параметр запиту ctx uploadedFile("ім'я"); // отримати завантажений файл // Методи JSON ctx.bodyAsClass(Clazz); // десеріалізація ctx.body() у класі ctx.bodyStreamAsClass(Clazz); // споживати вхідний потік із тіла запиту та десеріалізувати його в клас // перевірити Integer age = ctx.queryParamAsClass("age", Integer.class) // інкапсулювати параметр у валідатор .check(age -> age > 18, "NOT_OLD_ENOUGH") // додати перевірку з повідомленням про помилку .obtain(); // отримати перевірене значення або викинути ValidationException BananaBox bananaBox = ctx.bodyValidator(BananaBox.class) .check(box -> box.weight < 5, ValidationError("WEIGHT_TOO_HIGH", Map.of("MAX_WEIGHT", 5))) .check(box -> box.bananas.length > 20, ValidationError("NOT_ENOUGH_BANANAS", Map.of("MIN_BANANAS", 20))) .getOrDefault(defaultBananaBox) // використовувати значення за замовчуванням, якщо тіло має значення null, ...

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow