Gestão de conteúdo e o mecanismo Apache Jelly

  • Versão de lançamento: Yokohama
  • Atualizado 30 de jan. de 2025
  • 4 min. de leitura
  • O Apache Jelly é um mecanismo de script e processamento baseado em Java e XML para transformar XML em código executável.

    O mecanismo Apache Jelly é muito semelhante ao XML e deve ser confortável para desenvolvedores familiarizados com JavaScript, XML, XHTML ou HTML. Na instância ServiceNow, o mecanismo Apache Jelly renderiza itens como formulários, listas e Páginas de IU. O código Apache Jelly é renderizado bem em um bloco de conteúdo dinâmico, mas pode ter problemas quando usado em blocos estáticos. Você pode usar marcadores, chamadas e declarações do Jelly, mas o HTML funciona exatamente como o 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>

    Certifique-se de que todos os marcadores estejam fechados. Se o marcador não for um marcador de fechamento natural, coloque uma barra antes do colchete final. Por exemplo, um <BR /> ou um <IMG src="cms.png" />.

    Se você não estiver familiarizado com scripts Jelly, revise estes tópicos:

    Inclua o marcador a seguir com todos os scripts do Apache Jelly.

    <j:jelly trim= "false" xmlns:j= "jelly:core" xmlns:g= "glide" xmlns:j2= "null" xmlns:g2= "null" >
    O marcador parece complexo, mas lembre-se das seguintes informações.
    • O script Apache Jelly usa vários namespaces.
    • Existem dois tipos de prefixos nos marcadores: j e g. O prefixo j é usado para marcadores que fazem parte nativamente do Apache Jelly. O prefixo g é usado para marcadores que a plataforma ServiceNow criou e está usando para fins de plataforma.

    Os prefixos j2 e g2 são exatamente como j e g, exceto pelo fato de serem processados em uma segunda fase. O analisador de script Apache Jelly é executado por meio de cada marcador j e g, respectivamente. Por exemplo:

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

    Na fase 1, o analisador executa todos os marcadores j e g. Em seguida, ele armazena em cache o resultado. Antes de executar a segunda fase, ele usa os namespaces j e g e move os namespaces para a segunda fase. Ele é semelhante ao código a seguir.

    <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>
    Para chamadas subsequentes deste script, somente a fase 2 é analisada.
    Nota:
    Se você planeja usar marcadores Jelly de fase 2 (g2 e j2) nas tabelas Tipo de conteúdo [content_type] ou Conteúdo dinâmico [content_block_programmetric], selecione a opção Duas fases no formulário de conteúdo.

    Outro exemplo é criar um relatório de todos os incidentes abertos atribuídos a cada grupo. Para essa finalidade, você pode usar um relatório e economizar tempo, mas é um bom exemplo para aprender Jelly. Comece com o marcador Jelly:

    <j:jelly trim= "false" xmlns:j= "jelly:core" xmlns:g= "glide" xmlns:j2= "null" xmlns:g2= "null" >
    </j:jelly>

    Primeiro, você precisa de uma lista de incidentes em aberto. Use um marcador g2:evaluate. O marcador de avaliação executa o script. Qualquer coisa dentro do marcador é analisada como uma regra de negócio, portanto, por exemplo, você pode chamar regras de negócio globais, inclusões de script e 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>

    Este script está na fase 1 porque não são esperadas mudanças frequentes nos grupos de atribuição de incidentes. Observe também o atributo var no marcador de avaliação. Este atributo especifica qual variável é definida a partir deste bloco. No final do script, há um gr em uma linha isolada. Essa última linha é o que define a variável.

    Você pode omitir a variável jvar_groups, mas todas as variáveis na tag de avaliação se tornam variáveis do Apache Jelly. O object=true especifica que a variável não é um tipo de dados primitivo. Se object=true for omitido, o script será interrompido porque jvar_groups só poderá conter itens como números inteiros e cadeias de caracteres.

    Após o marcador de avaliação, percorra esses grupos e encontre os incidentes de cada um.

    <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>
    Você pode incluir XML normal no script Apache Jelly a qualquer momento. Como não há namespace, o script Apache Jelly não tenta analisar os marcadores XML. Observe o loop j:when. É um loop normal e pode iterar por meio de um objeto GlideRecord. Observe também que você gera um valor com ${HTML:jvar_groups.getValue('name')}. Estes são os elementos importantes:
    • Os colchetes externos, ${}, especificam a saída da variável e a fase na qual a variável é gerada: ${} significa primeira fase, $[] significa segunda fase.
    • O HTML antes da expressão serve para escapar da saída. A expressão jvar_groups.getValue('name') está sendo escapada para HTML. Para outros tipos de escape, há JS (Javascript), NS (sem script) e algumas outras opções.

    Para selecionar apenas um registro e não iterar por meio de muitos registros, o código é semelhante ao exemplo a seguir:

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