一、EL表达式概述
JSP主要的作用是实现动态页面,而动态页面中最主要的作用就是把数据动态显示。
目前,JSP中显示数据主要用表达式实现,即<%=%>可以说,EL (Expression Language)表达式语言,就是用来替代<%=%>的,EL比<%=%>更简洁,更方便。
二、EL表达式基本语法
-
EL的基本语法是$ { }结束
例如:输出名字是username的请求参数${param.username}
param是EL中的内置对象表达式:
<%=request.getParameter(“username")%>
-
除了语法不同EL更为“贴心”,当username为null时,EL就不显示。而表达式会显示null
-
与JSP表达式区别:JSP中使用的变量是脚本变量,而EL中的变量都是作用域变量,要操作的变量都在作用域中。
-
EL表达式是可以替代JSP页面中数据访问时的复杂编码可以自动转换类型,并且使JSP的开发变得更加简单。
-
在Servlet或JSP中保存数据request.setAttribute(“username”,“LiYang”);
在JSP中访问数据姓名:${username} -
按照 page →request → session →application的作用域顺序依次查找,找到即返回,最终找不到返回null。
三、内置对象
隐含对象 | 描述 |
---|---|
pageScope | page 作用域 |
requestScope | request 作用域 |
sessionScope | session 作用域 |
applicationScope | application 作用域 |
param | Request 对象的参数,字符串 |
paramValues | Request对象的参数,字符串集合 |
header | HTTP 信息头,字符串 |
headerValues | HTTP 信息头,字符串集合 |
initParam | 上下文初始化参数 |
cookie | Cookie值 |
pageContext | 当前页面的pageContext |
-
EL中有两个与请求参数有关的内置对象
-
param用来输出请求参数的值,格式为$ {param.请求参数名字},如下代码所示:
使用表达式:
<%=reqest.getParameter("name")%>
使用EL:
${param.name}
-
paramValues:用来获取一对多的参数值,返回一个数组。比如某请求参数是通过checkbox传递的,名字为hobbies,要输出所有hobbies值中的第一个值,可以使用如下两种方式:
使用表达式:<%=request.getParameterValues("hobbies")[0]%>
使用EL:
${paramValues.hobbies[0]}
-
-
有属性有关的内置对象
- pageScope:页面范围,即pageContext范围
- requestScope:请求范围
- sessionScope:会话范围
- applicationScope:上下文范围
-
与请求头有关的内置对象
-
header:输出某一个请求头的值。
输出请求头accept的值
$(header.accept}
-
headerValues:如果某个请求头的值有多个,则使用headerValues返回一个数组。如下代码所示:
${headerValues.cookie[0]}
上述代码将返回请求头cookie中的第一个值,例如:
JSESSIONID=A6A22CA4AEE8F9E1111422C889740B24 -
-
其他两个内置对象:cookie和initParam
- cookie:用来获取cookie的值
${cookie.JSESSIONID.value}
上述代码将输出名字为JSESSIONID的cookie的值。
-
initParam:用来输出上下文参数的值。
在web.xml中配置上下文参数:
<context-param> <param-name>path</param-name> <param-value>/WEB-INF/props</param-value> </context-param>
在JSP中使用EL输出path的值:
${initParam.path}
-
最特殊的内置对象:PageContext
EL中的pageContext对象可以调用PageContext类中所有符合规范的getXxx方法,如PageContext类中有如下方法:
public abstract ServletRequest getRequest()可以通过如下EL调用该方法:
${pageContext.request}
该方法将输出请求对象,如下所示:
org.apache.catalina.gore.ApplicationHttpRequest@1b98cbb
既然该EL返回的是真正的请求对象,那么就可以继续调用HttpServletRequest中的其他getXxx方法,如:${pageContext.request.remoteAddr}
上述表达式将调用请求中的getRemoteAddr方法,输出其返回值,例如:127.0.0.1
四、运算符
-
算术运算符
EL中支持五种算术运算符,有 +实现加法运算;- 实现减法运算;* 实现乘法运算;/ 或div实现除法运算;% 或mod实现求模运算。
如下代码所示:
$19+2}<br> ${19-2]<br> ${19*2]<br> ${19/2}<br> ${19%2]<br>
-
比较运算符
EL中有6种比较运算符,可以对值进行比较,返回值为true或fasle。
运算符 含义 ==、eq 等于 <、lt 小于 > 、gt 大于 <=、le 小于等于 >=、ge 大于等于 -
其他运算符
-
EL中除了有上面学习的算术、比较、逻辑运算符外,还有三种其他运算符。
-
empty运算符:判断值是否为null,如果是null,返回true,否则返回false。
以下几种情况为空:
- 值为null值的时候,为空
- 值为空串的时候,为空
- 值是Object类型数组,长度为零的时候
- list集合,元素个数为零
- map集合,元素个数为零
-
三目运算符:${A?B:C }如果A为true,则执行B,如果A为false,则执行C。
-
( )运算符:通过()可改变优先级。
EL中虽然提供了运算符,但是目前看没有太大意义,不可能直接输出一些运算结果,而往往运算结果将作为流程控制使用。
-
五、总结
- 可见使用EL能大大简化JSP中表达式
- 然而,EL不能实现流程控制,所以目前看并不能实现复杂的逻辑,必须结合标签一起使用,才能发挥更大作用。
- .JSP的标准标签库JSTL,结合EL一起使用,将能够大大简化JSP。