Extensões para a sintaxe Jelly

  • Versão de lançamento: Zurich
  • Atualizado 31 de jul. de 2025
  • 9 min. de leitura
  • A sintaxe Jelly do Apache é usada para renderizar formulários, listas, páginas de IU e muitas outras coisas renderizadas no ServiceNow.

    Com o Jelly, a lógica pode ser incorporada ao conteúdo estático e os valores calculados podem ser inseridos no conteúdo estático.

    Importante:
    Esta funcionalidade requer conhecimento do Apache Jelly (um mecanismo de processamento e script baseado em Java e XML para transformar XML em código executável).

    Esta página do Apache tem um resumo dos marcadores Jelly padrão: http://commons.apache.org/jelly/tags.html

    Namespaces

    Jelly geralmente inclui vários namespaces ao invocar marcadores.

    Os namespaces "j" são Jelly padrão, enquanto os namespaces "g" são exclusivos ServiceNow scripts. Por exemplo, o marcador <g:evaluate> é fornecido por ServiceNow Para permitir que você calcule um valor usando JavaScript. O marcador Jelly padrão <j:test> é usado para avaliar uma condição.

    Fases

    Normalmente, há duas fases indicadas por namespaces <j> versus <j2> e <g> versus <g2>.

    Os namespaces sem o "2" acontecem na primeira fase de processamento e são armazenados em cache, exceto quando usados em uma página de IU. Aqueles com o "2" nunca são armazenados em cache. Deve-se tomar cuidado ao selecionar se usar a fase 1 ou a fase 2 para eficiência e resultados corretos.

    Para além dos namespaces, a sintaxe usada para inserir valores no conteúdo estático difere dependendo de qual fase fornecerá o valor. Um dólar com chaves ao redor de um valor insere o valor na fase 1. Por exemplo, (jvar_ref) insere o valor jvar_ref durante a fase 1 do processo de geleia. Um dólar com colchetes ao redor de um valor insere o valor na fase 2. Por exemplo, [jvar_ref] insere o valor jvar_ref durante a fase 2. Um valor entre aspas é tratado como uma cadeia de caracteres. Por exemplo, '[jvar_ref]' insere o valor jvar_ref como uma cadeia de caracteres durante a fase 2.

     <script>
    if (confirm("$[gs.getMessage('home.delete.confirm') ]"))
       ...
    </script>
    <input type="hidden" id="${jvar_name}" name="${jvar_name}" value="${jvar_value}" class="${jvar_class}" />

    Se for testado

    Você pode usar instruções if em scripts Jelly.

    Testar se algo é verdadeiro ou não pode ser feito da seguinte forma:

    <j:if test="${jvar_something}">...do something...</j:if>
    <j:if test="${!jvar_something}">...do something...</j:if>
    Esta declaração funciona, é que, no Jelly, um termo como jvar_something é "verdadeiro" em uma tag if:
    1. É booliano e verdadeiro
    2. É uma cadeia de caracteres e é "true", "yes", "on" ou "1"

    Testar se algo existe pode ser feito da seguinte forma:

    <j:if test="${empty(jvar_something)}">...do something...</j:if>
    Esta declaração funciona é que a função vazia JEXL retorna verdadeiro se seu argumento for:
    1. nulo
    2. uma cadeia de caracteres vazia
    3. uma coleção de tamanho zero
    4. um mapa sem chaves
    5. uma matriz vazia
    Nota:
    Não é possível misturar variáveis javascript e jvar em uma expressão JEXL. Eles devem ser divididos em expressões separadas.

    Set_if

    Define uma variável como um de dois valores diferentes, dependendo se um teste é verdadeiro ou falso.

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

    versus <g:inline> versus <g:call> <g:insert>

    Esta página fornece uma explicação comparativa de três marcadores: <g:insert>, <g:inline> e <g:call>.

    <g:insert>

    O <g:insert> marcador Jelly insere um arquivo Jelly no seu Jelly em um novo contexto. Isso significa que você não pode acessar as variáveis estabelecidas anteriormente no Jelly.

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

    <g:inline>

    O <g:inline> marcador Jelly insere um arquivo Jelly no seu Jelly no mesmo contexto. Isso significa que o Jelly inserido pode acessar as variáveis que você estabeleceu anteriormente e pode mudar os valores dessas variáveis.

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

    <g:call>

    Para melhor encapsulamento, o marcador <g:call> pode ser usado. Sua função só terá acesso aos valores passados para ela. Após uma chamada, o contexto Jelly terá a aparência igual a antes da chamada. Isso significa que você não pode definir uma variável global aqui e lê-la mais tarde. Isso também significa que você não pode definir erroneamente uma variável global chamada "jvar_temp" e substituir uma variável da qual outra pessoa dependia.

    A aprovação de valores, se necessário, é feita explicitamente, incluindo o nome do parâmetro na linha <g:call> seguido pelo sinal de igual seguido pelo valor entre aspas:

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

    Se os valores forem passados e você quiser ter padrões ou parâmetros obrigatórios, o Jelly referenciado na função deverá incluir uma linha para declarar se os parâmetros são obrigatórios ou têm um valor padrão:

    <g:function id="REQUIRED" image="REQUIRED" image_prefix="" image_alt="REQUIRED"/>

    O exemplo acima indica que 3 dos parâmetros são obrigatórios e um parâmetro é opção com um valor padrão em branco. Se você não estiver passando valores ou se quiser ter valores padrão ou obrigatórios, não será necessário incluir a linha <g:function>. No entanto, em geral, convém incluir uma linha de <g:function>.

    O valor pode ser referenciado em seu modelo anexando o prefixo "jvar_" ao nome do parâmetro:

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

    Para o <g:call>, os parâmetros também podem ser passados implicitamente como uma lista de variáveis nomeadas em um parâmetro "argumentos":

     <g:call function="item_link_default.xml" arguments="sysparm_view,ref_parent,jvar_target_text"/>

    Como uma alternativa para passar variáveis para a função por meio de argumentos de marcador separados, é possível passar uma lista de variáveis em um único argumento "argumentos". Todas as variáveis identificadas por nome (separadas por vírgulas) em argumentos parâmetros são reintroduzidos na função com exatamente o mesmo nome (por exemplo, dentro do modelo de função, temos variáveis sysparm_view, ref_parent e jvar_target_text disponíveis para nós).

    O modelo de função pode retornar um valor para o modelo de chamada usando retorno atributo. Na função jvar_answer a variável define o valor de retorno.

    <g:call function="item_body_cell_calc_style.xml" arguments="jvar_type" return="jvar_style"/>

    <g:evaluate>

    O marcador <g:evaluate> é usado para avaliar uma expressão escrita em Rhino JavaScript e, às vezes, para definir uma variável para o valor da expressão.

    A última declaração na expressão é o valor que a variável conterá.

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

    "verdadeiro"

    Se você quiser que o Evaluate retorne um objeto (por exemplo, uma matriz), use o argumento object "true".

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

    jelly: "verdadeiro"

    Se você quiser acessar variáveis do Jelly dentro de uma avaliação, inclua jelly Antes do nome da variável Jelly. Por exemplo, para acessar GlideJellyContext:

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

    Outro exemplo de acesso a um jvar usando o parâmetro Jelly O valor de jvar_h foi definido anteriormente e podemos acessá-lo dentro de avaliar :

    $[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>

    "True"

    Se você tiver a necessidade de pegar os resultados de uma avaliação que ocorre na fase 1 e propagá-la para a fase 2, use copyTophase2 Há alguma proteção para escapar neste uso. Por exemplo:

    <g:evaluate var="jvar_has_special_inc" copyToPhase2="true">
       var specialInc = gs.tableExists("special_incident");
       specialInc;
    </g:evaluate>
    $[jvar_has_special_inc]

    Se você não precisa avaliar algo, você pode fazer isso mais diretamente. Cuidado com os problemas de escape aqui (aspas duplas em jvar_rows causariam um problema no exemplo):

    <j2:set var="jvar_rows" value="${jvar_rows}"/>

    <g:breakpoint/>

    Este marcador pode ser usado para exibir as variáveis atuais do Jelly e seus valores no log.

    Certifique-se de remover este marcador antes de ir para a produção.

    <g:ui_form/>

    Este marcador define um formulário na página de IU.

    Por exemplo, se o seu formulário continha application_sys_id g:ui_form pode se beneficiar de um script de processamento.

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

    Para obter mais informações, consulte Macros de IU.

    <g:ui_input_field />

    Este marcador adiciona uma referência a uma macro de IU que cria um campo de entrada em uma página que permite que os usuários insiram informações. . iu_input_field Passa um rótulo, nome, valor e tamanho para a macro de IU.

    Este é um exemplo de uma página de IU:
    <g:ui_input_field label="sys_id" name="sysid" value="9d385017c611228701d22104cc95c371" size="50"/>

    Para obter mais informações, consulte Macros de IU.

    <g:ui_checkbox/>

    Este marcador coloca uma marca de seleção editável pelo usuário em uma página. O nome e o valor são passados para a macro de IU.

    Este é um exemplo de uma tabela em uma página de IU:

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

    Para obter mais informações, consulte Macros de IU.

    <g:dialog_buttons_ok_cancel/>

    Este marcador coloca botões na página de IU que executam um script de processamento especificado se o marcador retornar verdadeiro.

    Se sua página de IU contiver um formulário (usa o marcador <g:form>), você poderá enviar o formulário e executar o Script de processamento. O Script de processamento pode acessar naturalmente os campos no formulário. Por exemplo, se o formulário continha o campo 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/>

    Este marcador adiciona uma referência a uma página que pode ser referenciada por um Script de processamento.

    O exemplo a seguir cria uma referência definida por parâmetros de nome, ID e tabela no marcador:

    <g:ui_reference name="QUERY:active=true^roles=itil" id="assigned_to" table="sys_user" />

    Em seguida, no Script de processamento, faça referência ao campo de nome da seguinte forma:

    newTask.assigned_to = request.getParameter("QUERY:active=true^roles=itil");
    Você pode especificar um qualificador de referência para que o atributo "name" possa ser exclusivo. O exemplo a seguir cria uma referência definida por parâmetros de nome, ID e tabela no marcador.
    Nota:
    O atributo "colunas" se aplica somente ao preenchimento automático.
    <g:ui_reference name="parent_id" id="parent_id" table="pm_project" query="active=true" completer="AJAXTableCompleter" 
    columns="project_manager;short_description"/>

    E comercial

    Ampersands no Jelly pode causar-lhe tristeza porque Jelly é XML.

    Usar (AMP) Para inserir um e comercial no Jelly. Se você estiver escrevendo JavaScript que aparece na parte HTML de uma página de IU ou macro de IU que realmente será executada no navegador, é melhor colocar esse código no campo "client script" e dessa forma você pode evitar problemas de escape. No entanto, se você realmente precisar colocá-lo no campo "html", você precisará fazer algo assim:

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

    E

    Usar E Para inserir um JavaScript e no Jelly.

    Por exemplo:

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

    Em um teste Jelly você usaria &amp&amp . Por exemplo:

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

    Menos de

    Sinais menores que (""") também podem causar problemas devido ao Jelly ser XML. Isso pode ser resolvido revertendo o teste para que não seja necessário ou usando E no lugar do sinal menor que.

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

    Muitas vezes, você pode evitar o operador "menor que" usando apenas "não igual", que não tem problemas de escape. Por exemplo:

    for (var i=0; i != ta.length; i++) {
    }

    Espaço em branco

    Normalmente, o espaço em branco é removido pelo Jelly. Para mantê-lo, você deve especificar que ele não será cortado.

    Por exemplo, o seguinte mantém o espaço após os dois pontos.

    <j2:whitespace trim="false">${gs.getMessage('Did you mean')}: </j2:whitespace>

    Espaços

    Para codificar um espaço não separável ( ), você pode usar [SP] .

    Por exemplo:

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

    Rastreamento Jelly

    ServiceNow Tem um recurso que permite que a avaliação do Jelly seja rastreada.

    O rastreamento é enviado para o log. Isso só deve ser ativado durante a depuração, pois isso produz muito registro em log. Para ativar o rastreamento, defina a propriedade glide.ui.template.trace como verdadeira. Por exemplo, o script a seguir pode ser executado para fazer isso:

    GlideProperties.set ( 'glide.ui.template.trace' , true ) ;

    Se você quiser ver suas entradas de log no navegador da Web na parte inferior de cada página, navegue até Diagnóstico do sistema > Log de depuração.