Fondamenti tecnici AEM
- Argomenti:
- Sviluppo
Creato per:
- Amministratore
- Sviluppatore
AEM è una piattaforma solida basata su tecnologie collaudate, scalabili e flessibili. Questo documento offre una panoramica dettagliata delle varie parti che compongono l'AEM ed è concepito come un'appendice tecnica per uno sviluppatore AEM full stack. Non è concepito come guida introduttiva. Se non hai ancora sviluppato AEM, consulta Guida introduttiva allo sviluppo per AEM Sites - Esercitazione WKND come primo passo.
Nozioni di base
In quanto sistema moderno di gestione dei contenuti, l’AEM si basa sulle tecnologie web standard:
- Ciclo richiesta-risposta (XMLHttpRequest / XMLHttpResponse)
- HTML
- CSS
- JavaScript
I livelli dell’archivio dei contenuti e della logica di business sottostanti sono basati sulle tecnologie Java™:
- JCR
- Sling
- OSGi
Archivio dei contenuti Java™
Lo standard Java™ Content Repository (JCR), JSR 283, specifica un modo indipendente dal fornitore e dall'implementazione per accedere al contenuto in modo bidirezionale su un livello granulare all'interno di un repository dei contenuti. Il lead della specifica è detenuto da Adobe Research (Switzerland) AG.
Il pacchetto JCR API 2.0, javax.jcr.*
, viene utilizzato per l'accesso diretto e la manipolazione del contenuto dell'archivio.
L’AEM si basa su un JCR.
Apache Jackrabbit Oak
Apache Jackrabbit Oak è un'implementazione di un archivio di contenuti gerarchici scalabile e ad alte prestazioni da utilizzare come base per siti Web moderni e altre applicazioni di contenuti complesse, conformi allo standard JCR.
Jackrabbit Oak (noto anche semplicemente come Oak) è l’implementazione dello standard JCR su cui si basa l’AEM.
Elaborazione richiesta Sling
L'AEM viene creato utilizzando Sling, un framework di applicazioni Web basato sui principi REST che consente di sviluppare facilmente applicazioni orientate ai contenuti. Sling utilizza un archivio JCR, come Apache Jackrabbit Oak, come archivio dati. Sling ha contribuito alla Apache Software Foundation; ulteriori informazioni sono disponibili su Apache.
Introduzione a Sling
Utilizzando Sling, il tipo di contenuto di cui eseguire il rendering non è la prima considerazione di elaborazione. Al contrario, la considerazione principale è se l’URL si risolve in un oggetto di contenuto per il quale è possibile trovare uno script per eseguire il rendering. Questo processo fornisce un supporto eccellente agli autori di contenuti web per creare pagine facilmente personalizzate in base alle loro esigenze.
I vantaggi di questa flessibilità sono evidenti nelle applicazioni con un’ampia gamma di elementi di contenuto diversi o quando servono pagine facilmente personalizzabili. In particolare, quando si implementa un sistema di gestione dei contenuti web come AEM.
Consulta Scopri Sling in 15 minuti per i primi passaggi per lo sviluppo con Sling.
Il diagramma seguente spiega la risoluzione dello script Sling. Mostra come passare dalla richiesta HTTP al nodo di contenuto, dal nodo di contenuto al tipo di risorsa, dal tipo di risorsa allo script e quali variabili di script sono disponibili.
Nel diagramma seguente vengono illustrati i parametri di richiesta nascosti ma potenti che è possibile utilizzare con SlingPostServlet
, il gestore predefinito per tutte le richieste POST. Il gestore offre opzioni infinite per la creazione, la modifica, l’eliminazione, la copia e lo spostamento di nodi nell’archivio.
Sling è incentrato sui contenuti
Sling è incentrato sul contenuto. Ciò significa che l’elaborazione si concentra sul contenuto, in quanto ogni richiesta (HTTP) è mappata sul contenuto sotto forma di risorsa JCR (un nodo dell’archivio):
- La prima destinazione è la risorsa (nodo JCR) contenente il contenuto
- In secondo luogo, la rappresentazione, o script, si trova dalle proprietà della risorsa con alcune parti della richiesta (ad esempio, selettori e/o estensione)
Sling RESTful
Grazie alla sua filosofia incentrata sui contenuti, Sling implementa un server orientato a REST e quindi presenta un nuovo concetto nei framework delle applicazioni web. I vantaggi sono i seguenti:
-
RESTful, non solo sulla superficie; le risorse e le rappresentazioni sono modellate correttamente all'interno del server
-
Rimuove uno o più modelli di dati
- Altri framework di gestione dei contenuti potrebbero richiedere struttura URL, oggetti aziendali e schema di database per accedere a una risorsa.
- L’utilizzo di Sling lo riduce a: URL = risorsa = struttura JCR
Scomposizione URL
In Sling, l’elaborazione è guidata dall’URL della richiesta dell’utente. Definisce il contenuto da visualizzare mediante gli script appropriati e le informazioni vengono estratte dall’URL.
Analisi del seguente URL:
https://myhost/tools/spy.printable.a4.html/a/b?x=12
È possibile suddividerlo nelle sue parti composite:
https://
myhost
/
tools/spy
.printable.a4.
html
/
a/b
?
x=12
- protocollo - HTTPS
- host - Dominio del sito
- percorso contenuto - Percorso che specifica il contenuto da riprodurre e viene utilizzato con l'estensione. In questo esempio, si traduce in
tools/spy.html
- selettori - Utilizzati per metodi alternativi di rendering del contenuto; in questo esempio una versione di formato A4 compatibile con la stampante
- estensione - Formato contenuto; specifica anche lo script da utilizzare per il rendering
- suffix - Può essere utilizzato per specificare informazioni aggiuntive
- parametri - Qualsiasi parametro richiesto per il contenuto dinamico
Da URL a contenuto e script
Utilizzo dei principi di decomposizione degli URL:
- La mappatura utilizza il percorso del contenuto estratto dalla richiesta per individuare la risorsa.
- Quando si trova la risorsa appropriata, il tipo di risorsa sling viene estratto e utilizzato per individuare lo script da utilizzare per il rendering del contenuto.
La figura riportata di seguito illustra il meccanismo utilizzato, descritto più dettagliatamente nelle sezioni seguenti.
Con Sling, puoi specificare quale script esegue il rendering di una determinata entità (impostando la proprietà sling:resourceType
nel nodo JCR). Questo meccanismo offre maggiore libertà rispetto a uno in cui lo script accede alle entità di dati (come farebbe un’istruzione SQL in uno script PHP) in quanto una risorsa può avere diverse rappresentazioni.
Mappatura delle richieste alle risorse
La richiesta è suddivisa ed è possibile estrarre le informazioni necessarie. Nell’archivio viene eseguita la ricerca della risorsa richiesta (nodo del contenuto):
- First Sling controlla se un nodo esiste nel percorso specificato nella richiesta, ad esempio
../content/corporate/jobs/developer.html
- Se non viene trovato alcun nodo, l'estensione verrà eliminata e la ricerca verrà ripetuta, ad esempio
../content/corporate/jobs/developer
- Se non viene trovato alcun nodo, Sling restituisce il codice http 404 (Not Found).
Sling consente anche di utilizzare come risorse elementi diversi dai nodi JCR, ma questa funzionalità è avanzata.
Individuazione dello script
Quando si trova la risorsa appropriata (nodo di contenuto), viene estratto il tipo di risorsa sling. Questo percorso individua lo script da utilizzare per il rendering del contenuto.
Il percorso specificato da sling:resourceType
può essere:
- Assoluto
- Relativo a un parametro di configurazione
Tutti gli script Sling sono archiviati in sottocartelle di /apps
(mutable, user scripts) o /libs
(immutable, system scripts), in cui viene eseguita la ricerca in questo ordine.
Altri punti da notare sono:
- Quando il metodo (GET, POST) è obbligatorio, viene specificato in maiuscolo in base alla specifica HTTP, ad esempio,
jobs.POST.esp
- Sono supportati vari motori di script, ma gli script comuni e consigliati sono HTL e JavaScript.
L'elenco dei motori di script supportati dall'istanza di AEM specificata è elencato nella console di gestione Felix ( http://<host>:<port>/system/console/slingscripting
).
Utilizzando l'esempio precedente, se sling:resourceType
è hr/jobs
per:
-
Richieste GET/HEAD e URL che terminano con
.html
(tipi di richiesta predefiniti, formato predefinito)- Lo script è
/apps/hr/jobs/jobs.esp
; l'ultima sezione disling:resourceType
costituisce il nome del file.
- Lo script è
-
Richieste POST (tutti i tipi di richiesta tranne GET/HEAD, il nome del metodo deve essere in maiuscolo)
- POST viene utilizzato nel nome dello script.
- Lo script è
/apps/hr/jobs/jobs.POST.esp
.
-
URL in altri formati, che non terminano con
.html
- Ad esempio
../content/corporate/jobs/developer.pdf
- Lo script è
/apps/hr/jobs/jobs.pdf.esp
. Il suffisso viene aggiunto al nome dello script.
- Ad esempio
-
URL con selettori
- I selettori possono essere utilizzati per visualizzare lo stesso contenuto in un formato alternativo. Ad esempio, una versione compatibile con la stampante, un feed rss o un riepilogo.
- Se si considera una versione adatta alla stampante in cui il selettore potrebbe essere
print
, come in../content/corporate/jobs/developer.print.html
- Lo script è
/apps/hr/jobs/jobs.print.esp
. Il selettore viene aggiunto al nome dello script.
-
In caso negativo, viene definito
sling:resourceType
:- Il percorso del contenuto viene utilizzato per cercare uno script appropriato (se il
ResourceTypeProvider
basato sul percorso è attivo). - Ad esempio, lo script per
../content/corporate/jobs/developer.html
genererebbe una ricerca in/apps/content/corporate/jobs/
. - Viene utilizzato il tipo di nodo principale.
- Il percorso del contenuto viene utilizzato per cercare uno script appropriato (se il
-
Se non viene trovato alcuno script, viene utilizzato lo script predefinito.
- La rappresentazione predefinita è supportata come testo normale (
.txt
), HTML (.html
) e JSON (.json
), che elencano tutte le proprietà del nodo (formattate in modo appropriato). Il rendering predefinito per l'estensione.res
, o per le richieste senza estensione di richiesta, consiste nello spool della risorsa (ove possibile).
- La rappresentazione predefinita è supportata come testo normale (
-
Per la gestione degli errori http (codici 403 o 404), Sling cerca uno script in:
- Percorso
/apps/sling/servlet/errorhandler
per gli script personalizzati - Oppure il percorso dello script standard
/libs/sling/servlet/errorhandler/404.jsp
- Percorso
Se per una determinata richiesta sono applicabili più script, viene selezionato lo script con la corrispondenza migliore. Più specifica è una corrispondenza, migliore sarà; in altre parole, più il selettore corrisponderà, indipendentemente da qualsiasi estensione di richiesta o corrispondenza del nome del metodo.
Ad esempio, considera una richiesta di accesso alla risorsa
/content/corporate/jobs/developer.print.a4.html
Di tipo
sling:resourceType="hr/jobs"
Supponendo di avere il seguente elenco di script nella posizione corretta:
GET.esp
jobs.esp
html.esp
print.esp
print.html.esp
print/a4.esp
print/a4/html.esp
print/a4.html.esp
Quindi l'ordine di preferenza sarebbe (8) - (7) - (6) - (5) - (4) - (3) - (2) - (1).
Oltre ai tipi di risorsa (definiti principalmente dalla proprietà sling:resourceType
), è presente anche il super tipo di risorsa. Tipo indicato dalla proprietà sling:resourceSuperType
. Questi super tipi vengono considerati anche quando si tenta di trovare uno script. Il vantaggio dei super-tipi di risorse è che possono formare una gerarchia di risorse in cui il tipo di risorsa predefinito sling/servlet/default
(utilizzato dai servlet predefiniti) è effettivamente la radice.
Il super tipo di risorsa di una risorsa può essere definito in due modi:
- dalla proprietà
sling:resourceSuperType
della risorsa. - dalla proprietà
sling:resourceSuperType
del nodo a cui puntasling:resourceType
.
Ad esempio:
-
/
-
a
-
b
sling:resourceSuperType = a
-
c
sling:resourceSuperType = b
-
x
sling:resourceType = c
-
y
sling:resourceType = c
sling:resourceSuperType = a
-
Gerarchia dei tipi di:
/x
- È
[ c, b, a, <default>]
- È
- Mentre per
/y
- La gerarchia è
[ c, a, <default>]
- La gerarchia è
Il motivo è che /y
ha la proprietà sling:resourceSuperType
, mentre /x
no e pertanto il suo supertipo viene preso dal suo tipo di risorsa.
Gli script Sling non possono essere chiamati direttamente
All’interno di Sling, gli script non possono essere chiamati direttamente perché violerebbero il concetto rigoroso di server REST; è possibile combinare risorse e rappresentazioni.
Se chiami direttamente la rappresentazione (lo script), nascondi la risorsa all’interno dello script, pertanto il framework (Sling) non ne è più a conoscenza. In questo modo si perdono alcune funzionalità:
-
Gestione automatica di metodi http diversi da GET, tra cui:
- POST, PUT, DELETE gestito con un’implementazione sling predefinita
- Lo script
POST.jsp
nel percorsosling:resourceType
-
L'architettura del codice non è più pulita né strutturata in modo chiaro come dovrebbe essere; di primaria importanza per lo sviluppo su larga scala
API Sling
Utilizza il pacchetto API Sling, org.apache.sling.*
, e le librerie tag.
Riferimento a elementi esistenti mediante sling:include
Un'ultima considerazione è la necessità di fare riferimento agli elementi esistenti all'interno degli script.
Gli script più complessi (aggregazione di script) accedono a più risorse (ad esempio, navigazione, barra laterale, piè di pagina, elementi di un elenco), includendo la risorsa.
In questo caso, è possibile utilizzare il comando sling:include("/<path>/<resource>")
. Include effettivamente la definizione della risorsa di riferimento.
OSGi
OSGi (Open Services Gateway Initiative) definisce un'architettura per lo sviluppo e la distribuzione di librerie e applicazioni modulari (nota anche come Dynamic Module System per Java™). I contenitori OSGi ti consentono di suddividere l’applicazione in singoli moduli (file jar con metadati aggiuntivi e denominati bundle nella terminologia OSGi) e di gestire le dipendenze incrociate tra di essi con:
- Servizi implementati nel contenitore
- Un contratto tra il contenitore e l’applicazione
Questi servizi e contratti forniscono un’architettura che consente ai singoli elementi di scoprirsi dinamicamente a vicenda per collaborare.
Un framework OSGi offre quindi operazioni dinamiche di caricamento/scaricamento, configurazione e controllo di questi bundle, senza richiedere riavvii.
Questa architettura consente di estendere Sling con moduli specifici per le applicazioni. Sling, e quindi AEM, utilizza l’implementazione Apache Felix di OSGi. Sono entrambe raccolte di bundle OSGi in esecuzione all’interno di un framework OSGi.
Questa funzionalità consente di eseguire le azioni seguenti su uno qualsiasi dei pacchetti all’interno dell’installazione:
- Installa
- Inizia
- Interrompi
- Aggiornare
- Disinstalla
- Vedi lo stato più recente
- Accedi a informazioni più dettagliate su bundle specifici, ad esempio nome simbolico, versione e posizione
Per ulteriori informazioni, vedere Configurazione di OSGi per AEM as a Cloud Service.
Struttura all’interno del repository
L’elenco seguente offre una panoramica della struttura visualizzata all’interno dell’archivio.
/apps
- Relativo all'applicazione; include definizioni di componenti specifiche del sito Web. I componenti sviluppati possono essere basati sui componenti predefiniti disponibili in/libs/core/wcm/components
./content
- Contenuto creato per il sito Web./etc
/home
- Informazioni utente e gruppo./libs
- Librerie e definizioni che appartengono al nucleo dell'AEM. Le sottocartelle in/libs
rappresentano le funzionalità predefinite di AEM. Impossibile modificare il contenuto in/libs
. Le funzionalità specifiche del sito Web devono essere effettuate in/apps
./tmp
- Area di lavoro temporanea./var
- File che vengono modificati e aggiornati dal sistema, ad esempio registri di controllo, statistiche e gestione degli eventi.
/libs
. Per la configurazione e altre modifiche, copiare l'elemento da /libs
a /apps
e apportare eventuali modifiche entro /apps
.