Dynamic Includesを用いたJSPのカスタマイズ
liferay-util:dynamic-include タグ
は、コンテンツ—JavaScript コード、HTML、
などを挿入できるプレースホルダーです。 サンプルプロジェクトでは、dynamic includeでコンテンツを挿入する方法を示しています。
サンプルプロジェクトをデプロイする
新しいLiferay DXPインスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/dxp:2025.q1.6-lts
メールアドレス test@liferay.com とパスワード testを使用して、 http://localhost:8080 で Liferay にサインインします。 プロンプトが表示されたら、パスワードを learnに変更します。
次に、以下の手順に従います。
-
Dynamic Include による JSP のカスタマイズをダウンロードして解凍します。
curl https://resources.learn.liferay.com/examples/liferay-n3q9.zip -Ounzip liferay-n3q9.zip -
モジュールのルートから、ビルドおよびデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注このコマンドは、デプロイされたjarをDockerコンテナの/opt/liferay/osgi/modulesにコピーするのと同じです。
-
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.n3q9.able.web_1.0.0 [1459] STARTED com.acme.n3q9.baker.web_1.0.0 [1460] -
サンプルのモジュールが機能していることを確認します。 ブラウザで
https://localhost:8080を開きます。 -
サイト ページに移動し、編集アイコン (
) をクリックします。 N3Q9 Bakerポートレットをページに追加します。 ウィジェットは、サンプルウィジェットの下にあります。
最初の 2 行は N3Q9 Baker Portlet からのものですが、3 行目は N3Q9 Able モジュールの動的インクルードから挿入されていることに注意してください。 この例は 2 つの部分で構成されています。
-
動的インクルードに名前を付けて、プレースホルダーとして特定の行に挿入する JSP ポートレット
-
動的インクルードを実装し、ポートレットのプレースホルダー行を新しい JSP コードに置き換える OSGi モジュール
これらのモジュールはさまざまな状況で役立つため、動的インクルードを適切に実装するには両方を理解することが重要です。
Dynamic Includeを実装する
動的インクルードの最も一般的な用途は、Liferay のデフォルトのページとアプリケーションを完全に上書きせずにカスタム コードを追加することです。 Liferay のすぐに使用できるコードには、追加のリソース、HTML 要素、エディターの変更などが必要な場所に動的なインクルードが含まれています。 動的インクルードのキーがわかれば、それを使用してモジュールを作成し、コンテンツを挿入できます。
-
@Componentアノテーションを使用して、DynamicIncludeの実装としてクラスを宣言します。@Component(service = DynamicInclude.class) -
includeメソッドで、カスタムコンテンツを追加します。 サンプルプロジェクトでは、シンプルなPrintWriterのサンプルを使用しています。
@Override
public void include(
HttpServletRequest request, HttpServletResponse response,
String key)
throws IOException {
PrintWriter printWriter = response.getWriter();
printWriter.println("<h3>Added by N3Q9 Able dynamic include.</h3>");
}
registerメソッドで、使用するdynamic includeタグを指定します。 サンプルでは、registerメソッドは、Bakerモジュールのview.jspのdynamic includeを対象としています。
@Override
public void register(DynamicIncludeRegistry dynamicIncludeRegistry) {
dynamicIncludeRegistry.register("com.acme.n3q9.baker.web#view.jsp");
}
動的インクルードを挿入する
従来、すぐに使用できる Liferay ポートレットの JSP を変更するには、ポートレット全体を書き直す必要がありました。 これにより、ポートレット全体を完全に制御できますが、管理が難しくなります。 Liferay インスタンスをアップグレードすると、Liferay によるデフォルト ポートレットの変更がカスタム実装と競合する可能性があります。
カスタマイズに複数行のコードが含まれている場合、ネイティブ コードを分離して最新の状態に保つことが困難になる可能性があります。 代わりに、カスタマイズを行う場所に動的インクルードを挿入し、別のモジュールに実装することができます。 この方法では、デフォルトの JSP に 1 行のカスタム コードを追加してポートレットを更新します。
これを行うには、動的インクルードを挿入する場所に liferay-util:dynamic-include タグを追加します。 サンプルでは、N3Q9 Baker Portletの view.jspの一番下にタグを追加しています。
<%@ taglib uri="http://liferay.com/tld/util" prefix="liferay-util" %>
<h2>N3Q9 Baker Portlet</h2><br />
<h3>Hello N3Q9 Baker.</h3><br />
<liferay-util:dynamic-include key="com.acme.n3q9.baker.web#view.jsp" />
dynamic includeキーが、上記の register()メソッドで設定したターゲット属性と一致することを確認してください。