EL表达式
1、EL表达式功能
EL 表达式:Expression Language 表达式语言
EL 使用:在 JSP 中使用,服务器会对其进行解析翻译,生成相应的 Java 代码
EL 作用:在 JSP 页面中输出动态内容,可以代替 JSP 中的表达式元素 <%= %>
2、EL表达式的格式
EL 格式:${ EL表达式 }
语法:${}
3、EL内置对象
为了方便的输出数据,EL 提供了 11 个内置对象
2 个内置对象为了方便输出请求参数:param/paramValues
4 个内置对象为了方便输出各个范围的属性:pageScope / requestScope / sessionScope / applicationScope
【4、中详解】
2 个与请求头有关的内置对象:header/headerValues
2 个其他内置对象:cookie/initParam
1 个特殊的内置对象:pageContext
3.1、param
param:用来输出请求参数的值
语法:${param.请求参数名}
例子:
http://localhost:8080/0513-EL/01-param.jsp?name=looper
<h1>${param.name}</h1>
结果:looper
3.2、paramValues
paramValues:取得同名请求参数的某一个索引的值
语法:${paramValues.请求参数名称[索引]}
例子:比如某请求参数是通过 checkbox 传递的,名字为 hobbies,要输出所有 hobbies 值中的第一个值,可以使用如下两种方式:
例如:
- 通过该 JSP 中的表单提交请求参数
<form action="paramValues.jsp">
爱好:
<input type="checkbox" name="hobbies" value="吃"/>吃
<input type="checkbox" name="hobbies" value="喝"/>喝
<input type="checkbox" name="hobbies" value="玩"/>玩
<input type="checkbox" name="hobbies" value="乐"/>乐<br/>
<input type="submit" value="提交"/>
</form>
paramValues.jsp
中获取请求参数
<%--使用表达式:--%>
<%=request.getParameterValues("hobbies")[0]%>
<%--使用EL:--%>
${paramValues.hobbies[0]}
3.3、header
header:用来输出某一个请求头的值
语法:${header.请求头名字}
例子:
${header.accept}
3.4、headerValues
headerValues:如果某个请求头的值有多个,则使用headerValues返回一个数组
语法:${headerValues.请求头名字[index]}
例子:
${headerValues.cookie[0]}
3.5、cookie
cookie:用来获取 cookie 的值
语法:
${cookie.cookie名字.value}
:获取 cookie 的值${cookie.cookie名字.name}
:获取 cookie 的名字
例子:
${cookie.JSESSIONID.value }<br>
${cookie.JSESSIONID.name }
3.6、initParam
initParam:用来输出上下文参数
语法:${initParam}
:获取 cookie 的值
例子:
- 设置 xml 文件
<context-param>
<param-name>userName</param-name>
<param-value>looper</param-value>
</context-param>
- 在 JSP 中获取上下文参数
${initParam.userName }
3.7、pageContext
pageContext:该内置对象可以调用 PageContext 类中所有符合规范的 getXxx
方法
语法:${pageContext.xxx}
其中 xxx 代表 PageContext 类的 getXxx
方法将首字母小写的名字
例子:
<head>
<!-- base标签代表当前工程的基本路径 -->
<base href="${pageContext.request.contextPath}/">
</head>
${pageContext.request}<br>
${pageContext.request.remoteAddr}<br>
<!-- 取得当前工程的基本路径 -->
${pageContext.request.contextPath}
结果:
org.apache.catalina.connector.RequestFacade@26a70a92 0:0:0:0:0:0:0:1 /0513-EL
4、获取数据的作用域检索顺序
4.1、获取属性数据有关的四个内置对象
- pageScope:页面范围
- requestScope:请求范围
- sessionScope:会话范围
- applicationScope:上下文范围
4.2、不写范围
语法:${变量名.属性名}
检索顺序:默认的访问顺序:pageScope→requestScope→sessionScope→applicationScope
当不指定范围时
例如:${user.pwd},将自动从pageScope开始查找,直到applicationScope,如果在某一范围找到,直接显示,不再找了;如果没查到,则什么也不显示
例子:
<%
request.setAttribute("name", "looper1");
session.setAttribute("name", "looper2");
pageContext.setAttribute("name", "looper3");
application.setAttribute("name", "looper4");
%>
${name }
结果:looper3
4.3、写范围
写范围之后,则表示精确定位;强制使用某个作用域的属性
语法:${范围.变量名.属性名}
;
范围:pageScope:页面、requestScope:请求、sessionScope:会话、applicationScope:上下文
检索顺序:精确定位指定范围的属性的值,如果查到显示;如果没查到,则什么也不显示
例子:
<%
request.setAttribute("name", "looper1");
session.setAttribute("name", "looper2");
pageContext.setAttribute("name", "looper3");
application.setAttribute("name", "looper4");
%>
${sessionScope.name }
结果:looper2
5、EL运算符
5.1、算数运算符
+
:实现加法运算
-
:现减法运算
*
:实现乘法运算
/
或 div
:实现除法运算
%
或 mod
:实现求模运算
${10+2} <br>
${10-2} <br>
${10*2} <br>
${10/3} <br>
${10%3} <br>
5.2、比较运算符
有 6 种比较运算符,可以对值进行比较,返回值为 true 或 fasle
==
或 eq
:表示等于
!=
或 en
:表示不等于
<
或 lt
:表示小于
>
或 gt
:表示大于
<=
或 le
:表示小于等于
>=
或 ge
:表示大于等于
${10==2}<br/>
${10!=2}<br/>
${10>2}<br/>
${10<2}<br/>
${10>=2}<br/>
${10<=2}<br/>
5.3、逻辑运算符
EL 中提供了 3 个逻辑运算符,可以对 boolean 类型的值进行运算,返回值为 true 或 false
&&
和 and
:表示交集,两个值都是 true 才返回 true;短路与
||
和 or
:表示并集,两个值只要有一个是 true 返回 true,则返回 false;短路或
!
:表示非,两个值只要有一个是 true 返回 true,则返回 false;短路或
${1==2 && 2==3} <br>
${1==1 || 2==3} <br>
${!true} <br>
5.4、特殊运算符
5.4.1、集合运算符
使用 [] 指定索引的方式可以获取数组或 List 集合中的元素
语法:${范围.集合变量[index].属性名 }
例如:
返回请求范围内商品列表集合的第一个商品的名称:
${requestScope.productsList[0].productName}
5.4.2、empty运算符
语法:${empty.变量名}
例子:
- 获取的是基本类型的数据时:
<%
//使用Java脚本创建一个集合
int[] array = new int[]{10,20,30};
//将集合放到作用域中
request.setAttribute("array", array);
%>
<!-- 在页面使用EL表达式取得集合中第二个元素的值 -->
${empty a} <br>
${empty array} <br>
结果:a 不存在,所有为空,结果 true
;array 存在,所有非空,结果 false
注意:寻找变量名,从 pageScope -> requestScope -> sessionScope -> applicationScope 四大作用域中找,找不到则为空,返回 true
;找到了则不为空,返回 false
。
- 获取引用类型的数据时:
<%
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
list2.add("looper");
request.setAttribute("list1", list1);
request.setAttribute("list2", list2);
%>
${empty list1}
${empty list2}
结果:list1
显示 true
;list2
显示 false
注意:从 pageScope -> requestScope -> sessionScope -> applicationScope 找
-
如果
集合.size()==0
,集合没有元素,认为是空的,返回 true -
如果
集合.size()>0
,集合有元素,认为是非空的,返回 false
如果找不到,说明没有该变量,值为null,返回true.
5.4.3、三目运算符
格式:${A?B:C}
如果 A 为 true,则执行 B,如果 A 为 false,则执行 C
${2>1?"大于":"不大于"} <br>
5.4.4、() 运算符
通过 ()
可改变优先级
${(1>2) || (3<2) }