Piranha Embedded で Hello World


build.gradle.kts

piranha-embedded は組み込み用のランタイム。

piranha-embedded はHTTPサーバを含まないため、piranha-http-impl でサーバ実装 DefaultHttpServer を使う。

plugins {
    application
}

repositories {
    mavenCentral()
}

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}

dependencies {
    implementation("cloud.piranha:piranha-embedded:22.8.0")
    implementation("cloud.piranha.http:piranha-http-webapp:22.8.0")
    implementation("cloud.piranha.http:piranha-http-impl:22.8.0")
    testImplementation("org.junit.jupiter:junit-jupiter:5.7.2")
}

application {
    mainClass.set("piranha.example.helloworld.App")
}

tasks.named<Test>("test") {
    useJUnitPlatform()
}


HelloWorldServlet.java

単純なサーブレット。

public class HelloWorldServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        try (PrintWriter out = response.getWriter()) {
            out.println("""
                <!DOCTYPE html>
                <html>
                  <head>
                    <title>Hello World!</title>
                  </head>
                  <body>
                    <h1>Hello World!</h1>
                  </body>
                </html>
            """);
        }
    }
}


App.java

EmbeddedPiranhaBuilder でサーブレットを登録し、DefaultHttpServer でサーバプロセスに組み込み。

import cloud.piranha.embedded.EmbeddedPiranha;
import cloud.piranha.embedded.EmbeddedPiranhaBuilder;
import cloud.piranha.http.impl.DefaultHttpServer;
import cloud.piranha.http.webapp.HttpWebApplicationServerProcessor;

public class App {

    public static void main(String[] args) {

        EmbeddedPiranha piranha = new EmbeddedPiranhaBuilder()
                .servletMapped(HelloWorldServlet.class, "/*")
                .buildAndStart();

        DefaultHttpServer server = new DefaultHttpServer(8080,
                new HttpWebApplicationServerProcessor(piranha), false);
        server.start();

        System.out.println("server started.");
    }
}


実行

$ ./gradlew run
$ open http://localhost:8080


AppTest.java

先程は、DefaultHttpServer で処理していた箇所を単一のリクエストとレスポンスを指定。

class AppTest {
    @Test void test() throws Exception {

        EmbeddedPiranha piranha = new EmbeddedPiranhaBuilder()
                .servletMapped(HelloWorldServlet.class, "/*")
                .buildAndStart();

        EmbeddedRequest request = new EmbeddedRequestBuilder().build();
        EmbeddedResponse response = new EmbeddedResponseBuilder().bodyOnly(true).build();
        piranha.service(request, response);

        assertTrue(response.getResponseAsString().contains("Hello World!"));

    }
}

実際のアプリケーションとしてテストできる。