Content Management 및 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>모든 태그가 닫혀 있는지 확인합니다. 태그가 자연스럽게 닫히는 태그가 아닌 경우 끝 괄호 앞에 슬래시를 배치합니다. 예를 들어, a <BR /> 또는 an <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의 두 가지 유형의 접두사가 있습니다. j 접두사는 기본적으로 Apache Jelly의 일부인 태그에 사용됩니다. g 접두사는 플랫폼이 ServiceNow 생성하여 플랫폼 목적으로 사용하는 태그에 사용됩니다.
j2 및 g2 접두어는 두 번째 단계에서 처리된다는 점을 제외하고는 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 태그를 통해 실행됩니다. 그런 다음 결과를 캐시합니다. 두 번째 단계를 실행하기 전에 j 및 g 네임스페이스를 사용하고 네임스페이스를 두 번째 단계로 이동합니다. 다음 코드와 비슷합니다.
<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>또 다른 예는 각 그룹에 할당된 모든 미해결 인시던트에 대한 보고서를 만드는 것입니다. 이를 위해 보고서를 사용하여 시간을 절약할 수 있지만 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')}을 사용하여 값을 출력합니다. 중요한 요소는 다음과 같습니다.- 외부 괄호
${}는 변수의 출력과 변수가 출력되는 단계를 지정합니다:${}는 첫 번째 단계를 의미하고,$[]는두 번째 단계를 의미합니다. - 표현식 앞의 HTML은 출력을 이스케이프하기 위한 것입니다.
jvar_groups.getValue('name')표현식이 HTML에 대해 이스케이프되고 있습니다. 다른 유형의 이스케이프의 경우 JS(Javascript), NS(스크립트 없음) 및 기타 몇 가지 옵션이 있습니다.
하나의 레코드만 선택하고 여러 레코드를 반복하지 않으려면 코드는 다음 예제와 같습니다.
<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>