AEM核心概念 aem-core-concepts

NOTE
在瞭解Adobe Experience Manager (AEM)的核心概念之前,Adobe建議完成開發AEM Sites快速入門檔案中的WKND教學課程。 內容包括AEM開發流程概述以及核心概念簡介。

在AEM上進行開發的先決條件 prerequisites-for-developing-on-aem

您需要下列技能才能在AEM之上開發:

  • 網頁應用程式技術的基本知識,包括:

    • request -response (XMLHttpRequest / XMLHttpResponse)循環
    • HTML
    • CSS
    • JavaScript
  • Experience Server (CRX)的工作知識,包括Content Explorer

  • 若要使用傳統UI進行開發,您也必須具備JSP (JavaServer Pages)的基本知識,包括瞭解及修改簡單JSP範例的能力。

也建議您閱讀並遵循指引和最佳實務

Java™內容存放庫 java-content-repository

Java™ Content Repository (JCR)標準JSR 283指定了在內容存放庫內的精細層級,以獨立於廠商和實作的方式雙向存取內容。

規格領先者為Adobe Research (瑞士) AG。

JCR API 2.0套件,javax.jcr。*用於直接存取及操作存放庫內容。

Experience Server (CRX)和Jackrabbit experience-server-crx-and-jackrabbit

Experience Server提供AEM以Experience Services為基礎、可用來建置自訂應用程式的Experience Services,並根據Jackrabbit嵌入內容存放庫。

Apache Jackrabbit是開放原始碼,完全符合JCR API 2.0的實作。

Sling請求處理 sling-request-processing

Sling簡介 introduction-to-sling

AEM是使用Sling建置的,這是以REST原則為基礎的Web應用程式架構,可讓您輕鬆開發內容導向的應用程式。 Sling使用JCR存放庫(例如Apache Jackrabbit),或如果有AEM,則使用CRX內容存放庫作為其資料存放區。 Sling已對Apache Software Foundation有所貢獻 — 如需詳細資訊,請參閱Apache 。

使用Sling時,要呈現的內容型別不是第一個處理考量。 主要考量是URL是否解析為內容物件,然後可以找到指令碼以執行轉譯。 這為網頁內容作者提供了絕佳支援,協助他們建立可輕鬆根據需求自訂的頁面。

在包含各種不同內容元素的應用程式中,或是需要可輕鬆自訂的頁面時,這種彈性的優點顯而易見。 特別是在AEM解決方案中實作WCM之類的網頁內容管理系統時。

請參閱在15分鐘內探索Sling,瞭解使用Sling進行開發的第一步。

下圖說明Sling指令碼解析。 它說明如何從HTTP要求取得至內容節點、從內容節點取得至資源型別、從資源型別取得至指令碼,以及有哪些指令碼變數可用。

瞭解Apache Sling指令碼解析度

下圖說明在處理SlingPostServlet時可以使用的所有隱藏但強大的請求引數。 它包含所有POST請求的預設處理常式,為您提供在存放庫中建立、修改、刪除、複製和移動節點的無限選項。

使用SlingPostServlet

Sling以內容為中心 sling-is-content-centric

Sling是​ 以內容為中心。 這表示處理著重於內容,因為每個(HTTP)請求都會對應至JCR資源(存放庫節點)形式的內容:

  • 第一個目標是儲存內容的資源(JCR節點)
  • 第二,表示或指令碼位於與請求某些部分(例如選取器和/或擴充功能)結合的資源屬性中

RESTful Sling restful-sling

由於以內容為中心的理念,Sling實作了REST導向的伺服器,因此在Web應用程式架構中引入了新概念。 優點包括:

  • RESTful,而不只是曲面上的;資源和表示在伺服器內正確建模

  • 移除一或多個資料模型

    • 之前需要下列專案:URL結構、業務物件、DB綱要;
    • 現在減少為: URL =資源= JCR結構

URL分解 url-decomposition

在Sling中,處理是由使用者請求的URL驅動。 這會定義適當的指令碼要顯示的內容。 為此,會從URL擷取資訊。

如果您分析下列URL:

https://myhost/tools/spy.printable.a4.html/a/b?x=12

您可以將它分解成其複合零件:

通訊協定
主機
內容路徑
選擇器
副檔名
尾碼
引數
https://
myhost
工具/監視
.printable.a4.
html
/
a/b
?
x=12

通訊協定 HTTP

主機 ​網站的名稱。

內容路徑 ​指定要轉譯之內容的路徑。 用於擴充功能。 在此範例中,它們將轉譯為tools/spy.html

選取器 ​用於轉譯內容的替代方法;在此範例中為A4格式的印表機易記版本。

延伸模組 ​內容格式;也指定要用於轉譯的指令碼。

尾碼 ​可用來指定其他資訊。

引數 ​動態內容所需的任何引數。

從URL到內容與指令碼 from-url-to-content-and-scripts

使用下列原則:

  • 對應會使用從請求中擷取的內容路徑來找出資源
  • 找到適當的資源時,就會擷取sling資源型別,並用來找出要用於轉譯內容的指令碼

下圖說明了所使用的機制,以下各節將更詳細地討論該機制。

chlimage_1-86

使用Sling,您可以指定哪個指令碼會轉譯特定實體(方法是在JCR節點中設定sling:resourceType屬性)。 此機制比指令碼存取資料實體時的自由度更大(PHP指令碼中的SQL陳述式就是如此),因為資源可以有數個轉譯。

將請求對應至資源 mapping-requests-to-resources

系統會劃分請求並擷取必要資訊。 系統會搜尋存放庫中的請求資源(內容節點):

  • 第一個Sling會檢查要求中指定的位置是否存在節點;例如,../content/corporate/jobs/developer.html
  • 如果找不到節點,則會捨棄副檔名並重複搜尋;例如,../content/corporate/jobs/developer
  • 如果找不到任何節點,則Sling會傳回http程式碼404 (找不到)。

Sling也可讓JCR節點以外的專案成為資源,但這是進階功能。

找到指令碼 locating-the-script

找到適當的資源(內容節點)時,就會擷取​ sling資源型別。 這是路徑,可找出要用於轉譯內容的指令碼。

sling:resourceType指定的路徑可以是:

  • 絕對值

  • 相對於設定引數

    由於相對路徑會增加可移植性,因此Adobe會建議使用相對路徑。

所有Sling指令碼都儲存在/apps/libs的子資料夾中,搜尋順序如下(請參閱自訂元件和其他元素)。

其他需要注意的要點包括:

  • 當需要方法(GET、POST)時,會根據HTTP規格以大寫指定,例如jobs.POST.esp (請參閱下文)

  • 支援各種指令碼引擎:

    • HTL (HTML範本語言 — Adobe Experience Manager偏好並建議的HTML伺服器端範本系統): .html
    • ECMAScript (JavaScript)頁面(伺服器端執行): .esp, .ecma
    • Java™ Server Pages (伺服器端執行): .jsp
    • Java™ Servlet編譯器(伺服器端執行): .java
    • JavaScript範本(使用者端執行): .jst

AEM的特定執行個體支援的指令碼引擎清單列在Felix管理主控台( http://<host>:<port>/system/console/slingscripting)上。

此外,Apache Sling也支援與其他熱門的指令碼引擎整合(例如Groovy、JRuby、Freemarker),並提供整合新指令碼引擎的方法。

在上述範例中,如果sling:resourceTypehr/jobs,則適用於:

  • GET/HEAD請求和以.html結尾的URL (預設請求型別、預設格式)

    指令碼為/apps/hr/jobs/jobs.esp;sling:resourceType的最後一個區段會形成檔案名稱。

  • POST請求(除GET/HEAD以外的所有請求型別,方法名稱必須為大寫)

    POST用於指令碼名稱中。

    指令碼是/apps/hr/jobs/jobs.POST.esp

  • 其他格式的URL,結尾不是.html

    例如 ../content/corporate/jobs/developer.pdf

    指令碼是/apps/hr/jobs/jobs.pdf.esp;字尾已新增至指令碼名稱。

  • 具有選取器的URL

    選取器可用來以替代格式顯示相同的內容。 例如,適合列印的版本、RSS摘要或摘要。

    如果您檢視適合列印的版本,其中選擇器可能是​ 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或沒有要求副檔名的要求的預設轉譯為儘可能將資源多工緩衝處理。

  • 如需http錯誤處理(程式碼403或404),Sling會在以下位置尋找指令碼:

如果特定請求套用多個指令碼,則會選取最符合的指令碼。 相符專案越具體,越好;換言之,無論是否有任何相符的要求副檔名或方法名稱,選取器越符合越好。

例如,考慮存取資源的請求
/content/corporate/jobs/developer.print.a4.html
型別
sling:resourceType="hr/jobs"

假設您在正確位置有下列指令碼清單:

  1. GET.esp
  2. jobs.esp
  3. html.esp
  4. print.esp
  5. print.html.esp
  6. print/a4.esp
  7. print/a4/html.esp
  8. print/a4.html.esp

偏好設定順序為(8) - (7) - (6) - (5) - (4) - (3) - (2) - (1)。

除了資源型別(主要由sling:resourceType屬性定義)之外,還有資源超級型別。 這由sling:resourceSuperType屬性表示。 嘗試尋找指令碼時,也會考量這些超級型別。 資源超級型別的優點在於,它們可以形成資源的階層,其中預設資源型別sling/servlet/default (由預設servlet使用)實際上是根。

資源的資源超級型別可透過兩種方式定義:

  • 依資源的sling:resourceSuperType屬性執行。
  • 依據sling:resourceType所指向之節點的sling:resourceSuperType屬性。

例如:

  • /

    • 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指令碼 sling-scripts-cannot-be-called-directly

在Sling中,無法直接呼叫指令碼,因為這會破壞REST伺服器的嚴格概念;您可以混合使用資源和表示法。

如果您直接呼叫表示(指令碼),會在指令碼內隱藏資源,讓框架(Sling)不知道該資源。 因此,您會遺失某些功能:

  • 自動處理GET以外的http方法,包括:

    • 以Sling預設實作處理的POST、PUT、DELETE
    • sling:resourceType位置中的POST.jsp指令碼
  • 您的程式碼架構已不像原來那麼乾淨和結構清晰;這對於大規模開發至關重要

Sling API sling-api

這會使用Sling API套件org.apache.sling。&amp;ast;和標籤程式庫。

使用sling:include參照現有元素 referencing-existing-elements-using-sling-include

最後考量是需要參考指令碼中的現有元素。

更複雜的指令碼(彙總指令碼)必須存取多個資源(例如導覽、側欄、頁尾、清單元素),並加入​ 資源 ​以執行此操作。

若要這麼做,請使用sling:include("/<path>/<resource>")命令。 這實際上包括參考資源的定義,如以下陳述式所示,該陳述式參考用於轉譯影像的現有定義:

%><sling:include resourceType="geometrixx/components/image/img"/><%

OSGI osgi

OSGi定義用於開發和部署模組化應用程式和程式庫的架構(也稱為Java™適用的動態模組系統)。 OSGi容器可讓您將應用程式分成個別模組(這些模組是含有其他中繼資訊的jar檔案,在OSGi術語中稱為套裝),並透過以下方式管理它們之間的交叉相依性:

  • 在容器內實作的服務
  • 容器與應用程式之間的合約

這些服務與合約提供的架構,可讓個別元素動態地互相探索,以便共同作業。

接著OSGi架構會提供這些套裝的動態載入/解除安裝、設定和控制,而不需要重新啟動。

NOTE
您可以在OSGi網站找到OSGi技術的完整資訊。
特別值得一提的是,他們的「基礎教育」頁面包含一系列簡報和教學課程。

此架構可讓您使用應用程式特定模組來擴充Sling。 Sling和CQ5使用Apache Felix的OSGI (Open Services Gateway方案)實作,且以OSGi Service Platform 4.2版規格為基礎。 兩者都是在OSGi架構中執行的OSGi套件組合集合。

這可讓您對安裝內的任何套裝軟體執行下列動作:

  • 安裝
  • 開始
  • 停止
  • 更新
  • 解除安裝
  • 檢視狀態
  • 存取有關特定套裝的更詳細資訊(例如符號名稱、版本和位置)

如需詳細資訊,請參閱網頁主控台OSGI組態OSGi組態設定

AEM環境中的開發物件 development-objects-in-the-aem-environment

下列專案符合開發需求:

專案 ​專案是節點或屬性。

如需有關操作Item物件的詳細資訊,請參閱介面javax.jcr.Item的Java™檔案

節點(及其屬性) ​節點及其屬性是在JCR API 2.0規格(JSR 283)中定義。 它們儲存內容、物件定義、演算指令碼和其他資料。

節點會定義內容結構,其屬性會儲存實際內容和中繼資料。

內容節點會驅動轉譯。 Sling從傳入要求取得內容節點。 此節點的屬性sling:resourceType指向要使用的Sling演算元件。

在Sling環境中,JCR名稱節點也稱為資源。

例如,若要取得目前節點的屬性,您可以在指令碼中使用下列程式碼:

PropertyIterator properties = currentNode.getProperties();

currentNode是目前的節點物件。

如需有關操作Node物件的詳細資訊,請參閱Java™檔案

Widget ​在AEM中,所有使用者輸入均由Widget管理。 這些通常用於控制內容的編輯。

對話方塊是藉由組合Widget所建置。

AEM是使用Widget的ExtJS資料庫開發的。

對話方塊 ​對話方塊是一種特殊型別的Widget。

若要編輯內容,AEM會使用應用程式開發人員定義的對話方塊。 這些功能結合一系列的Widget,向使用者呈現編輯相關內容所需的所有欄位和動作。

對話方塊也用於編輯中繼資料,以及各種管理工具。

元件 ​軟體元件是提供預先定義服務或事件的系統元素,而且可以與其他元件通訊。

在AEM中,元件通常用於呈現資源的內容。 當資源為頁面時,轉譯該資源的元件稱為頂層元件或頁面元件。 不過,元件不需要呈現內容,也不需要連結至特定資源。 例如,導覽元件會顯示多個資源的相關資訊。

元件的定義包括下列各項:

  • 用於呈現內容的程式碼
  • 用於使用者輸入和結果內容配置的對話方塊。

範本 ​範本是特定頁面型別的基礎。 在網站標籤中建立頁面時,使用者必須選取範本。 然後複製此範本以建立新頁面。

範本是節點的階層,其結構與要建立的頁面相同,但沒有任何實際內容。

它會定義用於呈現頁面的頁面元件和預設內容(主要頂層內容)。 內容會定義其呈現方式,因為AEM是以內容為中心。

頁面元件(最上層元件) ​要用來轉譯頁面的元件。

頁面 ​頁面是範本的「執行個體」。

頁面具有cq:Page型別的階層節點和cq:PageContent型別的內容節點。 內容節點的屬性sling:resourceType指向用於轉譯頁面的頁面元件。

例如,若要取得目前頁面的名稱,您可以在指令碼中使用下列程式碼:

String pageName = currentPage.getName();

TcurrentPage為目前頁面物件。 如需有關操控頁面物件的詳細資訊,請參閱Java™檔案

頁面管理員 ​頁面管理員是提供頁面層級作業方法的介面。

例如,若要取得資源的容納頁面,您可以在指令碼中使用下列程式碼:

頁面myPage = pageManager.getContainingPage(myResource);

pageManager是頁面管理員物件,myResource是資源物件。 如需頁面管理員所提供方法的詳細資訊,請參閱Java™檔案

存放庫內的結構 structure-within-the-repository

下列清單提供您在存放庫中看到的結構概覽。

CAUTION
變更此結構或其中的檔案時,應務必謹慎。
開發時需要變更,但應確保完全瞭解所做任何變更的影響。
CAUTION
請勿變更/libs路徑中的任何專案。 如需設定及其他變更,請將專案從/libs複製到/apps,並在/apps內進行任何變更。
  • /apps

    與應用程式相關;包含您網站專用的元件定義。 您開發的元件可以以/libs/foundation/components提供的現成元件為基礎。

  • /content

    為您的網站建立的內容。

  • /etc

  • /home

    使用者和群組資訊。

  • /libs

    屬於AEM核心的程式庫和定義。 /libs中的子資料夾代表現成可用的AEM功能,例如搜尋或復寫。 /libs中的內容不應修改,因為它會影響AEM的運作方式。 您網站的特定功能應在/apps底下開發(請參閱自訂元件和其他元素)。

  • /tmp

    臨時工作區。

  • /var

    變更並由系統更新的檔案;例如稽核記錄、統計資料、事件處理。

環境 environments

使用AEM時,生產環境通常包含兩種不同型別的執行個體: 作者和Publish執行個體

Dispatcher the-dispatcher

Dispatcher是Adobe的快取和/或負載平衡工具。 您可以在Dispatcher下找到進一步資訊。

FileVault (來源修訂系統) filevault-source-revision-system

FileVault為您的JCR存放庫提供檔案系統對應和版本控制。 透過對標準版本控制系統(例如Subversion)中專案計畫碼、內容、設定等的儲存和版本化提供完整支援,可用於管理AEM開發專案。

如需詳細資訊,請參閱FileVault工具檔案。

工作流程 workflows

您的內容通常受限於組織流程,包括各種參與者的核准和簽署等步驟。 這些程式可以表示為工作流程,在AEM中定義和開發,然後視需要套用至適當的內容頁面數位資產

工作流程引擎是用來管理工作流程的實作,及其後續對您內容的應用程式。

多網站管理 multi-site-management

多網站管理員(MSM)可讓您輕鬆管理共用相同內容的多個網站。 MSM可讓您定義網站之間的關係,如此一來,一個網站中的內容變更便會自動複製到其他網站。

例如,網站通常以多種語言提供給國際受眾。 若使用相同語言的網站數量偏低(三至五),則採用手動程式來同步跨網站的內容。 然而,當網站數量增加或涉及多種語言時,自動化程式會變得更有效率。

  • 有效管理網站的不同語言版本。

  • 根據來源網站自動更新一或多個網站:

    • 強制實施通用基礎結構,並在多個網站間使用通用內容。
    • 最大限度地利用可用資源。
    • 維持共同的外觀與風格。
    • 集中管理網站之間不同的內容。

如需詳細資訊,請參閱多網站管理員

recommendation-more-help
19ffd973-7af2-44d0-84b5-d547b0dffee2