コンテンツ管理と Apache Jelly エンジン
Apache Jelly は、XML を実行可能コードに変換する Java ベースおよび XML ベースのスクリプト作成および処理エンジンです。
Apache Jelly エンジンは、XML とよく似ているため、JavaScript、XML、XHTML、または HTML に精通している開発者であれば容易に使いこなせるはずです。ServiceNow インスタンスで、Apache Jelly エンジンはフォーム、リスト、UI ページなどのアイテムをレンダリングします。Apache Jelly コードは、ダイナミック コンテンツ ブロック内では正しくレンダリングされますが、静的ブロックで使用すると問題が発生する可能性があります。Jelly タグ、呼び出し、およびステートメントを使用できますが、HTML は 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>すべてのタグが閉じていることを確認してください。タグが自動的に閉じるタグでない場合は、終了かっこの前に前方スラッシュを挿入します。たとえば、<BR /> や <IMG src="cms.png" /> のようにします。
すべての Apache Jelly スクリプトと一緒に次のタグを含めます。
<j:jelly trim= "false" xmlns:j= "jelly:core" xmlns:g= "glide" xmlns:j2= "null" xmlns:g2= "null" >- Apache Jelly スクリプトは複数の名前空間を使用する。
- タグには、j と g の 2 種類の接頭辞がある。j プレフィックスは、Apache Jelly にネイティブに含まれているタグに使用される。g プレフィックスは、ServiceNow プラットフォームが作成してその目的のために使用しているタグに使用される。
j2 プレフィックスと g2 プレフィックスは、第 2 フェーズで処理される点を除いて、j と g と全く同じです。Apache Jelly スクリプト パーサーは、それぞれ、j タグと g タグを通して動作します。たとえば、
<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>フェーズ 1 で、パーサーはすべての j タグと g タグを通して動作します。その後で、結果をキャッシュします。第 2 フェーズを実行する前に、j と g の名前空間を取得し、それらを第 2 フェーズに移動します。次のようなコードになります。
<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>もう 1 つの例では、各グループに割り当てられたすべての未解決インシデントのレポートを作成します。この目的では、レポートを使用して時間を節約できますが、これは Jelly の学習に適した例と言えます。Jelly タグから始めます:
<j:jelly trim= "false" xmlns:j= "jelly:core" xmlns:g= "glide" xmlns:j2= "null" xmlns:g2= "null" >
</j:jelly>まず、未解決インシデントのリストが必要です。g2:evaluate タグを使用します。evaluate タグはスクリプトを実行します。タグ内のものはビジネス ルールと同様に解釈されるため、たとえば、グローバル ビジネス ルール、スクリプトインクルード、および gliderecord を呼び出すことができます。
<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>インシデント割り当てグループに対する変更の頻度が予想できないため、このスクリプトはフェーズ 1 に配置されます。また、evaluate タグの var 属性に注目してください。この属性は、このブロックからどの変数が設定されるかを指定します。スクリプトの末尾には、gr だけの行があります。この最後の行で、変数が設定されます。
jvar_groups 変数は省略できますが、そうすると evaluate タグ内のすべての変数が Apache Jelly 変数になります。object=true は、変数がプリミティブ データ型ではないことを指定します。object=true が省略された場合は、jvar_groups が整数や文字列などのアイテムしか保持できないため、スクリプトは中断します。
evaluate タグの後で、これらのグループをループして、それぞれのインシデントを検出します。
<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 ループに注目してください。これは標準の while ループであり、GlideRecord オブジェクトを通して繰り返すことができます。${HTML:jvar_groups.getValue('name')} を使用して値を出力している点にも注目してください。重要な要素は次のとおりです。- 外側のブラケット
${}は、変数の出力とその変数が出力されるフェーズを指定する。${}は第 1 フェーズを意味し、$[]は第 2 フェーズを意味する。 - 式の前の HTML は出力をエスケープするためのもの。式
jvar_groups.getValue('name')は HTML のためにエスケープされている。他のタイプのエスケープ処理では、JS (Javascript) や NS (No Script) などのオプションがある。
1 つのレコードのみを選択し、複数のレコードを反復処理しない場合、コードは次の例のようになります。
<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>