JSP2.0最重要的特性之一就是表达式语言EL (Expression Language ),由于受到ECMAScript和XPath表达式语言的启发,EL也被设计成可以轻松地编写免脚本的JSP页面。使用EL表达式,JSP页面可以不再使用任何的JSP声明、脚本和表达式,就可以轻松地访问应用程序的
数据,这使得JSP页面写起来更加简单。在许多Java Web应用程序中,EL还是会和JSTL配合使用。
一.EL表达式的主要作用:
获取数据。EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的Web作用域中检索Java对象,获取数据,包括访问JavaBean的属性、List集合、Map集合、数组等。
执行运算。利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑操作。
获取Web开发常用对。EL表达式定义了一些隐式对象,利用这些隐式对象,开发人员可以很轻松获得对Web常用对象的引用,从而获得这些对象中的数据。
1.1.${expression}
EL表达式以${开头,并以}结束。EL表达式的结构如下:
${expression}
例如,表达式X+Y,可以写成:
${x+y}
它也常用来连接两个表达式。对于一系列的表达式,它们的取值将是从左到右进行,计算结果的类型为String,并且连接在一起。
${表示是一个EL表达式的开头,如果需要的只是文本${,则需要在它前面加一个转义符,如\${。
1.2.[]和.运算符
EL表达式可以返回任意类型的值。如果EL表达式的结果是一个带有属性的对象,以利用[]或者.运算符来访问其属性,即通过getter方法获取其属性。[]和.运算符类似, 访问对象的属性,可以使用以下任意一种形式:
${object["propertyName"]}
${object.propertyName}
如果propertyName不是有效的Java变量名,则只能使用[]运算符。例如,访问隐式对象标题中的HTTP的host:
${header["host”]}
${header.host}
但是,要想访问accept-language标题,只能使用[]运算符,因为accept-language不是一个合法的Java变量名。如果用.运算符访问它,将会导致异常。
1.3.取值规则
EL表达式的取值是从左到右进行的。对于expr-a[expr-b]形式的表达式,其EL表达式的取值方法如下:
1.4.访问JavaBean
EL最常用来访问JavaBean的属性,利用「l和.运算符都可以访问JavaBean的属性,示例代码如下:
${beanName["propertyName"]}
${beanName.propertyName}
如果JavaBean的属性是一个带属性的对象,那么同样也可以利用口或.运算符来访问第二个对象的属性。例如有一个employee对象,employee对象有一个dept对象,dept对象有一个name属性。示例代码如下
${employee .dept.name}
二.EL表达式的运算符
2.1.算术运算符有5种:
加法(+)
减法(一)
乘法(*)
除法(/)
取余/取模(%和mod )
运算符是按优先级顺序排列的:
*、/、%、mod优先级相同,+、一优先级相同。*、/、%、mod优先级高于+ 、-
2.2.逻辑运算符有3种:
和(&&和and)
或(||和or)
非(!和not )
2.3.关系运算符有如下几种:
等于(==和eq)
不等于(!=和ne)
大于(>和gt)
大于或等于(>=和ge)
小于(<和lt )》小于或等于(<=和le )
关系运算符返回的是Boolean值,例如,表达式${1==2}返回false,${2 < 3} 返回true 。
EL关系运算符的语法如下:
${s七atement?A:B}
如果statement的计算结果为true,那么该表达式的输出结果是A,不然是B 例如,下面EL表达式可以判断用户是否登录。
${sessionScope.user.username==null?'‘您己经登录”:”您还没有登录”}
2.4.empty运算符
empty运算符用来检查作用域中是否有该变量存在,然后再判断该变量是否为null或者空字符串。示例代码如下:
${empty username}
1) empty首选判断JSP的作用域中是否有username变量,如果没有,则表达式返回true.
2) empty判断username变量是否为null或者一个长度为0的空字符串,如果是,则表达式返回true;如果username是一个空的集合或者数组,则表达式也返回true。否则表达式将返回false。
三.EL表达式的隐式对象
在JSP页面中,可以利用JSP脚本访问JSP的对象。在EL中,提供了11个隐式对象用来访问Web开发中常用的JSP对象并获取数据。表列出了EL表达式的隐式对象。
隐式对象 | 描述 |
---|---|
pageContext | JSP页面的上下文对象。它可以访问JSP隐式对象,如请求、响应、会话、输出、servletContext等 |
param | 一个包含所有请求参数,并用参数名作为key的Map。每个key的值就是指定名称的第一个参数值,表达式${param.name}相当于request.getParameter (name) |
paramValue | 一个包含所有请求参数,并用参数名作为key的Map。每个key的值是一个字符串数组,其中包含了指定参数名称的所有参数值。它与param隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式${paramvalues, name}相当于request.getParamterValues(name) |
header | 包含请求标题,并用标题名作为key的Map。每个key的值就是指定标题名称的第一个标题值。表达式$ {header.name}相当于request.getHeader(name) |
headerValues | 包含请求标题,并用标题名作为key的Map。每个key的值就是一个字符串数组,其中包含了指定标题名称的所有参数值。它与head隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式$ {headerUalues. name}相当request.getHeaderValues(name) |
cookie | 包含了当前请求对象中所有Cookie对象的Map 。 Cookie名称就是key名称,每个key都映射到一个Cookie对象。表达式${cookie. name .value}返回带有特定名称的第一个Cookie值 |
initParam | 包含所有环境初始化参数,并用参数名作为key的Map。表达式${initParam. name}相当于ServletContext.getInitparameter (name) |
pageScope | 这是一个Map,其中包含了页面域内的所有属性(Attribute ) 。属性名称就是Map的lcey。表达式$ {pageScope.name}相当于pageContext.getAmibute(“name”) |
requestScope | 这是一个Map,其中包含了请求域内的所有属性(Aaribute ) 。属性名称就是Map的key。表达式${ requestScope.name}相当于request.getAttribute(“name”) |
sessionScope | 这是一个Map,其中包含了会话域内的所有属性(Attribute ) 。属性名称就是Map的key。表达式${ sessionScope.name}相当于session.getAttribute(“name”) |
applicationScope | 这是一个Map,其中包含了应用程序上下文域内的所有属性(Amibute ) 。属性名称就是Map的key。表达式${ applicationScope.name}相当于appiication.getAttribute(“name”) |
3.1.pageScope, requestScope, sessionScope和applicationScope
在JSP中,经常通过JSP的page, request, session和application 4个作用域对象获取存储在其中的属性值。而这4个对象用来取值的getAttribute(“name”)方法并不是一个标准的getter方法,其无法通过EL的对象获取存储的属性值。所以EL表达式提供了4个scope隐式对象,用于获取4个作用域中所存储的属性值,对应的4个作用域中的取值方法为getAttribute(“name”)。4个作用域的范围从小到大依次为:pageScope, requestScope, sessionScope和applicationScope。假设4个作用域中都存在有名称为username的属性,则可以使用以下表达式:
${pageScope .username}
${requestScope .username}
${sessionScope .username}
${applicationScope.username}
EL表达式也支持默认访问,即省略scope对象,直接访问username变量,默认范围为从小到大取值。
${username}
即首先取pageScope 中的username,如果为null,则取requestScope中的username,依次类推。
原创来源:滴一盘技术