Documentation

MVCポートレットを使用したアクションの呼び出し

ポートレットの アクションフェーズ は、状態の変更を適用します。 ポートレットのアクションURL を使用して、ポートレットのアクション処理メソッドをUIコンポーネントにバインドできます。 これらは、ユーザーの要求をアクションを実行するためのポートレットメソッドにマッピングするportlet:actionURLJSPタグです。

ここでは、アクションURLを3つの異なる方法で使用するサンプルポートレットを呼び出して調べる方法を学習します。

アクションを処理するMVCポートレットをデプロイする

サンプルのMVCポートレットには、個別のポートレットメソッドにマッピングする3つのポートレットアクションURLがあります。

新しいLiferay インスタンスを起動し、以下を実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.29-ga29。

http://localhost:8080でLiferayへのサインインします。 メールアドレス_test@liferay.com_とパスワード_test_を使用してください。 プロンプトが表示されたら、パスワードを _learn_に変更します。

次に、以下の手順でポートレットをデプロイし、アクションを起動します。

  1. サンプルをダウンロードして解凍します。

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

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

    注釈

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

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

    STARTED com.acme.u8t2.web_1.0.0
    
  4. U8T2ポートレット] ウィジェットを [サンプル] カテゴリからウィジェットページに追加します。 U8T2ポートレットが表示されます。

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

    ポートレットには3つのリンクがあります。

    • Do Something

    • Do Something Else

    • Do Something More

    各リンクをクリックすると、異なるアクション処理メソッドが呼び出されます。 学習の目的で、各メソッドはそれ自体を識別するメッセージをログに記録します。

  5. Do Something] をクリックします。 ポートレットはdoSomethingメソッドの呼び出しをログに記録します。

    [U8T2Portlet:28] Invoke #doSomething(ActionRequest, ActionResponse)
    
  6. Do Something Else] をクリックします。 ポートレットはdoSomethingElseメソッドの呼び出しをログに記録します。

    [U8T2Portlet:36] Invoke #doSomethingElse(ActionRequest, ActionResponse)
    
  7. Do Something More] をクリックします。 ポートレットはdoSomethingMoreメソッドの呼び出しをログに記録します。

    [U8T2Portlet:45] Invoke #doSomethingMore(ActionRequest, ActionResponse)
    

これらのアクションは簡単ですが、UIコンポーネントをポートレットのアクション処理メソッドにマッピングするさまざまな方法を示しています。 次に、それらがどのように機能するかを学びます。

ポートレットのアクション処理メソッドを調べる

U8T2Portletクラスは、3つのアクション処理メソッドを持つ標準の MVCPortlet です。

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

	public void doSomething(
		ActionRequest actionRequest, ActionResponse actionResponse) {

		if (_log.isInfoEnabled()) {
			_log.info("Invoking #doSomething(ActionRequest, ActionResponse)");
		}
	}

	public void doSomethingElse(
		ActionRequest actionRequest, ActionResponse actionResponse) {

		if (_log.isInfoEnabled()) {
			_log.info(
				"Invoking #doSomethingElse(ActionRequest, ActionResponse)");
		}
	}

	@ProcessAction(name = "nameForTheDoSomethingMoreMethod")
	public void doSomethingMore(
		ActionRequest actionRequest, ActionResponse actionResponse) {

		if (_log.isInfoEnabled()) {
			_log.info(
				"Invoking #doSomethingMore(ActionRequest, ActionResponse)");
		}
	}

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

}

@Component アノテーションは、クラスを、 Portlet サービスを提供するOSGi宣言型サービスコンポーネントとしてマークします。 プロパティにより、ポートレットは [サンプル] ウィジェットカテゴリで使用可能になり、ポートレットに U8T2ポート レットという名前が付けられ、ポートレットのデフォルトのビューテンプレートが /view.jsp に設定されます。

各メソッドは、 ActionRequest および ActionResponse パラメーターを取ります。 ActionRequestはメソッド情報を提供し、ActionResponseはメソッドが情報を渡すための手段を提供します。 各サンプルメソッドは、ログメッセージで自身を識別します。

JSP(以下で説明)は、ポートレットアクションURLを使用してサンプルメソッドにマッピングします。 最初の2つのメソッドは、名前を除いて同じです。 最後のメソッドで注目すべき点は、@ProcessAction(name = "nameForTheDoSomethingMoreMethod")アノテーションがあることです。 ポートレットアクションURLは、メソッド名の代わりに @ProcessAction アノテーション名を介してメソッドにマッピングできます。 たとえば、ProcessAction名を使用すると、ポートレットアクションURLを壊すことなく、メソッド名を変更したり、別のメソッドにアノテーションを割り当てたりできます。 JSPのポートレットアクションURLを調べることで理解しやすくなります。

JSPを調べる

view.jspは、ポートレットアクションURLを使用して、UIコンポーネントをポートレットのアクション処理メソッドにバインドします。 view.jspコードは次のとおりです。

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

<portlet:actionURL name="doSomething" var="actionURL" />

<h4>U8T2 Portlet</h4>

<p>
	<a href="<%= actionURL %>">Do Something</a>
</p>

<p>
	<a href="<portlet:actionURL name="doSomethingElse" />">Do Something Else</a>
</p>

<p>
	<a href="<portlet:actionURL><portlet:param name="javax.portlet.action" value="nameForTheDoSomethingMoreMethod" /></portlet:actionURL>">Do Something More</a>
</p>

最初の行は、portletのプレフィックスを介してポートレット2.0タグライブラリを使用できるようにしています。 このJSPは、タグライブラリのportlet:actionURLタグを使用してアクションをUIコンポーネントにバインドします。 各アクションURLを調べます。

例1:変数によるアクションURLの参照

view.jspは、次のポートレットアクションURLを宣言します。

<portlet:actionURL name="doSomething" var="actionURL" />

portlet:actionURLname属性は、doSomethingポートレットメソッドにマッピングされます。 var属性は、ポートレットアクションURLを任意の変数に割り当てます。 このJSPは、actionURL変数を参照することにより、アクションURLをDoSomethingというラベルの付いたハイパーリンクにバインドします。

<a href="<%= actionURL %>">Do Something</a>

このリンクをクリックすると、ポートレットのdoSomethingメソッドが呼び出されます。 アクションURLの変数を参照することにより、アクションURLを複数のUIコンポーネントにバインドできます。

例2:UIコンポーネントでアクションURLを宣言する

JSPは、アンカーコンポーネントで別のアクションURLを直接宣言します。

<a href="<portlet:actionURL name="doSomethingElse" />">Do Something Else</a>

コンポーネントは、アクションをポートレットのdoSomethingElseメソッドにバインドするアクションURLを宣言します。 これは、アクションURLをマッピングするためのよりコンパクトな方法です。

例3:ポートレットアクション名の参照

最後のアンカーで、JSPは、nameForTheDoSomethingMoreMethodポートレットアクション名に関連付けられたアクション処理メソッドにマッピングするアクションURLを宣言します。

JSPアクションURL:

<a href="<portlet:actionURL><portlet:param name="javax.portlet.action" value="nameForTheDoSomethingMoreMethod" /></portlet:actionURL>">Do Something More</a>

ポートレットメソッド:

@ProcessAction(name = "nameForTheDoSomethingMoreMethod")
public void doSomethingMore(
	ActionRequest actionRequest, ActionResponse actionResponse) {

	if (_log.isInfoEnabled()) {
		_log.info(
			"Invoking #doSomethingMore(ActionRequest, ActionResponse)");
	}
}

nameForTheDoSomethingMoreMethodと呼ばれるポートレットパラメーターは、アクションURLとメソッド間の結合をより緩やかにします。 たとえば、メソッド名を変更したり、@ProcessAction(name = "nameForTheDoSomethingMoreMethod")アノテーションを別のメソッドに割り当てたりすることができます。

次のステップ

アクションURLの使用方法がわかったので、アクションメソッドの作成に集中できます。 または、MVCActionCommandクラスを使用して調査することもできます。 または、他のポートレットフェーズの処理を検討する準備ができている場合は、MVCRenderCommandクラスとMVCResourceCommandクラスの使用を検討してください。 MVCレンダーコマンド