让JSF从EL而不是bean字段访问Map <String,?>值?

sp0*_*00m 6 java jsf el map javabeans

有没有什么方法可以覆盖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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

example.xhtml

<c:out value="#{exampleBean.holder.foo}" /> <!-- should print "42" -->
<c:out value="#{exampleBean.holder.bar}" /> <!-- should print "X" -->
Run Code Online (Sandbox Code Playgroud)

如果我可以做类似的伪代码(因为我不知道是否存在这样的方法;)),那将是多么伟大的事情:

@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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Zaw*_* oo 16

您可以直接使用EL映射.

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 Map<String, Object> getObjectsMap() {
        return objects;
    }

}
Run Code Online (Sandbox Code Playgroud)

EL

#{exampleBean.holder.objectsMap[your-key]}
Run Code Online (Sandbox Code Playgroud)

  • [your-key]可以成为动态表达吗? (3认同)