AEM は、拡張性が高く柔軟なテクノロジーに基づいて構築された実証済みの堅牢なプラットフォームです。このドキュメントは、AEM を構成する様々な部分の詳細な概要を説明し、AEM フルスタックデベロッパー向けの技術的な付録として作成されています。はじめる前のガイドとしての意図はありません。AEM を初めて開発する場合は、最初の手順として『AEM Sites の開発の手引き - WKND チュートリアル』を参照してください。
AEM の中核技術に入る前に、『AEM Sites の開発の手引き - WKND チュートリアル』を完了することを推奨します。
最新のコンテンツ管理システムである AEM は次の標準的な Web テクノロジーに依存しています。
基盤となるコンテンツリポジトリーとビジネスロジックレイヤーは、Javaテクノロジーに基づいて構築されています。
Java コンテンツリポジトリー(JCR)の規格である JSR 283 では、コンテンツリポジトリー内で、任意の精度レベルでコンテンツに双方向アクセスするための、ベンダーにも実装にも依存しない方法が示されています。仕様を主導しているのは、Adobe Research(スイス)AG です。
JCR API 2.0 パッケージである javax.jcr.*
が、リポジトリーコンテンツの直接アクセスと操作に使用されます。
AEM は JCR 上に構築されています。
Apache Jackrabbit Oak は、JCR 標準に準拠した最新のワールドクラスの Web サイトやその他の要求の厳しいコンテンツアプリケーションの基盤として使用する、スケーラブルで高パフォーマンスの階層コンテンツリポジトリーの実装です。
Jackrabbit Oak(単に Oak とも呼ばれる)は、AEM を構築する JCR 標準の実装です。
AEM は、コンテンツ指向アプリケーションの開発を容易にする REST 原則に基づく Web アプリケーションフレームワーク Sling を使用して構築されています。Sling は、Apache Jackrabbit Oak などの JCR リポジトリーをデータストアとして使用します。Sling は Apache Software Foundation に貢献してきました。詳しい情報は Apache にあります。
Sling を使用する場合、レンダリングされるコンテンツのタイプは、処理に関する第一の考慮事項ではありません。主な考慮事項は、URL を解決して得られるコンテンツオブジェクト用に、レンダリングを実行するためのスクリプトが見つかるかどうかです。このことは、要件に合わせて簡単にカスタマイズ可能なページを Web コンテンツ作成者が構築する際に非常に役立ちます。
この柔軟性の利点は、様々なコンテンツ要素を持つアプリ、または容易にカスタマイズできるページが必要な場合に明らかです。特に、AEM などの Web コンテンツ管理システムを実装する場合です。
Sling を使用した開発の概要について詳しくは、『15 分間でわかる Sling』を参照してください。
次の図は、Sling のスクリプト解決の説明です。HTTP リクエストからコンテンツノード、コンテンツノードからリソースタイプ、リソースタイプからスクリプトを得る方法と、使用可能なスクリプト変数を示しています。
次の図は、SlingPostServlet
を扱う際に使用できる、非表示ながらも強力なリクエストパラメーターの説明です。リポジトリーでノードを作成、変更、削除、コピーおよび移動するためのオプションを際限なしに提供する、すべての POST リクエストのデフォルトハンドラーです。
Sling は コンテンツ中心型 です。これは、各(HTTP)リクエストが JCR リソース(リポジトリーノード)の形でコンテンツにマッピングされるため、コンテンツに焦点を当てた処理が行われることを意味します。
コンテンツ中心型の原理により、Sling は REST 指向のサーバーを実装するので、Web アプリケーションフレームワークの新しい概念を特徴としています。メリットは次のとおりです。
Sling では、処理はユーザーリクエストの URL によって駆動されます。これにより、適切なスクリプトによって表示されるコンテンツが定義されます。これを行うために、URL から情報が抽出されます。
次の URL を分析する場合、
https://myhost/tools/spy.printable.a4.html/a/b?x=12
以下の複合部分に分割できます。
プロトコル | ホスト | コンテンツのパス | セレクター | 拡張子 | サフィックス | パラメーター | |||
---|---|---|---|---|---|---|---|---|---|
https:// |
myhost |
/ |
tools/spy |
.printable.a4. |
html |
/ |
a/b |
? |
x=12 |
tools/spy.html
です。URL 分解の原則を使用します。
下の図は、使用するメカニズムを示しています。これについては、以下の各項で詳細に説明します。
Sling を使用して、特定のエンティティをレンダリングするスクリプトを指定します(JCR ノードで sling:resourceType
プロパティを設定します)。このメカニズムは、リソースが複数のレンディションを持つことができるため、スクリプトがデータエンティティにアクセスするメカニズム(PHP スクリプトの SQL 文のように)よりも自由度が高くなります。
リクエストを分解し、必要な情報を抽出します。リポジトリーで、リクエストされたリソース(コンテンツノード)を検索します。
../content/corporate/jobs/developer.html
)にノードが存在するかどうかを確認します。../content/corporate/jobs/developer
)。Sling では JCR ノード以外のものをリソースとすることもできますが、これは高度な機能です。
適切なリソース(コンテンツノード)が見つかると、sling リソースタイプが抽出されます。これは、コンテンツのレンダリングに使用するスクリプトを見つけるパスです。
sling:resourceType
によって指定されるパスは、次のいずれかです。
移植性を高めるため、相対パスが推奨されます。
すべての Sling スクリプトは、/apps
(可変、ユーザースクリプト)または/libs
(不可変、システムスクリプト)のサブフォルダーに格納され、この順序で検索されます。
その他の注意点は次のとおりです。
jobs.POST.esp
)。AEM の特定のインスタンスでサポートされているスクリプトエンジンのリストは、Felix Management Console(http://<host>:<port>/system/console/slingscripting
)にあります。
以前の例を使用すると、sling:resourceType
が hr/jobs
の場合は、次のようになります。
.html
で終わる GET/HEAD リクエストと URL(デフォルトのリクエストタイプ、デフォルトの形式)
/apps/hr/jobs/jobs.esp
です。sling:resourceType
の最後のセクションがファイル名になります。/apps/hr/jobs/jobs.POST.esp
です。.html
で終わらない、他の形式の URL
../content/corporate/jobs/developer.pdf
/apps/hr/jobs/jobs.pdf.esp
です。スクリプト名にサフィックスが追加されます。print
である可能性がります。例:../content/corporate/jobs/developer.print.html
/apps/hr/jobs/jobs.print.esp
です。セレクターがスクリプト名に追加されます。sling:resourceType
が定義されていない場合は、次のようになります。
ResourceTypeProvider
がアクティブな場合)。../content/corporate/jobs/developer.html
のスクリプトは、/apps/content/corporate/jobs/
で検索を生成します。.txt
)、HTML(.html
)、JSON(.json
)としてサポートされています。これらのレンディションでは、ノードのプロパティ(適切な形式)がリストされます。拡張子 .res
のデフォルトのレンディション、または要求拡張子のない要求は、(可能な場合は)リソースをスプールします。/apps/sling/servlet/errorhandler
/libs/sling/servlet/errorhandler/404.jsp
特定のリクエストに複数のスクリプトが該当する場合は、一致率が最も高いスクリプトが選択されます。一致は具体的であるほど良くなります。つまり、リクエスト拡張子であれ、メソッド名の一致であれ、セレクターの一致が多いほど良くなります。
例えば、次のリソースにアクセスするためのリクエストについて考えます。
/content/corporate/jobs/developer.print.a4.html
リソースのタイプは次のとおりとします。
sling:resourceType="hr/jobs"
また、次のリストのスクリプトが正しい場所にあると仮定します。
GET.esp
jobs.esp
html.esp
print.esp
print.html.esp
print/a4.esp
print/a4/html.esp
print/a4.html.esp
この場合、優先順位は (8) - (7) - (6) - (5) - (4) - (3) - (2) - (1) となります。
リソースタイプ(主に sling:resourceType
プロパティで定義)に加えて、リソーススーパータイプもあります。これは通常、sling:resourceSuperType
プロパティで示されます。これらのスーパータイプは、スクリプトを検索する際にも検討されます。リソーススーパータイプの利点は、(デフォルトのサーブレットで使用される)デフォルトのリソースタイプ sling/servlet/default
が事実上のルートになるリソースの階層を形成できる点です。
リソースのリソーススーパータイプは次の 2 つの方法で定義できます。
sling:resourceSuperType
プロパティを使用。sling:resourceSuperType
が示すノードの sling:resourceType
プロパティを使用。次に例を示します。
/
a
b
sling:resourceSuperType = a
c
sling:resourceSuperType = b
x
sling:resourceType = c
y
sling:resourceType = c
sling:resourceSuperType = a
タイプの階層:
/x
[ c, b, a, <default>]
です/y
では
[ c, a, <default>]
ですこれは、/y
には sling:resourceSuperType
プロパティがあるのに対して、/x
にはなく、スーパータイプがリソースタイプから継承されているからです。
Sling 内では、スクリプトを直接呼び出しできません。REST サーバーの厳格な概念に違反して、リソースと表現を混在させることになるからです。
表現(スクリプト)を直接呼び出す場合、リソースがスクリプト内に隠され、フレームワーク(Sling)では認識できなくなります。これにより、次のような機能が失われます。
sling:resourceType
内の POST.jsp
スクリプトSling API パッケージ、org.apache.sling.*
、およびタグライブラリを使用します。
最後の考慮事項は、スクリプト内にある既存の要素の参照の必要性です。
より複雑なスクリプト(集計スクリプト)は、複数のリソース(ナビゲーション、サイドバー、フッター、リストの要素など)へのアクセスが必要になる場合があり、そのためにリソースを含めます。
これを行うには、sling:include("/<path>/<resource>")
コマンドを使用します。これにより、参照されるリソースの定義を効果的に含めることができます。
OSGi(Open Services Gateway Initiative)は、モジュラー型アプリケーションとライブラリを開発および展開するためのアーキテクチャを定義します(Java 用 Dynamic Module System とも呼ばれます)。OSGi コンテナを使用すると、アプリケーションを個々のモジュール(追加のメタ情報を含む jar ファイルで、OSGi 用語でバンドルと呼ばれます)に分割し、それらの間の相互依存関係を次の機能で管理できます。
これらのサービスおよび契約によって提供されるアーキテクチャでは、コラボレーションのために個々の要素が相互に動的に検出し合うことができます。
その後、OSGi フレームワークによって、これらのバンドルの動的読み込み/読み込み解除、設定および制御が可能になります。再起動は不要です。
OSGi テクノロジーについて詳しくは、OSGi Web サイトを参照してください。
特に、基礎教育に関するページには、プレゼンテーションやチュートリアルのコレクションが収められています。
このアーキテクチャにより、Sling をアプリケーション固有のモジュールで拡張できます。Sling、つまり AEM は、OSGi の Apache Felix 実装を使用します。どちらも、OSGi フレームワーク内で実行される OSGi バンドルの集まりです。
これにより、インストール内のどのパッケージでも、以下のアクションを実行できます。
詳しくは、「AEM as a Cloud Service の OSGI の設定」を参照してください。
次のリストは、リポジトリー内で見られる構造の概要です。
/apps
- アプリケーション関連。Web サイトに固有のコンポーネント定義が含まれます。開発するコンポーネントは、/libs/core/wcm/components
で提供されている標準搭載のコンポーネントに基づくことができます。/content
-/etc
/home
- ユーザーおよびグループの情報。/libs
- AEM のコアに属するライブラリと定義。/libs
内のサブフォルダーは、標準搭載の AEM 機能を表します。/libs
内のコンテンツは変更できません。Web サイトに固有の機能は、/apps
の下に作成する必要があります。/tmp
- 一時作業領域。/var
- システムによって変更および更新されるファイル監査ログ、統計、イベント処理など。この構造、またはその中のファイルの変更は、注意して行う必要があります。変更が及ぼす影響を十分に理解しておく必要があります。
/libs
パス内のものは一切変更しないでください。設定やその他の変更の場合は、項目を /libs
から /apps
にコピーし、/apps
内で変更を行います。