私はネイティブ スクリプト (JSP) ベースの RESTful Web フレームワーク内で作業しています。フレームワークには、多数のリクエスト属性を自動的に設定するルーティング メカニズムがあり、これを JSP で使用できます (属性の 1 つは、リクエストされたリソースの「モデル」であり、基本的には単なる HashMap です)。
問題は 90% の確率であり、より複雑なドメイン ロジック、他のリソース データ (他のモデル) の取得、または出力用のデータのスクラブなど、ある程度のロジックを JSP に追加する必要があります。
私は、JSP からドメイン ロジックを抽出し、JSP を可能な限りロジックのない状態に保つためのさまざまな確立された Web アプリケーション デザイン パターンを検討しています。
注意すべき点がいくつかあります。
- 私が作業しているシステム内では、モデル (データベースからのデータ プル) が提供されますが、フレームワーク (前述の HashMap) が提供されます。このデータの周りに独自のモデル ラッパーを作成することもできますが、おそらく不要です。
- JSP/スクリプトはリクエストのエンドポイントです - ビューが使用するすべてのデータを含むビュー Bean (ViewModel?) を返すプレゼンター/コントローラー タイプのオブジェクトを使用するパターンを使用する場合、行が必要になります。 Presenter/Controller を呼び出して View Bean をインスタンス化する JSP で。
現在、モデルにアクセスできるモジュール (スクリプト) ごとにプレゼンター POJO を作成し (フレームワークはこれをリクエスト属性として設定します)、JSP の上部でインスタンス化するだけで、それをさらに使用したり、豆のようではありません。
私がそれを正しく理解していれば、プレゼンテーション モデルのデザイン パターンを実装したと思います。[1]
元。
JSP は次のようになります。
<% DemoPresenter demo = new DemoPresenter(request) %>
<%= demo.getTitle() %>
- or add it to pageContext to use w JSTL/EL -
<c:set var="demo" value="new DemoPresenter(request)"/>
${demo.title}
そして、「プレゼンター/コントローラー」は次のようになります。
public class DemoPresenter extends BasePresenter {
private String title;
public DemoPresenter(HttpServletRequest request) {
FrameworkModel model = request.getAttribute("frameworkProvidedResourceModel");
this.title = model.get("title").toUpperCase() + "!!!";
}
public getTitle() { return this.title; }
}
Presenter obj を JSP/Script で直接使用することと、Presenter がデータを入力する「ロジックのない」ViewModel Bean を返すことについて何か考えはありますか? これの利点は、1 つのプレゼンターで同じリソースのさまざまな「ビュー」 (表示ビュー、編集ビュー、概要ビューなど) を管理できることです。以下は、さまざまなビューを取得する方法の例です。モデル。
/blog/posts/1/show -> ViewModel を次のように取得する JSP を実行します。
<% DemoDefaultViewModel default = new DemoPresenter(request).getViewModel(DemoDefaultViewModel.class); %>
/blog/posts/1/edit -> ViewModel を取得する JSP を次のように実行します。
<% DemoEditViewModel edit = new DemoPresenter(request).getViewModel(DemoEditViewModel.class); %>
無関係な部分が多すぎないシンプルなソリューションを維持したいと思います。また、事前定義された厳密なフレームワーク内で作業しているため、あまり凝ったことはできません。すべてのドメイン ロジックを JSP から、より再利用可能でテスト可能な Java クラスに移動する良い方法を見つけたいだけです。