其实工作那么久,一直都是写的Freemarker模板页面,直到最近才开始写JSP页面,所以这里完整学一下JSP原生支持的EL表达式(web.xml的3.0版本默认支持,后面说)。
EL的全名是Expression Language,它原本是JSTL 1.0为了方便存储数据所自定义的语言,发展到现在已经是一项成熟、标准的技术。
使用EL表达式获取数据
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的WEB域中检索Java对象并获取数据,比如某个WEB域中的Java Bean、List集合、Map集合或数组等对象。
使用EL表达式获取数据的通常语法是:${标识符}。EL表达式在执行的时候,会调用pageContext.findAttribute方法,用标识符作为关键字,分别从page、request、session、application四个域中查找并返回匹配的对象,找不到则返回空字符串。
使用EL表达式执行运算
语法和获取数据的语法一样:${运算表达式}。EL表达式支持以下运算符:
关系运算符:
逻辑运算符:
empty运算符:检查对象是否为空(null),比如 ${empty user} 。
三目运算符:${user != null ? user.name : "游客"} 。
下标/属性运算符和属性运算符:${users[0]} 或 ${users[name]} 和 ${user.name} 。
使用EL表达式获得WEB开发常用对象
EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取WEB开发中的一些常见对象,并读取这些对象的数据。语法也是一样样的:${隐含对象名称}。
隐含对象名称 描述 pageContext 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。) pageScope 代表page域中用于保存属性的Map对象 requestScope 代表request域中用于保存属性的Map对象 sessionScope 代表session域中用于保存属性的Map对象 applicationScope 代表application域中用于保存属性的Map对象 param 表示一个保存了所有请求参数的Map对象 paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[] header 表示一个保存了所有http请求头字段的Map对象,注意:如果头里面有“-” ,例Accept-Encoding,则要header[“Accept-Encoding”] headerValues 表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] cookie 表示一个保存了所有cookie的Map对象 initParam 表示一个保存了所有web应用初始化参数的map对象
使用EL表达式调用Java方法(EL自定义函数)
EL表达式允许开发人员开发自定义函数,以调用Java类的方法,用于扩展EL表达式的功能,让EL表达式完成普通Java程序代码所能完成的功能。
在EL表达式中调用的只能是Java类的静态方法,这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用。
使用上还是熟悉的语法:${prefix: methiod(params)}。
一般来说,EL自定义函数的开发与应用包含以下三个步骤:
1.编写一个Java类的静态方法。
public class SayHello { public static String sayHello(String name) { return "你好," + name; } }
2.在WEB-INF目录下编写TLD(标签库描述符)文件,在TLD文件中描述自定义函数。
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version> <short-name>EL Function</short-name> <!-- 自定义EL函数库的引用URI, 在JSP页面中可以这样引用:<%@taglib uri="/sayHelloFunction" prefix="fn" %> --> <uri>/sayHelloFunction</uri> <!-- <function>元素用于描述一个EL自定义函数 --> <function> <description>html标签转义处理方法</description> <!-- <name>子元素用于指定EL自定义函数的名称 --> <name>sayHello</name> <!-- <function-class>子元素用于指定完整的Java类名 --> <function-class>me.gacl.util.SayHello</function-class> <!-- <function-signature>子元素用于指定Java类中的静态方法的签名, 方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。--> <function-signature>java.lang.String sayHello(java.lang.String)</function-signature> </function> </taglib>
3.在JSP页面中导入和使用自定义函数。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%-- 引入EL自定义函数库 --%> <%@taglib uri="/sayHelloFunction" prefix="fn" %> <!DOCTYPE HTML> <html> <head> <title>使用EL调用Java方法</title> </head> <body> <%-- 使用EL调用filter方法 --%> ${fn:sayHello("静静")} </body> </html>
注意,编写完TLD(标签库描述符)文件后,需要将它放置到<web应用>\WEB-INF\目录下的除了classes和lib目录之外的任意子目录中。TLD文件中的<uri>标签用于指定该TLD文件的URI,在JSP文件中可以通过这个URI来引入该标签库描述文件。
EL表达式保留关键字
EL表达式无效的原因及解决办法
EL表达式是JSP 2.0规范中的一项技术。因此,若想正确解析EL表达式,需要使用支持Servlet2.4/JSP2.0技术的WEB服务器。同时也要注意Tomcat 6以下是不能支持EL表达式的。
在3.0版本的web.xml环境下,JSP是默认支持EL表达式的。但是3.0之前的版本则是需要通过JSP页面上的一个标签中的一个属性去控制是否能使用EL表达式的:
<%@ page isELIgnored="false"%>
这个属性值默认是true,即默认是关闭EL表达式的,我们可以在JSP页面上加上这段代码使JSP页面开启EL表达式的使用支持。但是这样的话,每个JSP页面都要把这段代码写一遍,比较麻烦,最好是直接升级web.xml的版本到3.0,一劳永逸。
"我想哭,你可不可以暂时别要睡。"