1. 概要

Blade は、小さなJava 8+ MVCフレームワークであり、自己完結型、生産性、エレガント、直感的、超高速という明確な目標を念頭に置いてゼロから構築されています。

NodeのExpress、Pythonの Flask 、Golangの Macaron / Martini など、さまざまなフレームワークがその設計に影響を与えました。

Bladeは、野心的な大規模プロジェクト Let’sBladeの一部でもあります。 これには、キャプチャ生成からJSON変換、テンプレート作成から単純なデータベース接続まで、他の小さなライブラリの異種コレクションが含まれています。

ただし、このチュートリアルでは、MVCのみに焦点を当てます。

2. 入門

まず、空のMavenプロジェクトを作成し、最新のBladeMVC依存関係pom.xmlに追加しましょう。

<dependency>
    <groupId>com.bladejava</groupId>
    <artifactId>blade-mvc</artifactId>
    <version>2.0.14.RELEASE</version>
</dependency>

2.1. ブレードアプリケーションのバンドル

アプリはJARとして作成されるため、WARのように /libフォルダーはありません。 その結果、これにより、 blade-mvc JARを、必要になる可能性のある他のJARと一緒にアプリに提供する方法の問題が発生します。

これを行うさまざまな方法は、それぞれ長所と短所があり、Mavenチュートリアルで実行可能JARを作成する方法で説明されています。

簡単にするために、 Mavenアセンブリプラグインテクニックを使用します。これは、 pom.xml にインポートされたJARを分解し、その後、すべてのクラスを1つのuber-JARにバンドルします。

2.2. ブレードアプリケーションの実行

Bladeは、驚くべき非同期イベント駆動型ネットワークアプリケーションフレームワークであるNettyに基づいています。 したがって、ブレードベースのアプリケーションを実行するために、外部のアプリケーションサーバーやサーブレットコンテナは必要ありません。 JREで十分です。

java -jar target/sample-blade-app.jar

その後、アプリケーションは http:// localhost:9000URLからアクセスできるようになります。

3. アーキテクチャを理解する

Bladeのアーキテクチャは非常に単純です。

それは常に同じライフサイクルに従います:

  1. Nettyがリクエストを受け取ります
  2. ミドルウェアが実行されます(オプション)
  3. WebHooksが実行されます(オプション)
  4. ルーティングが実行されます
  5. 応答がクライアントに送信されます
  6. 掃除

次のセクションでは、上記の関数について説明します。

4. ルーティング

つまり、MVCでのルーティングは、URLとコントローラー間のバインディングを作成するために使用されるメカニズムです。

ブレードには、基本ルートと注釈付きルートの2種類のルートがあります。

4.1. 基本ルート

基本的なルートは、マイクロサービスや最小限のWebアプリケーションなどの非常に小さなソフトウェアを対象としています。

Blade.of()
  .get("/basic-routes-example", ctx -> ctx.text("GET called"))
  .post("/basic-routes-example", ctx -> ctx.text("POST called"))
  .put("/basic-routes-example", ctx -> ctx.text("PUT called"))
  .delete("/basic-routes-example", ctx -> ctx.text("DELETE called"))
  .start(App.class, args);

ルートの登録に使用されるメソッドの名前は、リクエストの転送に使用されるHTTP動詞に対応しています。 それと同じくらい簡単です。

この場合、テキストを返しますが、このチュートリアルの後半で説明するように、ページをレンダリングすることもできます。

4.2. 注釈付きルート

確かに、より現実的なユースケースでは、アノテーションを使用して必要なすべてのルートを定義できます。 そのために別々のクラスを使用する必要があります。

まず、 @Path アノテーションを使用してコントローラーを作成する必要があります。これは、起動時にBladeによってスキャンされます。

次に、インターセプトするHTTPメソッドに関連するルートアノテーションを使用する必要があります。

@Path
public class RouteExampleController {    
    
    @GetRoute("/routes-example") 
    public String get(){ 
        return "get.html"; 
    }
    
    @PostRoute("/routes-example") 
    public String post(){ 
        return "post.html"; 
    }
    
    @PutRoute("/routes-example") 
    public String put(){ 
        return "put.html"; 
    }
    
    @DeleteRoute("/routes-example") 
    public String delete(){ 
        return "delete.html"; 
    }
}

単純な@Routeアノテーションを使用して、パラメーターとしてHTTPメソッドを指定することもできます。

@Route(value="/another-route-example", method=HttpMethod.GET) 
public String anotherGet(){ 
    return "get.html" ; 
}

一方、メソッドパラメータを設定しない場合、ルートは、動詞に関係なく、そのURLへのすべてのHTTP呼び出しをインターセプトします。

4.3. パラメータインジェクション

ルートにパラメータを渡す方法はいくつかあります。 ドキュメントからのいくつかの例でそれらを調べてみましょう。

  • フォームパラメータ:
@GetRoute("/home")
public void formParam(@Param String name){
    System.out.println("name: " + name);
}
  • 安らかなパラメータ:
@GetRoute("/users/:uid")
public void restfulParam(@PathParam Integer uid){
    System.out.println("uid: " + uid);
}
  • ファイルアップロードパラメータ:
@PostRoute("/upload")
public void fileParam(@MultipartParam FileItem fileItem){
    byte[] file = fileItem.getData();
}
  • ヘッダーパラメーター:
@GetRoute("/header")
public void headerParam(@HeaderParam String referer){
    System.out.println("Referer: " + referer);
}
  • クッキーパラメータ:
@GetRoute("/cookie")
public void cookieParam(@CookieParam String myCookie){
    System.out.println("myCookie: " + myCookie);
}
  • ボディパラメータ:
@PostRoute("/bodyParam")
public void bodyParam(@BodyParam User user){
    System.out.println("user: " + user.toString());
}
  • ルートに属性を送信することによって呼び出される値オブジェクトパラメータ:
@PostRoute("/voParam")
public void voParam(@Param User user){
    System.out.println("user: " + user.toString());
}
<form method="post">
    <input type="text" name="age"/>
    <input type="text" name="name"/>
</form>

5. 静的リソース

ブレードは、必要に応じて、静的リソースを / resources / static フォルダー内に配置するだけで、静的リソースを提供することもできます。

たとえば、 src / main / resources / static / app.csshttp:// localhost:9000 / static /app.cssで利用できます。

5.1. パスのカスタマイズ

プログラムで1つ以上の静的パスを追加することにより、この動作を調整できます。

blade.addStatics("/custom-static");

ファイルsrc/ main / resources / application.properties を編集することにより、構成を通じて同じ結果を得ることができます。

mvc.statics=/custom-static

5.2. リソースリストの有効化

静的フォルダのコンテンツの一覧表示を許可できます。セキュリティ上の理由から、この機能はデフォルトでオフになっています。

blade.showFileList(true);

または構成内:

mvc.statics.show-list=true

これで、 http:// localhost:9000 / custom-static / を開いて、フォルダーの内容を表示できます。

5.3. WebJarsの使用

WebJarsの概要チュートリアルに見られるように、JARとしてパッケージ化された静的リソースも実行可能なオプションです。

ブレードは、 / webjars/パスの下でそれらを自動的に公開します。

たとえば、Bootstrappom.xmlにインポートしてみましょう。

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>bootstrap</artifactId>
    <version>4.2.1</version>
</dependency>

その結果、 http:// localhost:9000 / webjars / bootstrap / 4.2.1 / css /bootstrap.cssで利用できるようになります。

6. HTTPリクエスト

Bladeはサーブレット仕様に基づいていないため、そのインターフェイスRequestやクラスHttpRequestなどのオブジェクトは、以前のものとは少し異なります。

6.1. フォームパラメータ

フォームパラメータを読み取るとき、Bladeはクエリメソッドの結果でJavaのオプションを最大限に活用します(以下のすべてのメソッドはオプションオブジェクトを返します)。

  • query(文字列名)
  • queryInt(文字列名)
  • queryLong(文字列名)
  • queryDouble(文字列名)

フォールバック値で利用することもできます。

  • 文字列クエリ(文字列名、文字列defaultValue)
  • int queryInt(String name、int defaultValue)
  • long queryLong(String name、long defaultValue)
  • double queryDouble(String name、double defaultValue)

automappedプロパティを介してフォームパラメータを読み取ることができます。

@PostRoute("/save")
public void formParams(@Param String username){
    // ...
}

または、 Request オブジェクトから:

@PostRoute("/save")
public void formParams(Request request){
    String username = request.query("username", "Baeldung");
}

6.2. JSONデータ

次に、JSONオブジェクトをPOJOにマップする方法を見てみましょう。

curl -X POST http://localhost:9000/users -H 'Content-Type: application/json' \ 
  -d '{"name":"Baeldung","site":"baeldung.com"}'

POJO(読みやすさのために Lombok で注釈が付けられています):

public class User {
    @Getter @Setter private String name;
    @Getter @Setter private String site;
}

この場合も、値は注入されたプロパティとして使用できます。

@PostRoute("/users")
public void bodyParams(@BodyParam User user){
    // ...
}

そしてリクエストから:

@PostRoute("/users")
public void bodyParams(Request request) {
    String bodyString = request.bodyToString();
}

6.3. RESTfulパラメーター

localhost:9000 / user / 42 のようなきれいなURLのRESTFulパラメーターも、第一級市民です。

@GetRoute("/user/:id")
public void user(@PathParam Integer id){
    // ...
}

いつものように、必要に応じてRequestオブジェクトを信頼できます。

@GetRoute("/user")
public void user(Request request){
    Integer id = request.pathInt("id");
}

もちろん、LongタイプとStringタイプでも同じ方法を使用できます。

6.4. データバインディング

BladeはJSONとFormの両方のバインディングパラメーターをサポートし、それらをモデルオブジェクトに自動的にアタッチします。

@PostRoute("/users")
public void bodyParams(User user){}

6.5. リクエストとセッションの属性

RequestおよびSessionでオブジェクトを読み書きするためのAPIは非常に明確です。

キーと値を表す2つのパラメーターを持つメソッドは、さまざまなコンテキストで値を格納するために使用できるミューテーターです。

Session session = request.session();
request.attribute("request-val", "Some Request value");
session.attribute("session-val", 1337);

一方、キーパラメータのみを受け入れる同じメソッドはアクセサです。

String requestVal = request.attribute("request-val");
String sessionVal = session.attribute("session-val"); //It's an Integer

興味深い機能はそれらの一般的なリターンタイプ T 、結果をキャストする必要がなくなります。

6.6. ヘッダー

反対に、リクエストヘッダーは、リクエストからのみ読み取ることができます。

String header1 = request.header("a-header");
String header2 = request.header("a-safe-header", "with a default value");
Map<String, String> allHeaders = request.headers();

6.7. ユーティリティ

次のユーティリティメソッドもすぐに使用できます。これらは非常に明白なので、これ以上の説明は必要ありません。

  • ブールisIE()
  • ブールisAjax()
  • 文字列contentType()
  • 文字列userAgent()

6.8. クッキーを読む

どのようにリクエストオブジェクトは、特にCookieを読み取るときにCookieを処理するのに役立ちますオプション

Optional<Cookie> cookieRaw(String name);

Cookieが存在しない場合に適用するデフォルト値を指定することにより、Stringとして取得することもできます。

String cookie(String name, String defaultValue);

最後に、これがすべてのCookieを一度に読み取る方法です(キーはCookieの名前、はCookieの値です):

Map<String, String> cookies = request.cookies();

7. HTTP応答

Request で行われたことと同様に、 Response オブジェクトへの参照を、ルーティングメソッドのパラメーターとして宣言するだけで取得できます。

@GetRoute("/")
public void home(Response response) {}

7.1. シンプルな出力

200 HTTPコードと適切なContent-Typeとともに、便利な出力メソッドの1つを使用して、簡単な出力を呼び出し元に簡単に送信できます。

まず、プレーンテキストを送信できます。

response.text("Hello World!");

次に、HTMLを作成できます。

response.html("<h1>Hello World!</h1>");

第三に、同様にXMLを生成できます。

response.xml("<Msg>Hello World!</Msg>");

最後に、Stringを使用してJSONを出力できます。

response.json("{\"The Answer\":42}");

そして、POJOからでも、自動JSON変換を利用します。

User user = new User("Baeldung", "baeldung.com"); 
response.json(user);

7.2. ファイル出力

サーバーからファイルをダウンロードするのは無駄がありません。

response.download("the-file.txt", "/path/to/the/file.txt");

最初のパラメーターはダウンロードされるファイルの名前を設定し、2番目のパラメーター( File オブジェクト、ここでは String で構成)は、上の実際のファイルへのパスを表します。サーバ。

7.3. テンプレートレンダリング

Bladeは、テンプレートエンジンを介してページをレンダリングすることもできます。

response.render("admin/users.html");

テンプレートのデフォルトディレクトリはsrc/ main / resources / templates / であるため、前のワンライナーはファイル src / main / resources / templates / admin /users.htmlを検索します。 。

これについては、後でテンプレートセクションで詳しく説明します。

7.4. リダイレクト

リダイレクションとは、302 HTTPコードを、2番目のGETに続くURLとともにブラウザに送信することを意味します。

別のルートにリダイレクトすることも、外部URLにリダイレクトすることもできます。

response.redirect("/target-route");

7.5. クッキーを書く

この時点では、Bladeの単純さに慣れているはずです。 したがって、1行のコードで有効期限が切れていないCookieを作成する方法を見てみましょう。

response.cookie("cookie-name", "Some value here");

実際、Cookieの削除も同様に簡単です。

response.removeCookie("cookie-name");

7.6. その他の操作

最後に、 Response オブジェクトは、ヘッダーの書き込み、Content-Typeの設定、ステータスコードの設定などの操作を実行するための他のいくつかのメソッドを提供します。

それらのいくつかを簡単に見てみましょう:

  • 応答ステータス(intステータス)
  • マップheaders()
  • 応答notFound()
  • マップcookies()
  • 応答contentType(String contentType)
  • void body(@NonNull byte [] data)
  • 応答ヘッダー(文字列名、文字列値)

8. WebHooks

WebHookは、ルーティングメソッドの実行の前後にコードを実行できるインターセプターです。

WebHook 機能インターフェースを実装し、 before()メソッドをオーバーライドするだけで、WebHookを作成できます。

@FunctionalInterface
public interface WebHook {

    boolean before(RouteContext ctx);

    default boolean after(RouteContext ctx) {
        return true;
    }
}

ご覧のとおり、 after()はデフォルトのメソッドであるため、必要な場合にのみオーバーライドします。

8.1. すべてのリクエストを傍受する

@Bean アノテーションは、IoCコンテナでクラスをスキャンするようにフレームワークに指示します。

その結果、注釈が付けられたWebHookはグローバルに機能し、すべてのURLへのリクエストをインターセプトします。

@Bean
public class BaeldungHook implements WebHook {

    @Override
    public boolean before(RouteContext ctx) {
        System.out.println("[BaeldungHook] called before Route method");
        return true;
    }
}

8.2. URLに絞り込む

特定のURLをインターセプトして、それらのルートメソッドのみを中心にコードを実行することもできます。

Blade.of()
  .before("/user/*", ctx -> System.out.println("Before: " + ctx.uri()));
  .start(App.class, args);

8.3. ミドルウェア

ミドルウェアは優先順位が付けられたWebHookであり、標準のWebHookよりも先に実行されます。

public class BaeldungMiddleware implements WebHook {

    @Override
    public boolean before(RouteContext context) {
        System.out.println("[BaeldungMiddleware] called before Route method and other WebHooks");
        return true;
    }
}

これらは、 @Bean アノテーションなしで定義し、 use()を介して宣言的に登録する必要があります。

Blade.of()
  .use(new BaeldungMiddleware())
  .start(App.class, args);

さらに、Bladeには次のセキュリティ関連の組み込みミドルウェアが付属しています。これらの名前はわかりやすいものにする必要があります。

9. 構成

Bladeでは、すべてが慣例によりすぐに使用できるため、構成は完全にオプションです。ただし、 src / main内でデフォルト設定をカスタマイズし、新しい属性を導入できます。 /resources/application.propertiesファイル。

9.1. 構成の読み取り

設定が利用できない場合に備えて、デフォルト値を指定するかどうかにかかわらず、さまざまな方法で構成を読み取ることができます。

  • 起動時:
Blade.of()
  .on(EventType.SERVER_STARTED, e -> {
      Optional<String> version = WebContext.blade().env("app.version");
  })
  .start(App.class, args);
  • ルート内:
@GetRoute("/some-route")
public void someRoute(){
    String authors = WebContext.blade().env("app.authors","Unknown authors");
}
  • カスタムローダーでは、 BladeLoader インターフェイスを実装し、 load()メソッドをオーバーライドし、クラスに@Beanでアノテーションを付けます。
@Bean
public class LoadConfig implements BladeLoader {

    @Override
    public void load(Blade blade) {
        Optional<String> version = WebContext.blade().env("app.version");
        String authors = WebContext.blade().env("app.authors","Unknown authors");
    }
}

9.2. 構成属性

すでに構成されているがカスタマイズの準備ができているいくつかの設定は、タイプごとにグループ化され、このアドレスに3列のテーブル(名前、説明、デフォルト値)で一覧表示されます。 翻訳が設定の名前を誤って大文字にしていることに注意して、翻訳されたページを参照することもできます。 実際の設定は完全に小文字です。

プレフィックスで構成設定をグループ化すると、それらを一度にマップに読み取ることができます。これは、構成設定が多数ある場合に役立ちます。

Environment environment = blade.environment();
Map<String, Object> map = environment.getPrefix("app");
String version = map.get("version").toString();
String authors = map.get("authors","Unknown authors").toString();

9.3. 複数の環境の処理

アプリを別の環境にデプロイする場合、データベース接続に関連する設定など、別の設定を指定する必要がある場合があります。 application.properties ファイルを手動で置き換える代わりに、Bladeはさまざまな環境向けにアプリを構成する方法を提供します。 application.properties をすべての開発設定で保持し、同じフォルダーにapplication-prod.propertiesのように、異なる設定のみを含む他のファイルを作成するだけです

起動時に、使用する環境を指定できます。フレームワークは、 application-prod.properties の最も具体的な設定と、デフォルトのの他のすべての設定を使用してファイルをマージします。 X234X] application.properties ファイル:

java -jar target/sample-blade-app.jar --app.env=prod

10. テンプレート

ブレードでのテンプレーティングはモジュール式の側面です。 非常に基本的なテンプレートエンジンが統合されていますが、ビューを専門的に使用するには、外部テンプレートエンジンを使用する必要があります。 次に、GitHubのblade-template-enginesリポジトリで利用可能なエンジンからエンジンを選択できます。これらはFreeMarker Jetbrickです。 、 Pebble Velocity 、またはラッパーを作成して、好きな別のテンプレートをインポートします。

Bladeの作者は、別のスマートな中国のプロジェクトであるJetbrickを提案しています。

10.1. デフォルトエンジンの使用

デフォルトのテンプレートは、 ${}表記を使用してさまざまなコンテキストの変数を解析することで機能します。

<h1>Hello, ${name}!</h1>

10.2. 外燃機関の接続

別のテンプレートエンジンに切り替えるのは簡単です。 エンジン(のBladeラッパー)の依存関係をインポートするだけです。

<dependency>
    <groupId>com.bladejava</groupId>
    <artifactId>blade-template-jetbrick</artifactId>
    <version>0.1.3</version>
</dependency>

この時点で、そのライブラリを使用するようにフレームワークに指示する簡単な構成を作成するだけで十分です。

@Bean
public class TemplateConfig implements BladeLoader {

    @Override
    public void load(Blade blade) {
        blade.templateEngine(new JetbrickTemplateEngine());
    }
}

その結果、 src / main / resources / templates / の下にあるすべてのファイルが、このチュートリアルの範囲を超える構文の新しいエンジンで解析されるようになりました。

10.3. 新しいエンジンのラッピング

新しいテンプレートエンジンをラップするには、単一のクラスを作成する必要があります。このクラスは、 TemplateEngine インターフェイスを実装し、 render()メソッドをオーバーライドする必要があります。

void render (ModelAndView modelAndView, Writer writer) throws TemplateException;

この目的のために、実際のJetbrickラッパーのコードを見て、それが何を意味するのかを理解することができます。

11. ロギング

Bladeは、ロギングインターフェイスとしてslf4j-apiを使用します。

また、blade-logと呼ばれるすでに構成されたロギング実装も含まれています。 したがって、何もインポートする必要はありません。 Logger を定義するだけで、そのまま機能します。

private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);

11.1. 統合ロガーのカスタマイズ

デフォルト設定を変更する場合は、システムプロパティとして次のパラメータを調整する必要があります。

  • ロギングレベル(「トレース」、「デバッグ」、「情報」、「警告」、または「エラー」の場合があります):
# Root Logger
com.blade.logger.rootLevel=info

# Package Custom Logging Level
com.blade.logger.somepackage=debug

# Class Custom Logging Level
com.blade.logger.com.baeldung.sample.SomeClass=trace
  • 表示される情報:
# Date and Time
com.blade.logger.showDate=false

# Date and Time Pattern
com.blade.logger.datePattern=yyyy-MM-dd HH:mm:ss:SSS Z

# Thread Name
com.blade.logger.showThread=true

# Logger Instance Name
com.blade.logger.showLogName=true

# Only the Last Part of FQCN
com.blade.logger.shortName=true
  • ロガー:
# Path 
com.blade.logger.dir=./logs

# Name (it defaults to the current app.name)
com.blade.logger.name=sample

11.2. 統合ロガーを除く

統合ロガーをすでに構成しておくと、小さなプロジェクトを開始するのに非常に便利ですが、他のライブラリが独自のロギング実装をインポートする場合は簡単に終わる可能性があります。 そして、その場合、競合を回避するために統合されたものを削除することができます。

<dependency>
    <groupId>com.bladejava</groupId>
    <artifactId>blade-mvc</artifactId>
    <version>${blade.version}</version>
    <exclusions>
        <exclusion>
            <groupId>com.bladejava</groupId>
            <artifactId>blade-log</artifactId>
        </exclusion>
    </exclusions>
</dependency>

12. カスタマイズ

12.1. カスタム例外処理

例外ハンドラーもデフォルトでフレームワークに組み込まれています。 例外をコンソールに出力し、app.devModetrueの場合、スタックトレースもWebページに表示されます。

ただし、DefaultExceptionHandlerクラスを拡張する@Beanを定義することにより、特定の方法で例外を処理できます。

@Bean
public class GlobalExceptionHandler extends DefaultExceptionHandler {

    @Override
    public void handle(Exception e) {
        if (e instanceof BaeldungException) {
            BaeldungException baeldungException = (BaeldungException) e;
            String msg = baeldungException.getMessage();
            WebContext.response().json(RestResponse.fail(msg));
        } else {
            super.handle(e);
        }
    }
}

12.2. カスタムエラーページ

同様に、エラー 404 – NotFoundおよび500– Internal Server Error は、細いデフォルトページで処理されます。

次の設定でapplication.propertiesファイルでページを宣言することにより、フレームワークに独自のページを使用させることができます。

mvc.view.404=my-404.html
mvc.view.500=my-500.html

確かに、これらのHTMLページは src / main / resources /templatesフォルダーの下に配置する必要があります。

500内では、さらに、例外messagestackTraceをそれらの特別な変数を介して取得できます。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>500 Internal Server Error</title>
    </head>
    <body>
        <h1> Custom Error 500 Page </h1>
        <p> The following error occurred: "<strong>${message}</strong>"</p>
        <pre> ${stackTrace} </pre>
    </body>
</html>

13. スケジュールされたタスク

フレームワークのもう1つの興味深い機能は、メソッドの実行をスケジュールできることです。

これは、@Beanクラスのメソッドに@Scheduleアノテーションを付けることで可能になります。

@Bean
public class ScheduleExample {

    @Schedule(name = "baeldungTask", cron = "0 */1 * * * ?")
    public void runScheduledTask() {
        System.out.println("This is a scheduled Task running once per minute.");
    }
}

実際、従来のcron式を使用してDateTime座標を指定します。 詳細については、 A Guide to CronExpressionsを参照してください。

後で、 TaskManager クラスの静的メソッドを利用して、スケジュールされたタスクの操作を実行する可能性があります。

  • スケジュールされたすべてのタスクを取得します。
List<Task> allScheduledTasks = TaskManager.getTasks();
  • 名前でタスクを取得します。
Task myTask = TaskManager.getTask("baeldungTask");
  • 名前でタスクを停止します。
boolean closed = TaskManager.stopTask("baeldungTask");

14. イベント

セクション9.1ですでに見たように、カスタムコードを実行する前に、指定されたイベントをリッスンすることができます。

ブレードは、箱から出して次のイベントを提供します。

public enum EventType {
    SERVER_STARTING,
    SERVER_STARTED,
    SERVER_STOPPING,
    SERVER_STOPPED,
    SESSION_CREATED,
    SESSION_DESTROY,
    SOURCE_CHANGED,
    ENVIRONMENT_CHANGED
}

最初の6つは簡単に推測できますが、最後の2つにはいくつかのヒントが必要です。 ENVIRONMENT_CHANGED を使用すると、サーバーの起動時に構成ファイルが変更された場合にアクションを実行できます。 SOURCE_CHANGED は、代わりにまだ実装されておらず、将来の使用のみを目的としています。

セッションが作成されるたびに、セッションに値を設定する方法を見てみましょう。

Blade.of()
  .on(EventType.SESSION_CREATED, e -> {
      Session session = (Session) e.attribute("session");
      session.attribute("name", "Baeldung");
  })
  .start(App.class, args);

15. セッションの実装

セッションについて言えば、そのデフォルトの実装はセッション値をメモリに保存します。

したがって、キャッシュや永続性などを提供するために、別の実装に切り替えたい場合があります。 たとえば、Redisを取り上げましょう。 最初に、HttpSession のドキュメントにが示されているように、 Session インターフェイスを実装して、RedisSessionラッパーを作成する必要があります。

そうすれば、フレームワークにそれを使用したいことを知らせるだけです。 これは、カスタムテンプレートエンジンの場合と同じ方法で実行できますが、唯一の違いは、 sessionType()メソッドを呼び出すことです。

@Bean
public class SessionConfig implements BladeLoader {
 
    @Override
    public void load(Blade blade) {
        blade.sessionType(new RedisSession());
    }
}

16. コマンドライン引数

コマンドラインからBladeを実行する場合、動作を変更するために指定できる3つの設定があります。

まず、IPアドレスを変更できます。これは、デフォルトではローカル0.0.0.0ループバックです。

java -jar target/sample-blade-app.jar --server.address=192.168.1.100

次に、ポートを変更することもできます。デフォルトでは9000です。

java -jar target/sample-blade-app.jar --server.port=8080

最後に、セクション9.3に示すように、環境を変更して、別のapplication-XXX.propertiesファイルがデフォルトのファイルであるapplication.propertiesから読み取られるようにすることができます。

java -jar target/sample-blade-app.jar --app.env=prod

17. IDEで実行

最新のJavaIDEは、Mavenプラグインを必要とせずにBladeプロジェクトを再生できます。 IDEでBladeを実行すると、 Blade Demos を実行するときに特に役立ちます。この例は、フレームワークの機能を紹介するために明示的に記述されています。 これらはすべて親pomを継承するため、スタンドアロンアプリとして実行するように手動で調整するよりも、IDEに作業を任せる方が簡単です。

17.1. Eclipse

Eclipseでは、プロジェクトを右クリックして Javaアプリケーションとして実行を起動し、 App クラスを選択して、OKを押すだけで十分です。

ただし、EclipseのコンソールはANSIカラーを正しく表示せず、代わりにコードを出力します。

幸い、 ANSI Escape in Console 拡張機能をインストールすると、問題が完全に修正されます。

17.2. IntelliJ IDEA

IntelliJ IDEAは、すぐに使用できるANSIカラーで動作します。 したがって、プロジェクトを作成し、 App ファイルを右クリックして、 Run’App.main()’ を起動するだけで十分です(これは、Ctrl+を押すのと同じです。 Shift + F10 ):

17.3. Visual Studio Code

以前にJavaExtension Pack をインストールすることで、人気のある非Java中心のIDEであるVSCodeを使用することもできます。

Ctrl + F5 を押すと、プロジェクトが実行されます。

18. 結論

Bladeを使用して小さなMVCアプリケーションを作成する方法を見てきました。

ドキュメント全体は中国語でのみ利用可能です。 主に中国で普及しているにもかかわらず、その中国語の起源のおかげで、作者は最近APIを翻訳し、プロジェクトのコア機能を英語でGitHubに文書化しました。 。

いつものように、この例のソースコードはGitHubにあります。