JSP2.0表达式语言
JSP表达式语言介绍(了解):
表达式语言减轻页面工作量,减少JSP页面中的脚本(JSP声明、表达式、scriptlets)。
EL表达式可同时在文本和标准动作或制定动作的特性中出现。
EL在JSP编程中并不是全新的。EL首先出现在JSP标准标签库JSTL1.0规范中。
通过将标准库导入到他们的应用中,JSP2.0程序员可使用该语言。
现在EL是JSP的一部分,在没有JSP标准标记库时也可以使用EL。
EL引用CSS文件:
<link rel=”stylesheet” type=”text/css” href=”${pageContext.request.contxtPath}/Styles.css”>
1.1构建EL表达式
语法:${expression}——想输出”${“字符,则必须转义第一个字符:”\${“
可以连接两个表达式。表达式的顺序必须是从左到右,强制转换位字符串类型,并且连接起来。
Eg:如果a+b等于8,同时c+d等于10,那么:
${a+b}${c+d}等于多少?
${a+b}some${c+d}text
——810
——8some10text
如果定制标记的特性值中使用表达式,这个表达式就会被求值,并且结果字符串被强制转换为该特性所期望的类型:
<my:tag someAttribute=”${expression}”/>
表达式的求值规则:从左到右求值。对于一般的语法exprA[exprB]
(1) 对exprA求值并放入valueA中。
(2) 如果valueA值为null,则返回null。
(3) 对exprB求值并放入valueB中。
(4) 如果valueB值为null,则返回null。
(5) 如果valueA是一个Map,则检查valueB是否为Map中的一个键。如果是,则返回valueA.get(valueB),否则返回null。
(6) 如果valueA是一个List或一个数组,则:将valueB强制转换位int类型。如果强制转换失败,则抛出一个异常。如果valueA.get(valueB)或者Array.get(valueA,valueB)抛出ArrayIndexOutOfBoundsException或IndexOutOfBoundsException异常,返回null。否则,返回valueA.get(valueB)或Array.get(valueA,valueB)。
(7) 在这种情况下,valueA必须是一个JavaBean,因此将valueB强制转换成String类型。如果valueB是valueA的一个可读取的属性,它就会调用这个属性的getter方法并从这个getter方法中返回一个值。如果这个getter方法抛出异常,就表示产生了错误。
(8) 否则产生错误。
EL中的保留字 |
|||
and |
与 |
true |
真 |
or |
或 |
false |
假 |
not |
非 |
null |
Null |
eq |
等于 |
empty |
空 |
ne |
不等于 |
div |
除法 |
gt |
大于 |
mod |
求模 |
ge |
大于等于 |
|
|
1.2访问对象属性
表达式返回的类型可以是任意类型。如果某个表达式产生了一个带有属性的对象,就可以通过“[]”或“.”运算符访问这个属性。“[]”或“.”运算符可相同对待:“[ ]”是更加一般的形式,而“.”则更加简洁的形式。
Use:${object[“propertyName”]}
${object.protertyName}
如果propertyName不是一个有效的java变量名,必须使用“[ ]”语法。
举个例子说明,隐式对象header表示一个包括所有请求头的Map。为了访问host头,可以使用如下形式之一:
1.${header[“host”]} 2.${header.host}
但是,为了访问accept-language头,只能使用”[ ]”运算符,因为accept-language不是一个合法的java变量名。
如果对象的属性是一个同样含有属性的对象,可以使用”[ ]”或”.”来访问这个属性。比如,pageContext表示当前JSP页面的PageContext对象。pageContext的其中一个属性是request,它表示ServletRequest对象。ServletRequest对象具有requestURI属性。下面的表达式用于
产生requestURI的属性值:
${pageContext.request.requestURI}
为了访问requestURI的属性值,可以使用下列的任意义中形式:
${pageContext[“request”][“requestURI”]}
${pageContext.request[“requestURI”]}
${pageContext[“request”].requestURI}
1.3访问EL隐式对象
EL的使用之一就是访问一般通用的java代码可获得的信息,比如上下文初始化参数、请求参数、请求头、cookie以及会话对象等。使用EL,可以通过EL隐式对象访问这些信息。
使用隐式对象:
1、 pageContext隐式对象
pageContext隐式对象表示当前JSP页面的javax.servlet.jsp.Pagecontext对象。这也是最复杂的一个对象,因为它封装了所有其他的JSP隐式对象(比如out、request、response等)。
注意:不要将JSP隐式对象和EL隐式对象混淆。
Eg:获得当前的ServletRequest对象:
${pageContext.request}
获得request对象的请求URI:
${pageContext.request.requestURI}——等价于调用request隐式对象中的getRequestURI方法。
获得请求参数,可以使用param及paramValues隐式对象。
${pageContext.request.param}
${ pageContext.request.paramValues}(?????)
2、 initParam隐式对象
使用initParam隐式对象来得到上下文初始化参数的值。举个例子,假如有一个称为bgColor的参数,该参数指定了所有页面的背景颜色,那么可以在部署描述符中声明如下的context-param元素:
<context-param>
<param-name>bgColor</param-name>
<param-value>green</param-value>
</context-param>
然后,可以使用如下的EL表达式来得到bgColor参数的值:
<body gbcolor=”${initParam.bgColor}”>
3、 param与paramValues隐式对象
param隐式对象表示一个包括所有请求参数的Map。可以使用这个隐式对象来得到参数值。比如,下面的例子说明了如何获得一个name参数:${param.name}
paramValues隐式对象表示一个包含所有请求参数的Map,用参数名作为键。每个值都是一个字符串类型的数组,该数组包括指定参数名的所有值。如果参数只有一个值,则返回含有一个元素的数组。
Eg:为了得到favSinger参数的第一个和第二个值,可以使用如下表达式:
${paramValues. favSinger[0]}
${paramValues. favSinger[1]}
4、 Header与headerValues隐式对象
Header隐式对象表示一个包含所有请求头的Map,用请求头名作为键。为了得到host头的值,可以使用如下表达式:
${header.host}
如果头名不是一个有效的Java变量名,如accp-language,就必须使用“[ ]”运算符:
${headerValues[“accept-language”][0]}
5、 Cookie隐式对象
Cookie隐式对象表示一个包含当前的ServletRequest对象中所有cookie的Map。举例说明,为了得到一个称为password的cookie,可以使用如下表达式:
${cookie.password.value}
为了得到同一个cookie的maxAge值,使用如下表达式作用域:
${cookie.Password.maxAge}
6、 Scope隐式对象
可以使用applicationScope隐式对象来获得应用作用域内特性的值。比如,如果有一个称为myAttr的应用作用的特性,则可用如下的表达式访问这个特性:
${applicationScope.maAttr}
favSinger sessionScope、requestScope和pageScope隐式对象与applicationScope对象相似。然而,他们所指的作用域分别是会话、请求和页面。
1.4使用简单的EL表达式
使用(访问EL表达式隐式对象详例)
2.0访问JavaBean
JSP中可以用UIOoutput组件来显示JavaBean的属性值。亦可用EL表达式输出JavaBean的值通用语法:
使用”.”或”[ ]”运算符来访问该bean属性:
${beanName.propertyName}
用EL表达式输出Bean内容时需要配置JavaBean在应用配置文件中用managed-bean元素注册:
<managed-bean>
<managed-bean-name>JavaBeanName</managed-bean-name>
<managed-bean-class>classDricetory</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
<managed-property>
<property-name>attributeName</property-name>
<value>touchfone</value>
</managed-property>
</managed-bean>
使用(书上实例演示/加超链接)
3.0使用表达式语言(EL)运算符
除”.”和”[]”运算符以外,EL还为各种操作提供了其他的运算符,这些运算符号又操作数,并且允许一些操作;应该谨慎使用,一般在编写业务逻辑时才使用运算符;
——表示层不是写业务逻辑的地方。
一般应用:
<body bgColor=”${initParam.bgColor==null?”yellow”:initParam.bgColor}”>如果在部署描述符中不存在bgColor上下文初始化参数,就可以使用如下body元素:
<body bgColor=”yellow”>
否则,body元素中的bgColor特性值就是在部署描述符中指定的上下文参数bgColor的值。
EL表达式按照从高到低、从左到右的优先级别。
*、/、div、%、及mod运算符具有相同的优先级别,要求先求值。然后+和-具有相同的优先级别,在第一组优先计算之后求值,因为其优先级要低。
Eg:
使用(书上实例演示/加超链接)
以下为EL运算符!!
4.0调整表达式语言的相关设置
4.1使用EL计算无效
当不希望在一个或多个JSP页