Documentation

MVCアクションコマンド

MVCアクションコマンドは、アクションを個別のクラスとして処理します。 アクションコマンドを使用すると、多くのアクションを持つMVCPortletでアクションロジックを整理できます。 ポートレットのJSPのアクションURLは、指定されたMVCアクションコマンドクラスを呼び出します。

MVCアクションコマンドを使用するサンプルポートレットをデプロイしてから、それを調べます。

ポートレットのMVCアクションコマンドを呼び出す

新しいLiferayインスタンスを実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.22-ga22

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

サンプルポートレットの2つのアクションは、呼び出されているMVCアクションコマンドクラスとメソッドを示すメッセージをログに記録します。 ポートレットをデプロイしてそのアクションをトリガーする方法は次のとおりです。

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

    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
    
  2. サンプルをビルドしてデプロイします。

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

    注釈

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

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

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

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

    リンクは、さまざまなMVCActionCommandクラスのメソッドを呼び出します。 学習の目的で、メソッドは自分自身を識別するメッセージをログに記録します。

  5. Do L6Y9 Able] をクリックします。 DoL6Y9AbleMVCActionCommandは、そのdoProcessActionメソッドの呼び出しをログに記録します。

    [DoL6Y9AbleMVCActionCommand:26] Invoke #doProcessAction(ActionRequest, ActionResponse)
    
  6. 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コマンドにマップします。

view.jsp ポートレットアクションURL

DoL6Y9AbleMVCActionCommand コンポーネントプロパティ

<portlet:actionURL name="/do_l6y9_able" />

mvc.command.name=/l6y9/do_l6y9_able

view.jsp ポートレットアクションURL

DoL6Y9BakerMVCActionCommand コンポーネントプロパティ

<portlet:actionURL name="/do_l6y9_baker" />

mvc.command.name=/l6y9/do_l6y9_baker

たとえば、 Do L6Y9 Able リンクをクリックすると、DoL6Y9AbleMVCActionCommanddoProcessActionメソッドが呼び出されます。

MVCActionCommandクラスを調べる

MVCアクションコマンドクラスは、 MVCActionCommand を直接実装することも、 BaseMVCActionCommand を拡張することによって実装することもできます。 DoL6Y9AbleMVCActionCommandBaseMVCActionCommandを拡張します。

@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コマンドにマップします。 ユーザーがそのコマンド名にバインドされたアクションをトリガーすると、DoL6Y9AbleMVCActionCommanddoProcessActionメソッドが実行されます。 デモンストレーションの目的で、上記の``doProcessAction</0メソッドは、それ自体を識別するメッセージをログに記録します。

ポートレットごとに個別の `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
      )
``

DoL6Y9BakerMVCActionCommandDoL6Y9AbleMVCActionCommandに似ていますが、名前にAbleまたはableではなくBakerまたはbakerが含まれている点が異なります。

次に、ポートレットのJSPがUIコンポーネントのアクションをコマンドにマップする方法を確認します。

次のステップ

MVCアクションコマンドの使用方法がわかったので、MVC Render CommandsMVC Resource Commandsを確認することをお勧めします。 アプリのコンテンツのローカライズを開始する場合は、Using Localized Messagesを参照してください。 モデルレイヤー、永続レイヤー、およびサービスレイヤーの開発を開始する準備ができている場合は、 サービスビルダー をご覧ください。