.与 [ ] 运算符
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范围。
自动转变类型
${param.count + 20}
假若窗体传来count的值为10时,那么上面的结果为30。之前没接触过JSP 的读者可能会认为上面的例子是理所当然的,但是在JSP 1.2 之中不能这样做,原因是从窗体所传来的值,它们的类型一律是String,所以当你接收之后,必须再将它转为其他类型,如:int、float 等等,然后才能执行一些数学运算,下面是之前的做法:
所以,注意不要和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个声明范围不存在的话会输出空,如果存在则输出该变量的值。
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语言不支持的一些算术运算符和逻辑运算符,表达式语言也支持。
Code
上面页面中示范了表达式语言所支持的加、减、乘、除、求余等算术运算符的功能,读者可能也发现了表达式语言还支持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}
第一种方式:
在创建web项目的时候,自动添加jstl的标签
第二种方式:
以一种正常的方式创建web项目,然后在项目中手动的添加jstl标签项,如图:
点击项目名----右击------选中MyEclipse-------Add JSTL Libraries
这样就完成了jstl的添加。
无论哪种方式的添加都必须包含两个jar包:jstl.jar和standard.jar。
Jstl在页面中的导入:
<%@ taglib uri="http://java.sun.com/jstl/core"prefix="c" %>
Core标签库,又被称为核心标签库,该标签库的工作是对于jsp页面一般处理的封装,在该标签库中的标签一共有14个,被分为了四类,分别是:
多用途核心标签:<c:out> <c:set> <c:remove> <c:catch>
条件控制标签:<c:if><c:choose><c:when><c:otherwise>
循环控制标签:<c:forEach><c:forTokens>
url相关标签:<c:import> <c:url><c:redirect><c:param>
以下是各个标签的用途和属性及其简单示例。
1. 用于显示的<c:out>标签
<c:out value="${username }" default="传值为空" escapeXml="true"/>
该标签接收从前一个Action传递过来的username值,如果username的值为空,那么将默认显示default中的值,而当escapeXml设置为true时,将自动更换特殊字符。
2. 用于赋值的<c:set>标签
<c:set>标签用于为变量或是JavaBean中的变量属性赋值的工作,它的属性和描述如下所示:
<c:set value="${username}" property="" scope="page" target="userBean" var="username"/>
Value中存放着即将被使用的值
Target中式被赋值的JavaBean实例的名称,若存在该target属性,则一定要存在property属性(可选)
Property中是JavaBean实例的变量属性名称(可选)
Var是被赋值的变量名(可选)
Scope变量的作用范围,若没有指定,默认为page(可选)
3. 用于删除的<c:remove>标签
<c:remove>标签用于删除存在于scope中的变量,它的属性和描述如下:
<c:remove var=”sessionName” scope=”session”>
var 是即将被删除的存在scope范围中的变量的名称
scope指示即将删除的变量存在的作用域范围
4. 用于捕获异常的<c:catch>标签
<c:catch>标签允许在jsp页面中捕捉异常。它包含了一个var属性,是一个描述异常的变量,该变量可选,若没有改变量的定义,那么仅仅是捕捉异常,而不做任何的处理,若定义了var属性,那么可以利用var所定义的异常变量进行判断转发到其他页面或提示报错信息。
<c:catchvar=”errName”>
${param.name== 3}
</c:catch>
当${param.name == 3}表达式有异常时,可以从var属性”err”得到异常的内容,通过判断err内容是否为空来决定错误信息的提示。
5. 用于判断的<c:if>标签
<c:if>标签用于简单的条件语句
<c:iftest=”${username == ‘zhangshan’}”var=”result” scope=”session”>
若test中的值就是zhangshan的话,就显示<c:if></c:if>中的内容,判断的结果将存储在scope范围中的var变量中。默认情况下scope的值为page。
6. 用于复杂判断的<c:choose> ,<c:when>,<c:otherwise>标签
这三个标签用于实现复杂条件判断语句,类似”if,else if”的条件语句。
<c:choose>
<c:when test="${username== 'zhangshan'}">
显示张山的信息
</c:when>
<c:otherwise>
显示其他人的信息
</c:otherwise>
</c:choose>
<c:choose></c:choose>标签没有属性,我们可以将其看做是<c:when></c:when>和<c:otherwise></c:otherwise>的父标签,而这一对判断标签就是其中的子标签。
7. 用于循环的<c:forEach>标签
<c:forEach items="${userList }" var="user" step="" varStatus="" begin="" end="">
${user}
</c:forEach>
接收传递过来的一个List集合,然后依次迭代将其中的值放在var变量中
Items中存放进行循环的集合(可选)
Var做循环的对象变量名,若存在items这个属性,则表示循环集合对象中的变量名
Begin表示开始条件
End表示结束条件
Step表示循环的步长,默认情况下为1
varStatus显示循环状态的变量(可选)
8. 用于分隔字符的<c:forTokens>标签
<c:forTokens>标签可以根据某个分隔符分隔指定的字符串,相当于java.util.StringTokenizer类。
<c:forTokens items="123.456.789" delims="." varStatus="" var="inteValue" begin="0" end="2" step="1">
${intValue}
</c:forTokens>
Items表示进行分隔的EL表达式或是常量
Delims表示分隔符
Begin表示开始条件
End表示结束条件
Step表示循环的步长,默认情况下为1
Var表示做循环的对象变量名(可选)
varStatus显示循环状态的变量(可选)
将需要分隔的字符串“123.456.789”,依据分隔符“.”进行分隔,begin为0表示从第一个“.”开始分隔,end为2表示分隔到第三个“.”,并将做循环的变量名指定为intValue。由于步长为“2”,显示的EL表达式${intValue}只能显示为“123 789”。
9. 用于包含页面的<c:import>标签
<c:import>标签允许包含另一个JSP页面到本页面来
<c:import url="/index.jsp" charEncoding="utf-8" context="/test" scope="" var="pageTest" varReader=""/>
url需要导入页面的url
context该属性用于在不同的Context下 导入页面,当出现context属性时,必须以“/”开头,此时url属性页需要以“/”开头(可选)
charEncoding表示导入页的字符集
var可以定义导入文本的变量名(可选)
scope导入文本的变量名作用范围(可选)
varReader接受文本的java.io.Reader类变量名(可选)
10. 用于得到URL地址的<c:url>标签
该标签用于得到一个URL地址
<c:urlvalue="/index.jsp" context=""scope="" var="urlValue"></c:url>
<a href=”${urlValue}”>超链接</a>
Value页面的URL地址
Context该属性用于得到不同的Context下的URL地址,当出现context属性时,必须以“/”开头,此时也需要url属性以“/”开头(可选)
charEncoding设置URL的字符集(可选)
scope变量名的作用范围(可选)
11. 用于页面重定向的<c:redirect>标签
<c:redirect>用于页面的重定向,该标签的作用相当于response.setRedirect方法名的工作,它包含url和context两个属性,属性含义和<c:url>标签相同
<c:redirect url=”/index.jsp”>
出现该标签,则将重定向到当前web Context下的index.jsp页面,一般与<c:if>等标签一起使用。
12. 用于包含传递参数的<c:param>标签
<c:param>用来为包含或是重定向的页面传递参数
<c:paramname=”username” value=”zhangshan”>
Name传递的参数名
Value传递的参数值(可选)
例子: <c:redirect url=”/index.jsp”>
<c:param name=”username” value=”zhangshan ”/>
</c:redirect>
Jstl标签XML processing标签库介绍
XML核心标签:<x:parse> <x:out><x:set>
XML流控制标签:<x:if> <x:choose> <x:when> <x:otherwise> <x:forEach>
XML转换标签:<x:transform> <x:param>
<?xmlversion=”1.0” encoding=”utf-8”?>
<xml-body>
<username>张三</username>
<password>123456</password>
<hobbies>
<hobby>足球</hobby>
<hobby>篮球</hobby>
<hobby>看书</hobby>
</hobbies>
</xml-body>
1. 用于解析XML文件的<x:parse>标签
<x:parse>标签是该组标签库的核心,从其标签名就可以知道,它是作为解析XML文件而存在的。
<c:import var=”xmlUser” url=”http://localhost:8088/eachstudy/xml/userInfo.xml”>
<x:parse doc=”${xmlUser}” var=”userValue” scope=”” varDom=””scopeDom=”” systemId=”” filter=”’/>
Var,scope和varDom,scopeDom不应该同时出现的,而应该被视为两个版本来使用,两者的变量都可以被XML processing标签库的其他标签来使用。
Doc存放XML的内容
Var将解析后的XML保存在该属性所指定的变量中,之后XML processing标签库中的其他标签若取XML中的内容就可以从该变量中得到(可选)
Scope变量的作用范围
varDom指定保存的变量在org.w3c.dom.Document接口类型(可选)
scopeDom org.w3c.dom.Document的接口类型变量作用范围(可选)
systemId定义了一个URL,该URL将使用到XML文件中以接入其他资源文件(可选)
filter该属性必须为org.xml.sax.XMLFilter类的一个实例,可以通过使用EL表达式传入,将对XML文件作过滤得到自身需要的部分(可选)
该示例在借助<c:import>标签的作用下引入了userInfo.xml文件,将其内容保存在xmlUser变量中,<x:parse>根据xmlUser变量的值进行解析userInfo.xml。
2. 用于显示XML内容的<x:out>标签
<x:out>标签从<x:parse>标签解析后保存的变量中取得需要的XML文件内容,并显示在页面上。该标签是通过XPath技术(定位XML元素的一种技术)来实现的。要使用该标签必须将xalan-j的jar包保存在“WEB-INF/lib下”。
<c:import var=”xmlUser” url=”http://localhost:8088/eachstudy/xml/userInfo.xml”>
<x:parse doc=”${xmlUser}” var=”userValue”’/>
用户名为:<x:out select=”$userValue/xml-body/username”><br>
密码为:<x:out select=”$userValue/xml-body/password”>
读取XML文件并解析后的变量userValue将加上“$“作为XPath表达式的开头,select中的表达式将从xml-body根元素下的各个子元素中取得实体内容,最后将结果显示在页面上。
3.用于保存XML内容的<x:set>标签
<x:set>标签允许将某个源XML中元素的实体内容或是属性,保存到一个变量中去,它的实现也依靠XPath技术。
<c:import var=”xmlUser” url=”http://localhost:8088/eachstudy/xml/userInfo.xml”>
<x:parse doc=”${xmlUser}” var=”userValue”’/>
<x:set select=”$userValue/xml-body/username” var=”tempValue”>
在这里将保存XML的name元素内容到变量“tempValue“中。
4. 用于判断的<x:if>标签
<x:if>标签允许由XPath的Boolean()函数得到的判断结果,来判断是否显示其标签所包含的内容。<x:if >标签的属性与<x:set>标签相同,但是var的结果只能是Boolean类型。
5. 用于复杂判断的<x:choose><x:when><x:otherwise>标签
这组标签将一起使用,来提供“ifelseif“语句的功能。
<x:choose>标签没有属性,可以被认为是父标签<x:when> <x:otherwise>将作为其子标签来使用。
<x:when>标签等价于“if“语句,它包含一个select属性,该属性为XPath判断表达式。
<x:otherwise>标签没有属性,它等价于“else“语句。
6. 用于对XML元素循环的<x:forEach>标签
<x:forEach>为对XML文件中同一名称元素的循环控制标签。
<x:forEachselect=”$userValue/xml-body/hobbies/hobby” var=”hobby” begin=””end=”” step=”” varStatus=””>
${hobby }
</x:forEach>
Select是XPath表达式,结果是一个集合,将对该集合进行循环(可选)
Begin开始条件(可选)
End结束条件(可选)
Step循环的步长。默认为1(可选)
Var做循环的对象变量名,表示XPath表达式结果集合中的一个对象(可选)
varStatus显示循环状态的变量(可选)
该示例将使用循环读取XML中多个同存与hobbies元素下的hobby子元素
7. 格式化XML显示数据的<x:transform>标签
<x:transform>标签允许使用XSLT(转换XML格式的语言)为页面的显示数据所格式化的处理。
<c:import var=”xmlUser” url=”http://localhost:8088/eachstudy/xml/userInfo.xml”>
<c:set var=”xsltdoc”>
<?xml version=”1.0”?>
<xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”version=”1.0” >
<xsl:apply-template match=”/”>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match=”xml-body”>
<html>
<head></head>
<body>
<h2>用户名:<xsl:value-of select=”username”/></h2>
<h2>密码:<xsl:value-of select=”password”></h2>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
</c:set>
<x:transform xslt=”${xsltdoc }” doc=”${xmlUser}”/>
这个示例将XML文件保存的数据信心利用<c:import>保存在xmlUser中,然后使用一个<c:set>标签保存一个XSLT的源到“xsltdoc“,最后通过<x:transform>格式化XML文件的数据显示在页面上。
8. 用于参数传递的<x:param>标签
<x:param>标签用于在格式化XML时传递所需的参数。它的属性和描述同<c:param>
还有更多,不多介绍
分享到:
相关推荐
el和jstl学习笔记 很好很全 欢迎瞎子
本pdf是传智播客的教学资料,对学习和复习EL,JSTL有很大的帮助。
如果您学java它作为一个提纲挈领的东西还是不错的。另外我还将奉上IBM的java考试认证总结,也是比较概括,希望您能喜欢!
el表达式和jstl教程,无论哪一方面都是jsp学习的必学技术,拥有了她就拥有了明天。
EL和JSTL表达式学习资料,精品总结,利于初学者理解以及进一步学习
EL&JSTL笔记学习笔记
EL表达式语言和JSTL的结合使用,大大减少了JSP页面的java代码的复杂程度,提高了页面的简洁性和可读性。
记录一下JSTL和EL。
学习javaEE开发的好帮手,一看就懂EL 简介 EL 全名为Expression Language,它原本是JSTL 1.0为方便存取数据所自定义的语言
教你怎么熟练使用EL表达式和JSTL标签库的使用方法。 自己做的学习笔记,很详细哦!
JSTL & EL 学习笔记JSTL & EL 学习笔记
El表达式与Jstl 标签库学习,EL表达式语法结构:El 表达式的作用,如何使用El表达式; 2.Jstl 标签库的作用3.使用JSTL标签库 :
JSP+servlet+javabean学习 里面有PDF文件对该章节的详细讲解,培训老师才讲的到...JavaWeb09-EL与JSTL.rar JavaWeb10-分页应用.rar JavaWeb11-图片验证码.rar JavaWeb12-文件上传.rar JavaWeb13-过滤器与监听器.rar
使用mvc设计模式, 使用EL/JSTL简化页面
本设计源码提供了一个基于Java的新闻发布网站。项目包含50个文件,主要使用Java、...该网站使用jsp-servlet-el/jstl-mysql技术栈,适合用于学习和实践Java、JavaScript和CSS技术,以及开发新闻发布相关的网站。
EL表达式与JSTL入门学习,有例子,学起来比较轻松,这是我以前学习是搜集的学习资料,是别人的著作,感觉不错推荐给大家。
El表达式结合JSTL标签库的使用,达到jsp页面无java代码的效果(结合jsp技术)
学习JavaWeb经常遇到Servlet错误,数据库连接错误,EL表达式无法使用,页面显示不出来,然后是各种500错误。很多时候都是因为这个六个核心资源包出了问题,因此我上传了这六个核心资源包,包括EL+JSTL+Standard+...
风格及功能上参照动易网站管理系统(http://www.asp163.net),源码上有注释,方便参考使用,谢谢