Documentation

MVCの使用

経験豊富な開発者であれば、Model View Controllerについて聞いたのはこれが初めてではないでしょう。 JavaにはMVCフレームワークの実装がたくさんあるのに、Liferayがまた別のフレームワークを作成したのはなぜでしょうか。 Liferay MVCポートレットには次の利点があります。

  • 他の多くのJava MVCフレームワークとは対照的に、軽量です。

  • コードとの同期を維持する必要のある特別な構成ファイルはありません。

  • これは GenericPortlet の拡張です。

  • LiferayのMVCポートレットフレームワークは、init()メソッドが呼び出されたときにいくつかの事前定義されたパラメーターのみを検索するため、大量の定型コードの記述を回避できます。

  • コントローラーは、MVCコマンドクラスに分類できます。各クラスは、特定のポートレットポートレットフェーズ(レンダリング、アクション、およびリソース提供フェーズ)のコントローラーコードを処理します。

  • MVCコマンドクラスは複数のポートレットにサービスを提供できます。

  • Liferayのポートレットはそれを使用します。 つまり、Liferayアプリケーションを設計またはトラブルシューティングする必要がある場合に参照する堅牢な実装がたくさんあります。

Liferay MVCポートレットフレームワークは軽量で使いやすいです。

ここでは、次のトピックを取り上げて、MVCポートレットがどのように機能するかを学習します。

Liferay MVCポートレットフレームワークの各レイヤーがアプリケーションの懸念事項の分離にどのように役立つかを検討してください。

MVCレイヤーとモジュール性

MVCには、3つのレイヤーがあります。

モデル: モデル層は、アプリケーションデータとそれを操作するためのロジックを保持します。

ビュー: ビューレイヤーには、データが表示されます。

コントローラー: MVCパターンの中間者であるコントローラーは、ビューレイヤーとモデルレイヤーの間でデータをやり取りします。

Liferay DXPのアプリケーションは、複数の個別のモジュールに分割されています。 サービスビルダー を使用すると、モデルレイヤーがserviceモジュールとapi モジュールに生成されます。 ビューレイヤーとコントローラーレイヤーは、モジュールであるwebモジュールを共有します。

Workspace を使用してマルチモジュールのService Builder駆動型MVCアプリケーションプロジェクトのスケルトンを生成すると、時間を大幅に節約でき、より重要な(そして興味深い)開発作業を開始できます。

Liferay MVCコマンドクラス

大規模なアプリケーションでは、すべてのコントローラーロジックを保持している場合、 -Portlet クラスは巨大で扱いにくいものになります。 Liferayは、コントローラー機能を分割するMVCコマンドクラスを提供します。

*** MVCActionCommand :** -ActionCommand クラスを使用して、アクションURLによって呼び出される各ポートレットアクションを保持します。 *** MVCRenderCommand :** -RenderCommand クラスを使用して、レンダリングURLに応答することにより、適切なJSPにディスパッチする render メソッドを保持します。 *** MVCResourceCommand :** -ResourceCommand クラスを使用して、リソースURLに基づいてリソースを提供します。

すべてをつなぎ合わせて適切に機能させるには、入り組んでいる構成ファイルが必要でしょうか。 いいえ、そうではありません。-Portletクラスの@Componentアノテーションですべて簡単に管理できます。

Liferay MVCポートレットコンポーネント

コントローラーをMVCコマンドクラスに分割する予定があるかどうかに関係なく、ポートレットの @Component アノテーションはポートレットを構成します。 例として、簡単なポートレットコンポーネントを次に示します。

@Component(
    property = {
        "com.liferay.portlet.display-category=category.sample",
        "javax.portlet.display-name=Hello World Portlet",
        "javax.portlet.init-param.view-template=/view.jsp",
        "javax.portlet.name=com_acme_hello_world_web_internal_portlet_HelloWorldPortlet"
    },
    service = Portlet.class
)
public class HelloWorldPortlet extends MVCPortlet {

javax.portlet.nameプロパティは必須です。 MVCコマンドを使用する場合、javax.portlet.nameプロパティ値は、特定のポートレットURL /コマンドの組み合わせを正しいポートレットにリンクします。

重要

[Liferay DXPがその名前を使用して[ポートレットのID]を作成する方法(./reference/portlet-descriptor-to-osgi-service-property-map.html#ten)を考慮して、ポートレット名を一意にします。

コンポーネントを使用して公開している Portlet.class 実装の種類について、混乱が生じる可能性があります。 サービスレジストリは、これが javax.portlet.Portlet インターフェイスであると想定しています。 たとえば、 com.liferay.portal.kernel.model.Portletではなく、それをインポートします。

注釈

liferay-portlet-app_ [version].dtd ファイル は、ポートレットコンポーネントのプロパティとして指定できるすべてのLiferay固有の属性を定義します。 javax.portlet.で名前空間が設定されたプロパティは、 portlet.xml descriptor の要素です。

よりシンプルなMVCポートレット

より単純なアプリケーションでは、MVCコマンドを使用しません。 ポートレットのレンダーURLはmvcPathパラメーターでJSPパスを指定し、 MVCPortlet メソッドは実装制御ロジックをオーバーライドします。 次のJSPコードには、JSPパス/view_2.jspを指定するポートレットレンダーURLが含まれています。

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<portlet:renderURL var="view2URL">
    <portlet:param name="mvcPath" value="/view_2.jsp" />
</portlet:renderURL>

<a href="<%= view2URL %>">Go to View 2</a>

ユーザーがリンクをクリックすると、ポートレットはmvcPathリクエストパラメータを受け取り、そのrenderメソッドで制御ロジックを処理します。 詳細については、 MVCポートレットを使用したビューのレンダリング を参照してください。

次のステップ

これまで見てきたように、LiferayのMVCポートレットフレームワークは、適切に構造化されたコントローラーレイヤーを提供します。 MVCポートレットの基本を学びたい場合は、次のチュートリアルから始めてください。

個別のMVCコマンドクラスで制御ロジックを開発する場合は、次の記事をお読みください。

モデルレイヤーを開発する準備ができている場合は、 サービスビルダー をご覧ください。