EL表达式
一 概述
1.EL
Expression Language,表达式语言,一种不同于编程语言的语言,用于访问对象或者为对象赋值,取代JSP页面中嵌套的java代码,使页面风格统一。
2.语法格式
${expression}
expression既可以是属性,也可以是字面值,还可以是算术表达式、关系表达式、逻辑表达式、条件表达式等。
3.+
在EL表达式中,“+”只能用作算术运算,不能用来连接字符串。在进行算术运算时,EL尝试将两个数据转化为数字,转化不成功则抛出异常。
二 禁用EL
低版本的JSP页面可能不支持EL,需要在页面中禁用EL,根据作用范围,禁用有3种方式:
1.禁用单个EL表达式:
\${expression};
2.禁用当前页面中的EL:
<%@ page isELIgnored="true"%>
3.禁用应用程序中全部页面或者指定页面中的EL:
<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> </jsp-config>
三 EL表达式作用
- 可以将字面值输出到页面。
- 访问对象,可以访问对象中的属性、成员方法与静态方法,不可访问成员变量与静态变量。属性不存在时,输出空字符串,而不是null。
- 可以访问作用域范围内的属性,访问顺序:page、request、session、application,由小到大。
- 可以访问环境变量:请求参数、初始化参数、消息报头、cookie。
- ${empty expression}:判断对象是否为空,为空返回true。
- ${not empty expression}:表达式非空值返回true。
- ${list[0]}:访问数组或者List集合中的元素,索引越界不会抛出异常或返回null,而是返回空字符串。
- ${map.key}:访问map集合。
- 支持算术运算:a+b。
- 支持关系运算:对比两个参数的大小关系。
- 支持逻辑运算:&& ! ||,判断事件是否成立。
- 支持条件运算:${条件表达式?表达式1:表达式2}:条件表达式为true,执行表达式1,否则执行表达式2。
- EL表达式可以当做普通字符串插入JavaScript代码中。
四 内置对象
1.使用规则
EL表达式在底层创建了许多对象,这些对象可以在JSP页面中直接使用。
2.页面上下文对象pageContext
- 通过pageContext可以获取其他内置对象,如request/session/out/exception/page/application,不可以获得config。
- 获取到其他内置对象以后,可以获取其属性,如pageContext.request.contentLength。
3.作用域范围的隐含对象
- 包括:pageScope/requestScope/sessionScope/applicationScope。
- 可以访问作用域范围内保存的数据,不可以访问具有getter方法的属性。
4.环境信息的隐含对象
- param:访问请求参数。
- paramValues:当一个请求参数包含多个值时使用,以数组存储。
- header:用于获取HTTP请求头的值。
- headValues:当一个请求头包含多个值时使用,以数组存储。
- initParam:获取初始化参数的值。
- cookie:访问Cookie对象。
五 自定义EL函数
1.自定义函数的一般步骤
- 创建一个类,在类中创建一个有返回值的静态方法。
- 编写标签库描述文件.tld,将编写好的文件放在WEB-INF目录下。
2.标签库描述文件
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0"> <description>JSTL 1.1 functions library</description> <display-name>JSTL functions</display-name> <tlib-version>1.1</tlib-version> <short-name>fn</short-name> <uri>http://java.sun.com/jsp/jstl/myFunctions</uri><!-- 声明时使用 --> <function> <description> Tests if an input string contains the specified substring. </description> <name>contains</name><!-- 调用时使用的名称 --> <function-class>org.apache.taglibs.standard.functions.Functions</function-class><!-- 自定义类的全限定性类名 --> <!-- 无论是返回值,还是形参,都必须使用全限定性类名 --> <function-signature>boolean contains(java.lang.String, java.lang.String)</function-signature> </function> </taglib>
3.使用
首先在jsp页面中引入标签库:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/myFunctions"%>
使用语法同EL相同:
${fn:functionName(arg...)}
4.作用
取代JSP页面中的java代码,使页面风格统一,更加简洁。
不能仅仅停滞在实现上,应该去追求代价更小、性能更优的实现