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.132-ga132
http://localhost:8080 で Liferay にサインインしてください。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learn に変更してください。
次に、以下の手順に従ってポートレットをデプロイし、そのアクションをトリガーします。
-
サンプルをダウンロードして解凍してください。
curl https://resources.learn.liferay.com/examples/liferay-t9u3.zip -Ounzip liferay-t9u3.zip -
サンプルをビルドしてデプロイします。
cd liferay-t9u3./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注記このコマンドは、モジュール JAR を Docker コンテナ上の
/opt/liferay/osgi/modulesにコピーすることと同じです。 -
Dockerコンテナコンソールでデプロイを確認してください。
com.acme.t9u3.web_1.0.0 を開始しました -
T9U3 ポートレット ウィジェットを サンプル カテゴリからウィジェットページに追加します。 T9U3ポートレットが表示されます。

ポートレットには3つのリンクがあります。
- 何か行動を起こしましょう
- 他のことをする
- もっと何かをしよう
各リンクをクリックすると、それぞれ異なるアクション処理方法が実行されます。 学習目的のため、各メソッドは自身を識別するメッセージをログに記録します。
-
をクリックして何かを実行してください。 ポートレットは、
doSomethingメソッドの呼び出しをログに記録します。[T9U3Portlet:28] #doSomething(ActionRequest, ActionResponse) を呼び出します -
をクリックして、他の操作 を実行します。 ポートレットは、
doSomethingElseメソッドの呼び出しをログに記録します。[T9U3Portlet:36] #doSomethingElse(ActionRequest, ActionResponse) を呼び出します -
をクリックして、さらに何かを実行してください。 ポートレットは、
doSomethingMoreメソッドの呼び出しをログに記録します。[T9U3Portlet:45] #doSomethingMore(ActionRequest, ActionResponse) を呼び出します
これらの操作は些細なものですが、UIコンポーネントをポートレットのアクション処理メソッドにマッピングするさまざまな方法を示しています。 次に、それらがどのように機能するのかを学びます。
ポートレットのアクション処理方法を検証する
T9U3Portlet クラスは、3 つのアクション処理メソッドを持つ標準的な MVCPortlet です。
@Component(
property = {
"com.liferay.portlet.display-category=category.sample",
"jakarta.portlet.display-name=T9U3 Portlet",
"jakarta.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(
"#doSomethingMore(ActionRequest, ActionResponse) を呼び出しています");
}
}
private static final Log _log = LogFactoryUtil.getLog(T9U3Portlet.class);
}
@Component アノテーションは、クラスを ポートレット サービスを提供する OSGi 宣言型サービス コンポーネントとしてマークします。 プロパティにより、ポートレットは Sample ウィジェット カテゴリで使用可能になり、ポートレットの名前は T9U3 Portletとなり、ポートレットのデフォルトのビュー テンプレートは /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>T9U3 Portlet</h4>
<p>
<a href="<%= actionURL %>">何か行動を起こす</a>
</p>
<p>
<a href="<portlet:actionURL name="doSomethingElse" />">他のことをする</a>
</p>
<p>
<a href="<portlet:actionURL><portlet:param name="javax.portlet.action" value="nameForTheDoSomethingMoreMethod" /></portlet:actionURL>">さらに何かをする</a>
</p>
最初の行は、portletのプレフィックスを介してポートレット2.0タグライブラリを使用できるようにしています。 この JSP は、タグライブラリの portlet:actionURL タグを使用して、アクションを UI コンポーネントにバインドします。 各アクションのURLを検証してください。
例1:変数によるアクションURLの参照
view.jsp は、次のポートレットアクション URL を宣言します。
<portlet:actionURL name="doSomething" var="actionURL" />
portlet:actionURLの name 属性は、 doSomething ポートレット メソッドにマッピングされます。 var 属性は、ポートレットアクション URL を任意の変数に割り当てます。 この JSP は、 actionURL 変数を参照することにより、アクション URL を Do Something というラベルのハイパーリンクにバインドします。
<a href="<%= actionURL %>">何か行動を起こす</a>
このリンクをクリックすると、ポートレットの doSomething メソッドが呼び出されます。 アクションURLの変数を参照することで、アクションURLを複数のUIコンポーネントにバインドできます。
例2:UIコンポーネントでアクションURLを宣言する
JSPでは、アンカーコンポーネント内で別のアクションURLを直接宣言しています。
<a href="<portlet:actionURL name="doSomethingElse" />">他のことをする</a>
コンポーネントは、アクションをポートレットの doSomethingElse メソッドにバインドするアクション URL を宣言します。 これは、アクションURLをマッピングするより簡潔な方法です。
例3:ポートレットアクション名の参照
最後のアンカーでは、JSP は nameForTheDoSomethingMoreMethod ポートレットアクション名に関連付けられたアクション処理メソッドにマッピングされるアクション URL を宣言します。
JSPアクションURL:
<a href="<portlet:actionURL><portlet:param name="javax.portlet.action" value="nameForTheDoSomethingMoreMethod" /></portlet:actionURL>">もっと何かをする</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 クラスの使用を検討してください。