Documentation

MVCポートレットを使用したビューのレンダリング

ユーザーがポートレットのビューにアクセスできるようにする場合は、ビューへのナビゲーションを実装する必要があります。 ポートレットレンダーURLは、このような場合に役立ちます。

ここでは、ポートレットレンダーURLを使用するサンプルアプリケーションをデプロイします。 ポートレットが、MVCポートレットのmvcPathパラメーターを使用してビューパスを設定するURLを作成する方法を見ていきます。

サンプルポートレットには2つのビューがあります。 ビュー1 にはその名前と ビュー2 へのリンクが表示され、その逆も同様です。

これがビュー1です。

複数のビューを持つ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に変更します。

サンプルポートレットをデプロイし、そのビュー間を移動する方法は次のとおりです。 学習の目的で、ポートレットはmvcPathパラメーター値をログに記録します。

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

    curl https://learn.liferay.com/dxp/latest/ja/building-applications/developing-a-java-web-application/using-mvc/liferay-c8m3.zip -O
    
    unzip liferay-c8m3.zip
    
  2. サンプルをビルドしてデプロイします。

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

    注釈

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

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

    STARTED com.acme.c8m3.web_1.0.0
    
  4. C8M3ポートレット ウィジェットを [Samples] カテゴリからウィジェットページに追加します。 ビュー1(ポートレットのデフォルトビュー)が表示されます。

    ビュー1をページに追加しました。

    次のメッセージがログに出力されます。

    MVC path null
    

    描画リクエストには、MVCパスパラメーターがまだ含まれていません。 これは予想通りです。 ポートレットは、デフォルトでポートレットクラス(後述)を使用してビュー1をレンダリングします。 次のステップでは、MVCパスパラメーターを使用します。

  5. Go to View 2] をクリックします。 ビュー2が表示されます。

    ビュー2に移動しました。

    ログメッセージには、MVCパス値/view_2.jsp(ビュー2テンプレートへのパス)が表示されます。

    MVC path /view_2.jsp
    
  6. Go to View 1] をクリックします。 ビュー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 オブジェクトに追加されます。 ポートレットリクエストの処理時に、 MVCPortletmvcPathに割り当てられたテンプレートをレンダリングします。

ポートレットがレンダーURLを使用するには、そのURLをハイパーリンクやボタンなどのUIコンポーネントにバインドする必要があります。 ハイパーリンク<a href="<%= view2URL %>">[Go to View 2]</a>は、レンダーURLをUIコンポーネントにバインドします。

ユーザーが [Go to View 2] ハイパーリンクをクリックすると、mvcPathパラメーターを含むポートレットリクエストがポートレットクラスに送信されます。

mvcPathポートレットパラメーターの処理

ポートレットがリクエストオブジェクトを受信すると、リクエストオブジェクトのパラメーターに応答できます。 C8M3Portletrenderメソッドは、描画リクエストに応答します。

@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);

C8M3Portletrenderメソッドは、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クラスを使用して、ポートレットでアクションを実行したり、ビューをレンダリングしたりできます。