Objetivos
-
Compreender conceitualmente o que significa usar EL no douidefinition.xml
-
Conhecer os objetos implícitos no douidefinition.xml fora do escopo dos controles
-
Conhecer os objetos implícitos no douidefinition.xml dentro do escopo dos controles
-
Compreender o que é possível resolver com o uso de ELs, e as vantagens de seu uso em determinados cenários
Referências complementares
-
Ciclo de vida de interfaces Doui
-
Ciclo de vida dos controles
Pré-Requisitos
-
http://download.oracle.com/javaee/1.4/tutorial/doc/JSPIntro7.html
-
Ciclo de vida de interfaces Doui
-
Ciclo de vida dos controles
Conceito
EL ou Expression Language é uma linguagem script que permite acessar componentes Java em páginas JSP.
O Lumis dá suporte à utilização de EL, facilitando a implementação de serviços a partir do acesso a alguns objetos do Portal dentro do arquivo douidefinition.xml.
Sintaxe
O padrão que identifica um trecho EL é ‘${object}’ onde ‘object’ é a referência para um Java Bean. Em casos onde é necessário acessar atributos de um objeto, a notação utilizada segue o padrão:
‘${object.property}’.
Exemplo:
<filter id="mainArticleTrue" fieldId="mainArticle" value="${param.lumItemId == null ? true : false}" hidden="true" />
O exemplo acima atribui true ao filtro mainArticleTrue caso o parâmetro do request lumItemId seja null.
Objetos Implícitos
Os seguintes objetos implícitos estão disponíveis para as expressões EL no douidefinition:
-
param: Mapeia o nome de um parâmetro do request para um valor único;
-
paramValues: Mapeia o nome de um parâmetro do request para um vetor de valores;
-
header: Mapeia o nome de um cabeçalho do request para um valor único;
-
headerValues: Mapeia o nome de um cabeçalho do request para um vetor de valores;
-
cookie: Mapeia o nome do cookie para um cookie único;
-
initParam: Mapeia o nome de um parâmetro do contexto de inicialização para um valor único;
-
requestScope: Mapeia nomes de variáveis de escopo do request para seus valores;
-
sessionScope: Mapeia nomes de variáveis de escopo da sessão para seus valores. Corresponde ao escopo de aplicação do PortletSession;
-
applicationScope: Mapeia nomes de variáveis de escopo do aplicação para seus valores;
-
portletSessionScope: Mapeia nomes de variáveis de escopo da sessão do portlet para seus valores. Corresponde ao escopo de portlet do PortletSession;
-
douiContext: é uma instância de lumis.doui.DouiContext corrente;
-
portletMode: Mapeia o modo portlet atual para o EL ser avaliado. O modo é representado por uma string com letras minúsculas;
-
windowState: Mapeia o estado das janelas atuais para o EL ser avaliado. O estado é representado por uma string com letras minúsculas.
Exemplos:
O exemplo a seguir atribui o parâmetro do request cujo nome é ‘titulo’ ao valor do filtro cujo id é ‘title’:
<filter fieldId="title" id="filtro2" value="${param.titulo}" operator="like"/>
Resolução de ELs fora do escopo dos controles
O processo de renderização (render) de uma interface de serviço Doui pode ser esquematizado conforme os passos a seguir:
O processamento das ações (processAction) de uma interface de serviço Doui pode ser esquematizado conforme os passos a seguir:
Fora dos controles, tanto na renderização quanto no processamento das ações, as ELs presentes no douidefinition.xml são resolvidas no momento da criação do DouiContext.
Durante essa etapa de criação do DouiContext, é gerada a definição da instância da interface de serviço, resultado da união da definição da interface de serviço no douidefinition.xml com a definição no nível do serviço dos sources por ela utilizados.
Neste momento, em que a definição da interface de serviço é resolvida, também são resolvidas as ELs presentes.
É importante notar que a definição do serviço no douidefinition.xml pode ser utilizada em outros processos do Portal além da renderização das interfaces e do processamento das ações, como, por exemplo, o processo de indexação de conteúdos. Sendo assim, a utilização de ELs fora do escopo de uma interface não é recomendável, uma vez que a definição pode ser utilizada num processo que não prevê a resolução de ELs, causando efeitos indesejáveis.
Resolução de ELs dentro do escopo dos controles
A figura abaixo representa um esquema simplificado do ciclo de vida dos controles Doui, apresentando os principais passos deste ciclo. Do lado esquerdo estão os passos do processo de renderização de uma interface Doui e do lado direito, em abóbora, os principais passos da renderização de um controle:
A resolução de ELs no ciclo de vida dos controles ocorre logo antes do último passo da renderização de um controle, o método setRenderData. Sendo assim, apenas os dados da definição de um controle lidos neste passo poderão utilizar ELs.
Objetos implícitos no escopo dos controles
Os seguintes objetos implícitos estão disponíveis para as expressões EL no escopo dos controles:
-
controls: Mapeia o id do controle para um controle único;
-
control: Controle corrente;
-
sources: Mapeia o id do source para um source único;
-
source: Source default.
Exemplos:
O exemplo a seguir avalia o campo domain de um source cujo id é domain:
<control:lum_div style="${sources.domain.data.domain == 'lum_global' || sources.domain.data.domain == null ? '':'display:none'}"> <control:lum_label dataId="groupTypeId" /> </control:lum_div>
Neste exemplo, o atributo style de um controle lum_div é decidido com base no valor do campo domain de um source cujo id também é domain. Se o campo domain tiver o valor ‘lum_global’ ou for nulo, o atributo style terá valor vazio, caso contrário será ‘display:none’.
O exemplo a seguir acessa o controle cujo id é “principalList”. A partir deste controle, acessa um canal e seu nome (neste caso, a implementação do controle permite recuperar uma instância de ChannelConfig):
<control:lum_propertyPage title="STR_CHANNEL; ${controls.principalList.channel.name}" icon="lumis/portal/client/images/Access.gif"> ...
Quando não é possível resolver uma EL no escopo de controle com base nos objetos implícitos existentes, essa EL é interpretada como um dado do source default.
Assim, a EL ‘${campo}’ seria equivalente a ‘${sourceDefault.data.campo}’ onde sourceDefault é o source default.
Exemplo:
<control type="lum_selectPageTemplate" id="pageTemplateId" defaultChannelId="${parentId}"/>
Neste exemplo, a EL ‘${parentId}’ referencia o campo parentId do source default.
Boas Práticas no Uso de ELs no douidefinition.xml
As ELs devem ser utilizadas apenas no escopo de uma interface de serviço. Fora desse escopo, a definição presente no douidefinition.xml pode ser utilizada em outros processos do Portal além da renderização e processamento de ações da interface e esses processos não necessariamente prevêem a resolução de ELs.
Atualizado em 18.01.2011