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

Mat*_*hew 1 java jsp

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

例:

${person["cellPhoneNumber"]}
Run Code Online (Sandbox Code Playgroud)

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

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

${person.name}
Run Code Online (Sandbox Code Playgroud)

有没有办法绕过这个调用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用JSTL 1.1

Tom*_*icz 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这有点笨拙,不太可扩展.另外,使用反射并自动查找所有字段或将bean转换为map可能更容易(请参阅:如何将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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

${person.optional['cellPhoneNumber']}
Run Code Online (Sandbox Code Playgroud)

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

  • 它更快,更具可扩展性
  • 更能代表你的意图
  • 这是一个更好的设计(正如评论中的duffymo所强调的那样) - Person 具有可选属性,如手机号码.Person 不是可选属性的``Map`.