我已经制作了一些实现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
答案 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']}
这是一个更好的方法,因为:
Person
有可选属性,如手机号码。 Person
不是可选属性的``Map`。