Jelly 구문에 대한 확장

  • 릴리스 버전: Yokohama
  • 업데이트 날짜 2025년 01월 30일
  • 읽기15분
  • Apache의 Jelly 구문은 폼, 목록, UI 페이지 및 ServiceNow.

    Jelly를 사용하면 논리를 정적 콘텐츠 내에 포함할 수 있으며 계산된 값을 정적 콘텐츠에 삽입할 수 있습니다.

    중요사항:
    이 기능을 사용하려면 Apache Jelly(XML을 실행 가능한 코드로 변환하기 위한 Java 및 XML 기반 스크립팅 및 처리 엔진)에 대한 지식이 필요합니다.

    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>
    이 진술이 작동하는 이유는 Jelly에서 jvar_something 와 같은 용어가 if 태그에서 "진실"이기 때문입니다.
    1. 부울이며 예입니다.
    2. String 및 = "true", "yes", "on" 또는 "1"

    존재 여부를 테스트하는 작업은 다음과 같이 수행할 수 있습니다.

    <j:if test="${empty(jvar_something)}">...do something...</j:if>
    이 문이 작동하는 이유는 인수가 다음과 같은 경우 JEXL 빈 함수가 true를 반환하기 때문입니다.
    1. null
    2. 빈 문자열
    3. 길이가 0인 컬렉션
    4. 키가 없는 맵
    5. 빈 배열
    주:
    JEXL 표현식에서는 javascript 변수와 jvar 변수를 혼합할 수 없습니다. 그것들은 별도의 표현식으로 분리되어야 합니다.

    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 매크로에 전달합니다.

    다음은 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");
    "이름" 속성이 고유할 수 있도록 참조 한정자를 지정할 수 있습니다. 다음 예에서는 태그에 이름, ID 및 테이블 매개변수로 정의된 참조를 생성합니다.
    주:
    "열" 속성은 자동 완성 기능에만 적용됩니다.
    <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 ) ;

    웹 브라우저의 각 페이지 하단에서 로그 항목을 보려면 시스템 진단 > 디버그 로그.