コンテンツ管理と Apache Jelly エンジン

  • リリースバージョン: Washingtondc
  • 更新日 2024年02月01日
  • 読む8読むのに数分
  • 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" /> のようにします。

    Jelly スクリプティングに精通していない場合は、次のトピックを参照してください。

    すべての 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>
    このスクリプトのその後の呼び出しでは、フェーズ 2 のみが解析されます。
    注:
    コンテンツ タイプ [content_type] テーブルまたはダイナミック コンテンツ [content_block_programmatic] テーブルでフェーズ 2 Jelly タグ (g2 と j2) を使用する予定の場合は、コンテンツ フォームで [2 フェーズ ] オプションを選択します。

    もう 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>
    標準の XML はいつでも Apache Jelly スクリプトに含めることができます。名前空間が存在しないため、Apache Jelly スクリプトは XML タグを解釈しようとしません。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>