EL 全名为Expression Language
EL 语法很简单,它最大的特点就是使用上很方便。接下来介绍EL主要的语法结构:
${sessionScope.user.sex}
所有EL都是以${为起始、以}为结尾的。上述EL范例的意思是:从Session的范围中,取得
用户的性别。假若依照之前JSP Scriptlet的写法如下:
User user = (User)session.getAttribute("user");
String sex = user.getSex( );
两者相比较之下,可以发现EL 的语法比传统JSP Scriptlet更为方便、简洁。
.与[ ]
运算符
EL 提供.
和 [ ]
两种运算符来导航数据。下列两者所代表的意思是一样的:
${sessionScope.user.sex}等于${sessionScope.user["sex"]}
. 和[ ]
也可以同时混合使用,如下:
${sessionScope.shoppingCart[0].price}
回传结果为shoppingCart中第一项物品的价格。
不过,以下两种情况,两者会有差异:
(1) 当要存取的属性名称中包含一些特殊字符,如.或 – 等并非字母或数字的符号,就一定要使用
[ ],例如:${user.My-Name }
上述是不正确的方式,应当改为:${user["My-Name"] }
(2) 我们来考虑下列情况:
${sessionScope.user[data]}
此时,data是一个变量,假若data的值为"sex"时,那上述的例子等于${sessionScope.user.sex};
假若data的值为"name"时,它就等于${sessionScope.user.name}。因此,如果要动态取值时,就可以用上述的方法来做,但.无法做到动态取值。
EL变量
EL 存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page范围找,假如找不到,再依序到Request、Session、Application范围。假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null,当然EL表达式还会做出优化,页面上显示空白,而不是打印输出NULL。
属性范围(jstl名称)
|
EL中的名称
|
Page
|
PageScope
|
Request
|
RequestScope
|
Session
|
SessionScope
|
Application
|
ApplicationScope
|
我们也可以指定要取出哪一个范围的变量:
范例
|
说明
|
${pageScope.username}
|
取出Page范围的username变量
|
${requestScope.username}
|
取出Request范围的username变量
|
${sessionScope.username}
|
取出Session范围的username变量
|
${applicationScope.username}
|
取出Application范围的username变量
|
其中,pageScope、requestScope、sessionScope和applicationScope都是EL的隐含对象,由它们的名称可以很容易猜出它们所代表的意思,例如:${sessionScope.username}是取出Session范围的username变量。这种写法是不是比之前JSP的写法:
String username = (String) session.getAttribute("username");容易、简洁许多.
自动转变类型
EL 除了提供方便存取变量的语法之外,它另外一个方便的功能就是:自动转变类型,我们来看下面这个范例:
${param.count + 20}
假若窗体传来count的值为10时,那么上面的结果为30。之前没接触过JSP的读者可能会认为上面的例子是理所当然的,但是在JSP
1.2之中不能这样做,原因是从窗体所传来的值,它们的类型一律是String,所以当你接收之后,必须再将它转为其他类型,如:int、float等等,然后才能执行一些数学运算,下面是之前的做法:
String str_count = request.getParameter("count");
int count = Integer.parseInt(str_count);
count = count + 20;
所以,注意不要和java的语法(当字符串和数字用“+”链接时会把数字转换为字符串)搞混淆喽。
EL 隐含对象
JSP有9个隐含对象,而EL也有自己的隐含对象。EL隐含对象总共有11个
隐含对象
|
类型
|
说明
|
PageContext
|
javax.servlet.ServletContext
|
表示此JSP的PageContext
|
PageScope
|
java.util.Map
|
取得Page范围的属性名称所对应的值
|
RequestScope
|
java.util.Map
|
取得Request范围的属性名称所对应的值
|
sessionScope
|
java.util.Map
|
取得Session范围的属性名称所对应的值
|
applicationScope
|
java.util.Map
|
取得Application范围的属性名称所对应的值
|
param
|
java.util.Map
|
如同ServletRequest.getParameter(String name)。回传String类型的值
|
paramValues
|
java.util.Map
|
如同ServletRequest.getParameterValues(String name)。回传String[]类型的值
|
header
|
java.util.Map
|
如同ServletRequest.getHeader(String name)。回传String类型的值
|
headerValues
|
java.util.Map
|
如同ServletRequest.getHeaders(String name)。回传String[]类型的值
|
cookie
|
java.util.Map
|
如同HttpServletRequest.getCookies()
|
initParam
|
java.util.Map
|
如同ServletContext.getInitParameter(String name)。回传String类型的值
|
不过有一点要注意的是如果你要用EL输出一个常量的话,字符串要加双引号,不然的话EL会默认把你认为的常量当做一个变量来处理,这时如果这个变量在4个声明范围不存在的话会输出空,如果存在则输出该变量的值。
属性(Attribute)与范围(Scope)
与范围有关的EL
隐含对象包含以下四个:pageScope、requestScope、sessionScope和
applicationScope,它们基本上就和JSP的pageContext、request、session和application一样,所以笔者在这里只稍略说明。不过必须注意的是,这四个隐含对象只能用来取得范围属性值,即JSP中的getAttribute(String
name),却不能取得其他相关信息,例如:JSP中的request对象除可以存取属性之外,还可以取得用户的请求参数或表头信息等等。但是在EL中,它就只能单纯用来取得对应范围的属性值,例如:我们要在session中储存一个属性,它的名称为username,在JSP中使用session.getAttribute("username")来取得username
的值, 但是在EL中,则是使用${sessionScope.username}来取得其值的。
cookie
所谓的cookie是一个小小的文本文件,它是以key、value的方式将Session
Tracking的内容记录在这个文本文件内,这个文本文件通常存在于浏览器的暂存区内。JSTL并没有提供设定cookie的动作,因为这个动作通常都是后端开发者必须去做的事情,而不是交给前端的开发者。假若我们在cookie中设定一个名称为userCountry的值,那么可以使用${cookie.userCountry}来取得它。
header和headerValues
header 储存用户浏览器和服务端用来沟通的数据,当用户要求服务端的网页时,会送出一个记载要求信息的标头文件,例如:用户浏览器的版本、用户计算机所设定的区域等其他相关数据。假若要取得用户浏览器的版本,即${header["User-Agent"]}。另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues来取得这些值。
注意:因为User-Agent中包含“-”这个特殊字符,所以必须使用“[]”,而不能写成
$(header.User-Agent)。
initParam
就像其他属性一样,我们可以自行设定web站台的环境参数(Context),当我们想取得这些参数initParam就像其他属性一样,我们可以自行设定web站台的环境参数(Context),当我们想取得这些参数
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 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-app_2_4.xsd"
version="2.4">:
<context-param>
<param-name>userid</param-name>
<param-value>mike</param-value>
</context-param>:
</web-app>
那么我们就可以直接使用 ${initParam.userid}来取得名称为userid,其值为mike的参数。下面是之前的做法:String
userid = (String)application.getInitParameter("userid");
param和paramValues
在取得用户参数时通常使用一下方法:
request.getParameter(Stringname)
request.getParameterValues(Stringname)
在 EL中则可以使用param和paramValues两者来取得数据。
${param.name}
${paramValues.name}
这里param 的功能和request.getParameter(String name)相同,而paramValues和
request.getParameterValues(String name)相同。如果用户填了一个表格,表格名称为username,则我们就可以使用${param.username}来取得用户填入的值。
看到这里,大家应该很明确EL表达式只能通过内置对象取值,也就是只读操作,如果想进行写操作的话就让后台代码去完成,毕竟EL表达式仅仅是视图上的输出标签罢了。
pageContext
我们可以使用 ${pageContext}来取得其他有关用户要求或页面的详细信息。下表列出了几个比较常用的部分
Expression
|
说明
|
${pageContext.request.queryString}
|
取得请求的参数字符串
|
${pageContext.request.requestURL}
|
取得请求的URL,但不包括请求之参数字符串,即servlet的HTTP地址。
|
${pageContext.request.contextPath}
|
服务的webapplication的名称
|
${pageContext.request.method}
|
取得HTTP的方法(GET、POST)
|
${pageContext.request.protocol}
|
取得使用的协议(HTTP/1.1、HTTP/1.0)
|
${pageContext.request.remoteUser}
|
取得用户名称
|
${pageContext.request.remoteAddr}
|
取得用户的IP地址
|
${pageContext.session.new}
|
判断session是否为新的,所谓新的session,表示刚由server产生而client尚未使用
|
${pageContext.session.id}
|
取得session的ID
|
${pageContext.servletContext.serverInfo}
|
取得主机端的服务信息
|
这个对象可有效地改善代码的硬编码问题,如页面中有一A标签链接访问一个SERVLET,如果写死了该SERVLET的HTTP地址那么如果当该SERVLET的SERVLET-MAPPING改变的时候必须要修改源代码,这样维护性会大打折扣。
EL算术运算
表达式语言支持的算术运算符和逻辑运算符非常多,所有在Java语言里支持的算术运算符,表达式语言都可以使用;甚至Java语言不支持的一些算术运算符和逻辑运算符,表达式语言也支持。
<%@pagecontentType="text/html;charset=gb2312"%>
<html>
<head>
<title>表达式语言-算术运算符</title>
</head>
<body>
<h2>表达式语言-算术运算符</h2>
<hr>
<tableborder="1"bgcolor="aaaadd">
<tr>
<td><b>表达式语言</b></td>
<td><b>计算结果</b></td>
</tr>
<!--直接输出常量-->
<tr>
<td>\${1}</td>
<td>${1}</td>
</tr>
<!--计算加法-->
<tr>
<td>\${1.2+2.3}</td>
<td>${1.2+2.3}</td>
</tr>
<!--计算加法-->
<tr>
<td>\${1.2E4+1.4}</td>
<td>${1.2E4+1.4}</td>
</tr>
<!--计算减法-->
<tr>
<td>\${-4-2}</td>
<td>${-4-2}</td>
</tr>
<!--计算乘法-->
<tr>
<td>\${21*2}</td>
<td>${21*2}</td>
</tr>
<!--计算除法-->
<tr>
<td>\${3/4}</td>
<td>${3/4}</td>
</tr>
<!--计算除法-->
<tr>
<td>\${3div4}</td>
<td>${3div4}</td>
</tr>
<!--计算除法-->
<tr>
<td>\${3/0}</td>
<td>${3/0}</td>
</tr>
<!--计算求余-->
<tr>
<td>\${10%4}</td>
<td>${10%4}</td>
</tr>
<!--计算求余-->
<tr>
<td>\${10mod4}</td>
<td>${10mod4}</td>
</tr>
<!--计算三目运算符-->
<tr>
<td>\${(1==2)?3:4}</td>
<td>${(1==2)?3:4}</td>
</tr>
<tr>
<td>\${("A"=="C")}</td>
<td>${("A"=="C")}</td>
</tr>
</table>
</body>
</html>
运行结果:
表达式语言 |
计算结果 |
${1} |
1 |
${1.2 + 2.3} |
3.5 |
${1.2E4 + 1.4} |
12001.4 |
${-4 - 2} |
-6 |
${21 * 2} |
42 |
${3/4} |
0.75 |
${3 div 4} |
0.75 |
${3/0} |
Infinity |
${10%4} |
2 |
${10 mod 4} |
2 |
${(1==2) ? 3 : 4} |
4 |
${("A"=="C")} |
false |
上面页面中示范了表达式语言所支持的加、减、乘、除、求余等算术运算符的功能,读者可能也发现了表达式语言还支持div、mod等运算符。而且表达式语言把所有数值都当成浮点数处理,所以3/0的实质是3.0/0.0,得到结果应该是Infinity。
如果需要在支持表达式语言的页面中正常输出“$”符号,则在“$”符号前加转义字符“\”,否则系统以为“$”是表达式语言的特殊标记。
EL关系运算符
关系运算符
|
说明
|
范例
|
结果
|
== 或eq
|
等于
|
${5==5}或${5eq5}
|
true
|
!= 或ne
|
不等于
|
${5!=5}或${5ne5}
|
false
|
< 或lt
|
小于
|
${3<5}或${3lt5}
|
true
|
> 或gt
|
大于
|
${3>5}或{3gt5}
|
false
|
<= 或le
|
小于等于
|
${3<=5}或${3le5}
|
true
|
>= 或ge
|
大于等于
|
5}或${3ge5}
|
false
|
表达式语言不仅可在数字与数字之间比较,还可在字符与字符之间比较,字符串的比较是根据其对应UNICODE值来比较大小的。
注意:在使用EL 关系运算符时,不能够写成:
${param.password1} = = ${param.password2}
或者
${ ${param.password1 } = = ${ param.password2 } }
而应写成
${ param.password1 = = param.password2 }
EL逻辑运算符
逻辑运算符
|
范例
|
结果
|
&&或and
|
交集${A && B}或${A and B}
|
true/false
|
||或or
|
并集${A || B}或${A or B}
|
true/false
|
!或not
|
非${! A }或${not A}
|
true/false
|
Empty 运算符
Empty 运算符主要用来判断值是否为空(NULL,空字符串,空集合)。
条件运算符
${ A ? B : C}
分享到:
相关推荐
Fel Java表达式引擎是一款轻量级且高效的开源表达式计算引擎。它的全称是FastExpressionLanguage,专门设计用于满足不断变化的功能需求和性能需求。Fel的执行方式主要依赖于函数,运算符如加减乘除等被视为Fel函数,...
**JSTL1.1及EL表达式**是Java服务器页面(JSP)开发中的重要组件,它们极大地提升了JSP的可读性和可维护性。本文将深入探讨这两个概念及其在实际开发中的应用。 **JSTL(JavaServer Pages Standard Tag Library)**...
EL表达式是一种简洁的语法,它允许开发者通过简单的语法结构来访问Java对象的属性、方法以及集合元素。EL使用一种类似于JavaScript的语法,但它并不执行完整的脚本,而是专注于数据检索和计算。EL表达式通常在JSP...
### EL表达式教程 #### EL简介 EL (Expression Language),即表达式语言,是一种...通过上述介绍,相信您已经对EL表达式有了较为全面的认识,接下来您可以根据实际项目需求灵活运用EL表达式,实现更为丰富的功能。
在Web应用中,服务器通常会将请求参数作为字符串发送,而在Java代码中需要使用这些参数时必须进行类型转换,EL表达式免除了这种繁琐的类型转换工作,可以直接使用表达式得到的值。 EL表达式通常以“${表达式内容}”...
### Java EL (Expression Language) 和 JSTL 学习手册 #### 1. EL (Expression Language) 概述 EL,即表达式语言(Expression Language),最初是在 JSTL 1.0 中为了方便访问数据而引入的一种语言。随着 JSP 2.0 ...
JAVA EE 开发手册 JavaEE是一个开放的、 基于标准的平台,用以开发、部署和管理N层结构、面向...4、JSP和El表达式 5、Filter过滤器 6、JDBC之基础介绍 7、30之基础介绍 8、监听器Listener 9、注解( Annotation)
学习JSP时,你将接触到EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library),这些都是为了简化JSP开发而设计的表达式语言和标签库。 JavaServer Faces(JSF)是Java EE的一部分,提供了一种...
JSP 2.0技术手册中第六章详细介绍了EL的各种语法和使用方法,并且提供了丰富示例和场景,帮助开发者更好地理解和掌握EL的实际应用。 总体来看,EL的引入和标准化极大地提升了JSP页面的开发效率,简化了代码的编写,...
3. **JSP20技术手册chm版.chm**:JSP 2.0技术手册涵盖了JSP页面、表达式语言(EL)、自定义标签、JSTL等方面的知识,是学习动态网页开发的重要参考资料。 4. **MSDN+CS参考.chm**:通常包含Microsoft的开发工具和...
在手册中,你将学习如何编写Servlet、配置web.xml,以及理解JSP的生命周期和EL表达式。 CSS(Cascading Style Sheets)是用于控制网页元素样式和布局的样式表语言。了解CSS对于创建响应式、美观的用户界面至关重要...
JSP的指令、脚本元素、EL表达式和JSTL(JavaServer Pages Standard Tag Library)都是重要的学习内容。 4. **MVC模式**:Model-View-Controller模式是Java Web应用的常见架构模式。书中可能会介绍如何使用Servlet...
下面详细介绍 EL 的基本语法以及一些重要的使用场景。 - **EL 表达式的格式**: - `${sessionScope.user.sex}`:这个表达式的意义是从 session 范围内获取用户对象的性别属性。相比之下,传统的 JSP scriptlet ...
### EL&JSTL技术手册知识点详解 ...通过上述详细介绍,我们可以了解到EL是一种极其便捷的数据存取方式,在现代Web开发中具有广泛的应用价值。掌握EL的基本语法和高级用法对于提高开发效率和简化代码具有重要意义。
2. **脚本元素**: 声明、脚本块和表达式的使用,以及EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)的应用。 3. **JSP生命周期**: 从加载到销毁的过程,包括初始化、服务和销毁三个...
《Java Web开发学习手册》以初学者为对象,全面介绍了使用JavaWeb开发程序的相关技术。全书共分为4篇,21章,包括JavaWeb概述、搭建开发环境、Java语言基础、JavaScript语言、XML基础、JSP语法、JSP内置对象、...
通过使用JSTL及其内置的EL表达式语言,开发人员可以更容易地管理复杂的Web应用程序,并且使页面更加简洁、易于阅读和维护。无论是初学者还是经验丰富的开发者,掌握JSTL都将对JSP项目的开发大有裨益。
《Java Web开发学习手册》以初学者为对象,全面介绍了使用JavaWeb开发程序的相关技术。全书共分为4篇,21章,包括JavaWeb概述、搭建开发环境、Java语言基础、JavaScript语言、XML基础、JSP语法、JSP内置对象、...
本手册将深入探讨JSP 2.0的核心特性,包括JSTL、EL表达式以及Servlet 2.4与JSP 2.0的协同工作原理。 **一、JSTL标准标签库** JSTL(JavaServer Pages Standard Tag Library)是Java EE平台推荐的一组标准标签库,...