Joobyの紹介
1. 概要
Jooby は、最も使用されているNIOWebサーバー上に構築されたスケーラブルで高速なマイクロWebフレームワークです。 これは非常に単純でモジュール式であり、現代のWebアーキテクチャ用に明確に設計されています。 JavascriptとKotlinもサポートされています。
デフォルトでは、 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.xmlやapplication.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リポジトリで確認できます。
次のスクリプトを使用して、サンプルプロジェクトを生成できます。
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();
});
}
ここでは、リクエストからリクエストパラメータ名トークンを取得しています。 デフォルトでは、すべてのリクエストパラメータはJoobyのMutantデータ型に型キャストされます。 期待に基づいて、サポートされている任意のプリミティブデータ型に変換できます。
次の方法で任意の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";
});
ここで注意すべき点は、動的フォームバインディングをサポートするには、フォームenctypeをapplication/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 ファイルで必要な構成パラメーターを宣言する必要があります。そうしないと、アプリケーションは起動時に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で利用できます。