Content Management und die Apache Jelly-Engine
Apache Jelly ist eine Java-basierte und XML-basierte Skript- und Verarbeitungs-Engine zum Umwandeln von XML in ausführbaren Code.
Die Apache Jelly-Engine ist XML sehr ähnlich und sollte Entwicklern vertraut sein, die sich mit JavaScript, XML, XHTML oder HTML auskennen. In ServiceNow Instanz rendert die Apache Jelly-Engine Elemente wie Formulare, Listen und UI-Seiten. Apache Jelly-Code wird innerhalb eines dynamischen Content-Blocks gut dargestellt, kann jedoch bei statischen Blöcken zu Problemen führen. Sie können Tags, Aufrufe und Anweisungen von Jelly verwenden, HTML verhält sich jedoch wie XHTML.
<?xml version= "1.0" encoding= "utf-8" ?>
<j:jelly trim = "false" xmlns:j = "jelly:core" xmlns:g = "glide" xmlns:j2 = "null" xmlns:g2 = "null" >
<j:if test = "${current_page.getName()=='Solutions'}" >
<h1 class = "page_name" > <b> <a href = "solutions.do?" title="${gs.getMessage('Solutions')}" >${gs.getMessage('Solutions')}</a> </b> </h1>
<p class = "page_description" >
${current_page.getDescription()}
</p> <br />
</j:if>
<j:if test = "${current_page.getName()=='IT 3.0'}" >
<h1 class = "page_name" > <b> <a href = "solutions.do?" title="${gs.getMessage('Solutions')}" >${gs.getMessage('Solutions')}</a> </b> | ${current_page.getName()}</h1>
<p class = "page_description" >
${current_page.getDescription()}
</p> <br />
</j:if>
</j:jelly>Stellen Sie sicher, dass alle Tags geschlossen sind. Wenn das Tag kein natürlich schließendes Tag ist, platzieren Sie vor der schließenden Klammer einen Schrägstrich. Zum Beispiel <BR /> oder <IMG src="cms.png" />.
Fügen Sie das folgende Tag in alle Apache Jelly-Skripts ein.
<j:jelly trim= "false" xmlns:j= "jelly:core" xmlns:g= "glide" xmlns:j2= "null" xmlns:g2= "null" >- Das Apache Jelly-Skript verwendet mehrere Namespaces.
- Es gibt zwei Typen von Präfixen in Tags: j und g. Das j-Präfix wird für Tags verwendet, die systeminterner Bestandteil von Apache Jelly sind. Das Präfix „g“ wird für Tags verwendet, die das haben ServiceNow Plattform erstellt und wird für Plattformzwecke verwendet.
Die Präfixe j2 und g2 sind wie j und g, ausgenommen, dass sie in einer zweiten Phase verarbeitet werden. Der Apache Jelly-Skriptparser durchläuft die jeweiligen j- und g-Tags. Zum Beispiel:
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
<j:set var="jvar_phase1" value="Hello" />
<j2:set var="jvar_phase2" value="World" />
${jvar_phase1} $[jvar_phase2]
</j:jelly>In Phase 1 durchläuft der Parser alle j- und g-Tags. Das Ergebnis wird dann zwischengespeichert. Bevor die zweite Phase ausgeführt wird, werden die Namespaces j und g verwendet und die Namespaces in die zweite Phase verschoben. Der Code sieht in etwa wie folgt aus.
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="jelly:core" xmlns:g2="glide">
<j2:set var="jvar_phase2" value="World" />
Hello $[jvar_phase2]
</j:jelly>Ein weiteres Beispiel ist die Erstellung eines Berichts aller offenen Incidents, die jeder Gruppe zugewiesen sind. Zu diesem Zweck können Sie einen Bericht verwenden und Zeit sparen. Dies ist jedoch ein gutes Beispiel, um sich mit Jelly vertraut zu machen. Beginnen Sie mit dem Jelly-Tag:
<j:jelly trim= "false" xmlns:j= "jelly:core" xmlns:g= "glide" xmlns:j2= "null" xmlns:g2= "null" >
</j:jelly>Zunächst benötigen Sie eine Liste der offenen Incidents. Verwenden Sie das Tag g2:evaluate. Das Tag „evaluate“ führt das Skript aus. Alles, was sich innerhalb des Tags befindet, wird wie eine Business Rule analysiert, sodass Sie beispielsweise globale Business Rules, Skripteinbindungen und GlideRecord aufrufen können.
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
<g:evaluate var="jvar_groups" object="true">
var now_GR = new GlideRecord("sys_user_group");
gr.orderBy('name');
gr.query();
gr;
</g:evaluate>
</j:jelly>Dieses Skript befindet sich in Phase 1, da keine häufigen Änderungen an Incident-Zuweisungsgruppen erwartet werden. Beachten Sie auch das Attribut var für das Tag „evaluate“. Dieses Attribut gibt an, welche Variable aus diesem Block festgelegt wird. Am Ende des Skripts steht ein gr in einer Zeile für sich allein. Die Variable wird anhand dieser letzten Zeile festgelegt.
Sie können die Variable jvar_groups weglassen, dann werden jedoch alle Variablen im Tag „evaluate“ zu Apache Jelly-Variablen. Mit object=true wird festgelegt, dass die Variable kein primitiver Datentyp ist. Wenn object=true ausgelassen wird, wird das Skript beschädigt, da jvar_groups nur Elemente wie Ganzzahlen und Zeichenfolgen aufnehmen können.
Durchlaufen Sie diese Gruppen nach dem Tag „evaluate“, und suchen Sie jeweils deren Incidents.
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
<g:evaluate var="jvar_groups" object="true">
var now_GR = new GlideRecord("sys_user_group");
gr.orderBy('name');
gr.query();
gr;
</g:evaluate>
<table>
<tr>
<th>Name</th>
<th>Incidents</th>
</tr>
<j:while test="${jvar_groups.next()}">
<tr>
<td>${HTML:jvar_groups.getValue('name')}</td>
<td></td>
</tr>
</j:while>
</table>
</j:jelly>j:while. Dies ist eine normale while-Schleife, die ein GlideRecord-Objekt durchlaufen kann. Beachten Sie auch, dass Sie einen Wert mit ${HTML: jvar_groups.getValue('name')} ausgeben. Nachfolgend sind die wichtigen Elemente aufgeführt:- Die äußeren Klammern,
${}geben die Ausgabe der Variablen und die Phase an, in der die Variable ausgegeben wird:${}bedeutet erste Phase,$[]bedeutet zweite Phase. - HTML vor dem Ausdruck dient als Escapezeichen für die Ausgabe. Der Ausdruck
jvar_groups.getValue('name')wird für HTML geschützt. Für andere Typen von Escapezeichen sind JS (Javascript), NS (No Script, kein Skript) und einige andere Optionen verfügbar.
Wenn nur ein Datensatz ausgewählt und nicht viele Datensätze durchlaufen werden sollen, sieht der Code wie folgt aus:
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
<g:evaluate var="jvar_groups" object="true">
var now_GR = new GlideRecord("sys_user_group");
gr.orderBy('name');
gr.query();
gr;
</g:evaluate>
<j:if test="${jvar_groups.next()}">
We found ${HTML:jvar_groups.getValue('name')}
</j:if>
</j:jelly>