您的位置:首页 > 编程语言 > Java开发

【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 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表达式支持的所有的运算符如下:

算数运算符

+ —— 加; 例如:${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函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: