MVCアクションコマンド¶
MVCアクションコマンドは、アクションを個別のクラスとして処理します。 アクションコマンドを使用すると、多くのアクションを持つMVCPortlet
でアクションロジックを整理できます。 ポートレットのJSPのアクションURLは、指定されたMVCアクションコマンドクラスを呼び出します。
MVCアクションコマンドを使用するサンプルポートレットをデプロイしてから、それを調べます。
ポートレットのMVCアクションコマンドを呼び出す¶
サンプルポートレットの2つのアクションは、呼び出されているMVCアクションコマンドクラスとメソッドを示すメッセージをログに記録します。
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.55-ga55。
http://localhost:8080でLiferayへのサインインします。 メールアドレス_test@liferay.com_とパスワード_test_を使用してください。 プロンプトが表示されたら、パスワードを _learn_に変更します。
次に、以下の手順でポートレットをデプロイし、アクションを起動します。
サンプルをダウンロードして解凍します。
curl https://learn.liferay.com/dxp/latest/ja/building-applications/developing-a-java-web-application/using-mvc/liferay-l6y9.zip -O
unzip liferay-l6y9.zip
サンプルをビルドしてデプロイします。
cd liferay-l6y9
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
注釈
このコマンドは、モジュールJARをDockerコンテナの
/opt/liferay/osgi/modules
にコピーするのと同じです。Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.l6y9.web_1.0.0
[L6Y9 ポートレット] ウィジェットを [サンプル] カテゴリからウィジェットページに追加します。 L6Y9ポートレットが表示されます。
リンクは、さまざまな
MVCActionCommand
クラスのメソッドを呼び出します。 学習の目的で、メソッドは自分自身を識別するメッセージをログに記録します。[Do L6Y9 Able] をクリックします。
DoL6Y9AbleMVCActionCommand
は、そのdoProcessAction
メソッドの呼び出しをログに記録します。[DoL6Y9AbleMVCActionCommand:26] Invoke #doProcessAction(ActionRequest, ActionResponse)
[Do L6Y9 Baker] をクリックします。
DoL6Y9BakerMVCActionCommand
は、そのdoProcessAction
メソッドの呼び出しをログに記録します。[DoL6Y9BakerMVCActionCommand:26] Invoke #doProcessAction(ActionRequest, ActionResponse)
MVCアクションコマンドの動作を見てきました。 次に、それらがどのように機能するかを確認します。
ポートレットを調べる¶
L6Y9Portlet
は最小の MVCPortlet
です。
@Component(
property = {
"com.liferay.portlet.display-category=category.sample",
"javax.portlet.display-name=L6Y9 Portlet",
"javax.portlet.init-param.view-template=/view.jsp",
"javax.portlet.name=com_acme_l6y9_web_internal_portlet_L6Y9Portlet"
},
service = Portlet.class
)
public class L6Y9Portlet extends MVCPortlet {
}
@Component
javax.portlet.name
プロパティはポートレットの名前を設定します。
"javax.portlet.name=com_acme_l6y9_web_internal_portlet_L6Y9Portlet"
ポートレットはデフォルトで/view.jsp
をレンダリングします。
注釈
MVCActionCommand
は、ポートレットの名前(たとえば、ポートレットコンポーネントの javax.portlet.name
プロパティ値)によってポートレットにバインドします。
サンプルポートレットは、デフォルトでview.jsp
をレンダリングします。 次に、JSPがMVCアクションコマンドクラスを呼び出す方法を確認します。
ポートレットアクションのURLを調べる¶
ポートレットのview.jsp
ファイルは、ポートレットのMVCアクションコマンドを呼び出すためのリンクをレンダリングします。
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<h4>L6Y9 Portlet</h4>
<p>
<a href="<portlet:actionURL name="/l6y9/do_l6y9_able" />">Do L6Y9 Able</a>
</p>
<p>
<a href="<portlet:actionURL name="/l6y9/do_l6y9_baker" />">Do L6Y9 Baker</a>
</p>
最初の行は、portlet
のプレフィックスを介してポートレット2.0タグライブラリを使用できるようにしています。 このJSPは、タグライブラリのportlet:actionURL
タグを使用してアクションをUIコンポーネントにバインドします。 各タグは、MVCアクションコマンドのmvc.command.name
プロパティ値をタグのname
属性に割り当てることにより、UIコンポーネントをMVCコマンドにマップします。
|
|
---|---|
|
|
|
|
---|---|
|
|
たとえば、 [Do L6Y9 Able] リンクをクリックすると、DoL6Y9AbleMVCActionCommand
のdoProcessAction
メソッドが呼び出されます。
MVCActionCommandクラスを調べる¶
MVCアクションコマンドクラスは、 MVCActionCommand
を直接実装することも、 BaseMVCActionCommand
を拡張することによって実装することもできます。 DoL6Y9AbleMVCActionCommand
はBaseMVCActionCommand
を拡張します。
@Component(
property = {
"javax.portlet.name=com_acme_l6y9_web_internal_portlet_L6Y9Portlet",
"mvc.command.name=/l6y9/do_l6y9_able"
},
service = MVCActionCommand.class
)
public class DoL6Y9AbleMVCActionCommand extends BaseMVCActionCommand {
@Override
protected void doProcessAction(
ActionRequest actionRequest, ActionResponse actionResponse) {
if (_log.isInfoEnabled()) {
_log.info(
"Invoking #doProcessAction(ActionRequest, ActionResponse)");
}
}
private static final Log _log = LogFactoryUtil.getLog(
DoL6Y9AbleMVCActionCommand.class);
DoL6Y9AbleMVCActionCommand
は、MVCActionCommand
サービスを提供する Component
です。 DoL6Y9AbleMVCActionCommand
のコンポーネントプロパティは、プロパティjavax.portlet.name=com_acme_l6y9_web_internal_portlet_L6Y9Portlet
を持つポートレットにコンポーネントを適用し、コンポーネントを/do_l6y9_able
という名前のMVCコマンドにマップします。 ユーザーがそのコマンド名にバインドされたアクションをトリガーすると、DoL6Y9AbleMVCActionCommand
のdoProcessAction
メソッドが実行されます。 デモンストレーションの目的で、上記のdoProcessAction
メソッドは、それ自体を識別するメッセージをログに記録します。
注釈
ポートレットごとに個別の javax.portlet.name
プロパティを宣言することにより、MVCActionCommand
コンポーネントを複数のポートレットに関連付けることができます。
@Component(
property = {
"javax.portlet.name=com_acme_l6y9_web_internal_portlet_L6Y9Portlet",
"javax.portlet.name=com_acme_l6y9_web_internal_portlet_L6Y0Portlet",
"mvc.command.name=/l6y9/download"
},
service = MVCActionCommand.class
)
DoL6Y9BakerMVCActionCommand
はDoL6Y9AbleMVCActionCommand
に似ていますが、名前にAble
またはable
ではなくBaker
またはbaker
が含まれている点が異なります。
次に、ポートレットのJSPがUIコンポーネントのアクションをコマンドにマップする方法を確認します。
次のステップ¶
MVCアクションコマンドの使用方法がわかったので、MVC Render CommandsとMVC Resource Commandsを確認することをお勧めします。 アプリのコンテンツのローカライズを開始する場合は、Using Localized Messagesを参照してください。 モデルレイヤー、永続レイヤー、およびサービスレイヤーの開発を開始する準備ができている場合は、 サービスビルダー をご覧ください。