三. 索引 OGNL 第4章. 表达式
我们前面已经讨论到,"索引"实际上仍然是属性引用, 但它使用一种"计算"的形式来引用属性, 而不是使用常数的形式.
比如, 对于表达式"array.length", 在OGNL内部会与下面这个表达式进行完全相同的处理:
array["length"]
而且下面这个表达式也会计算为相同的结果 (虽然在它们的内部表现形式会不同):
array["len" + "gth"]
对于Java数组和列表来说, 索引是相当简单的, 语法与Java相同. 需要给出一个整数下标作为索引, 然后通过这个整数下标引用到对应的元素. 如果索引值超过了数组或列表的有效范围, 会抛出一个IndexOutOfBoundsException异常, 这一点也与Java相同.
JavaBean支持索引属性的概念. 也就是说, 对象包含一组满足以下模式的方法:
-
public PropertyType[] getPropertyName()
-
public void setPropertyName(PropertyType[] anArray)
-
public PropertyType getPropertyName(int index)
-
public void setPropertyName(int index, PropertyType value)
OGNL可以找到以上这类方法, 并在表达式中以索引的形式访问这些方法. 如下形式的引用:
someProperty[2]
会自动地转换到正确的索引属性访问方法上 (上面例子中的引用会转换为getSomeProperty(2) 或 setSomeProperty(2, value)). 如果没有找到索引属性的访问方法, OGNL会使用名为someProperty的属性, 然后再将索引应用到这个属性的返回值上.
JavaBean的索引属性只能使用整数值作为索引,
OGNL扩展了索引属性的概念, 使得可以使用任意对象作为索引. 当为对象索引查找可用的访问方法时, OGNL会寻找满足以下模式的方法 :
-
public PropertyType getPropertyName(IndexType index)
-
public void setPropertyName(IndexType index, PropertyType value)
其中 PropertyType 和 IndexType 在set和get方法对中必须是一致的?.
使用对象索引的一个实际例子是, Servlet API中的Session对象有两个方法用来读取和设置任意的属性 :
public Object getAttribute(String name) public void setAttribute(String name, Object value)
下面的OGNL表达式可以用来读写Session中的属性:
session.attribute["foo"]
孜孜不倦,必能求索;风尘仆仆,终有归途。