Javalin은 WebSocket, HTTP2 및 비동기 요청을 지원하는 Kotlin 및 Java용 매우 가벼운 웹 프레임워크입니다. Javalin의 주요 목표는 단순성, 뛰어난 개발자 경험, Kotlin과 Java 간의 최고 수준의 상호 운용성입니다.
Javalin은 프레임워크라기보다는 라이브러리에 가깝습니다. 몇 가지 핵심 사항:
아무것도 연장할 필요가 없습니다
@Annotations가 없습니다.
반성이 없다
다른 마법은 없습니다. 그냥 코드.
프로젝트 웹페이지는 javalin.io입니다(소스는 javalin/javalin.github.io에 있습니다).
javalin.io/documentation에서 문서를 읽어보세요.
라이센스 요약은 TLDR Legal에서 확인할 수 있습니다.
흥미로운 문제
우리는 신속하게 도움을 받을 수 있는 매우 활동적인 Discord 서버를 보유하고 있습니다. 원한다면 (훨씬 덜 활동적인) Slack도 있습니다.
기여는 매우 환영합니다. 기여에 대한 자세한 내용은 가이드: CONTRIBUTING에서 확인할 수 있습니다.
프로젝트를 지원하려면 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("Hello World")) .start(7070); } }
import io.javalin.Javalinfun main() { val app = Javalin.create(/*config*/) .get("/") { it.result("Hello World") } .start(7070) }
이 섹션에는 대부분 문서에서 추출한 몇 가지 예가 포함되어 있습니다. 모든 예제는 Kotlin에 있지만 문서에서 Java로 찾을 수 있습니다(구문 변경일 뿐입니다).
javalin-samples 저장소에서 더 많은 예제를 찾을 수 있습니다.
import io.javalin.Javalinimport io.javalin.apibuilder.ApiBuilder.*fun main() { val app = Javalin.create { config -> config.useVirtualThreads = true config.http.asyncTimeout = 10_000L config.staticFiles.add("/public") config.staticFiles.enableWebjars() config.router.apiBuilder { 경로("/사용자") { get(UserController::getAll) 포스트(UserController::만들기) 경로("/{userId}") { get(UserController::getOne) 패치(UserController::업데이트) 삭제(UserController::삭제) } ws("/events", userController::webSocketEvents) } } }.시작(7070) }
app.ws("/websocket/{경로}") { 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 -> ... } // 모든 요청 전에 실행app .after { ctx -> ... } // 모든 요청 후에 실행app.Exception(Exception.class) { e, ctx -> ... } // 잡히지 않은 경우 실행 Exceptionapp.error(404) { ctx -> .. . } // 다음 경우에 실행됩니다. 상태는 404입니다(다른 모든 핸들러 이후)app.wsBefore("/some-path/*") { ws -> ... } // /some-path/*app.wsBefore { ws ->에서 ws 이벤트 전에 실행됩니다. ... } // 모든 ws eventsapp.wsAfter { ws -> ... } // 모든 ws 이후에 실행됩니다. ws eventsapp.wsException(Exception.class) { e, ctx -> ... } // 잡히지 않으면 실행됩니다. ws 핸들러의 예외
var todos = arrayOf(...) app.get("/todos") { ctx -> // Todo 배열을 json-string에 매핑합니다. ctx.json(todos) } app.put("/todos") { ctx -> // 요청 본문(json)을 Todo 배열에 매핑합니다. todos = ctx.body>() ctx.상태(204) }
app.post("/업로드") { ctx -> ctx.uploadedFiles("files").forEach { UploadFile -> FileUtil.streamToFile(uploadedFile.content(), "upload/${uploadedFile.filename()}") } }
Javalin에는 핵심 라이브러리에 기능을 추가할 수 있는 플러그인 시스템이 있습니다. 여기에서 플러그인 목록을 찾을 수 있습니다.
플러그인 설치는 프로젝트에 종속성을 추가하고 이를 Javalin에 등록하는 것만큼 쉽습니다.
Javalin.create { 구성 -> config.registerPlugin(마이플러그인()) }
가장 인기 있는 플러그인은 다음과 같습니다.
Javalin OpenAPI 플러그인을 사용하면 컴파일 타임에 API에 대한 OpenAPI 3.0 사양을 생성할 수 있습니다.
사양을 생성하려면 경로에 @OpenApi
로 주석을 추가하세요.
@오픈아피( summary = "모든 사용자 가져오기", OperationId = "getAllUsers", 태그 = ["사용자"], 응답 = [OpenApiResponse("200", [OpenApiContent(Array::class)])], 경로 = "/사용자", 메소드 = [HttpMethod.GET] )fun getAll(ctx: 컨텍스트) { ctx.json(UserService.getAll()) }
브라우저에서 생성된 사양을 보기 위한 Swagger UI 및 ReDoc UI 구현도 사용할 수 있습니다.
자세한 내용은 Javalin OpenAPI Wiki를 참조하세요.
Javalin SSL 플러그인을 사용하면 PEM, PKCS12, DER, P7B 및 JKS와 같은 다양한 형식을 지원하여 Javalin 서버에 대한 SSL을 쉽게 구성할 수 있습니다.
443 포트에서 SSL을 활성화하는 것은 다음과 같이 쉽습니다.
val 플러그인 = SSLPlugin { conf -> conf.pemFromPath("/path/to/cert.pem", "/path/to/key.pem") }Javalin.create { javalinConfig -> javalinConfig.plugins.register(플러그인) }.시작()
심벌 마크 | 스폰서 |
---|---|
@barbarysoftware (50 USD/m) | |
KabCash (50 USD/월) |
시나트라 창작에 참여한 블레이크 미제라니(Blake Mizerany)
Per Wendel, Spark 생성
크리스티안 라스무센, 훌륭한 사람이 되어서
Per Kristian Kummermo, 역시 훌륭한 사람이었어.