JSP 2.0 中最重要的特性之一是Expression Language ( EL ) , JSP 设计者可以用它访问应用程序数据。受ECMAScript 和XPath 表达式语言的启发, EL 被设计成能够轻松地编写无脚本或不包含Java 代码的JSP 页面,即不使用JSP 声明、表达式或者Scriptlet 的页面。
EL 最早应用于JSP Standard Tag Library (JSTL ) 1. 0 规范中首次出现的JSP 2.0 中。JSP 1 . 2 的程序员可以通过将标准的类库导入到他们的应用程序当中,来使用这种语言。JSP 2.0 及以上版本的开发者则不需要JSTL 就可以使用EL ,不过有许多应用程序仍然需要JSTL ,因为它还包含了与EL 无关的其他标签。
这种表达式语言能简化JSP文件中数据访问大代码。可用来替代传统的基于“<%=”和“%>”形式的Java表达式,以及部分基于“<%”和“%>”形式的Java程序片段。
EL表达式能大大简化JSP代码,并能够提高JSP代码的可读性。
尽管EL表达式是JSP新版本的一个重要特性,但它并不是一种通用的编程语言,它仅仅是一种数据访问语言。
EL表达式是以"${"开头,以"}"结束。EL表达式的构造如下:
${expression}
如果在JSP文件的模板文本中使用EL表达式,那么表达式的值会输出到网页上。
例如:
以下的Java表达式和EL表达式的作用相同,都用于输出请求参数username:
<%= request.getParameter("username") %> ${param.username }
EL表达式和Java表达式一样,即可以直接插入到JSP文件的模板文本中,也可以作为JSP标签的属性的值。
字符 ${ 表示某一个EL表达式的开始;如果想要在EL表达式中使用 ${ , 需要使用转义:\${
and or not
eq ne lt
gt le ge
true false null
instanceof empty mod
EL表达式语言可以使用点号运算符 “,”来访问对象的属性。
例如: 表达式 ${customer.name}表示customer对象的name属性。
EL表达式语言也可以使用方括号运算符 “[]”来访问对象的属性。
例如:表示式${customer["name"]} 和上面的表达式是等价的。
方括号运算符“[]” 还可以用来访问数组中的元素。
例如:${customers[0]}表示访问customers数组中的第一个元素。
EL表达式支持的所有的运算符如下:
使用示例:
el_test.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ page import="java.util.HashMap" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <%= request.getParameter("username") %> ${param.username } <br/> (1) ${empty pageScope.container} <br/> <% HashMap container = new HashMap(); pageContext.setAttribute("container", container, PageContext.PAGE_SCOPE); %> (2) ${empty pageScope.container } <br/> <% container.put("name", "new user"); %> (3) ${empty pageScope.container } <br/> (4) ${empty param.username } <br/> (5) ${! empty param.username } <br/> </body> </html>
访问上面的JSP文件,浏览器显示为:
EL表达式定义了11个隐含对象,它们都是java.util.Map类型。
在EL表达式中无法直接访问JSP文件中的隐含对象。
例如通过表达式${request.requestURL}来访问HttpServletRequest对象的requestURL属性是无效的,正确的表达式为${pageContext.request.requestURL}
EL表达式中的变量称为命名变量,它不是JSP文件中的局部变量或者实例成员变量,而是存放在特定范围内的属性。命名变量的名字和属性名字对应,
例如:(1)
${username}
等价于以下代码:
<% // 从所有范围内寻找名为“username”的属性 String username = (String)pageContext.findAttribute("username"); if (username != null) { %> <%= username %> <% } %>
(2)
${cart.total}
等价于以下代码:
<% // 从所有范围内寻找名为“cart”的属性 ShoppingCart cart = (ShoppingCart)pageContext.findAttribute("cart"); if (cart != null) { %> <%= cart.getTotal() %> <% } %>
在ShoppingCart类中只要提供了public类型的getTotal()方法,就可以通过${cart.total}表达式获得cart.getTotal()方法的返回值。
(3)
<% String username = "new user"; %> ${username}
以上代码不会打印username局部变量。因为${username}代表特定范围内的username属性,如果在所有范围内都不存在username属性,那么${username}没有任何打印结果。
(4)
<% pageContext.setAttribute("username", "new user", PageContext.SESSION_SCOPE); %> ${username}
以上代码会打印出会话范围内的username属性值。
(5)
如何实现知道命令变量的范围,也可以通过隐含变量pageScope,requestScope,sessionScope,applicationScope来访问命名变量。
例如:
${sessionScope.username} ${applicationScope.username}
创建elform.jsp文件:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <h3>Fill - out -form</h3> <p/> <form action="elform.jsp" method="get"> name = <input type="text" name="username" value='${param["username"]}'/> <input type="submit" value=“Submit” /> </form> The name is ${param.username} </body> </html>
在浏览器中访问如下的url:
http://localhost:8080/base-webapp/jsp/eljsp/elform.jsp
输入值点击submit:
创建一个elvariable.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <jsp:useBean id="testBean" scope="page" class="com.gof.test.bean.TestBean"> </jsp:useBean> <jsp:setProperty property="id" name="testBean" value="the id"/> <jsp:setProperty property="firstName" name="testBean" value='${testBean.id}'/> Current id value is: ${testBean.id}<br/> <% application.setAttribute("driver", "com.mysql.jdbc.Driver"); %> Current driver is: ${applicationScope.driver} </body> </html>
testBean为 动作action 一节中, jsp:useBean所创建的Bean.
<jsp:useBean>动作将testBean对象加入到PAGE SCOPE范围内的属性中,因此在EL表达式中可以取出这个对象的引用。
在浏览器中访问这个JSP,
http://localhost:8080/base-webapp/jsp/eljsp/elvariable.jsp
EL表达式语言可以访问EL函数。
EL函数实际上与Java类中的方法对应,这个Java类必须定义为public类型,并且作为EL函数的方法必须声明为public static类型。
当Java类定义好后,应该在标签库描述符(TLD)文件中,把Java类的方法映射为EL函数。