Jelly 구문에 대한 확장
Apache의 Jelly 구문은 폼, 목록, UI 페이지 및 ServiceNow.
Jelly를 사용하면 논리를 정적 콘텐츠 내에 포함할 수 있으며 계산된 값을 정적 콘텐츠에 삽입할 수 있습니다.
Apache의 이 페이지에는 표준 Jelly 태그에 대한 요약이 있습니다 http://commons.apache.org/jelly/tags.html
네임스페이스
Jelly는 태그를 호출할 때 여러 네임스페이스를 포함하는 경우가 많습니다.
"j" 네임스페이스는 표준 Jelly인 반면 "g" 네임스페이스는 스크립트에 고유합니다 ServiceNow . 예를 들어 <g:evaluate> 태그는 JavaScript를 사용하여 값을 계산할 수 있도록 제공 ServiceNow 된다. 표준 Jelly 태그<j:test>는 조건을 평가하는 데 사용됩니다.
단계
일반적으로 네임스페이스<j> 대 <j2> 및 <g> 대 <g2>로 표시되는 두 단계가 있습니다.
"2"가 없는 네임스페이스는 처리의 첫 번째 단계에서 발생하며 UI 페이지에서 사용되는 경우를 제외하고 캐시됩니다. "2"가 있는 것은 캐시되지 않습니다. 효율성과 올바른 결과를 위해 1상 또는 2상을 사용할지 여부를 선택할 때 주의해야 합니다.
네임스페이스 외에도, 정적 컨텐츠에 값을 삽입하는 데 사용되는 구문은 값을 제공하는 단계에 따라 다릅니다. 값을 중괄호로 묶은 달러는 단계 1에 값을 삽입합니다. 예를 들어, ${jvar_ref} 는 Jelly 프로세스의 1단계에서 jvar_ref 값을 삽입합니다. 값을 괄호로 묶은 달러는 단계 2에 값을 삽입합니다. 예를 들어 $[jvar_ref] 는 2단계에서 jvar_ref 값을 삽입합니다. 따옴표로 묶인 값은 문자열로 처리됩니다. 예를 들어, '[jvar_ref]' 는 2단계에서 jvar_ref 값을 문자열로 삽입합니다.
<script>
if (confirm("$[gs.getMessage('home.delete.confirm') ]"))
...
</script>
<input type="hidden" id="${jvar_name}" name="${jvar_name}" value="${jvar_value}" class="${jvar_class}" />
테스트하는 경우
Jelly 스크립트에서 if 문을 사용할 수 있습니다.
어떤 것이 사실인지 아닌지 테스트하는 것은 다음과 같이 수행할 수 있습니다.
<j:if test="${jvar_something}">...do something...</j:if>
<j:if test="${!jvar_something}">...do something...</j:if>
- 부울이며 예입니다.
- String 및 = "true", "yes", "on" 또는 "1"
존재 여부를 테스트하는 작업은 다음과 같이 수행할 수 있습니다.
<j:if test="${empty(jvar_something)}">...do something...</j:if>
- null
- 빈 문자열
- 길이가 0인 컬렉션
- 키가 없는 맵
- 빈 배열
Set_If
테스트가 참인지 거짓인지에 따라 변수를 두 가지 값 중 하나로 설정합니다.
<g2:set_if var="jvar_style" test="$[gs.getPreference('table.compact') != 'false']"
true="margin-top:0px; margin-bottom:0px;"
false="margin-top:2px; margin-bottom:2px;" />
<g:insert> 대 <g:inline> 대 <g:call>
이 페이지에서는 <g:insert>, <g:inline> 및 <g:call>의 세 가지 태그에 대한 비교 설명을 제공합니다.
<g:삽입>
<g:insert> 태그는 새 컨텍스트의 Jelly에 Jelly 파일을 삽입합니다. 즉, 이전에 Jelly에 설정된 변수에 액세스할 수 없습니다.
<g:insert template="get_target_form_function.xml" />
<g:인라인>
<g:inline> 태그는 동일한 컨텍스트에서 Jelly 파일을 Jelly에 삽입합니다. 즉, 삽입된 Jelly는 이전에 설정한 변수에 액세스할 수 있으며 해당 변수의 값을 변경할 수 있습니다.
<g:inline template="element_default.xml" />
<g:call>
더 나은 캡슐화를 위해 <g:call> 태그를 사용할 수 있습니다. 함수는 전달된 값에만 액세스할 수 있습니다. Jelly 컨텍스트는 호출 전과 호출 후에 동일하게 표시됩니다. 즉, 여기에서 전역 변수를 설정하고 나중에 읽을 수 없습니다. 이것은 또한 실수로 "jvar_temp"라는 전역 변수를 설정하고 다른 사람이 의존 한 변수를 덮어 쓸 수 없음을 의미합니다.
필요한 경우 <g:call> 줄에 매개변수 이름을 포함시킨 다음 등호와 따옴표로 묶은 값을 포함하여 값을 명시적으로 전달합니다.
<g:call function="collapsing_image.xml" id="${jvar_section_id}" image="$[jvar_cimg]"
first_section_id="${jvar_first_section_id}" image_alt="${jvar_cimg_alt}"/>
값이 전달되고 기본 또는 필수 매개 변수를 사용하려는 경우 함수에서 참조되는 Jelly에는 매개 변수가 필수인지 또는 기본값이 있는지 여부를 선언하는 줄이 포함되어야 합니다.
<g:function id="REQUIRED" image="REQUIRED" image_prefix="" image_alt="REQUIRED"/>
위의 예는 3개의 매개변수가 필요하고 하나의 매개변수가 기본값이 비어 있는 옵션임을 나타냅니다. 값을 전달하지 않거나 기본값 또는 필수 값을 사용하려는 경우 <g:function> 줄을 전혀 포함할 필요가 없습니다. 그러나 일반적으로 <g:function> 줄을 포함할 수 있습니다.
그런 다음, 매개변수 이름 앞에 "jvar_" 접두사를 추가하여 템플릿에서 값을 참조할 수 있습니다.
<img id="img.${jvar_id}" src="images/${jvar_image}" alt="${jvar_image_alt}" onclick="toggleSectionDisplay('${jvar_id}', '${jvar_image_prefix}','${jvar_first_section_id}');"/>
<g:call>의 경우 매개 변수는 "인수" 매개 변수에서 명명된 변수 목록으로 암시적으로 전달될 수도 있습니다.
<g:call function="item_link_default.xml" arguments="sysparm_view,ref_parent,jvar_target_text"/>
별도의 태그 인자를 통해 변수를 함수에 전달하는 대신에, 하나의 'arguments' 인자로 변수 리스트를 전달할 수 있습니다. 매개변수에서 argument 이름(쉼표로 구분)으로 식별된 모든 변수는 정확히 동일한 이름으로 함수 내에서 다시 도입됩니다(예: 함수 템플릿 내부에는 sysparm_view, ref_parent 및 jvar_target_text 사용할 수 있는 변수가 있음).
함수 템플릿은 return= 특성을 사용하여 호출 템플릿에 값을 반환할 수 있습니다. 함수 내에서 jvar_answer 변수는 반환 값을 설정합니다.
<g:call function="item_body_cell_calc_style.xml" arguments="jvar_type" return="jvar_style"/>
<g:evaluate>
<g:evaluate> 태그는 Rhino JavaScript로 작성된 표현식을 평가하고, 변수를 표현식의 값으로 설정하는 데 사용됩니다.
표현식의 마지막 명령문은 변수에 포함될 값입니다.
<g2:evaluate var="jvar_page" jelly="true">
var page = "";
var pageTitle = "";
var pageGR = new GlideRecord("cmn_schedule_page");
pageGR.addQuery("type", jelly.jvar_type");
pageGR.query();
if (pageGR.next()) {
page = pageGR.getValue("sys_id");
pageTitle = pageGR.getDisplayValue();
}
page;
</g2:evaluate>
<g2:evaluate var="not_important" expression="sc_req_item.popCurrent()"/>
object="true"
평가가 객체 (예 : 배열)를 반환하도록하려면 object="true" 인수를 사용하십시오.
<g2:evaluate object="true" var="jvar_items" expression="SncRelationships.getCMDBViews()" />
jelly="true"
평가 내에서 Jelly 변수에 액세스하려면 evaulate에 jelly="true"를 포함하고 Jelly 변수 이름 앞에 "jelly."를 추가합니다. 예를 들어 GlideJellyContext에 액세스하려면 다음을 수행합니다.
<g2:evaluate var="jvar_row_no" jelly="true">
var gf = jelly.context.getGlideForm();
var row = gf.getRowNumber();
row;
</g2:evaluate>
jelly="true" 매개 변수를 사용하여 jvar에 액세스하는 또 다른 예입니다. jvar_h의 값은 이전에 설정되었으며 평가에서 액세스할 수 있습니다.
$[NLBR:jvar_h.getHTMLValue('newvalue')]
<g2:evaluate var="jvar_fix_escaping" jelly="true">
var auditValue = jelly.jvar_h.getHTMLValue('newvalue');
gs.log("************ " + auditValue);
</g2:evaluate>
copyToPhase2="예"
1단계에서 발생한 평가 결과를 가져와서 2단계로 전파해야 하는 경우 copyToPhase2="true"를 사용합니다. 이 사용에는 탈출에 대한 몇 가지 보호 장치가 있습니다. 예:
<g:evaluate var="jvar_has_special_inc" copyToPhase2="true">
var specialInc = gs.tableExists("special_incident");
specialInc;
</g:evaluate>
$[jvar_has_special_inc]
평가할 필요가 없는 경우 더 직접적으로 평가할 수 있습니다. 여기서 문제를 이스케이프하는 것에 주의하십시오(jvar_rows의 큰 따옴표는 예제에서 문제를 일으킬 수 있음).
<j2:set var="jvar_rows" value="${jvar_rows}"/>
<g:breakpoint/>
이 태그를 사용하여 현재 Jelly 변수와 해당 값을 로그에 표시할 수 있습니다.
프로덕션으로 이동하기 전에 이 태그를 제거해야 합니다.
<g:ui_form/>
이 태그는 UI 페이지에서 양식을 정의합니다.
예를 들어 양식에 application_sys_id 필드가 포함된 경우 g:ui_form는 처리 스크립트의 이점을 누릴 수 있습니다.
<g:ui_form>
<p>Click OK to run the processing script.</p>
<g:dialog_buttons_ok_cancel ok="return true" />
<input type="hidden" name="application_sys_id" value="499836460a0a0b1700003e7ad950b5da"/>
</g:ui_form>
자세한 내용은 UI 매크로 문서를 참조하십시오.
<g:ui_input_field />
이 태그는 사용자가 정보를 입력할 수 있는 페이지에 입력 필드를 만드는 UI 매크로에 대한 참조를 추가합니다. ui_input_field는 레이블, 이름, 값 및 크기를 UI 매크로에 전달합니다.
<g:ui_input_field label="sys_id" name="sysid" value="9d385017c611228701d22104cc95c371" size="50"/>자세한 내용은 UI 매크로 문서를 참조하십시오.
<g:ui_checkbox/>
이 태그는 페이지에 사용자가 편집할 수 있는 확인 표시를 합니다. 이름과 값은 UI 매크로로 전달됩니다.
다음은 UI 페이지의 테이블에서 가져온 예입니다.
<table>
<tr>
<td nowrap="true">
<label>Time Card Active:</label>
</td>
<td>
<g:ui_checkbox name="timecard_active" value="${sysparm_timecard_active}"/>
</td>
</tr>
</table>
자세한 내용은 UI 매크로 문서를 참조하십시오.
<g:dialog_buttons_ok_cancel/>
이 태그는 태그가 true를 반환하면 지정된 처리 스크립트를 실행하는 단추를 UI 페이지에 배치합니다.
UI 페이지에 양식이 포함된 경우(<g:form> 태그 사용) 양식을 제출하고 처리 스크립트를 실행할 수 있습니다. 처리 스크립트는 자연스럽게 양식의 필드에 액세스할 수 있습니다. 예를 들어, 양식에 application_sys_id 필드가 포함된 경우
<g:ui_form>
<p>Click OK to run the processing script.</p>
<g:dialog_buttons_ok_cancel ok="return true" />
<input type="hidden" name="application_sys_id" value="499836460a0a0b1700003e7ad950b5da"/>
</g:ui_form>
<g:ui_reference/>
이 태그는 처리 스크립트에서 참조할 수 있는 페이지에 대한 참조를 추가합니다.
다음 예에서는 태그에서 이름, ID 및 테이블 매개변수로 정의된 참조를 생성합니다.
<g:ui_reference name="QUERY:active=true^roles=itil" id="assigned_to" table="sys_user" />
그런 다음 처리 스크립트에서 다음과 같이 이름 필드를 참조합니다.
newTask.assigned_to = request.getParameter("QUERY:active=true^roles=itil");
<g:ui_reference name="parent_id" id="parent_id" table="pm_project" query="active=true" completer="AJAXTableCompleter"
columns="project_manager;short_description"/>
앰퍼샌드
Jelly의 앰퍼샌드는 Jelly가 XML이기 때문에 슬픔을 유발할 수 있습니다.
${AMP}를 사용하여 Jelly에 앰퍼샌드를 삽입합니다. 브라우저에서 실제로 실행될 UI 페이지 또는 UI 매크로의 HTML 부분에 나타나는 JavaScript를 작성하는 경우이 코드를 "클라이언트 스크립트"필드에 넣는 것이 더 좋으며 그렇게하면 문제를 피할 수 있습니다. 그러나 실제로 "HTML"필드에 넣어야하는 경우 다음과 같이해야합니다.
ta = ta[1].split('$[AMP]');
및
${AND}를 사용하여 JavaScript와 Jelly를 삽입합니다.
예:
if (d ${AND} e)
var color = d.value;
또는 Jelly 테스트에서 &&를 사용합니다. 예:
<j:if test="${jvar_form_name == 'sys_form_template' && !RP.isDialog()}">
보다 작음
앰퍼샌드와 마찬가지로 "<"보다 작은(") 기호도 Jelly가 XML이기 때문에 문제를 일으킬 수 있습니다. 필요하지 않도록 테스트를 되돌리거나 보다 작음 기호 대신 ${AMP}lt; 를 사용하여 이 문제를 해결할 수 있습니다.
<g2:evaluate var="jvar_text">
var days = "";
var selectedDays = '$[${ref}]';
for (var i = 1; i ${AMP}lt;= 7; i++) {
if (selectedDays.indexOf(i.toString()) >= 0) {
days += gs.getMessage("dow" + i);
days += " ";
}
}
days;
</g2:evaluate>
여러 번 이스케이프 문제가없는 "같지 않음"을 사용하여 "보다 작음"연산자를 모두 피할 수 있습니다. 예:
for (var i=0; i != ta.length; i++) {
}
공백
일반적으로 공백은 Jelly에 의해 제거됩니다. 이를 유지하려면 트리밍되지 않도록 지정해야 합니다.
예를 들어 다음은 콜론 뒤에 공백을 유지합니다.
<j2:whitespace trim="false">${gs.getMessage('Did you mean')}: </j2:whitespace>
공간
줄 바꿈하지 않는 공백( )을 인코딩하려면 $[SP]입니다.
예:
<span id="gsft_domain" style="display: inline">
${gs.getMessage('Domain')}:$[SP]
<span id="domainDD" class="drop_down_element" style="text-decoration: none; color: white">
${gs.getMessage("Loading...")}
</span>
</span>
추적 Jelly
ServiceNow 에는 Jelly의 평가를 추적할 수 있는 기능이 있습니다.
추적이 로그로 전송됩니다. 이 기능은 많은 로깅을 생성하므로 디버깅 중에만 켜야 합니다. 추적을 켜려면 glide.ui.template.trace 속성을 true로 설정합니다. 예를 들어, 다음 스크립트를 실행하여 이 작업을 수행할 수 있습니다.
GlideProperties.set ( 'glide.ui.template.trace' , true ) ;
웹 브라우저의 각 페이지 하단에서 로그 항목을 보려면 .