AEM ist eine solide Plattform, die auf bewährten, skalierbaren und flexiblen Technologien basiert. Dieses Dokument gibt einen detaillierten Überblick über die verschiedenen Teile, aus denen AEM besteht, und ist als technischer Anhang für Full-Stack-AEM-Entwickler vorgesehen. Es ist nicht als Anleitung für den Einstieg gedacht. Wenn Sie noch nicht mit der AEM-Entwicklung vertraut sind, sehen Sie sich zum Einstieg Erste Schritte bei der Entwicklung von AEM Sites – WKND-Tutorial an.
Bevor Sie sich eingehender mit den Kerntechnologien von AEM befassen, empfiehlt es sich, Erste Schritte bei der Entwicklung von AEM Sites – WKND-Tutorial durchzugehen.
Als modernes Content-Management-System setzt AEM auf Standard-Web-Technologien:
Die zugrunde liegenden Ebenen für Content-Repository und Geschäftslogik basieren auf Java-Technologien:
Der Java Content Repository-Standard JSR 283 legt eine hersteller- und implementierungsunabhängige Methode für den bidirektionalen Zugriff auf Inhalte auf einer granularen Ebene in einem Content-Repository fest. Maßgeblich für Spezifikationen ist Adobe Research (Switzerland) AG.
Das JCR API 2.0-Paket javax.jcr.*
wird für den direkten Zugriff und die Bearbeitung von Repository-Inhalten verwendet.
AEM basiert auf einem JCR.
Apache Jackrabbit Oak ist eine Implementierung eines skalierbaren und hochleistungsfähigen hierarchischen Content-Repositorys, das als Grundlage für moderne, erstklassige Websites und andere anspruchsvolle Content-Programme verwendet werden kann und dem JCR-Standard entspricht.
Jackrabbit Oak (auch als Oak bezeichnet) ist die Implementierung des JCR-Standards, auf dem AEM aufgebaut ist.
AEM basiert auf Sling, einem auf REST-Prinzipien basierenden Web-Anwendungs-Framework, das eine einfache Entwicklung von inhaltsorientierten Programmen ermöglicht. Sling verwendet ein JCR-Repository wie Apache Jackrabbit Oak als Datenspeicher. Sling ist Teil der Apache Software Foundation – weitere Informationen finden Sie bei Apache.
Bei Verwendung von Sling ist der Typ des zu rendernden Inhalts nicht die erste Verarbeitungsüberlegung. Stattdessen ist die Hauptüberlegung, ob die URL zu einem Inhaltsobjekt aufgelöst wird, für das dann ein Skript gefunden werden kann, um das Rendering durchzuführen. Dies bietet Autoren von Web-Inhalten hervorragende Unterstützung beim Erstellen von Seiten, die einfach an ihre Anforderungen angepasst werden können.
Die Vorteile dieser Flexibilität zeigen sich in Programmen mit einer großen Auswahl verschiedener Inhaltselemente oder wenn Sie Seiten benötigen, die einfach angepasst werden können. Insbesondere bei der Implementierung eines Web-Content-Management-Systems wie AEM.
Siehe Entdecken Sie Sling in 15 Minuten für die ersten Schritte zur Entwicklung mit Sling.
Das folgende Diagramm erläutert die Sling-Skriptauflösung: Es wird gezeigt, wie Sie von der HTTP-Anfrage zum Inhaltsknoten, vom Inhaltsknoten zum Ressourcentyp, vom Ressourcentyp zum Skript gelangen und welche Skriptvariablen verfügbar sind.
Die folgende Abbildung erläutert alle ausgeblendeten, aber effektiven Anfrageparameter, die Sie im Zusammenhang mit dem SlingPostServlet
verwenden können. Dieser Standard-Handler für alle POST-Anfragen bietet Ihnen unzählige Optionen zum Erstellen, Ändern, Löschen, Kopieren und Verschieben von Knoten im Repository.
Sling ist inhaltzentriert. Dies bedeutet, dass sich die Verarbeitung auf den Inhalt konzentriert, da jede (HTTP-)Anfrage auf den Inhalt in Form einer JCR-Ressource (eines Repository-Knotens) abgebildet wird:
Aufgrund der inhaltsorientierten Philosophie implementiert Sling einen REST-orientierten Server und bietet damit ein neues Konzept für Web-Anwendungs-Frameworks. Die Vorteile:
In Sling wird die Verarbeitung durch die URL der Benutzeranfrage gesteuert. Dies definiert den Inhalt, der von den entsprechenden Skripten angezeigt werden soll. Zu diesem Zweck werden Informationen aus der URL extrahiert.
Wenn wir die folgende URL analysieren:
https://myhost/tools/spy.printable.a4.html/a/b?x=12
Wir können ihn in seine zusammengesetzten Teile aufschlüsseln:
protocol | host | content path | selector(s) | Erweiterung | Suffix | param(s) | |||
---|---|---|---|---|---|---|---|---|---|
https:// |
myhost |
/ |
tools/spy |
.printable.a4. |
html |
/ |
a/b |
? |
x=12 |
tools/spy.html
Anwendung der Prinzipien der URL-Zerlegung:
Die folgende Abbildung zeigt den verwendeten Mechanismus, auf den in den folgenden Abschnitten näher eingegangen wird.
Mit Sling geben Sie an, welches Skript eine bestimmte Entität rendert (indem Sie die Eigenschaft sling:resourceType
im JCR-Knoten festlegen). Dieser Mechanismus bietet mehr Freiheit als einer, in dem das Skript auf die Datenentitäten zugreift (wie es eine SQL-Anweisung in einem PHP-Skript tun würde), da eine Ressource mehrere Ausgabedarstellungen haben kann.
Die Anfrage wird zerlegt und die notwendigen Informationen werden extrahiert. Das Repository wird nach der angeforderten Ressource (Inhaltsknoten) gesucht:
../content/corporate/jobs/developer.html
../content/corporate/jobs/developer
Sling erlaubt auch anderen Elementen als JCR-Knoten, als Ressourcen zu fungieren, dies ist jedoch eine erweiterte Funktion.
Wenn die entsprechende Ressource (Inhaltsknoten) gefunden wird, wird der Sling-Ressourcentyp extrahiert. Dies ist ein Pfad, der das Skript findet, das zum Rendern des Inhalts verwendet werden soll.
Der vom sling:resourceType
angegebene Pfad kann wie folgt sein:
Relative Pfade werden von der Adobe empfohlen, da sie die Portabilität erhöhen.
Alle Sling-Skripte werden in Unterordnern von /apps
(veränderlich, Anwenderskripte) oder /libs
(unveränderlich, Systemskripte) gespeichert, die in dieser Reihenfolge durchsucht werden.
Einige andere zu beachtende Punkte sind:
jobs.POST.esp
Die Liste der von der angegebenen Instanz von AEM unterstützten Skript-Engines wird in der Felix Management Console aufgeführt (http://<host>:<port>/system/console/slingscripting
).
Wenn der sling:resourceType
bei Verwendung des obigen Beispiels hr/jobs
lautet, gilt Folgendes:
.html
enden (Standardanfragetypen, Standardformat)
/apps/hr/jobs/jobs.esp
. Der letzte Abschnitt von sling:resourceType
bildet den Dateinamen./apps/hr/jobs/jobs.POST.esp
..html
enden.
../content/corporate/jobs/developer.pdf
/apps/hr/jobs/jobs.pdf.esp
. Das Suffix wird zum Skriptnamen hinzugefügt.print
wie in ../content/corporate/jobs/developer.print.html
./apps/hr/jobs/jobs.print.esp
. Der Selektor wird zum Skriptnamen hinzugefügt.sling:resourceType
definiert wurde, gilt Folgendes:
ResourceTypeProvider
aktiv ist).../content/corporate/jobs/developer.html
eine Suche in /apps/content/corporate/jobs/
erzeugen..txt
), HTML (.html
) und JSON (.json
) unterstützt, welche alle die Eigenschaften des Knotens auflisten (passend formatiert). Die Standardversion für die Erweiterung .res
oder für Anfragen ohne Anfrageerweiterung besteht darin, die Ressource (sofern möglich) zu spoolen./apps/sling/servlet/errorhandler
für benutzerdefinierte Skripte/libs/sling/servlet/errorhandler/404.jsp
Wenn mehrere Skripte für eine bestimmte Anfrage gelten, wird das Skript mit der besten Übereinstimmung ausgewählt. Je genauer eine Übereinstimmung ist, desto besser ist sie. Mit anderen Worten: Je mehr Selektor dem Besseren entspricht, unabhängig von einer beliebigen Anfrageerweiterung oder einer Übereinstimmung mit dem Methodennamen.
Beispiel: Eine Anfrage zum Zugriff auf die Ressource
/content/corporate/jobs/developer.print.a4.html
vom Typ
sling:resourceType="hr/jobs"
Angenommen, wir haben die folgende Liste von Skripten am richtigen Speicherort:
GET.esp
jobs.esp
html.esp
print.esp
print.html.esp
print/a4.esp
print/a4/html.esp
print/a4.html.esp
Dann wäre die Reihenfolge der Bevorzugung (8) - (7) - (6) - (5) - (4) - (3) - (2) - (1).
Zusätzlich zu den Ressourcentypen (primär definiert durch die Eigenschaft sling:resourceType
) gibt es auch den Supertyp der Ressource. Dieser wird normalerweise durch die Eigenschaft sling:resourceSuperType
angezeigt. Diese Supertypen werden ebenfalls berücksichtigt, wenn Sie versuchen, ein Skript zu finden. Der Vorteil von Ressourcensupertypen besteht darin, dass sie eine Hierarchie von Ressourcen bilden können, wobei der Standard-Ressourcentyp sling/servlet/default
(von den Standard-Servlets verwendet) effektiv der Stamm ist.
Der Ressourcensupertyp einer Ressource kann auf zwei Arten definiert werden:
sling:resourceSuperType
der Ressource.sling:resourceSuperType
des Knotens, auf den der sling:resourceType
zeigt.Beispiel:
/
a
b
sling:resourceSuperType = a
c
sling:resourceSuperType = b
x
sling:resourceType = c
y
sling:resourceType = c
sling:resourceSuperType = a
Die Typhierarchie von:
/x
[ c, b, a, <default>]
/y
[ c, a, <default>]
lautetGrund hierfür ist, dass /y
die Eigenschaft sling:resourceSuperType
aufweist, während /x
sie nicht aufweist und daher der Obertyp vom Ressourcentyp übernommen wird.
In Sling können Skripte nicht direkt aufgerufen werden, da dies das strikte Konzept eines REST-Servers beeinträchtigen würde. würden Sie Ressourcen und Darstellungen mischen.
Wenn Sie die Repräsentation (das Skript) direkt aufrufen, blenden Sie die Ressource in Ihrem Skript aus, sodass das Framework (Sling) nicht mehr davon weiß. So verlieren Sie bestimmte Funktionen:
POST.jsp
-Skript in Ihrem sling:resourceType
-SpeicherortDiese verwendet das Sling API-Paket, org.apache.sling.*
und Tag-Bibliotheken.
Eine letzte Überlegung ist die Notwendigkeit, auf vorhandene Elemente innerhalb der Skripte zu verweisen.
Komplexere Skripte (aggregierende Skripte) müssen möglicherweise auf mehrere Ressourcen zugreifen (z. B. Navigation, Seitenleiste, Fußzeile, Elemente einer Liste) und tun dies durch Einbeziehen der Ressource.
Dazu können Sie den Befehl sling:include("/<path>/<resource>")
verwenden. Dies umfasst effektiv die Definition der referenzierten Ressource.
OSGi (Open Services Gateway Initiative) definiert eine Architektur für die Entwicklung und Bereitstellung modularer Programme und Bibliotheken (es wird auch als Dynamic Module System für Java bezeichnet). OSGi-Container erlauben es Ihnen, Ihr Programm in einzelne Module aufzuteilen (JAR-Dateien mit zusätzlichen Metainformationen und sogenannten Bundles in OSGi-Terminologie) und die Querabhängigkeiten zwischen ihnen zu verwalten mit:
Diese Services und Verträge bieten eine Architektur, die es einzelnen Elementen ermöglicht, sich dynamisch für die Zusammenarbeit zu entdecken.
Ein OSGi-Framework bietet Ihnen dann dynamisches Laden/Entladen, Konfiguration und Steuerung dieser Bundles - ohne dass ein Neustart erforderlich ist.
Ausführliche Informationen zur OSGi-Technologie finden Sie auf der OSGi-Website.
Speziell die Seite mit grundlegenden Informationen beinhaltet eine Sammlung von Präsentationen und Tutorials.
Diese Architektur ermöglicht es Ihnen, Sling um programmspezifische Module zu erweitern. Sling und damit AEM verwendet die Apache Felix-Implementierung von OSGi. Beide sind Sammlungen von OSGi-Bundles, die in einem OSGi-Framework ausgeführt werden.
Auf diese Weise können Sie die folgenden Aktionen für beliebige Pakete innerhalb Ihrer Installation durchführen:
Weitere Informationen finden Sie unter Konfigurieren von OSGi für AEM as a Cloud Service.
Die folgende Liste gibt einen Überblick über die Struktur, die Sie im Repository sehen.
/apps
– programmbezogen; enthält für Ihre Website spezifische Komponentendefinitionen. Die von Ihnen entwickelten Komponenten können auf den Standardkomponenten basieren, die unter /libs/core/wcm/components
verfügbar sind./content
– Inhalt, der für Ihre Website erstellt wurde./etc
/home
– Anwender- und Gruppeninformationen./libs
– Bibliotheken und Definitionen, die zum Kern von AEM gehören. Die Unterordner in /libs
stellen die vordefinierten AEM-Funktionen dar. Der Inhalt in /libs
kann nicht geändert werden. Die für Ihre Website spezifischen Funktionen sollten unter /apps
erstellt werden./tmp
- Temporärer Arbeitsbereich./var
– Dateien, die sich ändern und vom System aktualisiert werden, wie Audit-Logs, Statistiken, Event-Handling.Änderungen an dieser Struktur oder an den darin enthaltenen Dateien sollten sorgfältig vorgenommen werden. Machen Sie sich unbedingt mit den Auswirkungen der Änderungen vertraut, die Sie vornehmen möchten.
Sie dürfen keinerlei Änderungen im Pfad /libs
vornehmen. Für die Konfiguration und andere Änderungen kopieren Sie das Objekt von /libs
nach /apps
und nehmen Sie Änderungen innerhalb von /apps
vor.