1

我制作了一些实现 Map 接口的自定义 bean,以便轻松访问我的 JSP 中的任意数据。

例子:

${person["cellPhoneNumber"]}

这些额外的数据可能会或可能不会添加到后端,因此 Map 似乎是一种很好的灵活存储方式。

当我尝试在我的 bean 上使用 getter 时,问题就出现了。我的 Person 类有一个getName()方法。在我的 JSP 中使用以下内容时,将Map.get()调用该方法而不是我的方法。

${person.name}

有没有办法绕过这个对 Map 的get("name")调用并getName()改为调用?

这是我的基本(精简)Java 类:

class Person implements Map
{
    private HashMap<String, Object> myMap;
    private String name;
    public Object get(Object key)
    {
        return myMap.get(key);
    }
    public String getName()
    {
        return this.name;
    }
}

使用 JSTL 1.1

4

1 回答 1

5

看起来 servlet 容器将每个实现Map接口的类视为一个映射并完全丢弃其他方法,退回到按键查找。我看到两个解决方案:

1)get(Object key)应注意正常属性:

class Person implements Map
{
    private HashMap<String, Object> myMap;
    private String name;
    public Object get(Object key)
    {
        switch(key) {
            case "name": return getName();
            default: myMap.get(key)
        }
    }
    public String getName()
    {
        return this.name;
    }
}

这有点笨拙,而且不是很可扩展。此外,使用反射并自动查找所有字段或将 bean 转换为映射可能更容易(请参阅:如何将 Java 对象(bean)转换为键值对(反之亦然)?)。更糟。

2)将您的地图公开为特殊的bean属性:

class Person
{
    private HashMap<String, Object> optional;
    private String name;
    public Map<String, Object> getOptional()
    {
        return optional;
    }
    public String getName()
    {
        return this.name;
    }
}

然后你的 EL 表达式如下所示:

${person.optional['cellPhoneNumber']}

这是一种更好的方法,因为:

  • 它更快,更具可扩展性
  • 更好地代表您的意图
  • 这是一个更好的设计(正如duffymo在评论中强调的那样) -Person 具有可选属性,如手机号码。Person 不是可选属性的“映射”。
于 2012-09-29T15:15:39.377 回答