Jelly 구문에 대한 확장

  • 릴리스 버전: Washingtondc
  • 업데이트 날짜 2024년 02월 01일
  • 읽기16분
  • 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 태그에서 &quot;진실&quot;하기 때문입니다.
    1. 부울이고 참입니다.
    2. 문자열이고 = &quot;true&quot;, &quot;yes&quot;, &quot;on&quot; 또는 &quot;1&quot;입니다.

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

    <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;" />

    &lt;g:insert> 대 &lt;g:inline> 대 &lt;g:call>

    이 페이지에서는 &lt;g:insert>, &lt;g:inline> 및 &lt;g:call>의 세 가지 태그에 대한 비교 설명을 제공합니다.

    &lt;g:삽입>

    &lt;g:insert> 태그는 새 컨텍스트에서 Jelly에 Jelly 파일을 삽입합니다. 즉, 이전에 Jelly에 설정된 변수에 액세스할 수 없습니다.

    <g:insert template="get_target_form_function.xml" />

    &lt;g:inline입니다>

    &lt;g:inline> 태그는 동일한 컨텍스트에서 Jelly에 Jelly 파일을 삽입합니다. 즉, 삽입된 Jelly는 이전에 설정한 변수에 액세스할 수 있으며 해당 변수의 값을 변경할 수 있습니다.

    <g:inline template="element_default.xml" />

    &lt;g:call>

    더 나은 캡슐화를 위해 &lt;g:call> 태그를 사용할 수 있습니다. 함수는 전달된 값에만 액세스할 수 있습니다. Jelly 컨텍스트는 호출 전과 호출 후에 동일하게 표시됩니다. 즉, 여기서 전역 변수를 설정하고 나중에 읽을 수 없습니다. 이것은 또한 실수로 &quot;jvar_temp&quot;라는 전역 변수를 설정하고 다른 사람이 의존하고 있던 변수를 덮어 쓸 수 없음을 의미합니다.

    필요한 경우 &lt;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개가 필수이고 매개 변수 중 하나는 기본값이 비어 있는 옵션임을 나타냅니다. 값을 전달하지 않거나 기본값 또는 필수 값을 원하는 경우 &lt;g:function> 줄을 전혀 포함할 필요가 없습니다. 그러나 일반적으로 &lt;g:function> 줄을 포함하는 것이 좋습니다.

    그런 다음 매개변수 이름 앞에 &quot;jvar_&quot; 접두사를 추가하여 템플릿에서 값을 참조할 수 있습니다.

    <img id="img.${jvar_id}" src="images/${jvar_image}" alt="${jvar_image_alt}"     onclick="toggleSectionDisplay('${jvar_id}', '${jvar_image_prefix}','${jvar_first_section_id}');"/>

    &lt;g:call>의 경우, 매개 변수는 &quot;arguments&quot; 매개 변수의 명명된 변수 목록으로 암시적으로 전달될 수도 있습니다.

     <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"/>

    &lt;g:평가>

    &lt;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()"/>

    개체 = &quot;true&quot;

    평가가 객체(예: 배열)를 반환하도록 하려면 object=&quot;true&quot; 인수를 사용합니다.

    <g2:evaluate object="true" var="jvar_items" expression="SncRelationships.getCMDBViews()" />

    jelly=&quot;참&quot;

    평가 내에서 Jelly 변수에 액세스하려면 evaulate에 jelly=&quot;true&quot;를 포함하고 Jelly 변수 이름 앞에 &quot;jelly.&quot;를 추가합니다. 예를 들어 GlideJellyContext에 액세스하려면 다음을 수행합니다.

    <g2:evaluate var="jvar_row_no" jelly="true">
       var gf = jelly.context.getGlideForm();
       var row = gf.getRowNumber();
       row;
    </g2:evaluate>

    jelly=&quot;true&quot; 매개 변수를 사용하여 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=&quot;예&quot;

    1단계에서 발생하는 평가 결과를 가져와서 2단계로 전파해야 하는 경우 copyToPhase2=&quot;true&quot;를 사용합니다. 이 사용에는 탈출에 대한 약간의 보호가 있습니다. 예:

    <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}"/>

    &lt;g:중단점/>

    이 태그는 로그에 현재 Jelly 변수와 해당 값을 표시하는 데 사용할 수 있습니다.

    프로덕션으로 이동하기 전에 이 태그를 제거해야 합니다.

    &lt;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 매크로 문서를 참조하십시오.

    &lt;g:ui_input_field />

    이 태그는 사용자가 정보를 입력할 수 있는 페이지에 입력 필드를 만드는 UI 매크로에 대한 참조를 추가합니다. ui_input_field는 레이블, 이름, 값 및 크기를 UI 매크로로 전달합니다.

    다음은 UI 페이지의 예입니다.
    <g:ui_input_field label="sys_id" name="sysid" value="9d385017c611228701d22104cc95c371" size="50"/>

    자세한 내용은 UI 매크로 문서를 참조하십시오.

    &lt;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 매크로 문서를 참조하십시오.

    &lt;g:dialog_buttons_ok_cancel/>

    이 태그는 태그가 true를 반환하는 경우 지정된 처리 스크립트를 실행하는 UI 페이지에 단추를 배치합니다.

    UI 페이지에 양식이 포함된 경우(&lt;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>

    &lt;g:ui_reference/>

    이 태그는 처리 스크립트에서 참조할 수 있는 페이지에 대한 참조를 추가합니다.

    다음 예제에서는 태그에서 name, ID 및 table 매개 변수로 정의된 참조를 만듭니다.

    <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");
    &quot;name&quot; 속성이 고유할 수 있도록 참조 한정자를 지정할 수 있습니다. 다음 예제에서는 태그에서 name, ID 및 table 매개 변수로 정의된 참조를 만듭니다.
    주:
    &quot;columns&quot; 속성은 자동 완성 프로그램에만 적용됩니다.
    <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를 작성하는 경우 이 코드를 &quot;클라이언트 스크립트&quot; 필드에 넣는 것이 좋으며 이렇게 하면 문제를 피할 수 있습니다. 그러나 실제로 &quot;HTML&quot;필드에 넣어야하는 경우 다음과 같이해야합니다.

    ta = ta[1].split('$[AMP]');

    And

    ${AND}를 사용하여 JavaScript 및 Jelly를 삽입합니다.

    예:

    if (d ${AND} e)
       var color = d.value;

    또는 Jelly 테스트에서 &amp;&amp;. 예:

    <j:if test="${jvar_form_name == 'sys_form_template' && !RP.isDialog()}">

    보다 작음

    앰퍼샌드와 마찬가지로 보다 작은(&quot;&lt;&quot;) 기호도 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>

    여러 번 이스케이프 문제가없는 &quot;같지 않음&quot;을 사용하여 &quot;보다 작음&quot;연산자를 모두 피할 수 있습니다. 예:

    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 ) ;

    각 페이지 하단의 웹 브라우저에서 로그 항목을 보려면 다음으로 이동합니다. 시스템 진단 > 디버그 로그레이블이 표시됩니다.