通常情况下,我可以访问嵌套bean的属性,在这种情况下,address
的address_name
:
#{customer.address.address_name}
比如说,我有一个字符串:
String addressPath = address.address_name
如何用#{customer}
和#{addressPath}
访问address_name
?
I tried
#{customer[addressPath]}
我不知道是否存在这样做的标准方法…但我用创造一种方法进入"消费者"。bean(或作用域内的helper bean)以编程方式动态求值EL表达式。
你可以实现这样一个方法:
public class Costumer{
...
public Object eval(String exp) {
//Concatenate your bean name or do it before method call instead
//to get a String with a content like: "customer.address.address_name"
exp = "customer." + exp;
FacesContext facesContext = getFacesContext();
Application appContext = facesContext.getApplication();
ExpressionFactory expFactory = appContext.getExpressionFactory();
ELContext expContext = facesContext.getELContext();
ValueExpression valExp = expFactory.createValueExpression(expContext,exp, Object.class);
return valExp.getValue(expContext);
}
...
}
然后你只需要这样调用这个方法:
#{customer.eval(addressPath)}
或#{customer.eval(myScopedBean.addressPath)}
我认为存在更好的解决方案,也许你的JSF框架或组件库(seam, primefaces, richfaces, omnifaces等)有一个方法来做这样的事情。