在JEE Workbench上使用AEM Forms中的執行指令碼服務來建立XML資料

在JEE流程管理工作流程中,AEM Forms涉及許多XML,例如:XML資訊可以在程式中建置,並傳送至JEE工作區上AEM Forms的Flex應用程式,用於系統設定,或傳遞資訊至表單或從表單傳遞。 在許多情況下,JEE上的AEM Forms開發人員都需要管理XML,而許多時候這都需要透過JEE上的AEM Forms程式來管理XML。

處理簡單XML設定時,您可以使用Set Value服務,這是JEE服務上的預設AEM Forms。 此服務設定流程資料模型中一個或多個資料項的值。 對於非常簡單的條件式邏輯「如果這樣,那麼就是那樣」的情況,此服務可以符合其目的。

但是,在更複雜的情況下,「設定值」服務並不有效。 在這些情況下,人們需要依賴一組更強健的寫程式命令,例如由Java等寫程式語言提供的命令。 使用Java構建複雜的XML比在「設定值」服務中從簡單文本構建XML文檔更簡單、更清晰。 此外,在Java中加入條件式程式設計比在設定值服務中更容易。

在進程中使用執行指令碼服務

在AEM Forms on JEE Workbench中提供的標準AEM Forms on JEE服務集中,即為Execute Script服務。 此服務可讓您在程式中執行指令碼,並提供executeScript操作。

使用定義為活動的「執行指令碼」服務建立應用程式和進程

本教程不允許建立整體應用程式和進程,但為了本說明,我們建立了一個名為「DemoApplication02」的應用程式。 假設已建立應用程式,我們需要在此應用程式中建立一個進程,以調用executeScript服務。 要向包含Execute Script服務的應用程式添加進程,請執行以下操作:

  1. 按一下右鍵您的應用程式,然後選擇新建。 在New滑出菜單中,選擇Process。 請據以命名您的程式,視需要新增說明,並選取您要代表此程式的圖示。 為了本教學課程的目的,我們已建立一個程式,並將其命名為executeScriptDemoProcess
  2. 定義您的起始點,或簡單選擇稍後新增您的起始點。
  3. 該進程現在已建立,應該在Process Design窗口中自動開啟。 在此窗口中,按一下「流程設計」窗口頂部的「活動選擇器」表徵圖,然後將新活動拖動到游泳道上。 此時應會出現定義活動視窗(請參閱下圖)。
    定義活動
  4. 可在Foundation服務集下找到executeScript服務。 服務名稱將對象列為Execute Script – 1.0,操作名稱為executeScript。 按一下以選取此項目。
  5. 現在應建立此進程,預設情況下,Process Properties窗口應顯示在左側窗格中。

使用「執行指令碼」服務向進程添加指令碼

在定義了「執行指令碼」服務活動後,您就可以向此進程添加指令碼。 要向此過程添加指令碼,請執行以下操作:

  1. 導覽至「處理屬性」浮動視窗。 在此浮動視窗中,展開Input區段,然後按一下「……」圖示。

  2. 在顯示的文字方塊中,寫入您的指令碼。 已寫入指令碼時,按「OK(確定)」(請參見下圖)。
    執行指令碼

使用執行指令碼服務建立XML

在建立了包含執行指令碼服務的進程後,就可以使用此指令碼建立XML。 您可以在上面Execute Script服務區段的「將指令碼新增至程式」中所述的文字方塊中撰寫下列所述的指令碼。

關於執行指令碼服務的技術

為了了解執行指令碼服務的功能和限制,您必須了解服務的技術基礎。 AEM Forms on JEE使用Apache Xerces檔案物件模型(DOM)剖析器,在處理中建立和儲存XML變數。 Xerces是W3C文檔對象模型規範的Java實現;定義此處。 DOM規格是自1998年以來一直採用的XML處理標準方式。 Xerces、Xerces-J的Java實現支援DOM Level 2 1.0版。

用於儲存XML變數的Java類包括:

  • org.apache.xerces.dom.NodeImpl和

  • org.apache.xerces.dom.DocumentImpl

DocumentImpl是NodeImpl的子類,因此可以假定任何XML進程變數都是NodeImpl派生。 您可以在此處🔗找到NodeImpl 的文檔。

使用Execute Script服務建立XML的示例

以下是在Execute Script服務中建立XML的示例。 該進程具有XML類型的變數節點。 此活動的最終結果將是XML文檔。 本教學課程不涵蓋該檔案的功用,或其如何套用至整體程式;最終,這取決於XML在整個應用程式中需要做什麼。 如本簡介所述,XML可在AEM Forms的JEE表單和程式中用於許多用途,這只是如何編寫執行指令碼活動的程式碼以輸出簡單XML檔案的說明。

輸出XML的簡單Java指令碼如下所示:

import org.apache.xerces.dom.DocumentImpl;

import org.w3c.dom.Document;

import org.w3c.dom.Element;



Document document = new DocumentImpl();

Element topLevelResources = document.createElement("resources");

Element resource = document.createElement("resource");

resource.setAttribute("id", "first item id");

resource.setAttribute("value", "first item value");

topLevelResources.appendChild(resource);

document.appendChild(topLevelResources);

patExecContext.setProcessDataValue("/process_data/node", document);
注意

上述DOM物件必須匯入至指令碼中。

此簡單指令碼的結果是新的XML文檔,其變數節點設定為:

<resources>

<resource id="first item id" value="first item value"/>

</resources>

使用迭代循環向XML添加節點

節點也可以添加到進程內的現有XML變數中。 變數節點包含我們剛建立的XML對象。

Document document = patExecContext.getProcessDataValue("/process_data/node");

NodeList childNodes = document.getChildNodes();

int numChildren = childNodes.getLength();

for (int i = 0; i < numChildren; i++)

{

Node currentChild = childNodes.item(i);

if (currentChild.getNodeType() == Node.ELEMENT_NODE)

{

// found the top level node

Element newResource = document.createElement("resource");

newResource.setAttribute("id", "second item id");

newResource.setAttribute("value", "second item value");

currentChild.appendChild(newResource);

break;

}

}

patExecContext.setProcessDataValue("/process_data/node", document);
The variable node in the XML is now set to:

<resources> 

<resource id="first item id" value="first item value"/> 

<resource id="second item id" value="second item value"/> 

</resources>

本頁內容