一、EL表达式
1. EL简介:
表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容。通过EL可以简化在JSP开发中对对象的引用,从而规范页面代码,增加程序的可读性及可维护性。
2. EL有以下几个特点:
EL可以与JSTL结合使用,也可以与JavaScript语句结合使用;
EL中会自动进行类型转换。如果想通过EL输入两个字符串型数值的和,可以直接通过”+”号进行连接,如${num1+num2};
EL不仅可以访问一般变量,还可以访问JavaBean中的属性以及嵌套属性和集合对象;
在EL中可以获得命名空间(PageContext对象,它是页面中所有其他内置对象的最大范围的集成对象,通过它可以访问其他内置对象);
在使用EL进行除法运算时,如果除数为0,则返回无穷大Infinity,而不是错误;
在EL中可以访问JSP的作用域(request、session、application以及page);
扩展函数可以与Java类的静态方法进行映射。
3. 与低版本的环境兼容——禁用EL
目前只要安装的Web服务器能够支持Servlet 2.4/JSP 2.0,就可以在JSP页面中直接使用EL。由于在JSP2.0以前版本中没有EL,所以JSP为了和以前的规范兼容,还提供了禁用EL的方法。有以下三种方法:
1)、使用斜杠”\”
只需要在EL的起始标记“$”前加上”\”即可;
2)、使用page指令
使用JSP的page指令也可以禁用EL表达式,语法格式如下;
<%@ page isELIgnored=”布尔值”%> true为禁用EL
3)、在web.xml文件中配置
*.jsp
true
二、EL的语法
${ EL exprission }
${ bean.name } 或 ${ bean['name'] }
<%@ page isELIgnored ="true|false" %>
三、EL运算符
算术运算符有五个:+、-、*或$、/或div、%或mod
关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
逻辑运算符有三个:&&或and、||或or、!或not
其它运算符有三个:Empty运算符、条件运算符、()运算符
1、通过EL访问数据
通过EL提供的”[]”和”.”运算符可以访问数据。通常情况下这两个运算符是等价的,可以相互代替。
但也不是所有情况下都可以相互代替,例如当对象的属性名中包含一些特殊的符号(-或.)时,就只能使用[]来访问对喜爱那个的属性。例如{userInfo.user-name}是错误的。
下面给出通过这两运算符访问数据的例子:
1)、获取数组元素(只能使用[],不能用.)
<%
String[] str = {"一号" , "二号" , "三号" , "四号" , "五号"};
request.setAttribute("user",str);
%>
<%
String[] str1 =(String[])request.getAttribute("user");
for(int i=0; i < str1.length; i++){
request.setAttribute("rt",i);
%>
${rt}: ${user[rt] }
<% }%>
2)、List集合元素的获取(只能使用[],不能用.)
<%
List list = newArrayList();
list.add("一号");
list.add("二号");
list.add("三号");
session.setAttribute("user",list);
%>
<%
List list1 =(List)session.getAttribute("user");
for(int i = 0 ; i < list1.size() ;i++){
request.setAttribute("rt",i);
%>
${rt}: ${user[rt] }
<% }%>
2、在EL中进行算术运算
运算符 功能 示例 结果
+ 加 ${1+1} 2
- 减 ${1-1} 0
* 乘 ${2*2} 4
/或div 除 ${2/1}或${2 div 1} 2
${2/0}或${2 div 0} Infinity
%或 mod 求余 ${3%2}或${3mod2} 1
${3%0}或${3 mod0} 异常:java.lang.ArithmeticException:/by zero
3、在EL中判断对象是否为空
通过empty运算符实现,用来确定一个对象或比那辆是否为null或空,格式如下:
${empty expression}
<%request.setAttribute("user" , "");%>
<%request.setAttribute("user1" , null);%>
<%request.setAttribute("user2" , 2);%>
${emptyuser} //返回值为true
${emptyuser1} //返回值为true
${emptyuser2} //返回值为false
4、在EL中进行逻辑关系运算
在EL中,通过逻辑运算符和关系运算符可以实现逻辑关系运算。
<%
request.setAttribute("userName","张三");
request.setAttribute("pwd","123456");
%>
userName= ${userName }
pwd= ${pwd }
\${userName!= "" and (pwd == "asd" )}
${userName!= "" and (pwd == "asd" )}
\${userName== "张三" and pwd == "123456" }
${userName== "张三" and pwd == "123456" }
5、在EL中进行条件运算
在EL中进行条件运算,唯一的优点在于其非常简单方便,和Java语言中的用法完全一致,其语法格式如下:
${条件表达式? 表达式1 : 表达式2}
例如:${1==1 ? “对”: “错“}
6. EL的隐含对象
查找的范围从page,request,session,application
隐式对象 | 作用 |
---|---|
pageContext | 对应于JSP页面中的pageContext对象 |
pageScope | 代表page域中用于保存属性的Map对象 |
requestScope | 代表request域中用于保存属性的Map对象 |
sessionScope | 代表session域中用于保存属性的Map对象 |
applicationScope | 代表application域中用于保存属性的Map对象 |
param | 表示一个保存了所有请求参数的Map对象 |
paramValues | 表示一个保存了所有请求参数的Map对象,它对于某个请求参数, 返回的是一个string类型数组 |
header | 表示一个保存了所有http请求头字段的Map对象 |
headerValues | 表示一个保存了所有http请求头字段的Map对象,返回string类型数组 |
cookie | 表示一个保存了所有cookie的Map对象 |
initParam | 表示一个保存了所有web应用初始化参数的map对象 |
1)pageContext对象
EL表达式中的pageContext隐式对象与JSP页面中的pageContext对象相对应,EL表达式可以通过pageContext隐式对象访问其它JSP隐式对象,如访问request、response对象属性时,可以使用表达式${pageContext.request.requestURI}
表达式${pageContext.response.contentType}等。
2)代表特定域属性的隐式对象
EL表达式中的pageScope、requestScope、sessionScope和applicationScope四个隐式对象分别用于访问JSP页面的page、request、session、application四个域中的属性。例如,表达式{sessionScope.bookName}返回session作用域中的bookName属性的值。
在EL表达式中也可以不使用这些隐式对象来指定查找域,而是直接引用这些域中的属性名称。例如,表达式${userName}就会在page、request、session、application这四个作用域内按顺序依次查找userName属性,直到找到为止。
3)代表请求参数的隐式对象
EL表达式中的隐式对象param和paramValues用于获取客户端访问JSP页面时传递的请求参数的值,由于HTTP协议允许使用一个请求参数名出现多次,即一个请求参数可能会有多个值,所以,EL表达式提供了param和paramValues这两个隐式对象来分别获取请求参数的某个值和所有值。
Param隐式对象用于返回一个请求参数的某个值,如果同一个请求参数有多个值,则返回第一个参数的值。paramValues隐式对象用于返回一个请求参数的所有值,返回结果为该参数的所有值组成的字符串数组,例如表达式${paramValues.username[0]}用于返回数组中第一个元素的值。
${param.user}
4)代表HTTP请求消息的隐式对象
EL表达式中的隐式对象header和headerValues用于获取客户端访问JSP页面时传递的请求头字段的值。由于HTTP协议允许一些请求头字段出现多次,即一个请求头字段可能会有多个值,所以,EL表达式提供了header和headerValues两个隐式对象分别用于获取请求头字段的某个值和所有值。
header隐式对象返回一个请求头字段的某个值,如果同一个请求头字段有多个值,则返回第一个值,例如,使用表达式${header.referer}可以非常方便的获取referer请求头字段的值。headerValues隐式对象用于返回一个请求头字段所有值组成的字符串数组。
${header[“connection”]}
5)cookie隐式对象
EL表达式中的隐式对象cookie是一个代表所有Cookie信息的Map集合,Map集合中元素的关键字为各个Cookie的名称,值则为对应的Cookie对象。使用cookie隐式对象可以访问某个Cookie对象,这些Cookie对象则是通过调用HTTPServletRequest.getCookies()方法得到的,如果多个Cookie共用一个名称,则返回Cookie对象数组中的第一个Cookie对象。例如,要访问一个名为userName的Cookie对象,可以使用表达式${cookie.userName}。
6)initParam隐式对象
EL表达式中的initParam是一个代表Web应用程序中的所有初始化参数的Map对象,每个初始化参数的值是ServletContext.getInitParameter(String name)方法返回的字符串。Web应用程序的初始化参数可以通过两种方式来配置,分别是在server.xml文件中配置和在web.xml文件中配置,具体如下:
(1)在server.xml文件中配置Web应用程序的初始化参数:
(2)在web.xml文件中配置Web应用程序的初始化参数:
在web.xml文件中设置一个初始化参数user:
user
张三
使用EL获取该参数:
${initParam.user}