Usar a Unified Expression Language (JSP/EL) com Swing. É possível?

8 respostas
ViniGodoy

É possível usar a Unified Expression Language com Swing? Se é, como?

Gostaríamos que nosso usuário fosse capaz de fazer um mapa com valores como:
${test.name}

Onde test seria um objeto presente em runtime. Nós então resolveríamos a expressão, sempre que ele precisasse dela.

A idéia seria que ele fosse capaz de criar um “dicionário” associando uma chave, a expressões como essa. Então, ao requisitar a chave, a aplicação avaliaria a expressão com variáveis presentes em runtime, e retornaria o valor resolvido.

8 Respostas

victorwss

Já vi um negócio assim em algum lugar, mas já faz bastante tempo. Se não me engano o negócio é ter os JARs corretos no classpath e invocar um monte de comandos manualmente (os que normalmente o container faria automaticamente).

ViniGodoy

Estou cogitando a idéia de usar um GroovyShell para isso.

Já que a GString suporta a EL, e os Bindings são um meio fácil de dizer com que classes ele deve trabalhar.

ViniGodoy

É, vamos fazer com o Groovy mesmo.

Um exemplo:

Binding binding = new Binding();
        GroovyShell gs = new GroovyShell(binding);

        binding.setVariable("Nome", gs.evaluate("\"Vinicius\""));
        binding.setVariable("Sobrenome", gs.evaluate("\"Godoy\""));
        
        binding.setVariable("NomeCompleto", gs.evaluate("\"${Nome} ${Sobrenome}\""));
        binding.setVariable("NickGUJ", gs.evaluate("\"${Nome[0..3]}${Sobrenome}\""));        
        binding.setVariable("NomeCompletoInvertido", gs.evaluate("\"${NomeCompleto.reverse()}\""));
        
        System.out.println(gs.getVariable("NomeCompleto"));
        System.out.println(gs.getVariable("NickGUJ"));
        System.out.println(gs.getVariable("NomeCompletoInvertido"));

A saída disso aí é:
Vinicius Godoy
ViniGodoy
yodoG suiciniV

Agora basta trabalhar nos detalhes.

nbluis

Realmente eu não conhecia o GroovyShell.
To devendo a mim mesmo estudar mais sobre Groovy.

Mas, você já deu uma olhada no velocity?

Uma boa alternativa.

ViniGodoy

Não, ainda não vi o velocity, vou dar uma pesquisada.
Aí está o exemplo ali de cima "retrabalhado". É mais ou menos isso que queríamos:

public static Map<String, String> evaluate(LinkedHashMap<String, String> ruleSet) {
   Binding binding = new Binding();
   GroovyShell gs = new GroovyShell(binding);
        
   Map<String, String> result = new LinkedHashMap<String, String>();
   for (Map.Entry<String, String> entry : ruleSet.entrySet()) {
      gs.setVariable(entry.getKey(), gs.evaluate("\"" + entry.getValue() + "\""));
      result.put(entry.getKey(), gs.getVariable(entry.getKey()).toString());
   }
   return result;
}
    
public static void main(String[] args) {
   LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
   map.put("Nome", "Vinicius");
   map.put("Sobrenome", "Godoy");
   map.put("NomeCompleto", "${Nome} ${Sobrenome}");
   map.put("NickGUJ", "${Nome[0..3]}${Sobrenome}");
   map.put("NomeCompletoInvertido", "${NomeCompleto.reverse()}");
        
   Map<String, String> result = evaluate(map);
   for (Map.Entry<String, String> entry : result.entrySet())
      System.out.println(entry.getKey() + ": " + entry.getValue());        
}
A saída é: Nome: Vinicius Sobrenome: Godoy NomeCompleto: Vinicius Godoy NickGUJ: ViniGodoy NomeCompletoInvertido: yodoG suiciniV

O Groovy é realmente muito bom, superou muito as nossas expectativas.

nbluis

O velocity também é muito legal e também bem poderoso.

Dê uma olhada no exemplo simples aqui do guj.
http://www.guj.com.br/java.tutorial.artigo.18.1.guj

ViniGodoy

Estou lendo o Getting Started dele nesse exato momento. :wink:

ViniGodoy

Nossa… é muito próximo do que eu queria também.

Mas no nosso caso, não creio que terá vantagem. Nossos usuário já usam groovy. E nossa aplicação já tem o .jar do groovy embarcado. De qualquer forma, foi bom conhecer! :slight_smile:

Vou estudar mais à respeito num futuro próximo.

Criado 4 de janeiro de 2008
Ultima resposta 4 de jan. de 2008
Respostas 8
Participantes 3