【Java.Web】JSP —— EL —— 基础
2014-10-06 03:12
369 查看
EL表达式
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表达式是以"${"开头,以"}"结束。EL表达式的构造如下:${expression}
如果在JSP文件的模板文本中使用EL表达式,那么表达式的值会输出到网页上。
例如:
以下的Java表达式和EL表达式的作用相同,都用于输出请求参数username:
<%= request.getParameter("username") %> ${param.username }
EL表达式和Java表达式一样,即可以直接插入到JSP文件的模板文本中,也可以作为JSP标签的属性的值。
字符 ${ 表示某一个EL表达式的开始;如果想要在EL表达式中使用 ${ , 需要使用转义:\${
EL中的保留字
and or noteq ne lt
gt le ge
true false null
instanceof empty mod
访问对象的属性及数组的元素 [] 和 .
EL表达式语言可以使用点号运算符 “,”来访问对象的属性。例如: 表达式 ${customer.name}表示customer对象的name属性。
EL表达式语言也可以使用方括号运算符 “[]”来访问对象的属性。
例如:表示式${customer["name"]} 和上面的表达式是等价的。
方括号运算符“[]” 还可以用来访问数组中的元素。
例如:${customers[0]}表示访问customers数组中的第一个元素。
EL运算符
EL表达式支持的所有的运算符如下:算数运算符
+ —— 加; 例如:${16 + 5}, 结果21
- —— 减;例如:${16 - 5}, 结果11
* —— 乘; 例如:${16 * 5},结果为80
/ 或 div —— 除;例如:${16 / 5},结果为3.2
% 或 mod —— 模;例如:${16 % 5},结果为1
关系运算符
== 或 eq —— 等于;例如:${16 == 5},结果为false
!= 或 ne —— 不等于;例如:${16 != 5},结果为true
< 或 lt —— 小于;例如:${16 < 5},结果为false
> 或 gt —— 大于;例如:${16 > 5},结果为true
<= 或 le —— 小于等于;例如:$(16 <= 5),结果为flase
>= 或 ge —— 大于等于;例如:${16 >= 5},结果为true
逻辑运算符
&& 或 and —— 逻辑与;例如:${ 16 > 5 && 16 < 18},结果为true
|| 或 or —— 逻辑或;例如:${16 > 5 || 16 < 18},结果为true
! 或 not —— 逻辑非;例如:${!(16 >5)},结果为false
empty运算符
empty —— 检查是否为空值;例如:${empty var},如果变量var为null,就返回true
如果var变量不存在,即没有被定义,返回true
如果var变量的职位null,返回true
如果var变量引用集合,如set,list,map等类型的对象,并且在集合对象中不包含任何元素,返回true
empty运算符可以与“!”运算符一起使用
条件运算符
a?b:c —— 条件运算符;例如${16 > 5? 16 ; 5},结果为16
使用示例:
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}
表示HTTP请求中的特定数据:
header
java.util.Map
把HTTP请求头部的项目名和项目值进行映射;
例如:${heaser["user-agent"]}等价于 <%= request.getHeader("user-agent") %>
headValues
java.util.Map
把HTTP请求头部的项目名和所有匹配的项目值的数组进行映射;
例如:${headerValues["accept-language"]} 等价于 <%= request.getHeader("accept-language") %>
param
java.util.Map
把客户请求中的请求参数名和参数值进行映射;
例如:${param.username} 等价于 <%= request.getParameter("username")%>
paramValues
java.util.Map
把客户请求中的请求参数名和所有破陪的参数值数组进行映射;
例如:${paramValues.username} 等价于 <%= request.getParameterValues("username") %>
cookie
java.util.Map
把客户请求中的Cookie名和Cookie对象进行映射;
表示特定范围:
pageScope
java.util.Map
把页面范围内的属性名和属性值进行映射;
requestScope
java.utilMap
把请求范围内的属性名和属性值进行映射;
sessionScope
java.util.Map
把会话范围内的属性名和属性值进行映射;
例如:${sessionScope.cart.total} 等价于 调用会话范围内的属性名为“cart”的ShoppingCart对象的getTotla方法
applicationScope
java.util.Map
把Web应用范围内的属性名和属性值进行映射;
例如:${applicationScope.counter.count} 等价于 调用Web应用范围内的属性名为"counter"的CounterBean对象的getCount()方法
pageContext
java.util.Map
表示PageContext对象
表示当前JSP页面的javax.servlet.jsp.PageContext对象
pageContext对象包含所有其他的JSP隐式对象:request, response, out, session, application, config, pageContext, page, exception
例如:${pageContext.servletContext.serverInfo} 等价于 <%= application.getServerInfo() %>
例如:${pageContext.request.requestURL} 等价于 <%= request.getRequestURL() %>
例如:${pageContext.response.characterEncoding } 等价于 <%= response.getCharacterEncoding() %>
例如:${pageContext.session.creationTime } 等价于 <%= session.getCreationTime() %>
initParam
java.util.Map
把Web应用的初始化参数名和参数值进行映射
例如:${initParam.driver} 等价于 <%= application.getInitParameter("driver") %>
命名变量
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}
使用EL表达式的JSP范例
示例1 - 读取HTML表单数据
创建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:
示例2 - 使用命名变量
创建一个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函数。EL函数实际上与Java类中的方法对应,这个Java类必须定义为public类型,并且作为EL函数的方法必须声明为public static类型。
当Java类定义好后,应该在标签库描述符(TLD)文件中,把Java类的方法映射为EL函数。
相关文章推荐
- 传智播客Java web之 JSP基础之EL表达式注释以及错误查找
- 传智播客Java web之 JSP基础之JSP的原理与特性
- jsp/java web基础知识回顾
- 【Java.Web】JSP —— 语法基础
- 【Java.Web】JSP —— 语法基础 —— JSP异常处理
- 【Java.Web】JSP —— 语法基础 —— 隐式对象implicit Objects
- 传智播客Java web之 JSP基础之模板与表达式
- Java Web EL、JSP、Servlet变量
- 【Java.Web】JSP —— 语法基础 —— JSP指令Directives(page include taglib)
- 5.JavaWeb基础 JSP内置对象
- 【Java.Web】JSP —— 语法基础 —— 包含include
- 传智播客Java web之 JSP基础之指令与标签
- 【JavaWeb】基础知识总结02 JSP
- Java web之JSP基础
- Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之12.Servlet基础(2)
- Java Web基础:第六讲 JSP运行原理
- 学习笔记之javaweb基础:jsp基本语法,内置对象,对JavaBean的操作语法
- 学习笔记_java web——JSP基础
- 【Java.Web】JSP —— 语法基础 —— URL Paths