Оценка JSP EL без контейнера сервлетов - PullRequest
0 голосов
/ 30 июня 2011

Вот что я хочу сделать:

Map<String, Object> model = new Hashmap<String, Object>();
model.put("a", "abc");
model.put("b", new Hashmap<String, Object>());
model.get("b").put("c", "xyz");
String el = "A is ${a} and C is ${b.c}";
assertEquals(elEval(el, model), "A is abc and C is xyz");

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Да, это возможно, вы можете обратиться к этой ссылке для получения дополнительной информации. Как видите, чтобы использовать автономное выражение EL, вам нужно реализовать несколько классов, таких как javax.el.ELContext. Я обнаружил, что JUEL , являющаяся одной из реализаций выражения EL, уже предоставляет очень хорошие реализации этих классов в пакете de.odysseus.el.util.

Я играл с JUEL. Вот мой тестовый код для вашей справки:

/*
ExpressionFactoryImpl should be the implementation of ExpressionFactory used by  your application server. 
For example , in tomcat 7.0 , it is org.apache.el.ExpressionFactoryImpl , which is inside the jasper-el.jar .
jasper-el.jar  is the implemenation of EL expression provided by tomcat  , el-api.jar is the API of EL expression (i.e. JSR-245)
*/
ExpressionFactory factory = new ExpressionFactoryImpl();

/*
SimpleContext is the utility classes from fuel 
*/
SimpleContext context = new SimpleContext();    

//Set the variables in the context  
Map<String,Object> hashMap =  new HashMap<String,Object>();
hashMap.put("c", "xyz");
context.setVariable("a", factory.createValueExpression("abc", String.class));   
context.setVariable("b", factory.createValueExpression(hashMap, HashMap.class));    

//Create the EL expression 
ValueExpression expr = factory.createValueExpression(context,  "A is ${a} and C is ${b.c}", String.class);  
System.out.println(expr.getValue(context));
1 голос
/ 30 июня 2011

Да и нет. EL является неотъемлемой частью JSP, и JSP-компилятор на самом деле выведет много материала в Servlet et, сгенерированного из файла JSP. В конце дня вызываются методы ExpressionFactory , и вы можете сделать то же самое, чтобы оценить выражение EL (после установки соответствующего ELContext).

Возможно, вам лучше использовать String.format, но это возможно ...

...