MVCポートレットを使用したビューのレンダリング
ユーザーがポートレットのビューにアクセスできるようにする場合は、ビューへのナビゲーションを実装する必要があります。 ポートレットレンダーURLは、このような場合に役立ちます。
ここでは、ポートレットレンダーURLを使用するサンプルアプリケーションをデプロイします。 ポートレットが、MVCポートレットのmvcPath
パラメーターを使用してビューパスを設定するURLを作成する方法を見ていきます。
サンプルポートレットには2つのビューがあります。 ビュー1 にはその名前と ビュー2 へのリンクが表示され、その逆も同様です。
複数のビューを持つMVCポートレットをデプロイする
サンプルポートレットをデプロイし、そのビュー間を移動する方法は次のとおりです。 学習の目的で、ポートレットはmvcPath
パラメーター値をログに記録します。
新しい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-c8m3.zip -O
unzip liferay-c8m3.zip
サンプルをビルドしてデプロイします。
cd liferay-c8m3
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、モジュールJARをDockerコンテナの
/opt/liferay/osgi/modules
にコピーするのと同じです。Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.c8m3.web_1.0.0
[C8M3ポートレット] ウィジェットを [サンプル] カテゴリからウィジェットページに追加します。 ビュー1(ポートレットのデフォルトビュー)が表示されます。
次のメッセージがログに出力されます。
MVC path null
レンダーリクエストには、MVCパスパラメーターがまだ含まれていません。 これは予想通りです。 ポートレットは、デフォルトでポートレットクラス(後述)を使用してビュー1をレンダリングします。 次のステップでは、MVCパスパラメーターを使用します。
[Go to View 2] をクリックします。 ビュー2が表示されます。
ログメッセージには、MVCパス値
/view_2.jsp
(ビュー2テンプレートへのパス)が表示されます。MVC path /view_2.jsp
[Go to View 1] をクリックします。 ビュー1が再び表示されます。
ログメッセージには、MVCパス
/view_1.jsp
が出力されます。MVC path /view_1.jsp
ポートレットビュー間を往復しました。 次に、ポートレットがデフォルトのビューを設定し、レンダーURLとMVCパスリクエストパラメータを使用してビューへのパスを設定する方法を学習します。
デフォルトビューの設定
ポートレットのデフォルトビューは、ユーザーが最初にポートレットのページにアクセスしたときにレンダリングされます。 ポートレットクラスの初期化パラメーターは、デフォルトビューを設定します。 C8M3Portlet.java
のサンプルクラスは、その @Component
アノテーションでデフォルトビューを設定します。
@Component(
property = {
"com.liferay.portlet.display-category=category.sample",
"javax.portlet.display-name=C8M3 Portlet",
"javax.portlet.init-param.view-template=/view_1.jsp"
},
service = Portlet.class
)
public class C8M3Portlet extends MVCPortlet {
@Component
プロパティ"javax.portlet.init-param.view-template=/view1.jsp"
は、デフォルトのビューテンプレートとして/view1.jsp
を指定します。 テンプレートパスは、ポートレットのsrc/main/resources/META-INF/resources
フォルダへの相対パスです。
次に、ビュー1がビュー2にリンクする方法を学習します。
ポートレットレンダーURLを使用したビューへのリンク
ビュー1には、 [View 1] という見出しと、 [Go to View 2] というラベルの付いたリンクしかありません。 view1.jsp
コードは次のとおりです。
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<h4>C8M3 Portlet</h4>
<h5>View 1</h5>
<portlet:renderURL var="view2URL">
<portlet:param name="mvcPath" value="/view_2.jsp" />
</portlet:renderURL>
<a href="<%= view2URL %>">Go to View 2</a>
portlet:renderURL
タグはポートレットtaglibから取得され、プレフィックスportlet
が割り当てられます。 上記のレンダーURLは、変数view2URL
に割り当てられています。 レンダーURLは、mvcPath
という名前のportlet:param
に値/view_2.jsp
を宣言します。 ポートレットがレンダリングされると、mvcPath
パラメーターがポートレットの RenderRequest
オブジェクトに追加されます。 ポートレットリクエストの処理時に、 MVCPortlet
はmvcPath
に割り当てられたテンプレートをレンダリングします。
ポートレットがURLを使用するためには、レンダーURLがハイパーリンクやボタンなどのUIコンポーネントにバインドされている必要があります。 ハイパーリンク<a href="<%= view2URL %>">[Go to View 2]</a>
は、レンダーURLをUIコンポーネントにバインドします。
ユーザーが [Go to View 2] ハイパーリンクをクリックすると、mvcPath
パラメーターを含むポートレットリクエストがポートレットクラスに送信されます。
mvcPathポートレットパラメーターの処理
ポートレットがリクエストオブジェクトを受信すると、リクエストオブジェクトのパラメーターに応答できます。 C8M3Portlet
のrender
メソッドは、レンダーリクエストに応答します。
@Override
public void render(
RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
if (_log.isInfoEnabled()) {
String mvcPath = renderRequest.getParameter("mvcPath");
_log.info("MVC path " + mvcPath);
}
super.render(renderRequest, renderResponse);
}
private static final Log _log = LogFactoryUtil.getLog(C8M3Portlet.class);
C8M3Portlet
のrender
メソッドは、mvcPath
パラメーター値をログに記録してから、ポートレットのレンダリングをスーパークラスMVCPortlet
に委任します。 MVCPortlet
は、mvcPath
ポートレットリクエストパラメータに割り当てられたビューをレンダリングします。
mvcPath
リクエストパラメータがない場合、MVCPortlet
はデフォルトのテンプレート(つまり、 javax.portlet.init-param.view-template
コンポーネントプロパティが指定するテンプレート)を表示します。
ビュー2のテンプレートview2.jsp
は、ポートレットレンダーURLも使用してview1.jsp
にマップし直します。
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<h4>C8M3 Portlet</h4>
<h5>View 2</h5>
<portlet:renderURL var="view1URL">
<portlet:param name="mvcPath" value="/view_1.jsp" />
</portlet:renderURL>
<a href="<%= view1URL %>">Go to View 1</a>
ビュー1に戻るラウンドトリップを実装します。
次のステップ
これで、ポートレットビューをレンダリングする方法がわかりました。 次に、個別のRenderCommand
クラスを使用して、ポートレットでアクションを実行したり、ビューをレンダリングしたりできます。