MVCレンダーコマンド
MVCレンダーコマンドは、レンダリングするページを処理するクラスです。 これらは、MVCPortletレンダーURLとリクエストによって呼び出されます。 レンダリング ロジックが単純な場合は、 すべてをポートレット クラスに実装できます。 レンダーロジックが複雑な場合、またはレンダーパスを明確に分離したい場合は、MVCレンダーコマンドを使用してください。
MVCレンダーコマンドを呼び出す
ここでは、MVCレンダーコマンドを使用してビューをレンダリングするサンプルポートレットをデプロイします。
新しい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-a4p1.zip -Ounzip liferay-a4p1.zip -
サンプルをビルドしてデプロイします。
cd liferay-a4p1./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注このコマンドは、モジュールJARをDockerコンテナ上の
/opt/liferay/osgi/modulesにコピーするのと同じです。 -
Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.a4p1.web_1.0.0 -
[A4P1ポートレット]ウィジェットを[サンプル]カテゴリからウィジェットページに追加します。 A4P1ポートレットが表示されます。

-
MVCレンダーコマンドを呼び出して、[Go to Baker]をクリックしてBakerビューにアクセスします。
A4P1BakerMVCRenderCommandは、そのrenderメソッドの呼び出しをログに記録し、Bakerビューをレンダリングします。[A4P1BakerMVCRenderCommand:26] Invoking #render(RenderRequest, RenderResponse)
-
他のMVCレンダーコマンドを呼び出し、[Go to Able]をクリックしてAbleビューに再度アクセスします。
A4P1AbleMVCRenderCommandは、そのrenderメソッドの呼び出しをログに記録し、Ableビューを再度レンダリングします。[A4P1AbleMVCRenderCommand:26] Invoking #render(RenderRequest, RenderResponse)
MVCレンダーコマンドの動作を見てきました。 次に、それらがどのように機能するかを確認します。
ポートレットを調べる
A4P1Portlet は最小限の MVCPortletです。
@Component(
property = {
"com.liferay.portlet.display-category=category.sample",
"javax.portlet.display-name=A4P1 Portlet",
"javax.portlet.init-param.view-template=/a4p1/able.jsp",
"javax.portlet.name=com_acme_a4p1_web_internal_portlet_A4P1Portlet"
},
service = Portlet.class
)
public class A4P1Portlet extends MVCPortlet {
}
@Component javax.portlet.name プロパティは、ポートレットの名前を設定します。
"javax.portlet.name=com_acme_a4p1_web_internal_portlet_A4P1Portlet"
ポートレットはデフォルトで/a4p1/able.jspをレンダリングします。
MVCRenderCommandは、ポートレットの名前 (例: ポートレット コンポーネント javax.portlet.name プロパティ値) によってポートレットにバインドされます。
次に、ポートレットのMVCレンダーコマンドクラスを調べます。
MVCRenderCommandクラスを調べる
MVC レンダリング コマンド クラスは MVCRenderCommand を直接実装できます。 A4P1AbleMVCRenderCommandは、MVCRenderCommandを直接実装します。 A4P1AbleMVCRenderCommandは次のとおりです。
@Component(
property = {
"javax.portlet.name=com_acme_a4p1_web_internal_portlet_A4P1Portlet",
"mvc.command.name=/a4p1/able"
},
service = MVCRenderCommand.class
)
public class A4P1AbleMVCRenderCommand implements MVCRenderCommand {
@Override
public String render(
RenderRequest renderRequest, RenderResponse renderResponse) {
if (_log.isInfoEnabled()) {
_log.info("Invoking #render(RenderRequest, RenderResponse)");
}
return "/a4p1/able.jsp";
}
private static final Log _log = LogFactoryUtil.getLog(
A4P1AbleMVCRenderCommand.class);
}
A4P1AbleMVCRenderCommand は、 MVCRenderCommand サービスを提供する コンポーネント です。 コンポーネントプロパティは、A4P1AbleMVCRenderCommandをcom_acme_a4p1_web_internal_portlet_A4P1Portletという名前のポートレットに適用し、A4P1AbleMVCRenderCommandをMVCコマンド名/a4p1/ableにマップします。
各ポートレットに個別の javax.portlet.name プロパティを宣言することで、 MVCRenderCommand コンポーネントを複数のポートレットに関連付けることができます。
@Component(
property = {
"javax.portlet.name=com_acme_a4p1_web_internal_portlet_A4P1Portlet",
"javax.portlet.name=com_acme_a4p1_web_internal_portlet_A4P2Portlet",
"mvc.command.name=/a4p1/download"
},
service = MVCRenderCommand.class
)
ポートレットがMVCコマンド名/a4p1/ableを指定するリクエストパラメータを受け取ると、A4P1AbleMVCRenderCommandのrenderメソッドが実行されます。 このrenderメソッドは、それ自体を識別するメッセージをログに記録し、レンダリングするビューのパスを返します。
A4P1BakerMVCRenderCommandはA4P1AbleMVCRenderCommandに似ていますが、MVCコマンド名が/a4p1/bakerであり、renderメソッドがビューパス/a4p1/baker.jspを返す点が異なります。
これらのMVCレンダーコマンドの例は、デモンストレーションの目的で簡単な機能を提供します。 ビューのレンダリングに必要なロジックを使用して、MVCレンダーコマンドのrenderメソッドを実装します。
サンプルURLは、MVCレンダーコマンドをトリガーします。
ポートレットレンダーURLを調べる
able.jspファイルとbaker.jspファイルは、ポートレットレンダーURLを使用して間接的に相互にリンクします。 以下はable.jspです。
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<h4>A4P1 Portlet</h4>
<h5>Able</h5>
<portlet:renderURL var="bakerURL">
<portlet:param name="mvcRenderCommandName" value="/a4p1/baker" />
</portlet:renderURL>
<a href="<%= bakerURL %>">Go to Baker</a>
portlet:renderURLタグはポートレットtaglibから利用可能で、プレフィックスportletが割り当てられます。 このレンダリング URL は、 mvcRenderCommandName ポートレット パラメータ値 /a4p1/baker—これは A4P1AbleMVCRenderCommandの MVC コマンド名です。 変数bakerURLは、このレンダーURLを参照します。
ハイパーリンク <a href="<%= bakerURL %>">Go to Baker</a> は、レンダリング URL をアクションにバインドします。 ユーザーがハイパーリンクをクリックすると、ポートレットは RenderRequest を A4P1BakerMVCRenderCommand に送信します。これは、その mvc.command.name コンポーネント プロパティ値 /a4p1/baker が mvcRenderCommandName パラメータ値と一致するためです。
baker.jspはable.jspに似ていますが、ポートレットレンダーURLのmvcRenderCommandNameパラメーター値が/a4p1/ableである点が異なります。 各JSPのportlet:renderURLタグは、MVCレンダーコマンドのmvc.command.nameプロパティ値をタグのmvcRenderCommandNameポートレットパラメーターに割り当てることにより、MVCレンダーコマンドにマップされます。
able.jspポートレットレンダーURLパラメーター | A4P1BakerMVCRenderCommandコンポーネントプロパティ |
|---|---|
<portlet:param name="mvcRenderCommandName" value="/a4p1/baker" /> | mvc.command.name=/a4p1/baker |
baker.jspポートレットレンダーURLパラメーター | A4P1AbleMVCRenderCommandコンポーネントプロパティ |
|---|---|
<portlet:param name="mvcRenderCommandName" value="/a4p1/able" /> | mvc.command.name=/a4p1/able |
次のステップ
これで、MVCレンダーコマンドクラスにレンダーロジックを実装する方法がわかりました。 次に、 MVC リソース コマンド クラスを使用して、ファイルなどのリソースを操作できます。