1. 概要

Jooby は、最も使用されているNIOWebサーバー上に構築されたスケーラブルで高速なマイクロWebフレームワークです。 これは非常に単純でモジュール式であり、現代のWebアーキテクチャ用に明確に設計されています。 JavascriptKotlinもサポートされています。

デフォルトでは、 Jooby は、 Netty、Jetty、およびUndertowを強力にサポートしています。

この記事では、 Jooby プロジェクトの全体的な構造と、Joobyを使用して簡単なWebアプリケーションを構築する方法について学習します。

2. アプリケーションアーキテクチャ

単純なJoobyアプリケーション構造は次のようになります。

├── public
|   └── welcome.html
├── conf
|   ├── application.conf
|   └── logback.xml
└── src
|   ├── main
|   |   └── java
|   |       └── com
|   |           └── baeldung
|   |               └── jooby
|   |                   └── App.java
|   └── test
|       └── java
|           └── com
|               └── baeldung
|                   └── jooby
|                       └── AppTest.java
├── pom.xml

ここで注意すべき点は、 public ディレクトリに、css / js/htmlなどの静的ファイルを配置できることです。 conf ディレクトリには、logback.xmlapplication.confなどのアプリケーションに必要な構成ファイルを配置できます。

3. Mavenの依存関係

次の依存関係をpom.xmlに追加することで、単純な Jooby アプリケーションを作成できます:

<dependency>
    <groupId>org.jooby</groupId>
    <artifactId>jooby-netty</artifactId>
    <version>1.1.3</version>
</dependency>

JettyまたはUndertowを選択する場合は、次の依存関係を使用できます。

<dependency>
    <groupId>org.jooby</groupId>
    <artifactId>jooby-jetty</artifactId>
    <version>1.1.3</version>
</dependency>
<dependency>
    <groupId>org.jooby</groupId>
    <artifactId>jooby-undertow</artifactId>
    <version>1.1.3</version>
</dependency>

Jooby プロジェクトの最新バージョンは、CentralMavenリポジトリで確認できます。

Joobyには専用のMavenアーキタイプもあります。 これを使用して、必要なすべての依存関係が事前に構築されたサンプルプロジェクトを作成できます。

次のスクリプトを使用して、サンプルプロジェクトを生成できます。

mvn archetype:generate -B -DgroupId=com.baeldung.jooby -DartifactId=jooby 
-Dversion=1.0 -DarchetypeArtifactId=jooby-archetype 
-DarchetypeGroupId=org.jooby -DarchetypeVersion=1.1.3

4. アプリケーションの構築

4.1. サーバーの開始

組み込みサーバーを起動するには、次のコードスニペットを使用する必要があります。

public class App extends Jooby {
    public static void main(String[] args) {
        run(App::new, args);
    }
}

起動すると、サーバーはデフォルトポート 8080で実行されます。

カスタムポートとカスタムHTTPSポートを使用してバックエンドサーバーを構成することもできます。

{
    port( 8081 );
    securePort( 8443 );
}

4.2. ルーターの実装

Joobyでパスベースのルーターを作成するのは非常に簡単です。 たとえば、次の方法でパス’ /login‘のルーターを作成できます。

{
    get( "/login", () -> "Hello from Baeldung");
}

同様に、POST、PUTなどの他の HTTP メソッドを処理する場合は、以下のコードスニペットを使用できます。

{
    post( "/save", req -> {
        Mutant token = req.param( "token" );
        return token.intValue();
    });
}

ここでは、リクエストからリクエストパラメータ名トークンを取得しています。 デフォルトでは、すべてのリクエストパラメータはJoobyMutantデータ型に型キャストされます。 期待に基づいて、サポートされている任意のプリミティブデータ型に変換できます。

次の方法で任意のURLパラメータを確認できます。

{
    get( "/user/{id}", req -> "Hello user : " + req.param("id").value() );
    get( "/user/:id", req -> "Hello user: " + req.param("id").value() );
}

上記のいずれかを使用できます。 固定コンテンツで始まるパラメータを見つけることも可能です。 たとえば、次の方法で’ uid:’で始まるURLパラメータを見つけることができます。

{
    get( "/uid:{id}", req -> "Hello User with id : uid" + 
        req.param("id").value());
}

4.3. MVCパターンコントローラーの実装

エンタープライズアプリケーションの場合、 Jooby には、SpringMVCなどの他のMVCフレームワークと同様にMVCAPIが付属しています。

たとえば、「 /hello」というパスを処理できます。

@Path("/hello")
public class GetController {
    @GET
    public String hello() {
        return "Hello Baeldung";
    }
}

同様に、 @ POST、@ PUT、@DELETEなどを使用して他のHTTPメソッドを処理するハンドラーを作成できます。 注釈。

4.4. 静的コンテンツの処理

HTML、Javascript、CSS、画像などの静的コンテンツを提供するには、それらのファイルをpublicディレクトリに配置する必要があります。

配置すると、ルーターから次のリソースに任意のURLをマッピングできます。

{
    assets( "/employee" , "form.html" );
}

4.5. 取り扱いフォーム

JoobyのRequest インターフェースは、デフォルトで、手動の型キャストを使用せずに任意のフォームオブジェクトを処理します。

フォームを介して従業員の詳細を送信する必要があると仮定します。 最初のステップでは、データを保持するために使用するEmployeeBeanオブジェクトを作成する必要があります。

public class Employee {
    String id;
    String name;
    String email;

    // standard constructors, getters and setters
}

次に、フォームを作成するためのページを作成する必要があります。

<form enctype="application/x-www-form-urlencoded" action="/submitForm" 
    method="post">
    <input name="id" />
    <input name="name" />
    <input name="email" />
    <input type="submit" value="Submit"/>
</form>

次に、このフォームに対応し、送信されたデータを取得するための投稿ハンドラーを作成します。

post( "/submitForm", req -> {
    Employee employee = req.params(Employee.class);
    // ...
    return "empoyee data saved successfullly";
});

ここで注意すべき点は、動的フォームバインディングをサポートするには、フォームenctypeapplication/x-www-form-urlencodedとして宣言する必要があるということです。

Request.file(String filename)により、アップロードされたファイルを取得できます。

post( "/upload", req -> {
    Upload upload = req.file("file");
    // ...
    upload.close();
});

4.6. フィルタの実装

箱から出して、Jooby は、グローバルフィルターとパスベースのフィルターを定義する柔軟性を提供します。

Jooby でのフィルターの実装は、 URLパスをフィルター用とハンドラー用の2回構成する必要があるため、少し注意が必要です。

たとえば、「 / filter」というURLパスにフィルターを実装する必要がある場合、このパスにフィルターを明示的に実装する必要があります。

get( "/filter", ( req, resp, chain ) -> {
    // ...
    chain.next( req, resp );
});

構文は、サーブレットフィルターと非常によく似ています。 Response.send(Result result)メソッドを呼び出すことにより、要求を制限し、フィルター自体で応答を送り返すことができます。

フィルタを実装したら、リクエストハンドラを実装する必要があります。

get("/filter", (req, resp) -> {
    resp.send("filter response");
});

4.7. セッション

Jooby には、2種類のセッション実装が付属しています。 インメモリおよびCookieベース。

インメモリセッション管理の実装は非常に簡単です。 Joobyで利用可能なEhCache、Guava、HazleCast、Cassandra、Couchbase、Redis、MongoDB、Memcachedなどの高スループットセッションストアを選択するオプションがあります。

たとえば、Redisベースのセッションストレージを実装するには、次のMaven依存関係を追加する必要があります。

<dependency>
    <groupId>org.jooby</groupId>
    <artifactId>jooby-jedis</artifactId>
    <version>1.1.3</version>
</dependency>

これで、以下のコードスニペットを使用してセッション管理を有効にできます。

{
    use(new Redis());
    session(RedisSessionStore.class);

    get( "/session" , req -> {
        Session session = req.session();
        session.set("token", "value");
        return session.get("token").value();
    });
}

ここで注意すべき点は、 Redisurlをapplication.conf‘db’プロパティとして構成できることです。

Cookieベースのセッション管理を有効にするには、 cookieSession()を宣言する必要があります。 Cookieベースのアプローチを選択した場合は、application.confファイルでapplication.secretプロパティを宣言する必要があります。 各Cookieはこの秘密鍵で署名されるため、長いランダムな文字列フラグメントを秘密鍵として使用することを常にお勧めします。

インメモリアプローチとCookieベースのアプローチの両方で、 application.conf ファイルで必要な構成パラメーターを宣言する必要があります。そうしないと、アプリケーションは起動時にIllegalStateExceptionをスローします。

5. テスト

ルートはいくつかのクラスの戦略にバインドされているため、MVCルートのテストは確かに簡単です。 これにより、すべてのルートに対して単体テストを簡単に実行できます。

たとえば、デフォルトURLのテストケースをすばやく作成できます。

public class AppTest {
 
    @ClassRule
    public static JoobyRule app = new JoobyRule(new App());

    @Test
    public void given_defaultUrl_expect_fixedString() {
 
        get("/").then().assertThat().body(equalTo("Hello World!"))
          .statusCode(200).contentType("text/html;charset=UTF-8");
    }
}

ここで注意すべき点は、 @ClassRule アノテーションを使用すると、すべてのテストケースに対してサーバーのインスタンスが1つだけ作成されることです。 テストケースごとにサーバーの個別のインスタンスを構築する必要がある場合は、静的修飾子なしで@Ruleアノテーションを使用する必要があります。

JoobyのMockRouterを使用して、同じ方法でパスをテストすることもできます。

@Test
public void given_defaultUrl_with_mockrouter_expect_fixedString() 
  throws Throwable {
 
    String result = new MockRouter(new App()).get("/");
 
    assertEquals("Hello World!", result);
}

6. 結論

このチュートリアルでは、Joobyプロジェクトとその重要な機能について説明しました。

いつものように、完全なソースコードはGitHub利用できます。