本文为学习总结所用。
目录
一:简介
在 JSP 页面中,我们经常使用 JSP 表达式来输出变量或者页面之间传递的参数,但写法繁杂,还大大降低了页面的可读性。
为了简化 JSP 页面,JSP 2.0 新增了 EL(Expression Language)表达式语言。EL 提供了更为简洁、方便的形式来访问变量和参数,不仅可以简化 JSP 页面代码,还会使开发者的逻辑变得更加清晰 。
JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单。JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。
二:语法
写法为:${合法的EL表达式}
示例:
${ param.name } // 相当于 <% =request.getParameter('name') %>
(一)变量
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
这里并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。
如果全部的范围都没有找到,就会传回null。
(二)隐含对象
所有提到的隐含对象在后文第六大点中可以查到
1.与范围有关的
与范围有关的隐含对象包含以下四个:pageScope、requestScope、sessionScope、和applicationScope;
它们基本上就和JSP的pageContext、request、session和application一样;
在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。
2.与输入有关的
与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。
例如我们要取得用户的请求参数时,可以利用下列方法:
request.getParameter(String name);
request.getParameterValues(String name);
在EL表达式中:
${param.name};
${paramValues.name};
3.其他
cookie
header、headerValues
header 储存用户浏览器和服务端用来沟通的数据。
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。
但是偶尔有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得。
initParam
pageContext
pageContext取得其他有关用户要求或页面的详细信息。
${pageContext.request.queryString} 取得请求的参数字符串
${pageContext.request.requestURL} 取得请求的URL,但不包括请求之参数字符串
${pageContext.request.contextPath} 服务的web application 的名称
${pageContext.request.method} 取得HTTP 的方法(GET、POST)
${pageContext.request.protocol} 取得使用的协议(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser} 取得用户名称
${pageContext.request.remoteAddr } 取得用户的IP 地址
${pageContext.session.new} 判断session 是否为新的
${pageContext.session.id} 取得session 的ID
${pageContext.servletContext.serverInfo} 取得主机端的服务信息
三:运算符
(一)算数运算符
算术运算符用来进行加、减、乘、除和求余,EL 表达式算术运算符如下:
运算符 | 说明 | 示例 | 结果 |
---|---|---|---|
+ | 加 | ${10+5} | 15 |
- | 减 | ${10-5} | 5 |
* | 乘 | ${10*5} | 50 |
/ 或 div | 除 | ${10/5} | 2 |
% 或 mod | 求余 | ${10%5} | 0 |
注意:EL 的
+
运算符与 Java 的+
运算符不一样,它无法实现两个字符串的连接运算。如果该运算符连接的两个值不能转换为数值型的字符串,则会拋出异常;反之,EL 会自动将这两个字符转换为数值型数据,再进行运算。
EL 表达式中还可以使用( )
改变优先级,例如:${2+3*2}
等于 8,${(2+3)*2}
等于 10。
(二)比较运算符
比较运算符用来实现两个表达式的比较,进行比较的表达式可以是数值型或字符串。EL 表达式比较运算符如下:
运算符 | 说明 | 示例 | 结果 |
---|---|---|---|
== 或 eq | 等于 | ${6==6} 或 ${6 eq 6} ${"A"="a"} 或 ${"A" eq "a"} | true false |
!= 或 ne | 不等于 | ${6!=6} 或 ${6 ne 6} ${“A"!=“a”} 或 ${“A” ne “a”} | false true |
< 或 lt | 小于 | ${3<8} 或 ${3 lt 8} ${"A"<"a"} 或 ${"A" lt "a"} | true true |
> 或 gt | 大于 | ${3>8} 或 ${3 gt 8} ${"A">"a"} 或 ${"A" gt "a"} | false false |
<= 或 le | 小于等于 | ${3<=8} 或 ${3 le 8} ${"A"<="a"} 或 ${"A" le "a"} | true true |
>= 或 ge | 大于等于 | ${3>=8} 或 ${3 ge 8} ${"A">="a"} 或 ${"A" ge "a"} | false false |
(三)逻辑运算符
逻辑运算符两边的表达式必须是布尔型(Boolean)变量,其返回结果也是布尔型(Boolean)。EL 表达式逻辑运算符如下:
运算符 | 说明 | 示例 | 结果 |
---|---|---|---|
&& 或 and | 与 | ${2>1&&3<4} | true |
|| 或 or | 或 | ${2<1||3<4} | true |
! 或 not | 非 | ${!(2>4)} | true |
(四)其他
1."." 和 "[]"
"." 和 "[]" 是 EL 中最常用的运算符,用来访问 JavaBean 中的属性和隐式对象的数据。一般情况下,"."用来访问 JavaBean 属性或 Map 类型的值,[]用来访问数组或者列表的元素。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。
例如:${user.My-Name}应当改为${user["My-Name"] }
如果要动态取值时,就可以用[]来做,而 "." 无法做到动态取值。
例如:${sessionScope.user[data]}中data 是一个变量
2.empty
empty 用来判断 EL 表达式中的对象或者变量是否为空。若为空或者 null,返回 true,否则返回 false。
3.条件运算符
EL 表达式中,条件运算符的语法和 Java 的完全一致,如下:
${条件表达式?表达式1:表达式2}
其中,条件表达式用于指定一个判定条件,该表达式的结果为 boolean 类型。如果该表达式的运算结果为 true,则返回表达式 1 的值;反之,返回表达式 2 的值。
(五)优先级
优先级如下表所示(由高至低,由左至右)
序号 | 运算符 |
---|---|
1 | [] 、. |
2 | () |
3 | -(负) 、not、! 、empty |
4 | * 、 / 、 div 、% 、mod |
5 | +、-(减) |
6 | <、>、<=、>=、lt、gt、le、ge |
7 | ==、!-、eq、ne |
8 | &&、and |
9 | ||、or |
10 | ${A?B:C} |
四:保留字
保留字是系统预留的名称。在为变量命名时,应该避开这些预留的名称,以免程序编译时发生错误。EL 表达式的保留字如下表所示:
lt | le | gt | ge |
eq | ne | true | false |
and | or | not | instanceof |
div | mod | empty | null |
五:禁用EL表达式
如果不想使用 EL 表达式,可以禁用 EL 表达式。禁用 EL 表达式有以下 3 种方法:
1.禁用单个
在 EL 表达式前加 \
,例如:
\${2+3}
页面输出:
${2+3}
2.禁用当前页
将 page 指令中的 isELIgnored 属性设置为 true,如下:
<%@ page isELIgnored="true" %>
3.禁用整个web应用
在 web.xml 中配置 <el-ignored> 元素
<jsp-property-group>
<url-pattern>*jsp</url-pattern>
<el-ignored>false</el-ignored>
</jsp-propery-group>
六:内置对象
为了显示方便,EL 表达式语言提供了许多内置对象,可以通过不同的内置对象来输出不同的内容。EL 表达式内置对象如下:
内置对象 | 说明 |
---|---|
pageScope | 获取 page 范围的变量 |
requestScope | 获取 request 范围的变量 |
sessionScope | 获取 session 范围的变量 |
applicationScope | 获取 application 范围的变量 |
param | 相当于 request.getParameter(String name),获取单个参数的值 |
paramValues | 相当于 request.getParameterValues(String name),获取参数集合中的变量值 |
header | 相当于 request.getHeader(String name),获取 HTTP 请求头信息 |
headerValues | 相当于 request.getHeaders(String name),获取 HTTP 请求头数组信息 |
initParam | 相当于 application.getInitParameter(String name),获取 web.xml 文件中的参数值 |
cookie | 相当于 request.getCookies(),获取 cookie 中的值 |
pageContext | 表示当前 JSP 页面的 pageContext 对象 |
七:EL中的函数(浅学)
JSP EL允许您在表达式中使用函数。这些函数必须被定义在自定义标签库中。函数的使用语法如下:
${ns:func(param1, param2, ...)}
ns指的是命名空间(namespace),func指的是函数的名称,param1指的是第一个参数,param2指的是第二个参数,以此类推。比如,有函数fn:length,在JSTL库中定义,可以像下面这样来获取一个字符串的长度:
${fn:length("Get my length")}
要使用任何标签库中的函数,您需要将这些库安装在服务器中,然后使用<taglib>标签在JSP文件中包含这些库。