在EL表达式出现之前,开发Java Web应用程序时,经常需要将大量的Java代码片段嵌入JSP页面中,这会使得页面看起来很乱,而使用EL表达式则比较简洁。
范例:
在页面中显示保存在session中的变量username,并将其输出到页面中,代码如下:
<%
if(session.getAttribute(“username”) != null){
out.print(session.getAttribute(“username”).toString();
}
%>
如果使用EL,则只需一句代码即可实现
${username}
因此,EL在Web开发中比较常用,通常与 JSTL一起使用。
EL表达式语法:以${开头,以}结束,中间为合法的表达式,具体语法格式如下:
${expression}
参数说明:
Expression:指定要输出的内容,可以是字符串,也可以是由EL运算符组成的表达式。
PS:
由于EL表达式的语法是以${开头,所以如果在JSP页面中要显示字符串S{,则必须在前面加上。即”${” .或者写成“${‘${’}” .
范例:
在页面中输出字符串“JSP学习”,代码如下:
${‘JSP学习’}
EL除了具有语法简单、使用方便的特点,还有以下特点:
A、EL可以与JSTL结合使用,也可以也JavaScript语句结合使用
B、EL中会自动进行类型转换,如果想通过EL输入两个字符串数值(如n1和n2)的和,可以直接通过“+”进行连接(如${n1+n2})
C、EL不仅可以访问一般变量,还可以访问JavaBean中的属性及嵌套属性和集合对象
D、EL中可以执行算术运算、逻辑运算、关系运算和条件运算等操作
E、EL中可以获取湖区命名空间(PageContext对象,他是页面中所有其他内置对象的最大范围的继承对象,通过他可以访问其他内置对象)
F、在EL中可以访问JSP的作用域(request、session、application、page)
G、在使用EL进行除法运算的时候,如果0作为除数,则返回无穷大Infinity,而不是返回错误
H、扩展函数可以与Java类的静态方法进行映射
只要安装的Web服务器能支持Servlet2.4/JSP2.0,就可以在JSP页面中使用EL。由于在JSP2.0之前的版本中没有EL,所以JSP为了和以前的规范兼容,还提供了禁用EL的方法。JSP中提供3中方法禁用EL,分别介绍如下。
使用斜杠是一种比较简单的禁用EL的方法。该方法只需要在EL的起始标记“${”前加上“”。具体语法格式如下:
${expression}
PS:
该语法格式只使用在禁用页面中的一个或几个EL表达式的情形
使用JSP的page指令可以禁用EL表达式,具体语法格式如下:
<%@page isELIgnored=“布尔值”%>
参数说明:
isELIgnored:用于指定是否禁用页面的EL,如果属性值为true,则忽略页面中的EL,否则将解析页面中的EL
范例:
<%@page isELIgnored=”true”%>
PS:
该方法适用于禁用一个JSP页面中的EL
3、在web.xml中配置元素
在web.xml中配置元素可以实现禁用服务器中的EL。
范例:
*.jsp
true
PS:
该方法使用于禁用Web应用中的所有的JSP页面中的EL
同Java一样,EL也有自己的保留关键字,在变量命名时,应避免这些关键字,包括使用EL输出已经保存在作用域范围内的变量,也不能使用关键字,如果已经定义了,那么需要修改为其他的变量名。EL中的保留关键字如下:
and |
eq |
gt |
instanceof |
div |
or |
le |
false |
empty |
not |
lt |
ge |
如果EL中使用了保留的关键字,那么在Eclipse中,将给出错误提示。如果忽略该提示,直接运行程序,将会出错。
EL可以访问数据运算符、算数运算符、关系运算符、条件运算符及empty运算符等。各运算符的优先级如下:
运算符的优先级决定了在多个运算符同时存在的时候,各个运算符的求职顺序,对于同级别的运算符采用从左到右的顺序进行计算。
PS:
使用()可以改变优先级。在复杂的表达式中,使用括号可以使得表达式更容易阅读和避免出错。
通过EL提供的“[]”和“,”运算符可以访问数据。通常情况下,“[]”和“.”运算是等价的,可以相互代替。
范例:
访问JavaBean中的userInfo的id属性,可以写成以下两种形式:
${userInfo.id}
${userInfo[id]}
但是也不是所有的情况下都可以相互替代,例如,当对象的属性名中包含一些特殊的符号(-或.)时,就只能使用“[]”运算符来访问对象的属性。例如:${userInfo[user-id]}是正确的,而${userInfo.user-name}则是错误的。另外,EL的“[]”运算符还有一个用途,就是用来获取数组或List集合中的数据。
数组元素的获取:
应用“[]”运算符可以获取数组的指定元素,但是“.”不能
范例:
获取request范围中的数组arrBook中的第一个元素,可以使用下面的EL表达式:
${arrBook[0]}
范例:
编写array.jsp,该文件中,首先包含一个3元素的以为数组,并赋值,然后通过for循环和EL输出数组中的元素
<%@ page language=java import=java.util.* pageEncoding=UTF-8%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+://+request.getServerName()+:+request.getServerPort()+path+/;
%>
><%
String[] arr = {Java,JSP,MySQL};//定义一维数组
request.setAttribute(book,arr);//将数组保存在request对象中
%>
<%
String[] arr1 = (String [])request.getAttribute(book);//获取保存在request范围内的对象
//通过循环和EL输出一维数组的内容
for(int i = 0 ; i < arr1.length ; i++){
request.setAttribute(requestI, i);//将循环变量i保存在request范围内的变量中
%>
${requestI }:${book[requestI] }
<%
}
%>
List集合元素的获取
应用“[]”运算符还可以获取List集合中的指定元素,但是“.”不行
范例:
session中保存一个包含3个元素的List,并用EL输出
<%@ page language=java import=java.util.* pageEncoding=UTF-8%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+://+request.getServerName()+:+request.getServerPort()+path+/;
%>
><%
List list = new ArrayList();//声明一个List集合对象
list.add(饼干);
list.add(牛奶);
list.add(面包);
session.setAttribute(goodsList, list);//将List保存到session中
%>
<%
List list1 = (List)session.getAttribute(goodsList);//获取保存在session中的对象
for(int i = 0 ; i < list1.size() ; i++){
session.setAttribute(sessionI, i);
%>
${sessionI } : ${goodsList[sessionI] }
<%
}
%>
在EL中,判断对象是否为空,可以通过empty运算符实现,该运算符是一个前缀运算符,即empty运算符位于操作数的前方,用来确定一个对象是否为null或空。Empty运算符的格式如下:
${empty.expression}
范例:
定义两个request范围内的变量user,user1,分别数值为null和“”.
<%request.setAttribute(“user”,””);%>
<%request.setAttribute(“user1”,null);%>
然后通过empty运算符判断user,user1是否为空
${empty user} //返回true
${empty user1} //返回true
另外,empty运算符也可以与not运算符结合使用,判断一个对象或变量是否为空。
范例:
<%request.setAttribute(“user”,””);
${not empty user} //返回值为false
在EL中,通过逻辑运算符和关系运算符可以实现逻辑关系运算。关系运算符用于实现两个表达式的比较,进行比较的表达式可以是数值型也可以是字符串。而逻辑运算符则常用于对Boolean类型的数据进行操作。逻辑运算符和关系运算符经常一起使用。
范例:
在判断考试成绩时,可以用下面的表达式判断60到80分的成绩
成绩>60 and 成绩<80
关系运算符
在EL中,提供了6中关系运算符。关系运算符的使用格式如下:
运算符 |
功能 |
示例 |
==或eq |
等于 |
${10==10}/${10 eq 10} |
!=或ne |
不等于 |
${10!=10}/${“A” ne “A”} |
<或lt |
小于 |
${7<6}/${“A” lt “B”} |
>或gt |
大于 |
${7>6}/${“A” gt “B”} |
<=或le |
小于等于 |
${“A” <= “A”} |
>=或ge |
大于等于 |
${7>=6}/${7 ge 6} |
逻辑运算符
在EL中进行条件运算
语法格式:
${条件表达式?表达式1:表达式2}
参数说明:
条件表达式:用于指定一个条件表达式,该表达式的值为Boolean型。可以由关系运算符、逻辑运算符和empty运算符组成
表达式1:用于指定当条件表达式的值为true时,将要返回的值
表达式2:用于指定当条件表达式的指为false时,将要返回的值
范例:应用条件运算符实现放变量cart的值为空时,输出“cart车为空”,否则输出cart的值。
${empty cart ? ”cart为空” : cart}
通常情况下,条件运算符可以用JSTL中的条件标签或代替