EL全称 Expression Language(表达式语言),是jsp2.0最重要的特性之一,可以利用EL表达式来访问应用程序中的数据,来消除jsp页面中的java脚本。
el表达式的语法
expression例如x+y可以写成 {x+y}
el中的关键字
以下是el中的关键字,他们不能用做标识符:
and,eq,gt,true,instanceof,or,ne,le,false,empty,not,lt,ge,null,div,mod
后面会对部门关键字做进一步讲述.
运算符 [ ] 和 .
EL表达式可以返回任意类型的数值。例如EL表达式的结果是一个带有属性的对象,则可以利用 [ ] 和 . 来访问属性值,效果完全一样,只不过 [ ] 比 . 稍微正规一点。
eg:${object.["propertyName"]} 或 ${object.propertyName}
但是,要注意一个非常重要的“陷阱”,当属性名称不是有效的java变量名时,就只能用 [] ,而不能用 . 操作。
eg:获取请求头中host属性的值
${header["host"]} 或 ${header.host}
这是没问题的。
但是,当要获取accept-language属性时,就只能用 []。
${header["accept-language"]}
当获取到的结果仍然是一个对象时,还可以继续用 [] 或 . 来获取其中的属性。例如,利用el表达式获取servlet path
${pageContext["request"]["servletPath"]}
${pageContext.request["servletPath"]}
${pageContext.request.servletPath}
获取HttpSession中的属性
${pageCotext.session}
${pageContext.session.id}
el表达式的取值规则
el表达式的取值是从左到右进行的,对于expr-a[expr-b]形式的表达式,取值规则入下:
1)先计算expr-a,得到value-a
2)如果value-a为null,则返回null
3)然后计算expr-b,得到value-b
4)如果value-b为null,则返回null
5)如果value-a为map,则查看value-b是否是map中的一个key,如果是,则返回value-a.get(value-b),若不是,则返回null
6)如果value-a为list,或者array,则要进行如下处理
6.a)强制将value-b转为int,若转换失败,则抛出异常。
6.b)如果value-a.get(value-b)抛出IndexOutOfBandsException或者Array.get(value-a,value-b)抛出ArrayIndexOutBandsException,则返回null。
6.c)否则,若value是list则返回value-a.get(value-b),若value-a是一个Array,则返回Array.get(value-a,value-b)
7)如果value-a不是一个map,list或者array,那么,value-a必须是一个JavaBean,这时,必须强制value-b为String。如果value-b是value-a是一个可读属性,则要调用getter方法。
EL表达式的隐式对象
在jsp页面中,可以利用jsp脚本来方法jsp隐式对象。但是在免脚本的jsp页面中,则不可能访问这些隐式对象,EL表达式通过提供一组自己的隐式对象来访问不同的对象。
EL表达式是隐式对象有:
*pageContext:它与jsp中的PageContext对象相对应。
initParam:它包含所有环境初始化参数,并用参数名作为key的map
*param:它包含所有请求参数,并用参数名作为key的map,每一个key 的值是指定名称的第一个参数值。
*paramValues:它包含所有请求参数,并用参数名为key的map。每个key的值是一个字符串数组,其中包含了指定参数名称的所有参数值。
header:这是一个包含请求标题,并用标题名作为key的map。每一个key的值就是指定标题名称的第一个标题。
headerValues:这是一个包含请求标题,并用标题名作为key的map。每个key的值是一个字符串数组,其中包含了指定标题名称的 所有参数值。
*cookie:这是一个包含了当前请求对象中所有cookie对象的map,cookie名称就是key的名称,每一个key都映射到一个cookie对象。
applicationScope:这个是一个包含了ServletContext对象中所有属性的map,并用属性名作为key。
sessionScope:这是一个包含了HttpSession对象中所有属性的map,并用属性名作为key。
requestScope:这是一个map,包含了当前HttpServletRequest对象中的所有属性,并用名称作为key。
pageScope:这是一个map,其中包含了全页面范围的所有属性,属性名称作为key。
下面简单介绍一下这些隐式对象。
1)pageContext
该隐式对象对应于jsp隐式对象中的pageContext,它是最常用的取值入口,因为其中包含了很多其他的与Servlet相关的对象,例如requst、response、out、session、application、config、page、exception等。
我们可以像下面这样来获取request对象
${pageContext.request}、${pageContext["request"]}
获取请求方式或请求中的一个参数
${pageContext.request.method} ${pageContext["request"]["paramName"]}
一次类推……
2)initParam
该对象包含了上下文的初始参数值,即
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-beans.xml
classpath:spring-cxf.xml
</param-value>
</context-param>
如果要利用initParam来获取这个初始化参数的值,是这样的
${initParam.contextConfigLocation}
${initParam["contextConfigLocation"]}
3)param
该对象用于获取请求参数,如果在一个请求中客户端向服务器提交了用户名和密码信息,那么就可以用下面的形式来获取
${param.username}/${param["password"]}
4)paramValues
利用这个对象可以获取一个请求参数的多个值,例如多个复选框,它的返回值是一个字符串数组,若我们选中了多个用于说明爱好的复选框,则可以用下面的方式来获取这些值
${paramValues.hobby[0]} //第一个爱好
${paramValues.hobby[1]} //第二个爱好
5)header
还隐身对象包含请求标题,可以用它来获取所有请求头信息
${header.connection}
${header.host}
${header["accept-language"]}
注意,前面已经说过,如果key不是一个标准的Java变量名,那么只能用[ ]来获取其对应的值,就像accept-language一样。
6)headerValues
同paramValues类似
${headerValues["accept-language"][0]}
7)cookie
利用这个隐式对象可以获取所有cookie的值,例如
获取jsessionid的数据
${cookie.jsessionid.value}
${cookie.jsessionid.path}
获取用户session数据
${cookie.user.name}
${cookie.user.age}
8)applicationScope、sessionScope、requestScope、pageScope
分别用户获取ServletContext、Session、HttpServletRequest和PageContext中的数据。
需要说明的一点是,例如,用el表达式获取name的值${name}
,这样写,el会先从pageScope范围找key为name的值,若没有,则会按照 requestScope->sessionScope->applicationScope来以此查找。
EL表达式的其他运算符
1.算数运算
· + 加法
· - 减法
· * 乘法
· / (div) 除法
· %/mod 取余/取模
2.逻辑运算符
· &&/and 和
· || / or 或
· ! / not 非
3.关系运算符
· == / eq 等于
· != / ne 不等于
· >/gt 大于
· · >=/ge 大于等于
· <=/lt 小于等于
· · <=/le 小于或等于
4.三目运算符
${statement ? A : B}
5.empty
用来检查一个值是否为null或空
${empty x} 如果x为null或空(长度为0的字符串),则返回true,否则返回false
web.xml
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<script-invalid>true</script-invalid>
</jsp-property-group>
</jsp-config>
这样在所有jsp中就金庸了java脚本,哈哈,够狠!
2)禁用EL
当然,什么事都有特殊情况,禁用EL表达式!这翻脸也太快了吧!
第一种方式,在jsp页面中利用jsp指令完成。
<%@ page isELIgnored="true"%>
第二种方式:
在web.xml中配置,向下面这样。
<jsp-config>
<jsp_property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>