domingo, 13 de setembro de 2015

OGNL + Struts 2 - Porque causa tanta confusão ?

Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.

O tema de hoje é voltado para desenvolvedores que já estão familiarizados com o framework Struts 2.  Não explicarei aqui como funcionam as tags do Struts pois, não é esse o nosso objetivo. Caso você, amiguinho, não conheça nada desse framework, recomendo fortemente que você dê uma clicada aqui e veja essa listagem de tutoriais.

Tenho experiência de alguns anos com o framework Struts 2 e toda vez que preciso recuperar dados usando OGNL, me sinto um pouco inseguro e desconfortável mas, porque ? Tenho de admitir que sou muito fã de Expression Language (EL) + JSTL porque, com eles consigo trabalhar de forma límpida e rápida. A verdade era que a OGNL não descia pela minha garganta porque, achava muito complicado, existem várias formas de se fazer a mesma coisa. Eu nunca sabia quando usar o #, o %{expressão}, o @ ou o attr e isso ainda podia piorar porque, as vezes via em alguns exemplos, pessoas realizando combinações desses caracteres. Isso tudo me estressava profundamente, eu não conseguia entender o que eu tinha de fazer e acabava testando combinações aleatórias, esperando a primeira funcionar. Porém, como o nosso foco não pode conhecer limites, tive que aprender OGNL e gostar dela.

A OGNL não é nada mais, nada menos que um tipo de linguagem de escopo de página, usada para recuperar dados dos diferentes contextos de uma aplicação. Antes que você me pergunte se é possível utilizar OGNL com outro framework que não seja o Struts 2, eu te respondo que nunca vi tal integração. Nem com o Struts 1, acho que é possível.

Depois de um certo tempo de pesquisa, consegui achar uma resposta para minha penosa dúvida. Tal resposta a qual, servirá para construir exemplos em uma aplicação web mostrando que a mesma é verídica. Então, aperte seus cintos.

Como disse anteriormente, a OGNL é usada para recuperar valores de um determinado escopo onde, esse escopo pode ser request, sessão ou aplicação. Porém, antes de sabermos de qual escopo queremos recuperar nosso dado, precisamos saber qual o seu nome logo, sempre que usarmos OGNL temos que especificar qual o nome do nosso objeto (objectName) tanto, para simples recuperações quanto, para montagem de expressões. Esta é a nossa premissa básica.

Vou separar as explicações por perguntas, acho que assim fica mais fácil para você encontrar.

  • Quando uso o # ? 
Usamos a tralha ou jogo da velha para fazer referência a objetos que estejam no nosso ActionContext, ou seja, no contexto da nossa action. Como assim ?
    • #objectName - Objeto que tenha sido criado usando as tags do struts com o escopo padrão.
    • #parameters.objectName - Um parâmetro do request.
    • #request.objectName  - Um atributo de escopo de request.
    • #session.objectName  - Um atributo de escopo de sessão.
    • #application.objectName  - Um atributo de escopo de aplicação.
    • #attr.objectName  - Um atributo que pode estar nos seguintes contextos: page, request, session ou application. A busca é feita nessa ordem.
Exemplo:
Figura 1 - Primeiro exemplo do uso da #
Figura 2 - Segundo exemplo do uso da #
Note que utilizarmos a OGNL sem as tags do Struts, as expressões são renderizadas como se fossem texto. É possível recuperar valores de um determinado escopo das seguintes formas:
    • #escopo.objectName
    • #escopo['objectName']
Se você entendeu o uso do # então, você já entendeu 75% do uso da OGNL no Struts 2. Parabéns, você já entendeu o mais complicado.
  • Quando uso o %{expressão} ?
Usamos o %{expressão} para forçar a OGNL avaliar o dado pelo seu real tipo ou para invocar um método, como por exemplo o método getText (usado para obter valores de arquivos de propriedades).

Figura 3 - Exemplo de uso do %{expressão}
Acima existem dois testes. Duas estruturas condicionais foram montadas, a primeira em cima de um atributo de um objeto e a segunda baseada em um atributo Integer da action. No primeiro if é necessário usar o %{} pois o Struts não conhece o tipo do objeto pessoa logo, ele não consegue fazer a comparação mas, como a segunda é feita em cima de um atributo do tipo Integer, não é necessário o uso do %{}. Condições realizadas em cima de tipos primitivos e seus wrappers não necessitam do %{}.

 <s:set name="var" value="%{myDinamicValue}" />  
   
 <s:set name="var" value="myDinamicValue" />  

No exemplo acima, o valor da nossa variável var, será o valor da variável myDinamicValue e no segundo exemplo, o valor final de var será a String myDinamicValue.
  • Quando uso o @ ?
Usamos a @ quando queremos fazer referência a recursos estáticos, ou seja, propriedades e métodos. Para utilizar essa facilidade, você deve habilitá-la em seu arquivo struts.xml, adicionando a propriedade: struts.ognl.allowStaticMethodAccess=true.

IMPORTANTE: A partir da versão 2.3.0, o acesso a recursos estáticos através de OGNL é deprecated.

Exemplo:
Figura 4 - Exemplo de uso do @
  • Quando usamos o $ ?
A OGNL não faz uso do $ logo, não irá funcionar. Caso você já tenha visto o uso do dólar acompanhado de chaves em tags do Struts 2, resultará em erro ou, em uma String comum.

Para baixar o projeto, clique aqui.

Dúvidas !? Sugestões ?! Críticas ou elogios ?!

Deixe aí nos comentários ou na nossa página do facebook.

Facebook: https://www.facebook.com/precisoestudarsempre/

Referências:
What's the difference between # , % and $ signs in Struts tags - http://stackoverflow.com/questions/8007858/whats-the-difference-between-and-signs-in-struts-tags