MVCレンダーコマンド
MVCレンダーコマンドは、レンダリングするページを処理するクラスです。 これらは、MVCPortlet
レンダーURLとリクエストによって呼び出されます。 レンダーロジックが単純な場合は、すべてをポートレットクラスに実装できます。 レンダーロジックが複雑な場合、またはレンダーパスを明確に分離したい場合は、MVCレンダーコマンドを使用してください。
MVCレンダーコマンドを呼び出す
ここでは、MVCレンダーコマンドを使用してビューをレンダリングするサンプルポートレットをデプロイします。
新しい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-a4p1.zip -O
unzip liferay-a4p1.zip
サンプルをビルドしてデプロイします。
cd liferay-a4p1
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、モジュール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
を直接実装することも、 BaseMVCRenderCommand
を拡張することもできます。 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
サービスを提供する Component
です。 コンポーネントプロパティは、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をアクションにバインドします。 ユーザーがハイパーリンクをクリックすると、そのmvc.command.name
コンポーネントプロパティ値/a4p1/baker
がmvcRenderCommandName
パラメーター値と一致するため、ポートレットは RenderRequest
をA4P1BakerMVCRenderCommand
に送信します。
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リソースコマンドクラスを使用してファイルなどのリソースを操作できます。