콘텐츠 관리 및 Apache Jelly 엔진

  • 릴리스 버전: Australia
  • 업데이트 날짜 2026년 03월 12일
  • 소요 시간: 7분
  • 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 /> 또는 <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의 두 가지 유형의 프리픽스가 있습니다. 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>
    이 스크립트의 후속 호출의 경우 단계 2만 구문 분석됩니다.
    주:
    콘텐츠 유형 [content_type] 또는 동적 콘텐츠 [content_block_programmatic] 테이블에서 단계 2 Jelly 태그(g2 및 j2)를 사용하려는 경우 콘텐츠 양식에서 2단계 옵션을 선택합니다.

    또 다른 예로는 각 그룹에 할당된 모든 미해결 인시던트에 대한 보고서를 생성하는 것입니다. 이를 위해 보고서를 사용하여 시간을 절약할 수 있지만 Jelly를 배우는 데 좋은 예입니다. Jelly 태그로 시작합니다.

    <j:jelly trim= "false" xmlns:j= "jelly:core" xmlns:g= "glide" xmlns:j2= "null" xmlns:g2= "null" >
    </j:jelly>

    먼저 미해결 인시던트 목록이 필요합니다. g2: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단계에 있습니다. 또한 평가 태그의 var 속성도 확인합니다. 이 속성은 이 블록에서 설정되는 변수를 지정합니다. 스크립트 끝에는 그 자체로 줄에 gr 이 있습니다. 마지막 줄이 변수를 설정합니다.

    jvar_groups 변수를 생략해도 되지만 평가 태그의 모든 변수가 Apache Jelly 변수가 됩니다. object=true는 변수가 원시 데이터 형식이 아님을 지정합니다. object=true가 생략되면 정수와 문자열과 같은 항목만 보유할 수 있기 때문에 스크립트jvar_groups 중단됩니다.

    평가 태그 다음에 이러한 그룹을 반복하여 각 그룹의 인시던트를 찾습니다.

    <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>
    언제든지 Apache Jelly 스크립트에 일반 XML을 포함할 수 있습니다. 네임스페이스가 없으므로 Apache Jelly 스크립트는 XML 태그를 구문 분석하지 않습니다. 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>