Using MVC
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

Invoking Actions with MVC Portlet

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

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

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

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

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

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132

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

次に、次の手順に従ってポートレットをデプロイし、そのアクションをトリガーします。

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

    curl https://resources.learn.liferay.com/examples/liferay-t9u3.zip -O
    
    unzip liferay-t9u3.zip
    
  2. サンプルをビルドしてデプロイします。

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

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

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

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

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

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

    • [Do Something]
    • [Do Something Else]
    • [Do Something More]

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

  5. 「何かする」をクリックします。 ポートレットはdoSomethingメソッドの呼び出しをログに記録します。

    [T9U3Portlet:28] Invoke #doSomething(ActionRequest, ActionResponse)
    
  6. 「他の操作を実行」をクリックします。 ポートレットはdoSomethingElseメソッドの呼び出しをログに記録します。

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

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

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

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

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

@Component(
	property = {
		"com.liferay.portlet.display-category=category.sample",
		"javax.portlet.display-name=T9U3 Portlet",
		"javax.portlet.init-param.view-template=/view.jsp"
	},
	service = Portlet.class
)
public class T9U3Portlet 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(T9U3Portlet.class);

}

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

各メソッドは、 ActionRequestActionResponse パラメータを取ります。 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>T9U3 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 クラスの使用を検討してください。