콘텐츠 관리 및 Apache Jelly 엔진

  • 릴리스 버전: Yokohama
  • 업데이트 날짜 2025년 01월 30일
  • 읽기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 태그를 사용합니다. 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>
    언제든지 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>