在我的JSP中实现Map的Bean不会调用getter

时间:2012-09-29 15:05:08

标签: java jsp

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

示例:

${person["cellPhoneNumber"]}

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

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

${person.name}

有没有办法绕过这个地图的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

1 个答案:

答案 0 :(得分: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转换为map(参见:How to convert a Java object (bean) to key-value pairs (and vice versa)?)可能更容易。更糟糕的是。

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 不是可选属性的``Map`。