JSP中EL表达式的⽤法详解(必看篇)
EL 全名为Expression Language
EL 语法很简单,它最⼤的特点就是使⽤上很⽅便。接下来介绍EL主要的语法结构:
${sessionScope.user.sex}
所有EL都是以${为起始、以}为结尾的。上述EL范例的意思是:从Session的范围中,取得
⽤户的性别。假若依照之前JSP Scriptlet的写法如下:
User user =(Attribute("user");
String sex =Sex( );
两者相⽐较之下,可以发现EL 的语法⽐传统JSP Scriptlet 更为⽅便、简洁。
EL表达式是配合JSTL使⽤的。你需要引⼊JSTL标签库(<c:forEach items=""></c:forEach>,<c:if test=""></c:if>等属于jstl表达式)
<%@taglib uri=" jsp标签的命名空间 " prefix="c"%>
.与 [ ] 运算符
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 ApplicationScopeel表达式获取session中的值
我们也可以指定要取出哪⼀个范围的变量:
范例说明
${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) Attribute("username");容易、简洁许多.
⾃动转变类型
EL 除了提供⽅便存取变量的语法之外,它另外⼀个⽅便的功能就是:⾃动转变类型,我们来看下⾯这个范例:${unt + 20}
假若窗体传来count的值为10时,那么上⾯的结果为30。之前没接触过JSP 的读者可能会认为上⾯的例⼦是理所当然的,
但是在JSP 1.2 之中不能这样做,原因是从窗体所传来的值,它们的类型⼀律是String,所以当你接收之后,必须再将它转为其他类型,
如:int、float 等等,然后才能执⾏⼀些数学运算,下⾯是之前的做法:
String str_count =Parameter("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范围的属性名称所对应的值
applicationScopejava.util.Map取得Application范围的属性名称所对应的值
param java.util.Map如同Parameter(String name)。回传String类型的值paramValues java.util.Map如同ParameterValues(String name)。回传String[]类型的值header java.util.Map如同Header(String name)。回传String类型的值headerValues java.util.Map如同Headers(String name)。回传String[]类型的值
cookie java.util.Map如同Cookies()
initParam java.util.Map如同InitParameter(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 中使⽤Attribute("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-appxmlns="java.sun/xml/ns/j2ee"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="java.sun/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 =(InitParameter("userid");
param和paramValues
在取得⽤户参数时通常使⽤⼀下⽅法:
在 EL中则可以使⽤param和paramValues两者来取得数据。
${param.name}
${paramValues.name}
看到这⾥,⼤家应该很明确EL表达式只能通过内置对象取值,也就是只读操作,如果想进⾏写操作的话就让后台代码去完成,毕竟EL表达式仅仅是视图上的输出标签罢了。
pageContext
我们可以使⽤ ${pageContext}来取得其他有关⽤户要求或页⾯的详细信息。下表列出了⼏个⽐较常⽤的部分
Expression说明
${quest.queryString}取得请求的参数字符串
${questURL}取得请求的URL,但不包括请求之参数字符串,即servlet的HTTP地址。${tPath}服务的webapplication的名称
${hod}取得HTTP的⽅法(GET、POST)
${quest.protocol}取得使⽤的协议(HTTP/1.1、HTTP/1.0)
${User}取得⽤户名称
${Addr}取得⽤户的IP地址
${w}判断session是否为新的,所谓新的session,表⽰刚由server产⽣⽽client尚未使⽤${pageContext.session.id}取得session的ID
${pageContext.servletContext.serverInfo}取得主机端的服务信息
这个对象可有效地改善代码的硬编码问题,如页⾯中有⼀A标签链接访问⼀个SERVLET,如果写死了
该SERVLET的HTTP地址
那么如果当该SERVLET的SERVLET-MAPPING改变的时候必须要修改源代码,这样维护性会⼤打折扣。
EL算术运算
表达式语⾔⽀持的算术运算符和逻辑运算符⾮常多,所有在Java语⾔⾥⽀持的算术运算符,表达式语⾔都可以使⽤;
甚⾄Java语⾔不⽀持的⼀些算术运算符和逻辑运算符,表达式语⾔也⽀持。
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>表达式语⾔ - 算术运算符</title>
</head>
<body>
<h2>表达式语⾔ - 算术运算符</h2>
<hr>
<table border="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>\${3 div 4}</td>
<td>${3 div 4}</td>
</tr>
<!-- 计算除法 -->
<tr>
<td>\${3/0}</td>
<td>${3/0}</td>
</tr>
<!-- 计算求余 -->
<tr>
<td>\${10%4}</td>
<td>${10%4}</td>
</tr>
<!-- 计算求余 -->
<tr>
<td>\${10 mod 4}</td>
<td>${10 mod 4}</td>
</tr>
<!-- 计算三⽬运算符 -->
<tr>
<td>\${(1==2) ? 3 : 4}</td>
<td>${(1==2) ? 3 : 4}</td>
</tr>
</table>
</body>
</html>
<%@ page contentType="text/html; charset=gb2312"%> <html>
<head>
<title>表达式语⾔ - 算术运算符</title>
</head>
<body>
<h2>表达式语⾔ - 算术运算符</h2>
<hr>
<table border="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>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论