4.1.3 EL表达式取值规则

4.1.3 EL表达式取值规则

EL表达式的取值是从左到右进行的。对于expression-a[expression-b]这种形式的表达式,其意思是根据expression-bexpression-a中取出数据,具体来说EL表达式的取值规则如下:

  • 先计算expression-a得到value-a
  • 如果value-anull,从null里面是无法取出什么值,所以直接返回null
  • 如果value-a不为null,则继续计算expression-b得到value-b
  • 如果value-bnullvalue-a中取出null,这也是不对的,所以直接返回null
  • 如果value-ajava.util.Map,则表达式的意思是,value-a这个Map集合中取出keyvalue-b的值.那么检查value-b是否为Map中的一个key
    • 如果是key,则根据keyMap中取出一个值,也就是返回value-a.get(value-b)的结果。
    • 如果不是key,那自然取不到对应的值,将返回null
  • 如果value-ajava.util.List,则这个的表达式的意思是value-a这个List集合中取出下标为value-b的值
    • 下标都是int类型的,所以首先把value-b强制转换为int类型,如果强制转换失败,则抛出异常。
    • 如果强制类型转换为int类型成功,但是value-a.get(value-b)抛出IndexOutOfBoundsException异常,则返回null
    • 如果强制转换为int类型成功,并且不抛出IndexOutOfBoundsException异常,返回value-a.get(value-b)的结果,也就是返回value-a这个List集合中下标为value-b的值.
  • 如果value-a是一个Array,那么表达式的意思是:value-a这个Array集合中取出下标为value-b的数据,则要进行以下处理:
    • 首先把value-b强制转换为int类型,如果强制转换失败,则抛出异常。
    • 假如Array.get(value-a, value-b)抛出ArrayIndexOutOfBoundsException,则返回null
    • 以上没问题的话则返回Array.get(value-a, value-b)的值.也就是返回value-a这个Array集合中下标为value-b的数据
  • 如果value-a不是一个MapList或者 array,那么,value-a必须是一个JavaBean,此时表达式的意思是:从value-a对象中取出属性名称为value-b的属性的属性值
    • 首先强制转换value-bString类。如果value-bvalue-a对象的一个可读属性,则要调用该属性的getter方法从value-a对象中取出属性值。
    • 如果getter方法抛出异常,该表达式就是无效的,
    • 否则,该表达式有效。