Gestão de conteúdo e o mecanismo Apache Jelly
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" />.
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 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>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>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>