本篇我们讨论表达式语言(Expression Language,EL)。我们先论述一下它的语法。
EL语法
EL语法很简单,所有EL表达式都以${开始,以}结束。例如${expr}。
“[]”和“.”操作符
EL使用“[]”和“.”操作符来访问数据,${expr.identifier}等价于${expr[i"dentifier"]}。例如,访问javabean对象user的属性name,可以写成如下两种形式。
${user.name}; ${user["name"]};如果使用"."操作符,要求点号左边是一个Map或javabean。例如,在servlet中
Map names = new HashMap(); names.put("one","shan"); names.put("tow","dong"); request.setAtrribute("names",names);
在jsp中,第一个姓名是:${names.one},如果使用“[]”,左边可以使Map,javabean,List或数组。例如在servlet中,
String names = {"shan","dong"}; requset.setAttribute("names",names);在jsp中,第一个姓名是:${names[0]},也可以用${names["0"]}。在EL中,数组和List中的String类型的索引会被强制转换为int。
算数操作符
在EL中,共有5个算数操作符+,-,*,/(或div),%(或mod)。分别代表加,减,乘,除,取模。
注意,对于除法运算,如A/B。如果A和B为null,则返回(Long)0,如果A和B类型是BigDecimal或BigInteger,将被强制转换为BigDecimal,然后返回A.divide(B,BigDecimal.ROUND_HALF_UP),其他情况下,则将A和B强制转换为Double,然后相除。
关系运算符
在EL中,有6个关系运算符等于(==或eq),不等于(!=或ne),小于(<或lt),大于(>或gt),小于等于(<=或le),大于等于(>=或ge)。
逻辑操作符
在EL中,共有3个逻辑操作符。逻辑与(&&或and),逻辑或(||或or),逻辑非(!或not)。
Empty操作符
Empty操作符是一个前缀操作符,用于检测一个值是否为null或empty。例如,变量A不存在时,${empty A}返回true。
条件操作符
EL中的条件操作符为“?:”,用法等同于java中的"?:"。
圆括号
用于改变执行的优先级。
操作符优先级(从高到低,从做到右)
[] .
()
-(unary) not ! empty
* / div % mod
+ -(binary)
< > <= >= lt gt le ge
== != eq ne
&& and
|| or
?:
隐含对象
EL 表达式定义了11个隐含对象,使用这11个对象可以很方便的读取到session,cookie,HttpHeader,用户提交表单(param)等。具体内容如下表。
隐含对象 | 内容 |
applicationScope | 应用程序范围内的scoped变量组成的集合 |
cookie | 所有cookie组成的集合 |
header | HTTP请求头部,字符串 |
headerValues | HTTP请求头部,字符串集合 |
initParam | 全部应用程序参数名组成的集合 |
pageContext | 当前页面的javax.servlet.jsp.PageContext对象 |
pageScope | 页面范围内所有对象的集合 |
param | 所有请求参数字符串组成的集合 |
paramValues | 所有作为字符串集合的请求参数 |
requestScope | 所有请求范围的对象的集合 |
sessionScope | 所有会话范围的对象的集合 |
${header["host"]},得到HTTP连接头部的host值
${header["accept"]} ,获得HTTP头部的accept值
${header["user-agent"]},获得HTTP头部的user-agent值
注意,对于包含连字符“-”和其他一些特殊字符的字符串只能使用“[]”操作符,而不能使用"."操作符。所以,上面的两个例子可以改用${header.host},但是最后的例子只能使用上面的方式。
假设用户提交信息为 ?name=shan&alies=shan.net.cn(这里有两种访问方式,一种是使用"[]"来进行访问,另外一种是使用". "来进行访问,两种访问效果是一样的。)
${param["name"] } j结果为shan
${param.name}结果为shan
${param["alies"] } 结果为shan.net.cn
${param.alies} 结果为shan.net.cn
命名变量
在EL中,对于命名变量值的查找是通过PageContext.findAttribute(String)方法来完成的。例如,${user}。这个表达式将按照page,request,session,application范围的顺序查找命名的属性user,如果没找到,返回null。我们也可以利用pageScope,requestScope,sessionScope,applicationScope指定范围,如${sessionScope.user}。
函数
在EL中,允许定义和使用函数,函数的语法如下:
ns:func(a1,a2,...,an)
其中前缀ns必须匹配包含了函数的标签库的前缀,func是函数的名字,n1,n2等是函数的参数。
函数的定义和使用机制类似于标签库,例如,编写一个转换编码格式的函数,将字符串从一种字符集转换到GBK编码。首先编写一个java类,将该函数声明为静态函数。代码如下:
package com.shan.el; import java.io.*; public class MyFunc { public static toGBK(String str, String charset) throws UnsupportedEncodingException { return new String(str.getBytes(charset),"GBK") } }
然后在标签库描述符文件中对函数进行声明
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <uri>myfunc</uri> <function> <name>toGBK</name> <function-class>com.shan.el.MyFunc</function-class> <function-signature> java.lang.String toGBK(java.lang.String, java.lang.String) </function-signature> </taglib>
最后编写一个测试页面
<%@ page contentType="text/html;charset=gb2312" %> <%@ taglib uri="/myfunc" prefix="myfn"%> 欢迎,${myfn:toGBK(param.username,"ISO-8859-1") }!
最后在浏览器网址栏输入对应的url(如http://localhost:8080/Test/test.jsp?username="张三"),就可以看到最后结果。
转载请注明出处:http://blog.csdn.net/iAm333