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

标签 java jsf map javabeans el

是否有任何正确的方法来覆盖 JSF 从表达式语言访问 beans 字段的方式?这个想法是模仿这种行为以访问 Map<String, ?>值,其中 bean 字段将是映射键。

换句话说,无论如何都可以使用#{beanContainingNestedMap.keyOfSaidNestedMap}吗? , 就像 keyOfSaidNestedMapbeanContainingNestedMap的领域?

如果没有,我还有什么其他解决方案?


示例:

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

最佳答案

EL可以直接使用map。

持有人.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;
    }

}

EL

#{exampleBean.holder.objectsMap[your-key]}

关于java - 让 JSF 从 EL 而不是 bean 字段访问 Map<String, ?> 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17884028/

相关文章:

c++ - 部分匹配 std::map 中的长键

java - 哪个更快? List.contains() 或 Map.containsKey()

java - Dynamics CRM 2016.Web API 授权。我有 token ,现在呢?

html - ICEFACES commandButton title 属性是否可以具有粗体文本样式?

function - 在 Scala 中,如何链接生成带有过滤器的元组的映射?

javascript - 如何使用ckEditor中的Gists代码片段功能?

java - 多个文件上传 - JSF

java - 如果我在 Spring JPA Gradle 项目的 Jar 文件中找不到 jks 文件怎么办?

java - 在多显示器系统中识别正在运行的显示器小程序

java - Android从常量xml读取值