Documentation

MVCレンダーコマンド

MVCレンダーコマンドは、レンダリングするページを処理するクラスです。 これらは、MVCPortletレンダーURLとリクエストによって呼び出されます。 レンダーロジックが単純な場合は、すべてをポートレットクラスに実装できます。 レンダーロジックが複雑な場合、またはレンダーパスを明確に分離したい場合は、MVCレンダーコマンドを使用してください。

MVCレンダーコマンドを呼び出す

ここでは、MVCレンダーコマンドを使用してビューをレンダリングするサンプルポートレットをデプロイします。

  1. Liferay Dockerコンテナを起動します。

    docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.22-ga22
    
  2. サンプルをダウンロードして解凍します。

    curl https://learn.liferay.com/dxp/latest/ja/building-applications/developing-a-java-web-application/using-mvc/liferay-a4p1.zip -O
    
    unzip liferay-a4p1.zip
    
  3. サンプルをビルドしてデプロイします。

    cd liferay-a4p1
    
    ./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    

    注釈

    このコマンドは、モジュールJARをDockerコンテナの/opt/liferay/osgi/modulesにコピーするのと同じです。

  4. Dockerコンテナコンソールでデプロイを確認します。

    STARTED com.acme.a4p1.web_1.0.0
    
  5. ブラウザでhttp://localhost:8080を開きます。

  6. デフォルトの認証情報を使用してサインインします。

    ユーザー名 : test@liferay.com

    パスワード: test

  7. A4P1ポートレット ウィジェットを [Samples] カテゴリからウィジェットページに追加します。 A4P1ポートレットが表示されます。

    A4P1ポートレットをページに追加しました。

  8. MVCレンダーコマンドを呼び出して、 [Go to Baker] をクリックしてBakerビューにアクセスします。 A4P1BakerMVCRenderCommandは、そのrenderメソッドの呼び出しをログに記録し、Bakerビューをレンダリングします。

    [A4P1BakerMVCRenderCommand:26] Invoking #render(RenderRequest, RenderResponse)
    

    Bakerビューをレンダリングしています。

  9. 他のMVCレンダーコマンドを呼び出し、 [Go to Able] をクリックしてAbleビューに再度アクセスします。 A4P1AbleMVCRenderCommandは、そのrenderメソッドの呼び出しをログに記録し、Ableビューを再度レンダリングします。

    [A4P1AbleMVCRenderCommand:26] Invoking #render(RenderRequest, RenderResponse)
    

MVCレンダーコマンドの動作を見てきました。 次に、それらがどのように機能するかを確認します。

ポートレットを調べる

A4P1Portletは最小の MVCPortlet です。

@Component(
	property = {
		"com.liferay.portlet.display-category=category.sample",
		"javax.portlet.display-name=A4P1 Portlet",
		"javax.portlet.init-param.view-template=/a4p1/able.jsp",
		"javax.portlet.name=com_acme_a4p1_web_internal_portlet_A4P1Portlet"
	},
	service = Portlet.class
)
public class A4P1Portlet extends MVCPortlet {
}

@Component javax.portlet.nameプロパティはポートレットの名前を設定します。

"javax.portlet.name=com_acme_a4p1_web_internal_portlet_A4P1Portlet"

ポートレットはデフォルトで/a4p1/able.jspをレンダリングします。

注釈

MVCRenderCommandは、ポートレットの名前(たとえば、ポートレットコンポーネントの javax.portlet.nameプロパティ値)によってポートレットにバインドします。

次に、ポートレットのMVCレンダーコマンドクラスを調べます。

MVCRenderCommandクラスを調べる

MVCレンダーコマンドのクラスは、 MVCRenderCommand を直接実装することも、 BaseMVCRenderCommand を拡張することもできます。 A4P1AbleMVCRenderCommandは、MVCRenderCommandを直接実装します。 A4P1AbleMVCRenderCommandは次のとおりです。

@Component(
	property = {
		"javax.portlet.name=com_acme_a4p1_web_internal_portlet_A4P1Portlet",
		"mvc.command.name=/a4p1/able"
	},
	service = MVCRenderCommand.class
)
public class A4P1AbleMVCRenderCommand implements MVCRenderCommand {

	@Override
	public String render(
		RenderRequest renderRequest, RenderResponse renderResponse) {

		if (_log.isInfoEnabled()) {
			_log.info("Invoking #render(RenderRequest, RenderResponse)");
		}

		return "/a4p1/able.jsp";
	}

	private static final Log _log = LogFactoryUtil.getLog(
		A4P1AbleMVCRenderCommand.class);

}

A4P1AbleMVCRenderCommandは、MVCRenderCommandサービスを提供する Component です。 コンポーネントプロパティは、A4P1AbleMVCRenderCommandcom_acme_a4p1_web_internal_portlet_A4P1Portletという名前のポートレットに適用し、A4P1AbleMVCRenderCommandをMVCコマンド名/a4p1/ableにマップします。

注釈

ポートレットごとに個別の javax.portlet.nameプロパティを宣言することにより、MVCRenderCommandコンポーネントを複数のポートレットに関連付けることができます。

  @Component(
     property = {
        "javax.portlet.name=com_acme_a4p1_web_internal_portlet_A4P1Portlet",
        "javax.portlet.name=com_acme_a4p1_web_internal_portlet_A4P2Portlet",
        "mvc.command.name=/a4p1/download"
     },
     service = MVCRenderCommand.class
  )        

ポートレットがMVCコマンド名/a4p1/ableを指定するリクエストパラメータを受け取ると、A4P1AbleMVCRenderCommandrenderメソッドが実行されます。 このrenderメソッドは、それ自体を識別するメッセージをログに記録し、レンダリングするビューのパスを返します。

A4P1BakerMVCRenderCommandA4P1AbleMVCRenderCommandに似ていますが、MVCコマンド名が/a4p1/bakerであり、renderメソッドがビューパス/a4p1/baker.jspを返す点が異なります。

これらのMVCレンダーコマンドの例は、デモンストレーションの目的で簡単な機能を提供します。 ビューのレンダリングに必要なロジックを使用して、MVCレンダーコマンドのrenderメソッドを実装します。

サンプルURLは、MVCレンダーコマンドをトリガーします。

ポートレットレンダーURLを調べる

able.jspファイルとbaker.jspファイルは、ポートレットレンダーURLを使用して間接的に相互にリンクします。 以下はable.jspです。

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

<h4>A4P1 Portlet</h4>

<h5>Able</h5>

<portlet:renderURL var="bakerURL">
	<portlet:param name="mvcRenderCommandName" value="/a4p1/baker" />
</portlet:renderURL>

<a href="<%= bakerURL %>">Go to Baker</a>

portlet:renderURLタグはポートレットtaglibから利用可能で、プレフィックスportletが割り当てられます。 このレンダーURLは、mvcRenderCommandNameポートレットパラメーター値/a4p1/bakerを宣言します。これはA4P1AbleMVCRenderCommandのMVCコマンド名です。 変数bakerURLは、このレンダーURLを参照します。

ハイパーリンク<a href="<%= bakerURL %>">Go to Baker</a>は、レンダーURLをアクションにバインドします。 ユーザーがハイパーリンクをクリックすると、そのmvc.command.nameコンポーネントプロパティ値/a4p1/bakermvcRenderCommandNameパラメーター値と一致するため、ポートレットは RenderRequestA4P1BakerMVCRenderCommandに送信します。

baker.jspable.jspに似ていますが、ポートレットレンダーURLのmvcRenderCommandNameパラメーター値が/a4p1/ableである点が異なります。 各JSPのportlet:renderURLタグは、MVCレンダーコマンドのmvc.command.nameプロパティ値をタグのmvcRenderCommandNameポートレットパラメーターに割り当てることにより、MVCレンダーコマンドにマップされます。

able.jspポートレットレンダーURLパラメーター

A4P1BakerMVCRenderCommandコンポーネントプロパティ

<portlet:param name="mvcRenderCommandName" value="/a4p1/baker" />

mvc.command.name=/a4p1/baker

baker.jspポートレットレンダーURLパラメーター

A4P1AbleMVCRenderCommandコンポーネントプロパティ

<portlet:param name="mvcRenderCommandName" value="/a4p1/able" />

mvc.command.name=/a4p1/able

次のステップ

これで、MVCレンダーコマンドクラスにレンダーロジックを実装する方法がわかりました。 次に、MVCリソースコマンドクラスを使用してファイルなどのリソースを操作できます。