【发布时间】:2013-07-26 21:09:11
【问题描述】:
是否有任何适当的方法来覆盖 JSF 从表达式语言访问 bean 字段的方式?我们的想法是模仿这种行为以访问 Map<String, ?> 值,其中 bean 字段将是映射键。
换句话说,是否可以使用#{beanContainingNestedMap.keyOfSaidNestedMap},就像keyOfSaidNestedMap 是beanContainingNestedMap 的一个字段一样?
如果没有,我还有什么其他解决方案?
示例:
Holder.java
public class Holder {
private Map<String, Object> objects = new HashMap<String, Object>();
public void add(String key, Object value) {
objects.put(key, value);
}
public Object getObject(String key) {
return objects.get(key);
}
}
ExampleBean.java
public class ExampleBean {
private Holder holder = new Holder();
public ExampleBean() {
holder.add("foo", 42);
holder.add("bar", 'X');
}
public Holder getHolder() {
return holder;
}
}
example.xhtml
<c:out value="#{exampleBean.holder.foo}" /> <!-- should print "42" -->
<c:out value="#{exampleBean.holder.bar}" /> <!-- should print "X" -->
如果我能做类似的事情会很棒(一种伪代码,因为我不知道这种方法是否存在;)):
@Override // override JSF's (if any...)
public Object resolveEl(String el) {
try {
super.resolveEl(el);
} catch (ElException e) {
Object bean = e.getBean();
String fieldName = e.getFieldName();
if (bean instanceof Holder) {
Holder holder = (Holder) bean;
Object value = holder.getObject(fieldName);
if (value == null) {
throw e;
} else {
return value;
}
}
}
}
【问题讨论】:
-
这个问题不是关于 JSF 而是关于 EL。 StackOverflow EL wiki 中有一个地图访问部分。举两个例子:
${someMap[dynamicKey]},${some['class'].simpleName} -
@LuiggiMendoza 感谢您的提示,但首先要知道是否可以使用
#{beanContainingAMap.keyOfTheSaidMap}代替,就像keyOfTheSaidMap是bean 的字段一样。跨度> -
如果您检查我评论中提供的链接,您会发现目前不可能。你必须使用
#{exampleBean.holder[foo]}。 -
@LuiggiMendoza 无论如何它在技术上必须是可行的,我错了吗?我会稍等片刻,看看其他可能的答案。但不要犹豫,添加你自己的,因为如果你有唯一正确的答案,我会欣然接受
;) -
您的问题令人困惑。 EL 已经支持使用与 javabeans 完全相同的语法进行映射。