Erweiterungen der Jelly-Syntax

  • Freigeben Version: Australia
  • Aktualisiert 12. März 2026
  • 9 Minuten Lesedauer
  • Die Jelly-Syntax von Apache wird zum Rendern von Formularen, Listen, UI-Seiten und vielen anderen Elementen in ServiceNow verwendet.

    Mit Jelly kann Logik in statischen Inhalt eingebettet werden, und berechnete Werte können in den statischen Inhalt eingefügt werden.

    Wichtig:
    Diese Funktionalität erfordert Kenntnisse über Apache Jelly (eine Java- und XML-basierte Skripting- und Verarbeitungsmaschine zum Umwandeln von XML in ausführbaren Code).

    Diese Seite von Apache enthält eine Zusammenfassung der standardmäßigen Jelly-Tags: http://commons.apache.org/jelly/tags.html

    Namespaces

    Jelly enthält beim Aufrufen von Tags häufig mehrere Namespaces.

    Die Namespaces „j“ sind Standard-Jelly, während die Namespaces „g“ eindeutig sind ServiceNow Skripts. Beispielsweise wird das <g:evaluate>-Tag von bereitgestellt ServiceNow Damit Sie einen Wert mit JavaScript berechnen können. Die standardmäßige Jelly-Tag-<j:test> wird verwendet, um eine Bedingung auszuwerten.

    Phasen

    Normalerweise gibt es zwei Phasen, die durch Namespaces <j> versus <j2> und <g> versus <g2> angegeben werden.

    Die Namespaces ohne „2“ erfolgen in der ersten Phase der Verarbeitung, und diese werden zwischengespeichert, außer wenn sie auf einer UI-Seite verwendet werden. Diejenigen mit „2“ werden nie zwischengespeichert. Bei der Auswahl, ob Phase 1 oder Phase 2 verwendet werden soll, ist Vorsicht geboten, um Effizienz und richtige Ergebnisse zu erzielen.

    Zusätzlich zu den Namespaces unterscheidet sich die Syntax, die zum Einfügen von Werten in statischen Inhalt verwendet wird, je nachdem, welche Phase den Wert bereitstellen soll. Ein Dollar mit geschweiften Klammern um einen Wert fügt den Wert in Phase 1 ein. Beispiel: ${jvar_ref} Fügt den Wert ein Jvar_ref Während Phase 1 des Jelly-Prozesses. Ein Dollar mit Klammern, die einen Wert umgeben, fügt den Wert in Phase 2 ein. Beispiel: $[jvar_ref] Fügt den Wert ein Jvar_ref Während Phase 2. Ein Wert, der von Anführungszeichen umgeben ist, wird als Zeichenfolge behandelt. Beispiel: „[jvar_ref]“ Fügt den Wert ein Jvar_ref Als Zeichenfolge während Phase 2.

     <script>
    if (confirm("$[gs.getMessage('home.delete.confirm') ]"))
       ...
    </script>
    <input type="hidden" id="${jvar_name}" name="${jvar_name}" value="${jvar_value}" class="${jvar_class}" />

    Wenn Tests durchgeführt werden

    Sie können IF-Anweisungen in Jelly-Skripts verwenden.

    Das Testen, ob etwas wahr ist oder nicht, kann wie folgt durchgeführt werden:

    <j:if test="${jvar_something}">...do something...</j:if>
    <j:if test="${!jvar_something}">...do something...</j:if>
    Der Grund, warum diese Anweisung funktioniert, besteht darin, dass in Jelly ein Begriff wie „jvar_something“ in einem if-Tag „wahrheitsgemäß“ ist, wenn:
    1. Er ist boolesch und „wahr“
    2. Es handelt sich um eine Zeichenfolge und = „wahr“, „Ja“, „ein“ oder „1“.

    Das Testen, ob etwas vorhanden ist, kann wie folgt durchgeführt werden:

    <j:if test="${empty(jvar_something)}">...do something...</j:if>
    Der Grund für die Funktion dieser Anweisung besteht darin, dass die leere JEXL-Funktion „wahr“ zurückgibt, wenn ihr Argument:
    1. Null
    2. Eine leere Zeichenfolge
    3. Eine Sammlung mit einer Länge von Null
    4. Eine Zuordnung ohne Schlüssel
    5. Ein leeres Array
    Hinweis:
    javascript- und Jvar-Variablen können in einem JEXL-Ausdruck nicht gemischt werden. Sie müssen in separate Ausdrücke unterteilt werden.

    Set_If

    Legt eine Variable auf einen von zwei verschiedenen Werten fest, je nachdem, ob ein Test „wahr“ oder „falsch“ ist.

    <g2:set_if var="jvar_style" test="$[gs.getPreference('table.compact') != 'false']" 
       true="margin-top:0px; margin-bottom:0px;" 
       false="margin-top:2px; margin-bottom:2px;" />

    <g:insert> vs. <g:inline> vs. <g:call>

    Diese Seite bietet eine vergleichende Erklärung der drei Tags: <g:insert>, <g:inline> und <g:call>.

    <g:insert>

    Das <g:insert>-Tag fügt eine Jelly-Datei in einen neuen Kontext in Ihre Jelly ein. Dies bedeutet, dass Sie nicht auf die zuvor in Ihrer Gelee erstellten Variablen zugreifen können.

    <g:insert template="get_target_form_function.xml" />

    <g:inline>

    Das <g:inline>-Tag fügt eine Jelly-Datei im selben Kontext in Ihre Jelly ein. Dies bedeutet, dass die eingefügte Jelly auf die zuvor von Ihnen festgelegten Variablen zugreifen und die Werte dieser Variablen ändern kann.

    <g:inline template="element_default.xml" />

    <g:call>

    Für eine bessere Verkapselung kann das <g:call>-Tag verwendet werden. Ihre Funktion hat nur Zugriff auf die an sie übergebenen Werte. Der Jelly-Kontext sieht nach einem Anruf wie vor dem Anruf aus. Dies bedeutet, dass Sie hier keine globale Variable festlegen und sie später lesen können. Dies bedeutet auch, dass Sie nicht versehentlich eine globale Variable namens „jvar_temp“ festlegen und eine Variable überschreiben können, auf die sich jemand anderes verließ.

    Die Übergabe von Werten erfolgt bei Bedarf explizit, indem der Name des Parameters in die <g:call>-Zeile gefolgt vom Gleichheitszeichen gefolgt vom Wert in Anführungszeichen eingefügt wird:

    <g:call function="collapsing_image.xml" id="${jvar_section_id}" image="$[jvar_cimg]" 
       first_section_id="${jvar_first_section_id}" image_alt="${jvar_cimg_alt}"/>

    Wenn Werte übergeben werden und Sie Standardwerte oder erforderliche Parameter haben möchten, muss Ihr in der Funktion referenzierter Jelly eine Zeile enthalten, um anzugeben, ob die Parameter erforderlich sind oder einen Standardwert haben:

    <g:function id="REQUIRED" image="REQUIRED" image_prefix="" image_alt="REQUIRED"/>

    Das obige Beispiel gibt an, dass 3 der Parameter erforderlich sind und ein Parameter eine Option mit einem leeren Standardwert ist. Beachten Sie, dass Sie die <g:function>-Zeile überhaupt nicht einschließen müssen, wenn Sie keine Werte übergeben oder Standardwerte oder erforderliche Werte haben möchten. Im Allgemeinen möchten Sie jedoch eine <g:function>-Zeile einschließen.

    Auf den Wert kann dann in Ihrer Vorlage verwiesen werden, indem dem Parameternamen das Präfix „jvar_“ vorangestellt wird:

    <img id="img.${jvar_id}" src="images/${jvar_image}" alt="${jvar_image_alt}"     onclick="toggleSectionDisplay('${jvar_id}', '${jvar_image_prefix}','${jvar_first_section_id}');"/>

    Für <g:call> können Parameter auch implizit als Liste benannter Variablen in einem Parameter „Argumente“ übergeben werden:

     <g:call function="item_link_default.xml" arguments="sysparm_view,ref_parent,jvar_target_text"/>

    Als Alternative zur Übergabe von Variablen an die Funktion über separate Tag-Argumente ist es möglich, eine Liste von Variablen in einem einzelnen Argument „Argumente“ zu übergeben. Alle Variablen, die durch Namen (kommagetrennt) in identifiziert werden argumentParameter werden innerhalb der Funktion unter genau demselben Namen erneut eingeführt (z. B. hätten wir innerhalb der Funktionsvorlage die Variablen „sysparm_View“, „ref_parent“ und „jvar_target_Text“ verfügbar).

    Die Funktionsvorlage kann mithilfe von einen Wert an die aufrufende Vorlage zurückgeben Rückgabe= Attribut. Innerhalb der Funktion Jvar_answer Variable legt den Rückgabewert fest.

    <g:call function="item_body_cell_calc_style.xml" arguments="jvar_type" return="jvar_style"/>

    <g:evaluate>

    Das <g:evaluate>-Tag wird verwendet, um einen in Rhino-JavaScript geschriebenen Ausdruck auszuwerten und manchmal eine Variable auf den Wert des Ausdrucks festzulegen.

    Die letzte Anweisung im Ausdruck ist der Wert, den die Variable enthält.

    <g2:evaluate var="jvar_page" jelly="true">
         var page = "";
         var pageTitle = "";
         var pageGR = new GlideRecord("cmn_schedule_page");
         pageGR.addQuery("type", jelly.jvar_type");
         pageGR.query();
         if (pageGR.next()) {
            page = pageGR.getValue("sys_id");
            pageTitle = pageGR.getDisplayValue();
         }
         page;
    </g2:evaluate>
    <g2:evaluate var="not_important" expression="sc_req_item.popCurrent()"/>

    Objekt="wahr"

    Wenn die Auswertung ein Objekt zurückgeben soll (z. B. ein Array), verwenden Sie das Argument object="true".

    <g2:evaluate object="true" var="jvar_items" expression="SncRelationships.getCMDBViews()" />

    Jelly="wahr"

    Wenn Sie in einer Auswertung auf Jelly-Variablen zugreifen möchten, fügen Sie Jelly="wahr" in die Auswertung ein, und fügen Sie „Jelly“ hinzu. Vor dem Namen der Jelly-Variable. So greifen Sie beispielsweise auf GlideJellyContext zu:

    <g2:evaluate var="jvar_row_no" jelly="true">
       var gf = jelly.context.getGlideForm();
       var row = gf.getRowNumber();
       row;
    </g2:evaluate>

    Ein weiteres Beispiel für den Zugriff auf ein Jvar mit dem Parameter „Jelly=„true““. Der Wert von Jvar_h Wurde zuvor festgelegt, und wir können darauf innerhalb von zugreifen Bewerten :

    $[NLBR:jvar_h.getHTMLValue('newvalue')]
    <g2:evaluate var="jvar_fix_escaping" jelly="true">
        var auditValue = jelly.jvar_h.getHTMLValue('newvalue');
        gs.log("************ " + auditValue);
    </g2:evaluate>

    CopyToPhase2="wahr"

    Wenn Sie die Ergebnisse einer Evaluierung in Phase 1 verwenden und an Phase 2 weitergeben müssen, verwenden Sie copyToPhase2="wahr". Bei dieser Verwendung ist ein gewisser Schutz für Escape-Vorgänge vorhanden. Zum Beispiel:

    <g:evaluate var="jvar_has_special_inc" copyToPhase2="true">
       var specialInc = gs.tableExists("special_incident");
       specialInc;
    </g:evaluate>
    $[jvar_has_special_inc]

    Wenn Sie etwas nicht bewerten müssen, können Sie dies direkt tun. Vorsicht vor Problemen mit Escape-Zeichen (doppelte Anführungszeichen in „jvar_rows“ würden im Beispiel ein Problem verursachen):

    <j2:set var="jvar_rows" value="${jvar_rows}"/>

    <g:breakpoint/>

    Dieses Tag kann verwendet werden, um die aktuellen Jelly-Variablen und ihre Werte im Protokoll anzuzeigen.

    Entfernen Sie dieses Tag, bevor Sie in die Produktion gehen.

    <g:ui_form/>

    Dieses Tag definiert ein Formular auf der UI-Seite.

    Beispiel: Wenn Ihr Formular enthielt Application_sys_ID Feld kann g:ui_Form von einem Verarbeitungsskript profitieren.

    <g:ui_form>
        <p>Click OK to run the processing script.</p>
        <g:dialog_buttons_ok_cancel ok="return true" />
        <input type="hidden" name="application_sys_id" value="499836460a0a0b1700003e7ad950b5da"/>
     </g:ui_form>

    Weitere Informationen finden Sie unter UI-Makros.

    <g:ui_input_field />

    Dieses Tag fügt einem UI-Makro einen Verweis hinzu, das ein Eingabefeld auf einer Seite erstellt, mit dem Anwender Informationen eingeben können. Die ui_input_field Übergibt eine Bezeichnung, einen Namen, einen Wert und eine Größe an das UI-Makro.

    Hier ist ein Beispiel aus einer UI-Seite:
    <g:ui_input_field label="sys_id" name="sysid" value="9d385017c611228701d22104cc95c371" size="50"/>

    Weitere Informationen finden Sie unter UI-Makros.

    <g:ui_checkbox/>

    Dieses Tag setzt ein vom Anwender bearbeitbares Häkchen auf einer Seite. Name und Wert werden an das UI-Makro übergeben.

    Hier ist ein Beispiel aus einer Tabelle auf einer UI-Seite:

    <table>
        <tr>
          <td nowrap="true">
              <label>Time Card Active:</label>
          </td>
          <td>
              <g:ui_checkbox name="timecard_active" value="${sysparm_timecard_active}"/>
          </td>
       </tr>
    </table>

    Weitere Informationen finden Sie unter UI-Makros.

    <g:dialog_buttons_ok_cancel/>

    Dieses Tag stellt Schaltflächen auf der UI-Seite bereit, die ein angegebenes Verarbeitungsskript ausführen, wenn das Tag „wahr“ zurückgibt.

    Wenn Ihre UI-Seite ein Formular enthält (verwendet das <g:form>-Tag), können Sie das Formular übermitteln und das Verarbeitungsskript ausführen lassen. Das Verarbeitungsskript kann natürlich auf Felder im Formular zugreifen. Wenn Ihr Formular beispielsweise das Feld Application_sys_ID enthielt:

    <g:ui_form>
        <p>Click OK to run the processing script.</p>
        <g:dialog_buttons_ok_cancel ok="return true" />
        <input type="hidden" name="application_sys_id" value="499836460a0a0b1700003e7ad950b5da"/>
     </g:ui_form>

    <g:ui_reference/>

    Dieses Tag fügt einer Seite einen Verweis hinzu, auf die von einem Verarbeitungsskript verwiesen werden kann.

    Das folgende Beispiel erstellt eine Referenz, die durch Name, ID und Tabellenparameter im Tag definiert ist:

    <g:ui_reference name="QUERY:active=true^roles=itil" id="assigned_to" table="sys_user" />

    Verweisen Sie dann im Verarbeitungsskript auf das Namensfeld wie folgt:

    newTask.assigned_to = request.getParameter("QUERY:active=true^roles=itil");
    Sie können einen Referenzqualifizierer angeben, damit das Attribut „Name“ eindeutig sein kann. Das folgende Beispiel erstellt eine Referenz, die durch Name, ID und Tabellenparameter im Tag definiert ist.
    Hinweis:
    Das Attribut „Spalten“ gilt nur für den automatischen Vervollständiger.
    <g:ui_reference name="parent_id" id="parent_id" table="pm_project" query="active=true" completer="AJAXTableCompleter" 
    columns="project_manager;short_description"/>

    Amperand

    Ampersands in Jelly können zu Kummer führen, da Jelly XML ist.

    Verwenden ${AMP} Zum Einfügen eines Ampersand in Gelee. Wenn Sie JavaScript schreiben, das im HTML-Teil von z. B. einer UI-Seite oder einem UI-Makro angezeigt wird, das tatsächlich im Browser ausgeführt wird, sollten Sie diesen Code besser in das Feld „Client-Skript“ eingeben, um Probleme zu vermeiden. Wenn Sie es jedoch wirklich in das Feld „HTML“ einfügen müssen, müssen Sie Folgendes tun:

    ta = ta[1].split('$[AMP]');

    Und

    Verwenden ${UND} Zum Einfügen eines JavaScript und in Jelly.

    Zum Beispiel:

    if (d ${AND} e)
       var color = d.value;

    Alternativ würden Sie in einem Gelee-Test verwenden &Amp . Zum Beispiel:

    <j:if test="${jvar_form_name == 'sys_form_template' && !RP.isDialog()}">

    Weniger als

    Ähnlich wie Ampersands können weniger als („<“) Zeichen auch zu Problemen führen, da Jelly XML ist. Dies kann gelöst werden, indem Sie Ihren Test rückgängig machen, sodass er nicht erforderlich ist, oder indem Sie verwenden ${AMP}lt; An Stelle des kleiner-als-Zeichens.

    <g2:evaluate var="jvar_text">
         var days = "";
         var selectedDays = '$[${ref}]';
         for (var i = 1; i ${AMP}lt;= 7; i++) {
            if (selectedDays.indexOf(i.toString()) >= 0) {
               days += gs.getMessage("dow" + i);
               days += " ";
            }
         }
         days;
     </g2:evaluate>

    Oft können Sie den Operator „weniger als“ gemeinsam vermeiden, indem Sie einfach „nicht gleich“ verwenden, was keine Escape-Probleme hat. Zum Beispiel:

    for (var i=0; i != ta.length; i++) {
    }

    Leerzeichen

    Normalerweise wird Leerzeichen durch Jelly entfernt. Um sie beizubehalten, müssen Sie angeben, dass sie nicht gekürzt wird.

    So wird beispielsweise das Leerzeichen nach dem Doppelpunkt beibehalten.

    <j2:whitespace trim="false">${gs.getMessage('Did you mean')}: </j2:whitespace>

    Plätze

    Zum Codieren eines bruchsicheren Bereichs ( ) können Sie verwenden $[SP] .

    Zum Beispiel:

    <span id="gsft_domain" style="display: inline">
        ${gs.getMessage('Domain')}:$[SP]
        <span id="domainDD" class="drop_down_element" style="text-decoration: none; color: white">
            ${gs.getMessage("Loading...")}
       </span>
    </span>

    Gelee Wird Nachverfolgt

    ServiceNow Hat eine Funktion, mit der die Auswertung von Gelee nachverfolgt werden kann.

    Die Ablaufverfolgung wird an das Protokoll gesendet. Dies sollte nur während des Debugging aktiviert werden, da dies zu einer hohen Protokollierung führt. Um die Ablaufverfolgung zu aktivieren, legen Sie die Eigenschaft „Glide.ui.template.Trace“ auf „wahr“ fest. Dazu kann beispielsweise das folgende Skript ausgeführt werden:

    GlideProperties.set ( 'glide.ui.template.trace' , true ) ;

    Wenn Sie Ihre Protokolleinträge unten auf jeder Seite in Ihrem Webbrowser anzeigen möchten, navigieren Sie zu Systemdiagnostik > Protokoll debuggenan.