Estendendo JSF EL com JBoss EL

Uma das features que faz falta na JSF EL (Unified EL) é a não possibilidade de executar métodos sobre um objeto qualquer ou mesmo passar parâmetros para um método, isto é, não é possível por exemplo se utilizar de uma EL como #{managedBean.list.size()} ou #{managedBean.addSomeThing(row)}.

Enfim, atualmente a especificação nos limita apenas a obter propriedades de um objeto através de getters e setters ou obter os elementos de um map pelo nome. Contudo o pessoal da JBoss estendeu a JSF EL criando a JBoss EL -que hoje é utilizada no JBoss Seam– que traz diversas melhorias na expressividade e poder da expression language, entre elas a comentada um pouco acima.

Instalando

A instalação e configuração da JBoss EL no seu projeto é muito simples, e o melhor, não se faz necessário a instalação do JBoss Seam.

O primeiro passo é baixar a implementação da JBoss EL e então adicioná-la ao classpath (/WEB-INF/lib/) da sua aplicação, depois disso basta apenas adicionar um parâmetro de contexto no web.xml da aplicação para usar a lib:


	com.sun.faces.expressionFactory
	org.jboss.el.ExpressionFactoryImpl

Pronto! Você já pode se utilizar da JBoss EL para executar métodos e passar parâmetros para estes métodos quando necessário.

Features

O extensão traz diversas features interessantes e bastante utéis no nosso dia a dia, entre elas a já comentada passagem de parâmetros:


Podemos também escrever expressões como abaixo:

 5}" />

Bacana, não? Então o que vocês acham da feature a seguir?

Uma das features mais interessantes é a projection. Com ela é possível iterar coleções (list, set etc) de objetos de maneira simples através de sub-expressões, e o melhor, é possível iterar coleções aninhadas, algo realmente prático quando não se deseja escrever muito código nos managed beans.

Com a sintaxe de projections podemos fazer algo tão simples quanto:

#{company.departments.{d|d.name}}

Ou podemos ir mais longe com:

#{company.departments.{d|d.employees.{emp|emp.lastName}}}

É importante ressaltar que esta sintaxe não pode ser utilizada diretamente nas páginas (xhtml ou jsp) pois tanto Facelets quanto JSP não conseguem interpretá-la.

Limitações

Existem algumas limitações que se deve ficar atento, porém não é nada de outro mundo.

Eu particularmente considero a não compatibilidade com JSP 2.1 (isso mesmo, ela é compatível apenas com JSP 2.0) como a principal e a mais crítica da extensão, pois nem todas as aplicações com JSF 1.2 se utilizam de Facelets, mas deveriam, pois já é sabido de todos que qualquer aplicação séria desenvolvida em Jsf deveria utilizar-se de Facelets.

Então se você quer utilizar essa extensão com JSF 1.2 você deverá utilizar Facelets querendo ou não.

Concluindo

Aproveitem a extensão, evitem as gambiarras e as tentativas deploráveis de passagens de parâmetros utilizadas hoje em dia. A instalação da extensão é simples, a utilização é mais simples ainda, e o melhor de tudo é que há grandes possibilidade de fazer parte da JSR 314.

A extensão só tem a melhorar (versões futuras já estão sendo implementadas), principalmente em relação a sintaxe de projections (que poderá mudar em breve), possibilitando assim uma maior manipulação de coleções nas páginas.

Enfim, se seu projeto se utiliza de JSF 1.2 e você pretende utilizar a JBoss EL você já pode aproveitar e migrar suas páginas para Facelets, no final você e sua aplicação só tem a ganhar.

20 Replies to “Estendendo JSF EL com JBoss EL”

  1. Muito bom post Ponte!
    Já tinha visto sobre a passagem de parâmetros, mas não sabia sobre essa iteração em coleções.
    Parabéns.

  2. Achei muito bacana a possibilidade de manipular métodos fora os get e sets, porém não gostei da limitação com relação a versão do JSP 2.0 e com relação ao uso de facelets.

  3. Achei bastante interessante esse cara..
    já tentei usar uns EL nessa maneira (não o projections) e infelizmente tive que recorrer às ‘gabiarra’ mesmo!
    bom post!

    Abraço!

  4. Legal! Vinha funcionando legal até hoje quando precisei acessa uma propriedade de outra propriedade embutida, assim :

    Fornecedor.endereco.bairro

    o erro é :
    javax.el.PropertyNotFoundException: /Fornecedor.xhtml @54,78 value=”#{row.endereco.bairro}”: The class ‘Endereco’ does not have the property ‘bairro’.

    E agora?? 😦

    PS: se colocar row.endereco.getBairro() funciona, mas só pra consulta pois não faz o seter se eu precisar de um formulario!

  5. Pra quem usa Maven 2 e Tomcat 6:
    Eu tive que tirar a el-api das dependências pois ela já existe no lib do Tomcat.

    Assim:

    org.jboss.el
    jboss-el
    2.0.1.GA

    javax.el
    el-api

  6. Cara fiz o descrito no post e não funcionou, é como se o container não interpretase o context param com.sun.faces.expressionFactory usando o default da apache (JBoss e Tomcat)

  7. Hugo,

    Levando em consideração que você não caiu em nenhum dos problemas relatados no tópico “Limitações” deste post eu posso tentar ajudar com um experiência minha, abaixo.

    Eu tive problemas com uma versão especifica do Mojarra (implementação de referência JSF1.2 da Sun), o problema estava na versão 1.2_04. Mesmo configurando corretamente, no Tomcat, ainda assim a EL não era interpretada nas páginas.

    A dica que dou é que mude a versão da implementação JSF que você está utilizando. Se assim ainda não funcionar poderemos investigar melhor os possíveis problemas.

    Ps.: Se possível, entre na lista de discussão do #javasf, lá com certeza muitos do membros se utilizam da JBoss EL, e provavelmente poderão te passar um feedback bem mais rápido que o meu.

    Abraços e boa sorte.

  8. olá Rafael boa noite
    quanto “Uma das features que faz falta na JSF EL (Unified EL) é a não possibilidade de executar métodos sobre um objeto qualquer” acredito que seja possível sim ,eu etava estudando o código gerado pelo NetBeans no projeto de exemplo JsfJpaCrud quando vi um troço lá que pelo menos nunca tinh visto:

    mas ao meu ver é exatamente isso que esse código tá fazendo.Desculpa ai se estiver falando besteira é que ainda tou ganhando experiência em JSF

  9. Olá Ricardo, tudo bom?

    O seu código não apareceu no comentário, as vezes isso acontece, se puder comentar novamente tentando colocar o código eu ficaria grato!

    Um abraço.

  10. olá, desculpe a demora!!
    bem num data table ele coloca o seguinte:

    e cria um el-resolver chamado JsfCrudELResolver(uma pequena classe de 642 linhas) mas funciona .

  11. Olá Otávio,

    Na verdade não entrou na JSF 314, mas com Servlet 3.0 é possível usar algumas features da JBoss EL, entre elas a passagem de parâmetros na chamada de métodos!

    Infelizmente não é possível usar projections – a feature mais interessante da JBoss EL

Deixe um comentário