您的位置:首页 > 编程语言 > Java开发

JavaWeb-EL表达式

2015-08-14 07:41 507 查看
EL全称 Expression Language(表达式语言),是jsp2.0最重要的特性之一,可以利用EL表达式来访问应用程序中的数据,来消除jsp页面中的java脚本。

el表达式的语法

expression例如x+y可以写成{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


在jsp 2.0中配置EL表达式

1)实现免脚本的jsp页面

不在jsp中写java脚本在很多项目中已经是硬性标准,但是有些攻城狮们就是不听话,那怎么办呢,强制!向下面这样

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: