はじめに
パスによるサーブレットのバインドは、リソースタイプによるバインドと比べると、いくつかのデメリットがあります。
- パスバインドサーブレットでは、デフォルトの JCR リポジトリ ACL を使用してアクセス制御することはできません
- パスバインドサーブレットは、パスにのみ登録でき、リソースタイプには登録できません(例えば、サフィックス処理はありません)
- パスバインドサーブレットがアクティブでない場合(例:バンドルが見つからない場合や開始されていない場合)、POST を実行すると予期しない結果が生じる場合があります。通常、
/bin/xyz
にノードを作成すると、その後にマッピングをバインドするサーブレットパスをオーバーレイします。
開発者がリポジトリを見るだけでは透過的ではありません。
このような欠点を考慮すると、サーブレットをパスではなく、リソースタイプにバインドすることを強くお勧めします。
サーブレットの作成
IntelliJ で aem-banking プロジェクトを起動します。次のスクリーンショットに示すように、サーブレットフォルダーの下に GetFieldChoices というサーブレットを作成します。
サンプルサーブレット
次のサーブレットは、azure/fetchchoices の Sling リソースタイプにバインドされます。
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.Session;
import javax.servlet.Servlet;
import java.io.IOException;
import java.io.Serializable;
@Component(
service={Servlet.class }
)
@SlingServletResourceTypes(
resourceTypes="azure/fetchchoices",
methods= "GET",
extensions="json"
)
public class GetFieldChoices extends SlingAllMethodsServlet implements Serializable {
private static final long serialVersionUID = 1L;
private final transient Logger log = LoggerFactory.getLogger(this.getClass());
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) {
log.debug("The form path I got was "+request.getParameter("formPath"));
}
}
CRX でのリソースの作成
- ローカルの AEM SDK にログインします。
- コンテンツノードの下に
cq:Page
タイプのfetchchoices
という名前のリソース(このノードには好きに名前を付けることができます)リソースを作成します。 - 変更内容を保存します。
cq:PageContent
のタイプのjcr:content
という名前のノードを作成して変更を保存します。jcr:content
ノードに次のプロパティを追加します。
azure/fetchchoices
sling:resourceType
値は、サーブレットで指定された「resourceTypes="azure/fetchchoice」に一致する必要があります。
これで、Sling サーブレットに登録されているセレクターまたは拡張機能を使用し、リソースのフルパスに sling:resourceType
= azure/fetchchoices
を指定してリクエストして、サーブレットを呼び出すことができるようになりました。
http://localhost:4502/content/fetchchoices/jcr:content.json?formPath=/content/forms/af/forrahul/jcr:content/guideContainer
/content/fetchchoices/jcr:content
のパスは、リソースと .json
の拡張のパスで、サーブレットで指定されています。
AEM プロジェクトを同期する
- 使い慣れたエディターで AEM プロジェクトを開きます。この記事では intelliJ を使用しました。
\aem-banking-application\ui.content\src\main\content\jcr_root\content
の下にfetchchoices
というフォルダーを作成します。fetchchoices
フォルダーを右クリックして「repo | Get Command
」を選択(このメニュー項目は、このチュートリアルの前の章で設定します)します。
このノードは、AEM からローカルの AEM プロジェクトに同期する必要があります。
AEM プロジェクト構造は次のようになります。
aem-banking-application\ui.content\src\main\content\META-INF\vault フォルダーの filter.xml を次のエントリで更新します。
<filter root="/content/fetchchoices" mode="merge"/>
これで、Cloud Manager を使用して、変更をAEM as a Cloud Service 環境にプッシュできます。