我已经制作了一些自定义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
看起来像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)
这是一个更好的方法,因为:
Person 具有可选属性,如手机号码.Person 不是可选属性的``Map`.