三. 索引 OGNL 第4章. 表达式

 

我们前面已经讨论到,"索引"实际上仍然是属性引用, 但它使用一种"计算"的形式来引用属性, 而不是使用常数的形式.

比如, 对于表达式"array.length", OGNL内部会与下面这个表达式进行完全相同的处理:

array["length"]

而且下面这个表达式也会计算为相同的结果 (虽然在它们的内部表现形式会不同):

array["len" + "gth"]

数组(Array)与列表(List)的索引

 

对于Java数组和列表来说, 索引是相当简单的, 语法与Java相同. 需要给出一个整数下标作为索引, 然后通过这个整数下标引用到对应的元素. 如果索引值超过了数组或列表的有效范围, 会抛出一个IndexOutOfBoundsException异常, 这一点也与Java相同.

 

JavaBean中的索引属性(Indexed Properties)

 

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的属性, 然后再将索引应用到这个属性的返回值上.

 

 

OGNL特有的对象索引属性

 

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"]

posted on 2016-07-11 19:15  雪的心  阅读(117)  评论(0编辑  收藏  举报

导航