MVCポートレットを使用したアクションの呼び出し
ポートレットの アクションフェーズ は、状態の変更を適用します。 ポートレットのアクションURL を使用して、ポートレットのアクション処理メソッドをUIコンポーネントにバインドできます。 これらは、ユーザーの要求をアクションを実行するためのポートレットメソッドにマッピングするportlet:actionURL
JSPタグです。
ここでは、アクションURLを3つの異なる方法で使用するサンプルポートレットを呼び出して調べる方法を学習します。
アクションを処理するMVCポートレットをデプロイする
サンプルのMVCポートレットには、個別のポートレットメソッドにマッピングする3つのポートレットアクションURLがあります。
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.55-ga55。
http://localhost:8080でLiferayへのサインインします。 メールアドレス[email protected]_とパスワード_test_を使用してください。 プロンプトが表示されたら、パスワードを _learn_に変更します。
次に、以下の手順でポートレットをデプロイし、アクションを起動します。
サンプルをダウンロードして解凍します。
curl https://resources.learn.liferay.com/dxp/latest/ja/building-applications/developing-a-java-web-application/using-mvc/liferay-u8t2.zip -O
unzip liferay-u8t2.zip
サンプルをビルドしてデプロイします。
cd liferay-u8t2
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、モジュールJARをDockerコンテナの
/opt/liferay/osgi/modules
にコピーするのと同じです。Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.u8t2.web_1.0.0
[U8T2ポートレット] ウィジェットを [サンプル] カテゴリからウィジェットページに追加します。 U8T2ポートレットが表示されます。
ポートレットには3つのリンクがあります。
- Do Something
- Do Something Else
- Do Something More
各リンクをクリックすると、異なるアクション処理メソッドが呼び出されます。 学習の目的で、各メソッドはそれ自体を識別するメッセージをログに記録します。
[Do Something] をクリックします。 ポートレットは
doSomething
メソッドの呼び出しをログに記録します。[U8T2Portlet:28] Invoke #doSomething(ActionRequest, ActionResponse)
[Do Something Else] をクリックします。 ポートレットは
doSomethingElse
メソッドの呼び出しをログに記録します。[U8T2Portlet:36] Invoke #doSomethingElse(ActionRequest, ActionResponse)
[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:actionURL
のname
属性は、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レンダーコマンド