EL表达式语法13930.pdf
《EL表达式语法13930.pdf》由会员分享,可在线阅读,更多相关《EL表达式语法13930.pdf(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.1 EL 表达式:EL 表达式规定为:eval-expression 和 literal-expression,同时 EL 表达式支持 Compositeexpressions,很多 EL 表达式(eval-expressions 和 literal-expressions)被聚合在一起。EL 表达式被解析成数值表达式和方法表达式。其中,取值表达式去引用一个值,而方法表达式则是关联一个方法。一旦被解析之后,表达式能够被优化地计算一次或多次。下面我们来分为:eval-expression、literal-expression、Compositeexpressions 来讲述 1.1.1Eva
2、l-expression Eval-expression 是以使用$expr或者#expr结构的形式构成。两种方式都是相同的方式,能很好被解析和计算,尽管它们在使用时有着不同的意义从技术方面来说。从 J2EE 层规范协定来说,$expr结构是直接计算而#expr结构则是延期计算,这种界定符号指出了在 J2EE 层两种表达式类型的语义上面的区别。#expr这种界定符号被称为延迟计算是因为直到系统需要的时候才计算。而$expr这种界定符号则是在 JSP 页面编译的时候就计算,就是为什么叫做直接计算的原因。1.1.1.1 作为取值表达式的计算表达式 当解析成一个取值表达式的时候,eval-expre
3、ssion 能被计算成左值和右值。若在 EL 中有等号操作符号出现,右值是类型出现在等号的右边的表达式,左值同理。右值比如:以下面这个例子为例:当表单被提交的时候,在申请计算的阶段,Faces 计算 EL 表达式#checkOutFormBean.validateEmail作为一个数据接口的引用,这个数据结构的数值是被一个表单相关联的输入参数设置。因此,表达式的结果表现成一个数据结构的引用,或者为一个左值。在翻译阶段,那个相同的表达式被计算,它产生特殊值关联右值对象,作为 JSP 实例。一个左值合法语法是右值合法语法的子集。在特殊情况,一个左值只能由单个变量(比如$name)或者一个从某个对象
4、中解析属性的组成,通过.或 操作符(比如$employee.name 在解析取值表达式时,一个预期的类型是被提供的。拿右值为例,预期的类型是表达式计算被强制的结果。以左值为例,预期的类型是被忽略的,并且在属性被设置之前,提供的值是被强制为一个表达式指向实际的属性类型。在后面提供了类型转换 1.1.1.2 作为方法表达式的计算表达式 在某种情况,计算表达式会描述成引用一个方法而不是模型对象。比如,在 JSF 中,组建标记也提供了引用方法的属性的集合,这些方法能够执行特定为组建标签关联的函数。为了支持这些类型的表达式,EL 定义了方法表达式(ELclass MethodExpresssion)以上
5、面的例子,validator 属性使用了关联方法表达式类型的表达式。做为一个取值表达式,表达式的计算(调用函数)被延期并且在生命周期内的合理的瞬间能够被底层的技术处理。方法表达共享相同的左值语法,它只能由单个变量(比如$name)或者一个从某个对象中解析属性的组成,通过.或 操作符(比如$employee.name)。关于预期返回值类型和参数类型的信息提供在方法被解析的时候。方法表达式被计算在其引用的方法的调用时候或者获取引用的方法信息。计算之上,ELAPI 验证方法必须一致于预期方法的签名在解析时候。因此,没有方法表达式的强制 1.1.2 字面表达式 一个字面表达式不使用$expr或者#ex
6、pr结构并且简单地计算 String 类型文本表达式。在 EL上,一个预期某个类型不止提供 String。比如:表达式:Aloha!类型:String 结果:Aloha!true Boolean Boolean.True 为了生成字面值包括字符串$或者#,开发人员能够选择使用组合表达式比如下面:$exprA#exprB,这里结果是$exprA和#exprB。两者选一个,使用转义字符$和#能够被用于转义,否则,会被处理为取值表达式。$exprA#exprB,这里结果是$exprA和#exprB。字符表达式能够用在任何取值表达式使用的地方。一个字符表达式也能使用一个必须要有返回值的方法。若他们的返
7、回值不是 String 类型,他们会强制类型转换。1.1.3.组合表达式:在多个 EL 表达式被组合一起的地方,EL 也支持组合表达式。取值表达式从左到右北计算,强制成 String 类型,并且连接任何一个插入字面表达式。举个例子,组合表达式$firstName$lastName是由三个 EL 表达式组合而成,取值表达式$firstName、$lastName,表达式。一旦 EL 计算,结果会按照 EL 类型转换规则把从预期的类型强制成 String 类型。混合$和#的结构在组合表达式中是非法的。这种限制的导入是为了避免用户想要使$expr还是#expr指令来计算表达式的含糊不清。举个例子,前
8、面我们提到了,$是直接计算并且#是延迟计算在 J2EEweb 层规范的协定中,这就意味这 EL 表达式在 J2EEweb 层,开发人员不能强制直接计算那些组合表达式和间接计算的其余部分。这种限定可能会在未来的版本中回取消,从而为更高级的 EL 应用模式得到允许。组合表达式能够在任何 EL 表达式除了方法表达式之外的地方使用。仅仅单个取值表达式中能解析方法表达式。1.1.4.语法约束 取值表达式精确地被解析和被计算,在底层的技术导入约束,在 EL 表达式出现时,语法在使用遵循这些约束。比如,在 JSP2.1,#表达式都只能使标签属性接受延迟表达式才被允许,若使用#在其他的地发挥报错误。1.2.字
9、面值 有一些字面值作为 boolean,integer,floatingpoint,string 和 null 类型在取值表达之中。Boolean true 和 false Integer-参看 integerLiteral Floating point-参看 FloayPointLiteral String-单引号和双引号 转义成,转义成,和 转义成。引号只是需要需要转义在 string 封装值在相同的引号类型。1.3.错误,警告、默认值 表达式语言已经被设计出来作为 web 表示层应用程序。在使用时,经验建议最重要的是能够提供尽可能好的表述来设计,甚至在页面中有的一点错误。为了达到这个需求
10、,EL 不提供警告,只是提供默认值和错误。默认值都是类型正确的值,这些值被子表达式赋值当有问题时候。一个错误是异常的抛出(通过 EL 使用的环境来处理异常)。1.4.解析模型对象和他们的属性 一个核心的概念在 EL 中,就是计算模型对象名称到一个对象,并且在一个表达式中分离属性应用于对象(操作符.和)。EL API 提供一个一般化机制,解析器,通过底层技术实现并且定义了规则,它管理模型对象名称的解析和他们关联属性。1.5.操作符和.EL 遵照的 ECMAScript 来统一处理.和 操作符 expr-a.identifier-b 等于 expr-aidentifier-b;验证器 identi
11、fier-b 被用于构造一个字面的值作为一个验证器。计算 expr-aexpr-b:计算 expr-a 的值放到 value-a。若 vaule-a 等于 null:如果 expr-aexpr-b作为末尾的一个属性被解析:若表达式一个值表达式并且 ValueExpression.getValue(context)被调用 ,作为初始化表达式计算,返回 null。否则,抛出 PropertyNotFoundException 的异常.(尝试着去分离引用 null 作为左值)否则,返回 null 计算 expr-b 的值放到 value-b 若 value-b 等于 null;o 如果 expr-a
12、expr-b作为末尾的一个属性被解析:若表达式是一个取值表达式并且 ValueExpression.getValue (context)方法被调用去初始化表达式的计算,返回 null。否则,抛出一个 PropertyNotFoundException.否则返回一个 null 若表达式是一个取值表达式:如果 expr-aexpr-b作为末尾的一个属性被解析:若 ValueExpression.getValue(context)方法被调用去初始化表达式的计算,则调用 elResolver.getValue(context.value-a,value-b)方法。若 ValueExpression.g
13、etType(context)方法被调用,调用 elResolver.getType(context,value-a,value-b)方法。若 ValueExpression.isReadOnly(context)方法被调用,则调用 elResolver.isReadOnly(context,value-a,value-b)方法。若 ValueExpression.setValue(context,val)被调用,则调用 elResolver.setValue(context,value-a,value-b,val)方法。否则,调用 elResolver.getValue(value-a,va
14、lue-b)。否则,表达式则是一个方法表达式:o 若 expr-aexpr-b作为末尾的一个属性被解析:强制 value-b 转化成 String。在解析时,寻找对象 vaule-a 上的 value-b 方法和提供预想的方法参数类型集合。如果不存在这些,或者返回的类型不能匹配预想的回返类型(即方法签名不同),则抛出一 MethodNotFoundException。若 MethodExpression.invoke(context,params)被调用,则通过传递过来参数来调用相应的方法。若 MethidExpression.getMethodInfo(context)被调用,构建和返回一个
15、 MethodInfo 对象。o 否则,调用 elResolver.getValue(value-a,value-b)。1.6 算术操作符号:算术操作只被在 Integer(BigInteger 和 Long)类型和浮点(BigDecimal 和双精度型)值.有五个操作符:加法:+减法:-乘法:*除法:/and div 求余:%and mod 算术操作符的计算在下面的章节中描述。A 和 B 作为计算的字表达式。1.6.1 二元操作符-A+,-,*B 若 A 和 B 都是 null,则返回(Long)0 若 A 或 B 属于 BigDecimal 类型,或者都是,那么:o 若操作符为+,返回 a
16、.add(b)o 若操作符为-,返回 a.subtract(b)o 若操作符为*,返回 a.multiply(b)若 A 或 B 属于 Float,Double,或者包含 String,e 或则 E,o 若 A 或 B 属于 BigInteger 类型,把 A 和 B 强制转化成 BigDecimal 类型并且应用操作符 o 否则,A 和 B 强制成 Double 类型并且申请操作符 若 A 或 B 属于 BigInteger 类型,强制他们成为 BigInteger 类型,然后:o 若操作符为+,返回 a.add(b)o 若操作符为-,返回 a.subtract(b)o 若操作符为*,返回
17、a.multiply(b)否侧,把 A 和 B 强制成 Integer,并且应用符操作符。若操作符产生异常,那么报错误。1.6.2 二元操作符-A/,div B 若 A 和 B 都是 null,则返回(Long)0 若 A 或 B 一个属于 BigDecimal或 一个属于 BigInteger,都强制成 BigDecimal 并且返回 A.divde(B,BigDecimal.ROUND_HALF_UP)。否则,A 和 B 都强制成为 Double 类型并且申请操作符 若操作符产生异常,那么报错误。1.6.3 二元操作符-A%,mod B 若 A 和 B 都是 null,则返回(Long)0
18、 若 A 或 B 属于 Float,Double,或者包含 String。e 或则 E,都强制成 Double 并且申请操作符。若 A 或 B 属于 BigInteger 类型,都强制成 BigInteger 返回 A.remainer(B)。否则强制成 Long 并且申请操作符。若操作符产生异常,那么报错误。1.6.4 一元操作符-A 若 A 是 null,则返回(Long)0 若 A 属于 BigDecimal 类型或则 BigInteger 类型,或则 A.negate()。若 A 是 String 类型:o 若 A 含有 e 或 E,强制成 Double 类型并申请操作符 o 否则强制
19、成 Long 类型并申请操作符 o 操作符产生异常,那么报错误。若 A 属于 Byte,Short,Integer,Long,Float,Double o 保留原类型,并且申请操作符 o 若操作符产生异常,那么报错误。否则,报错误 1.7 关系操作符 =和 eq !=和 ne 和 gt =和 le =和 ge 后面四种第二的版本符号提供使用是为了避免在XML语法中中使用实体引用和含有相同的行为,比如行为 与 lt 一样,以此类推。1.7.1 A =,lt,gt,le,ge B o 若 A=B,若=或者 ge 返回 true。o 若 A 或 B 是 null,return false o 若 A
20、 或 B 属于 BigDecemial 类型,他们都会强制转化成 BigDecemial 类型,并且使用 A.compareTo(B)方法的返回值作为返回值。o 若 A 或 B 属于 Float 或 Double 都强制成为 Double 类型并且申请操作符 o 若 A 或 B 属于 BigInteger,都强制成 BigInteger 类型并且使用 A.compareTo(B)方法的返回值作为返回值。o 若 A 或 B 属于 Byte,Short,Character,Integer,或者 Long等类型都强制成为 Long 类型并且申请操作符。o 若 A 或 B 属于字符型强制成 Strin
21、g 类型,比较字符:o 若 A 属于 Comparable 类型,那么:若 A.compareTo(B)抛出异常,错误。否则利用 A.compareTo(B)结果 o 若 B 属于 Comparable 类型,那么:若 B.compareTo(A)抛出异常,错误。否则利用 B.compareTo(A)结果 o 否则,报错误 1.7.2 A =,!=,eq,ne B o 若 A=B,申请操作 o 若 A 或 B 属于 BigDecemial 类型,他们都会强制转化成 BigDecemial类型,然后:若操作符为 =或者 eq ,返回 A.equals(B)若操作符为 !=或者 eq ,返回!A.
22、equals(B)o 若 A 或 B 属于 Float 或 Double 都强制成为 Double 类型并且申请操作符 o 若 A 或 B 属于 BigInteger,都强制成 BigInteger 类型,然后:若操作符为 =或者 eq ,返回 A.equals(B)若操作符为 !=或者 eq ,返回!A.equals(B)o 若 A 或 B 属于 Byte,Short,Character,Integer,或者 Long等类型都强制成为 Long 类型并且申请操作符。o 若 A 或 B 属于 Boolean,都强制成 Boolean,并且申请符号。o 若 A 或 B 属于 enum,都强制成
23、enum,并且申请符号。o 若 A 或 B 属于字符型强制成 String 类型,比较字符:否则,如果当调用 A.equals(B)产生错误,则报错误。否则,申请符号,并且使用 A.equals(B)的结果 1.8.逻辑操作符 逻辑操作符有:&和 and|和 or !和 not 计算逻辑操作符的说明在下面章节中:1.8.1 二元操作符-A&,|,and,or B A 和 B 强制成 Boolean,申请符号 操作符停止计算,能够由表达式来决定,比如:Aand B and C and C 如果 B 等于 false,然后只有 A 和 B 计算。1.8.2 一元操作符!,not A:A 强制成 B
24、oolean,申请操作符 1.9 空值操作符-empty A 空值操作符是一种前缀操作符,他被使用决定于一个值是否空或者 null。计算空值 A:若 A 等于 null,返回 true 否则如果 A 是空 String,返回 true 否则如果 A 是空 array,返回 true 否则如果 A 是空 Map,返回 true 否则如果 A 是空 Collection,返回 true 否则返回 false 1.10.条件操作符 A?B:C 计算 B 或 C,结果依赖于 A 的计算 强制成 Boolean:若 A 等于 true,计算结果为 B 若 A 等于 false,计算结果为 C 1.11.
25、括号操作符 括号操作符能够改变计算的优先级,比如:$a*(b+c)(先计算 b+c)1.12.操作符优先级 .()-not!empty(一元操作符)*/div%mod +-(二元操作符)=lt gtle ge =!=eq ne&and|or?:带有参数合理的函数拥有的优先级超过符号的优先级。因此,表达式$c?b:f(),是一个非法的,因为 b:f()被解析成一个合理的函数而不是作为一个条件表达式。通常,()操作符能被用作确定优先级,比如:$c?b:(f()1.13.保留字:下列的语言保留字不能由做法标识符:and eq gt true instanceof or ne le false emp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EL 表达式 语法 13930
限制150内