JSP中的EL表达式详细介绍

来源:互联网 发布:算法复杂度的意义 编辑:程序博客网 时间:2024/05/18 02:32
 

JSP中的EL表达式详细介绍

一、JSP EL语言定义
        E L(Expression Language)  目的:为了使JSP写起来更加简单。

       表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。它是一种简单的语言,基于可用的命名空间(PageContext 属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到 Java 类中静态方法的可扩展函数以及一组隐式对象。

       EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种脚本编制元素。

二、JSP EL简介

1、语法结构
     ${expression}
2、[ ]与.运算符
     EL 提供“.“和“[ ]“两种运算符来存取数据。
     当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用“[ ]“。例如:
         ${user.My-Name}应当改为${user["My-Name"] }
     如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:
         ${sessionScope.user[data]}中data 是一个变量
3、变量
     EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
     因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。
     假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。
     属性范围在EL中的名称
         Page          PageScope
         Request          RequestScope
         Session          SessionScope
         Application      ApplicationScope

二、JSP EL 中的有效表达式

       有效表达式可以包含文字、操作符、变量(对象引用)和函数调用。我们将分别了解这些有效表达式中的每一种:

1、文字

JSP 表达式语言定义可在表达式中使用的以下文字:

文字

文字的值

Boolean

true 和 false

Integer

与 Java 类似。可以包含任何正数或负数,例如 24、-45、567

Floating Point

与 Java 类似。可以包含任何正的或负的浮点数,例如 -1.8E-45、4.567

String

任何由单引号或双引号限定的字符串。对于单引号、双引号和反斜杠,使用反斜杠字符作为转义序列。必须注意,如果在字符串两端使用双引号,则单引号不需要转义。

Null

null

2、操作符

JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:

术语

定义

算术型

+、-(二元)、*、/、div、%、mod、-(一元)

逻辑型

and、&&、or、||、!、not

关系型

==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。

空操作符是前缀操作,可用于确定值是否为空。

条件型

A ?B :C。根据 A 赋值的结果来赋值 B 或 C。

3、隐式对象

JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:

术语

定义

pageContext

JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。

此外,还提供几个隐式对象,允许对以下对象进行简易访问:

术语

定义

param

将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param.name) 相当于 request.getParameter (name)。

paramValues

将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于 request.getParamterValues(name)。

header

将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header.name} 相当于 request.getHeader(name)。

headerValues

将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues.name} 相当于 request.getHeaderValues(name)。

cookie

将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie.name.value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues.name} 表达式。

initParam

将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。

除了上述两种类型的隐式对象之外,还有些对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:

术语

定义

pageScope

将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope.objectName.attributeName} 访问对象的属性。

requestScope

将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope.objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope.objectName.attributeName} 访问对象的属性。

sessionScope

将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如:


$sessionScope.name}

applicationScope

将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。

三、特别强调:

1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。

2、 注意 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。

四、举例说明

1、例如,

      < %=request.getParameter(“username”)% >       等价于       ${ param.username }

2、EL语言可以完成如果得到一个username为空,则不显示null,而是不显示值。     

<%=user.getAddr( ) %>      等价于     ${user.addr}。

3、例如:

<% =request.getAttribute(“userlist”) %>     等价于$     { requestScope.userlist }

4、例如,原理如上例3。

${ requestScope.userlist } 1

${ sessionScope.userlist } 2

${ applicationScope.userlist } 3 

${ pageScope.userlist } 4

${uselist} 含义:执行顺序为4 1 2 3。

“.”后面的只是一个字符串,并不是真正的内置对象,不能调用对象。

4、例如,

   <%=user.getAddr( ) %>      等价于     ${user.addr}

第一句前面的user,为一个变量。

   第二句后面user,必须为在某一个范围里的属性。

使用JSP2 EL


项目中一直用JSTL,竟然没有用JSP2的EL!现在才发现真的很不错。使用步骤,单个页面使 用JSP2 EL需要添加下面的内容:
<%@ page isELIgnored="false"%>

实例:
<%
request.setAttribute("cl"," 陈亮");
%>

直接使用作用域中属性:
<input name="clk1" type="text" value="${cl}">

(1) Expression Language;
(2) 新增Simple Tag 和Tag File;
(3) web.xml 新增<jsp-config>元素。
在这些新功能 中我非常喜 Expression Language×(EL),EL使我们开发jsp更加简单方便,代码更加简洁,不会大量嵌入scriptlet (我现在在项目中也不用scriptlet), 下面我来简单介绍一下EL使用。
1、EL命名变量
下面的EL表达式会显示名称count 的命名变量的值。
例:<b>这是一个简EL表达式${count} </b>
EL分析器会按以下顺序在各个 JSP 作用域对象中搜索属性
(1)页面作用域 (pageContext)
(2)请求作用域(request)
(3)会话作用 域(session)
(4)应用作用域(application)
其实此表达式等价于调用Java <%=pageContext.findAttribute(“count”)%>

即然大家已经了解EL,下面具体介绍一下 EL具体的应用,EL表达式一般应在JSP中两个位置中:
内联放置在模板数据中
放在JSP动作(标准动作或定制动作taglib)的属性中

1、在模板数据中使用
例: <p>这是求两个数和的EL 表达式5+3=${5+3}</p>

2、 在属性值中使用EL表达式
例:<c:if test="${age>20}">
您的年龄大于20岁
</c:if>

注:<c:if> 是JSTL标签库

EL支持以下操作符
算术操作符
逻辑操作符
比较操作符
空前缀操作符
一、算 术操作符
算术操作符包括日常用的加、减、乘、除和取模等运算符。例如:<b>桌子上有${2+3*(3+6)/5}个苹果< /b>
<b>5除以3的余数是${5%3}</b> 求余数也可以用 mod运算符。
<b>5 除以3的余数是${5 mod 3}</b>
除法操作符另一种方法用 div 例:<b>5除以3等于${5 div 3}</b>

二、逻辑运算符
逻辑操作符可以用于把多个布尔表达合并为在一起,EL支持的两个逻辑操作符是 &&和||,! ,另外也可以用文本形式的and 和 or,not

例:<h1>猜 数</h1>
设定值:<c:set var="guess" value="12"/>

<c:if test="${(answer>=10)&&(answer<=20}">
被猜的数已近很接近啦
</c:if>
<c:if test="${(answer<=110)||(answer>=20}">
重试
</c:if>

三、 比较运算符
可用的比较操作符 ==(或 eq)、!=(或 ne)、<</code>;(或 lt)、>;(或 gt)、<=(或 le)和 >;=(或 ge)

四 、空验证运算符 empty

访 问对象性质和集合
使用EL访问一个命名变量的性质时,要用到“.”或“[]”操作符,例如:
你的年龄是${user.age}
如 果user命名变量引用了一个JavaBean ,就会读取这个JavaBean的age属性,并做相应的替换,当然,这个性质必须存在,而且必须可
以 读取。实际上是调用底层JavaBean的getAge()方法来得到的属性质。

2007-5-13 12:27:08 EL 简介

EL 简介
EL 全名为Expression Language,它原本是JSTL 1.0为方便存取数据所自定义的语言。当时EL
只能在JSTL 标签中使用,如下:
<c:out value="${ 3 + 7}">
程序执行结果为10。但是你却不能直接在JSP 网页中使用:
<p>Hi ! ${ username }</p>
到了JSP 2.0 之后,EL 已经正式纳入成为标准规范之一。因此,只要是支持Servlet 2.4 / JSP
2.0 的Container,就都可以在JSP 网页中直接使用EL 了。
除了JSP 2.0 建议使用EL 之外,JavaServer Faces( JSR-127 ) 也考虑将EL 纳入规范,由此
可知,EL 如今已经是一项成熟、标准的技术。
注意
假若您所用的Container 只支持Servlet 2.3/JSP 1.2,如:Tomcat 4.1.29,您就不能在
JSP 网页中直接使用EL,必须安装支持Servlet 2.4 / JSP 2.0 的Container。
EL 语法
EL 语法很简单,它最大的特点就是使用上很方便。接下来介绍EL 主要的语法结构:
${sessionScope.user.sex}
所有EL都是以 ${ 为起始、以} 为结尾的。上述EL范例的意思是:从Session的范围中,取得
用户的性别。假若依照之前JSP Scriptlet的写法如下:
User user = (User)session.getAttribute("user");
String sex = user.getSex( );
6-2-1 .与 [ ] 运算符
EL 提供 . 和 [ ] 两种运算符来存取数据。下列两者所代表的意思是一样的:
${sessionScope.user.sex}
等于
${sessionScope.user["sex"]}
. 和 [ ] 也可以同时混合使用,如下:
${sessionScope.shoppingCart[0].price}
回 传结果为shoppingCart中第一项物品的价格。
不过,以下两种情况,两者会有差异:
(1) 当要存取的属性名称中包含一些特殊字符,如 . 或 – 等并非字母或数字的符号,就一定
要使用 [ ],例如:
${user.My-Name }
上述是不正确的方式,应当改为:
${user["My-Name"] }
(2) 我们来考虑下列情况:
${sessionScope.user[data]}
此时,data 是一个变量,假若data的值为"sex"时,那上述的例子等 于${sessionScope.user.sex};
假若data 的值为"name"时,它就等于${sessionScope.user.name}。因此,如果要动态取值时,就可以
用上述的方法来做,但 . 无法做到动态取值。
接下来,我们更详细地来讨论一些情况,首先假设有一个EL:

${expr-a[expr-b]}
(1) 当expr-a 的值为null时,它会回传null。
(2) 当expr-b的值为null时,它会回传null。
(3) 当expr-a 的值为一Map 类型时:
● 假若 !value-a.containsKey(value-b)为真,则回传null。
● 否则回传value-a.get(value-b)。
(4) 当expr-a 的值为List 或array 类型时:
● 将value-b 的值强制转型为int,假若不能转型为int 时,会产生error。
● 然后, 假若value-a.get(value-b) 或Array.get(value-a, value-b) 产生
ArrayIndexOutOfBoundsException 或IndexOutOfBoundsException 时,则回传null。
● 假若value-a.get(value-b)或Array.get(value-a, value-b)产生其他的异常时,则会产生
error。
● 最后都没有任何异常产生时,回传value-a.get(value-b)或Array.get(value-a, value-b)。
(5) 当expr-a 的值为JavaBean 对象时:
● 将value-b 的值强制转型为String。
● 假若getter 产生异常时,则会产生error。若没有异常产生时,则回传getter 的结果。

6-2-2 EL 变量
EL 存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username
的变量。因为我们并没有指定哪一个 范围的username,所以它的默认值会先从Page 范围找,假如
找不到,再依序到Request、Session、 Application范围。假如途中找到username,就直接回传,
不再继续找下去,但是假如全部的范围都没有找到时,就回传 null(见表6-1):

属性范围 在EL 中的名称
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope

自 动搜索顺序
我们也可以指定要取出哪一个范围的变量(见表6-2):
范 例 说 明
${pageScope.username} 取出Page 范围的username 变量
${requestScope.username} 取出Request 范围的username 变量
${sessionScope.username} 取出Session 范围的username 变量
${applicationScope.username} 取出Application 范围的username 变量
其中,pageScope、requestScope、sessionScope 和applicationScope都是EL 的隐含对

6-3 EL 隐含对象
笔者在“第五章:隐含对象(Implicit Object)”中,曾经介绍过9 个JSP 隐含对象,而EL本
身也有自己的隐含对象。EL 隐含对象总共有11 个(见表6-4):
表6-4
隐含对象 类 型 说 明
PageContext javax.servlet.ServletContext 表示此JSP 的PageContext
PageScope java.util.Map 取得Page范围的属性名称所对应的值
RequestScope java.util.Map
取得Request 范围的属性名称所对应
的值
sessionScope java.util.Map
取得Session 范围的属性名称所对应
的值
applicationScope java.util.Map
取得Application 范围的属性名称所
对应的值
param java.util.Map
如同
ServletRequest.getParameter(String
name)。回传 String 类型的值
续表
隐含对象 类 型 说 明
paramValues java.util.Map 如同
隐 含对象 类 型 说 明
ServletRequest.getParameterValues(String
name)。回传 String []类型的值
header java.util.Map
如同 ServletRequest.getHeader(String
name)。回传String 类型的值
headerValues java.util.Map
如同ServletRequest.getHeaders(String
name)。回传String []类型的值
cookie java.util.Map 如同HttpServletRequest.getCookies( )
initParam java.util.Map
如同
ServletContext.getInitParameter(String
name)。 回传String 类型的值

 

在JSP2.0中使用EL表达式语言

EL(表达式语言)是一种数据访问语言,可以方便地访问和处理应用程序数据,而无需使用scriptlet或者请求时(request-time)表达式的值。(不需要使用< % 和%>来获得数据,EL使JSP页面编写人员摆脱了java语言,使用户即使不懂JAVA也可以轻松编写JSP程序.

在JSP2.0之前,网页作者只能使用表达式< %= aName %>访问系统的值,比如:

1.            < someTags:aTag attribute="< %= pageContext.getAttribute("aName") %>">  

或者

2.            < % = aCustomer.getAddress().getCountry() %>  

而表达式语言允许网页作者使用简单的语法访问对象。比如要访问一个简单变量,可以像下面这样写:

3.            < someTags:aTag attribute="${aName}">  

而访问JavaBeans属性,可以使用:${aCustomer.address.country}

Tomcat对EL扩展表达式的支持和配置:

tomcat5.0默认支持EL,同时用户可以在Web.xml文件中对整个web应用程序进行设置或者在每个页面中单独设置page指令来控制TOMCAT是否对EL的支持。

----------------------------

JSP2.0中EL扩展表达式语言的设置

有了JSP2.0,就可以使用EL扩展表达式了。对于一个单个JSP页面,你可以使用定义page指令来设置jsp页面是否支持EL。默认是支持EL(如果要页面不支持EL,请设置为isELIgnored=true;

4.            < %@ page isELIgnored="true|false"%>  

对于整个JSP应用程序,要修改WEB.XML配置(tomcat5.0.16默认是支持EL的);

5.            < jsp-property-group>   

6.            < description> For config the ICW sample application < /description>   

7.            < display-name>JSPConfiguration< /display-name>   

8.            < url-pattern>/jsp/datareset.jsp< /url-pattern>   

9.            < el-ignored>true</el-ignored>   

10.        < page-encoding>ISO-8859-1< /page-encoding>   

11.        < scripting-invalid>true< /scripting-invalid>   

12.        < include-prelude>/jsp/prelude.jspf< /include-prelude>   

13.        < include-coda>/jsp/coda.jspf< /include-coda>   

14.        < /jsp-property-group>   

----------------------------

JSP2.0中表达式运算符号:

EL表达式运算符包括算数运算符(+-*/),关系运算符(>< )和逻辑运算符(&& || !),还有empty 判断值是否为空,同时EL能够对字符串,数字等各种类型的数据之间的自动转换,使EL 兼容了JAVASCRIPT等脚本语言的优点,摆脱了JAVA语言严格的数据类型限制,使用起来简单,只需要几分钟就可以轻松掌握(对于不懂java的网页编写人员实在是一件好事)。

----------------------------

JSP2.0中各种运算符运算实例

以下是EL运算符列表,其中empty可以检查某个值是否为空

运算符 说明

+ 加

- 减

* 乘

/或div 除

% 或 mod 模(求余)

== 或 = 等于

!= 或 != 不等于

<  或 lt 小于

>或gt 大于

< =或le 小于等于

>=或ge 大于等于

&& 或 and 逻辑与

|| 或 or 逻辑或

! 或 not 逻辑非

empty 检查是否为空值

a ? b : c 条件运算符

----------------------------

EL表达式使用简单,在网页中"${}"表示是EL表达式。${1+1} 显示为 2

----------------------------

JSP2.0中EL算术表达式 运算结果

15.        ${1} 1   

16.        ${1 + 2} 3   

17.        ${1.2 + 2.3} 3.5   

18.        ${-4 - 2} -6   

19.        ${21 * 2} 42   

20.        ${10%4} 2   

21.        ${10 mod 4} 2   

22.        ${1 <  2} true   

23.        ${1 lt 2} true   

24.        ${1 > (4/2)} false   

25.        ${4.0 >= 3} true   

26.        ${4.0 ge 3} true   

27.        ${100.0 eq 100} true   

28.        ${(10*10) != 100} false   

29.        ${(10*10) ne 100} false   

30.        ${(1==2) ? 3 : 4} 4  

----------------------------

内置的11个隐含对象:

为方便的获得WEB应用程序的相关数据,EL表达式语言定义了一些隐含对象。隐含对象共有11个对象,(JSP中具有9个隐含对象,EL比JSP中具有更多的隐含对象,这样EL比JSP更方便的获取数据) 使用这些对象可以很方便的访问Web 程序数据。

隐含对象包括Session(获得当前web程序的Session值),cookie(获得WEB程序的Cookie值),header,headerValues(获得用户的Http数据访问头部信息),Param和ParamValues(获得用户提交数据参数)等。

使用${隐含对象名称["元素"]} 就可以获得这个值了,例如${header("host")} 可以显示http头部中host的值,${param("username")},可以获得显示用户表单提交的用户. 使用${empty(param("username")} 可以判断用户提交表单是否为空等。(这样比jsp1.2中使用request.getParamter("username") 要简化和方便很多了)

----------------------------

隐含对象及隐含对象访问实例

EL 表达式定义了11个隐含对象,使用这11个对象可以很方便的读取到session,cookie,HttpHeader,用户提交表单(param)等

隐含对象 内容

applicationScope 应用程序范围内的scoped变量组成的集合

cookie 所有cookie组成的集合

header HTTP请求头部,字符串

headerValues HTTP请求头部,字符串集合

initParam 全部应用程序参数名组成的集合

pageContext 当前页面的javax.servlet.jsp.PageContext对象

pageScope 页面范围内所有对象的集合

param 所有请求参数字符串组成的集合

paramValues 所有作为字符串集合的请求参数

requestScope 所有请求范围的对象的集合

sessionScope 所有会话范围的对象的集合

下面是获取HTTP访问头部数据和用户提交数据的示例

EL表达式 运算结果

${header["host"]} 这里得到HTTP连接头部的host值

${header["accept"]} 这里获得HTTP头部的accept值

${header["user-agent"]} 这里获得HTTP头部的user-agent值

----------------------------

访问应用程序数据

除了可以方便的访问内置的隐含对象外,EL还可以方便的到应用程序数据,访问应用程序数据使用两种方式 . (点号运算符)访问对象的属性,也可以使用[] 来访问数组元素(实际上EL中访问隐含对象数据也是使用这两种方式的)

表达式${data}表示名为data的scoped变量。可以使用点号(.)或方括号([])运算符从集合中检索属性值:(两种数据访问方式演示)

点号运算符用于访问命名的属性,比如表达式${customer.name}表示scoped变量customer的name属性;

方括号运算符可用于检索命名的属性,比如在${customer[“name”]}中。也可以通过${customers[0]}的形式来访问集合customers中的第一项。

EL表达式语言同时还统一了对点号和方括号运算符的处理,因此${customer.name}与${ customer[“name”]}是等价的。

----------------------------

以下可以读取用户提交的信息,假设用户提交信息为 ?name=myname&alies=now.net.cn(这里有两种访问方式,一种是使用[]来进行访问,另外一种是使用"."来进行访问,两种访问效果是一样的。)

31.        ${param["name"] } myname   

32.        ${param.name} myname   

33.        ${param["alies"] } now.net.cn   

34.        ${param.alies} now.net.cn  

----------------------------

访问应用程序数据需要进行以下几个步骤:

1.编写public类的static public 方法,只有static public的方法才能被标记表达试访问。

----------------------------

JSP2.0中定义和使用函数

表达式语言允许你定义可在表达式中调用的函数。函数必须作为public类中的public static方法编写。同时要将文件映射到TLD标志库文件中。

为了说明函数的使用,我们举一个简单的例子,把两个数相加。首先要编写求两数之和的Java方法代码,如代码示例所示,这里定义了一个静态方法,它接收两个字符串参数,把它们解析成整数并返回它们的和。

示例文件:Compute.java

35.        package jsp2.examples.el;   

36.        import java.util.*;   

37.        public class Compute {   

38.        public static int add(String x, String y) {   

39.        int a = 0;   

40.        int b = 0;   

41.        try {   

42.        a = Integer.parseInt(x);   

43.        b = Integer.parseInt(y);   

44.        }catch(Exception e) {}   

45.        return a + b;   

46.        }   

47.        }  

用javac把这段代码编译成功后,下一步就要把函数的签名映射到标签库。

----------------------------

2.将方法映射到TLD表中

----------------------------

配置标记库描述文件 函数描述符

48.        < function>   

49.        < description>add x and y< /description>   

50.        < name>add< /name>   

51.        < function-class>jsp2.examples.el.Compute   

52.        < /function-class>   

53.        < function-signature>int   

54.        add(java.lang.String,java.lang.String)   

55.        < /function-signature>   

56.        < /function>  

现在我们就可以编写一个JSP页面来使用这个函数。代码示例5是包含两个字段的一个表单,用户输入两个数字并按下“求和”按钮,就会调用上面的函数并把两个数相加,结果在同一个页面中显示出来。

----------------------------

3.在JSP页面中调用要引用的Taglib标记,然后就可以在jsp页面中访问了。

----------------------------

代码示例5: math.jsp

57.        < %@ taglib prefix="my"   

58.        uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib %>   

59.        < HEAD>   

60.        < TITLE>Functions< /TITLE>   

61.        < /HEAD>   

62.        < BODY>   

63.        < H3>Add Numbers< /H3>   

64.        < P>   

65.        < FORM action="math.jsp" method="GET">   

66.        X = < input type="text" name="x" value="${param["x"]}">   

67.        < BR>   

68.        Y = < input type="text" name="y" value="${param["y"]}">   

69.        < input type="submit" value="Add Numbers">   

70.        < /FORM>   

71.        < P>   

72.        The sum is: ${my:add(param["x"],param["y"])}   

73.        < /BODY>   

74.        < /HTML>  

----------------------------

JSP中表达式语言(EL)

JSP 表达式语言定义
表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。它是一种简单的语言,基于可用的命名空间(PageContext 属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到 Java 类中静态方法的可扩展函数以及一组隐式对象。

EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种脚本编制元素。

脚本编制元素具有三个从属形式: 声明
Scriptlet
表达式。让我们来看代码中的这三种从属形式:
 table.getColumn( ) 

在将 EL 添加到 JSP 工具包以后,可以使用更简单的语法来编写以上的代码,而获得与以上 JSP 元素相同的结果。EL 表达式的另一个优势是,可以在不允许使用上述任何脚本编制元素从属形式的无脚本的 JSP 页中使用它。但是必须注意,可以不使用三种脚本编制元素从属形式中的任一种来编写 JSP 页,而对 JSP 页是否应该为无脚本形式的选择则完全基于应用程序的需求。如果您希望明确分开表达与商务逻辑,则还可以选择将页面强制为无脚本形式。通过强制成为无脚本页面,必须通过其他元素(如 JavaBean、EL 表达式、自定义操作和标准标记库)提供 JSP 页的动态行为。

在无脚本的 JSP 页中支持 EL 的机制
有两种机制可以确保页面不包含任何脚本编制元素。每种机制还提供在无脚本的 JSP 页中支持 EL 的方法。

使用页面指示:
在使用页面指示时,您可以通过将 isELEnabled 指示的值相应地设为“true”或“false”,指定是否支持 EL,如下所示:

使用部署描述符的元素:
当使用部署描述符的元素时,您可以通过在标记间包含布尔值“true”或“false”,指定是否支持 EL,如下所示:

...      *.jsp    true    true  ....
表达式语言语法
JSP 表达式语言允许页面制作人员使用简单语法访问组件,如:
 
${expr}
在以上的语法中,expr 代表有效的表达式。必须注意,该表达式可以与静态文本混合,还可以与其他表达式结合成更大的表达式。

JSP EL 中的有效表达式
有效表达式可以包含文字、操作符、变量(对象引用)和函数调用。我们将分别了解这些有效表达式中的每一种:

文字
JSP 表达式语言定义可在表达式中使用的以下文字:

文字 文字的值
Boolean
 true 和 false
 
Integer
 与 Java 类似。可以包含任何正数或负数,例如 24、-45、567
 
Floating Point
 与 Java 类似。可以包含任何正的或负的浮点数,例如 -1.8E-45、4.567
 
String
 任何由单引号或双引号限定的字符串。对于单引号、双引号和反斜杠,使用反斜杠字符作为转义序列。必须注意,如果在字符串两端使用双引号,则单引号不需要转义。
 
Null null

让我们来看一些使用文字作为有效表达式的示例:

${false} ${3*8)
操作符
JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:

术语 定义
算术型
 +、-(二元)、*、/、div、%、mod、-(一元)
 
逻辑型
 and、&&、or、||、!、not
 
关系型
 ==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。
 

 空操作符是前缀操作,可用于确定值是否为空。
 
条件型 A ?B :C。根据 A 赋值的结果来赋值 B 或 C。 

让我们来看一些使用操作符作为有效表达式的示例:

${ (6 * 5) + 5 } ${empty name}
隐式对象
JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:

术语 定义
pageContext
 JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。
 

此外,还提供几个隐式对象,允许对以下对象进行简易访问:
术语 定义
param
 将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param.name) 相当于 request.getParameter (name)。
 
paramValues
 将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于 request.getParamterValues(name)。
 
header
 将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header.name} 相当于 request.getHeader(name)。
 
headerValues
 将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues.name} 相当于 request.getHeaderValues(name)。
 
cookie 将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie.name.value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues.name} 表达式。
initParam 将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。 

除了上述两种类型的隐式对象之外,还有些对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:


术语 定义
pageScope
 将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope.objectName.attributeName} 访问对象的属性。
 
requestScope
 将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope.objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope.objectName.attributeName} 访问对象的属性。
 
sessionScope
 将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如:


$sessionScope.name}


applicationScope
将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。必须注意,当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。

使用 EL 表达式
EL 表达式可用于两种情况:

作为标准操作和自定义操作中的属性值
在 JSP 文件的模板文本中,如 HTML 或非 JSP 元素 — 在这种情况下,模板文本中的表达式被赋值并插入到当前的输出中。但是,必须注意,如果标记的主体被声明为与标记相关,则不会对表达式赋值。

 

 

 

一、JSP EL语言定义

        E L(Expression Language)   目的:为了使JSP写起来更加简单。

       表达式语言的灵感来自于 ECMAScript 和XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。它是一种简单的语言,基于可用的命名空间(PageContext属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到 Java 类中静态方法的可扩展函数以及一组隐式对象。       EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种脚本编制元素。

二、JSP EL简介

1、语法结构     ${expression}2、[ ]与.运算符     EL 提供“.“和“[ ]“两种运算符来存取数据。     当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用“[ ]“。例如:         ${user.My-Name}应当改为${user["My-Name"] }     如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:         ${sessionScope.user[data]}中data 是一个变量3、变量     EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。     因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。     假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。     属性范围在EL中的名称         Page          PageScope         Request          RequestScope         Session          SessionScope         Application      ApplicationScope

二、JSP EL 中的有效表达式

       有效表达式可以包含文字、操作符、变量(对象引用)和函数调用。我们将分别了解这些有效表达式中的每一种:

1、文字

JSP 表达式语言定义可在表达式中使用的以下文字:

 

 

文字

文字的值

Boolean

true 和 false

Integer

与 Java 类似。可以包含任何正数或负数,例如 24、-45、567

Floating Point

与 Java 类似。可以包含任何正的或负的浮点数,例如 -1.8E-45、4.567

String

任何由单引号或双引号限定的字符串。对于单引号、双引号和反斜杠,使用反斜杠字符作为转义序列。必须注意,如果在字符串两端使用双引号,则单引号不需要转义。

Null

null

2、操作符

JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:

 

 

术语

定义

算术型

+、-(二元)、*、/、div、%、mod、-(一元)

逻辑型

and、&&、or、||、!、not

关系型

==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。

空操作符是前缀操作,可用于确定值是否为空。

条件型

A ?B :C。根据 A 赋值的结果来赋值 B 或 C。

3、隐式对象

JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:

 

术语

定义

pageContext

JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。

此外,还提供几个隐式对象,允许对以下对象进行简易访问:

 

 

术语

定义

param

将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name)获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param.name) 相当于request.getParameter (name)。

paramValues

将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于request.getParamterValues(name)。

header

将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header.name} 相当于 request.getHeader(name)。

headerValues

将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String)获得)。它与头隐式对象非常类似。表达式 ${headerValues.name} 相当于request.getHeaderValues(name)。

cookie

将cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式${cookie.name.value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用${headerValues.name} 表达式。

initParam

将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。

除了上述两种类型的隐式对象之外,还有些对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:

 

 

术语

定义

pageScope

将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope.objectName.attributeName} 访问对象的属性。

requestScope

将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope.objectName}访问一个 JSP 请求范围的对象,还可以使用 ${requestScope.objectName.attributeName} 访问对象的属性。

sessionScope

将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如:

$sessionScope.name}

applicationScope

将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。

三、特别强调:

1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。

2、 注意 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。

四、举例说明

1、例如,

      < %=request.getParameter(“username”)% >       等价于      ${ param.username }

2、例如,但是下面的那句EL语言可以完成如果得到一个username为空,则不显示null,而是不显示值。

    <%=user.getAddr( ) %>     等价于     ${user.addr}。

3、例如:

<% =request.getAttribute(“userlist”) %>     等价于$     { requestScope.userlist }

4、例如,原理如上例3。

${ sessionScope.userlist } 1

${ sessionScope.userlist } 2

${ applicationScope.userlist } 3

${ pageScope.userlist } 4

${uselist} 含义:执行顺序为4 1 2 3。

“.”后面的只是一个字符串,并不是真正的内置对象,不能调用对象。

4、例如,

<%=user.getAddr( ) %>      等价于    ${user.addr}

第一句前面的user,为一个变量。

    第二句后面user,必须为在某一个范围里的属性。

 

 

原创粉丝点击