Joobyの紹介

Joobyの概要

1. 概要

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

デフォルトでは、JoobyNetty, Jetty, and Undertowを強力にサポートしています。

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

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

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

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

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

3. メーベン依存

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


    org.jooby
    jooby-netty
    1.1.3

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


    org.jooby
    jooby-jetty
    1.1.3


    org.jooby
    jooby-undertow
    1.1.3

Central Maven RepositoryJoobyプロジェクトの最新バージョンを確認できます。

Jooby also has a dedicated Maven archetype.これを使用して、必要なすべての依存関係が事前に構築されたサンプルプロジェクトを作成できます。

私たちは、サンプルプロジェクトを生成するには、次のスクリプトを使用することができます。

mvn archetype:generate -B -DgroupId=com.example.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);
    }
}

起動すると、サーバーはdefault port8080で実行されます。

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

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

4.2. ルーターの実装

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

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

同様に、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 example";
    }
}

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

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

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

配置したら、ルーターから次のリソースに任意のURLをマップできます。

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

4.5. 取り扱いフォーム

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

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

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

    // standard constructors, getters and setters
}

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

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

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は、パスベースのフィルターだけでなくグローバルフィルターも定義する柔軟性を提供します。

we need to configure the URL path twice, once for the filter and once again for the handler.にフィルターを実装するのは、we need to configure the URL path twice, once for the filter and once again for the handler.なので少し注意が必要です。

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

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

構文はServletフィルターと非常によく似ています。 Response.send(Result result)メソッドを呼び出すことで、リクエストを制限し、フィルタ自体でレスポンスを送り返すことができます。

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

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

4.7. セッション

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

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

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


    org.jooby
    jooby-jedis
    1.1.3

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

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

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

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

Cookieベースのセッション管理を有効にするには、cookieSession()を宣言する必要があります。 If cookie based approach is selected, we must need to declare application.secret property in the application.conf file.各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’s 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プロジェクトとその重要な機能について説明しました。

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