JSTL教程
- 格式:doc
- 大小:1.97 MB
- 文档页数:64
JSTL详解(常⽤标签以及c:forEach遍历集合)JSTL标签参考⽂章:/qq_25827845/article/details/53311722# 学习总结⼀、 JSTL的简介1. 什么是JSTLJSTL 是 JSP 标准标签库,利⽤标签库的标签可以取代 JSP 页⾯上的 Java 代码,为页⾯设计⼈员和后台开发⼈员的分⼯协作提供了便利。
2. JSTL常⽤标签库标签库名URI字符串作⽤前缀核⼼标签库<%@ taglib prefix=“c” uri=“/jsp/jstl/core” %>⽤于页⾯逻辑控制如:if、forEachc格式化标签库<%@ taglib prefix=“fmt” uri=“/jsp/jstl/fmt” %>⽤于执⾏格式操作如:格式化⽇期字符串fmt3. JSTL使⽤步骤1)、导⼊ jstl-1.2.jar 包,每个标签底层其实都是⽤ Java 代码实现的,复制 jar 包到 web/WEB-INF/lib ⽬录结构下;2)、创建 JSP 页⾯,使⽤ taglib 的指令引⽤标签库<%@ taglib prefix="c" uri="/jsp/jstl/core" %>3)、接下来就可以使⽤标签库定义好的标签了,例如:<c:if>⼆、核⼼标签库常⽤标签1. c: set 标签标签名使⽤<c:out value=“xxx”/>输出 xxx<c:out value="${age}"/>输出EL表达式 ${age} 获取的内容<c:out value=”${age}” default=”xxx”/>输出EL表达式 ${age} 获取的内容,当EL表达式内容不存在时输出 default 的内容2. c: out 标签标签名使⽤<c:set var=“a” value=“xxx”/>在pageContext中添加name为a,value为xxx的数据<c:set var=”a” value=”xxx” scope=”session”/>在session中添加name为a,value为xxx的数据3. c: if 标签属性名是否⽀持EL属性类型属性描述test⽀持,必须是EL boolean EL 中条件为真则执⾏标签体内容注意:没有对应 else 标签代码案例:<c:set var="a" value="hello"/><c:if test="${not empty a }"><c:out value="${a }"/></c:if>4. c: choose 标签作⽤:⽤于多分⽀判断(多条件判断)标签名作⽤chaoose类似于 Java 中的 switch,choose只是⼀个容器,包含下⾯两个元素when可以出现多个⽤于每个判断条件,类似于 switch 中 case。
JSTL标签用法详解在JSP的开发中,迭代是经常要使用到的操作。
例如,逐行的显示查询的结果等。
在早期的JSP中,通常使用Scriptlets来实现Iterator或者Enumeration对象的迭代输出。
现在,通过JSTL的迭代标签可以在很大的程度上简化迭代操作。
JSTL所支持的迭代标签有两个,分别是<c:forEach>和<c:forTokens>。
在这里介绍的是<c:forEach>标签。
简单点说,<c:forEach>标签的作用就是迭代输出标签内部的内容。
它既可以进行固定次数的迭代输出,也可以依据集合中对象的个数来决定迭代的次数。
<c:forEach>标签的语法定义如下所示。
<c:forEach var='name' items='expression' varStatus='name' begin='expression' end='expression' step='expression'>body content</c:forEach><c:forEach>标签具有以下一些属性:l var:迭代参数的名称。
在迭代体中可以使用的变量的名称,用来表示每一个迭代变量。
类型为String。
l items:要进行迭代的集合。
对于它所支持的类型将在下面进行讲解。
l varStatus:迭代变量的名称,用来表示迭代的状态,可以访问到迭代自身的信息。
l begin:如果指定了items,那么迭代就从items[begin]开始进行迭代;如果没有指定items,那么就从begin开始迭代。
它的类型为整数。
l end:如果指定了items,那么就在items[end]结束迭代;如果没有指定items,那么就在end结束迭代。
JSTL表达式描述9.1 概述在JSP页面中,使用标签库代替传统的Java片段语言来实现页面的显示逻辑已经不是新技术了,然而,由自定义标签很容易造成重复定义和非标准的实现。
鉴于此,出现了JSTL(JSP Standard Tag Library)。
大多数JSP页面逻辑提供了实现的JSTL技术,该技术本身就是一个标签库。
Sun公司Java规范标准的JSTL由apache jakarta组织负责维护。
作为开源的标准技术,它一直在不断地完善。
JSTL的发布包有两个版本:Standard-1.0 Taglib、Standard-1.1 Taglib,它们在使用时是不同的。
8Standard-1.0 Taglib(JSTL1.0)支持Servlet2.3和JSP1.2规范,Web应用服务器Tomcat4支持这些规范,而它的发布也在Tomcat 4.1.24测试通过了。
8Standard-1.1 Taglib(JSTL1.1)支持Servlet2.4和JSP2.0规范,Web应用服务器Tomcat5支持这些规范,它的发布在Tomcat 5.0.3测试通过了。
在本章的介绍中,将以由Sun发布的Standard-1.1 Taglib标签库为主,而apache jakarta组织发布的开源标签库,可以从/taglibs/找到所需要的帮助。
Sun发布的标准JSTL1.1标签库有以下几个标签:8核心标签库:包含Web应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
8国际化标签库:用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
8数据库标签库:可以做访问数据库的工作。
8XML标签库:用来访问XML文件的工作,这是JSTL标签库的一个特点。
8函数标签库:用来读取已经定义的某个函数。
此外,JSTL还提供了EL表达式语言(Expression Language)来进行辅助的工作。
9.2 JSTL EL表达式语言JSTL标签库由标签库和EL表达式语言两个部分组成。
每一个jsp页面都要导入标签库:<%@ taglib uri="/jsp/jstl/core" prefix="c" %>项目结构图:c_choose.jsp<body><%//放入小老鼠Rat rat=new Rat();rat.setName("小宝");rat.setAge(10);request.setAttribute("rat1", rat);%><h1>c:choose测试</h1><c:choose><c:when test="${rat1.age<2}"><font color="red">老鼠很小,不能吃</font></c:when><c:when test="${rat1.age>2 and rat1.age<8}"> <font color="green">老鼠很壮,好吃</font></c:when><c:otherwise><font color="blue">老鼠很大,不好吃</font></c:otherwise></c:choose></body>c_foreach.jsp<body><h1>迭代标签:c:foreach</h1><%ArrayList<Rat> al =new ArrayList<Rat>(); Rat rat1=new Rat();rat1.setName("小宝");rat1.setAge(2);Rat rat2=new Rat();rat2.setName("中宝");rat2.setAge(4);Rat rat3=new Rat();rat3.setName("大宝");rat3.setAge(6);//放入到alal.add(rat1);al.add(rat2);al.add(rat3);request.setAttribute("allrats", al);%><h1>foreach取数据</h1><c:forEach items="${allrats}" var="rat"><c:out value="${}"/><c:out value="${rat.age}"/></c:forEach><h1>第二种迭代</h1><c:forEach var="i"begin="1"end="10"step="2"><c:out value="${i}"/>--></c:forEach></body>c_fortokens.jsp<body><h1>fortokens</h1><%request.setAttribute("abc", "12;56;你好;aaa");%><c:forTokens items="${abc}" delims=";"var="temp">${temp}</c:forTokens></body>c_if.jsp<body><h1>c_if的使用</h1><!-- 以下的代码不应该在这儿写,为了方便学习,直接在这儿写了! --> <%request.setAttribute("a", "hello");request.setAttribute("age", "23");Rat rat=new Rat();rat.setName("小宝");rat.setAge(1);request.setAttribute("rat1", rat);%><h1>字符串判断</h1><c:if test="${a=='hello' }">ok!</c:if><c:if test="${a!='hello' }">err!</c:if><h1>判断数值</h1><c:if test="${age==56}">等于56</c:if><c:if test="${age<56}">小于56</c:if><h1>范围判断</h1><c:if test="${age>10 and age<34}">age>10 and age<34</c:if><h1>对象判断</h1><c:if test="${rat1.age>3}">老鼠年龄大于3岁</c:if><c:if test="${rat1.age<3}">老鼠年龄小于3岁</c:if></body>c_out.jsp<body><%//out.println("hello,world!"); %><%//c:out优先级是pageContext>request>session>applicationrequest.setAttribute("abc", "你好1 <ahref=''>sohu</a>");//session.setAttribute("abc", "你好2");//application.setAttribute("abc", "你好3");//pageContext.setAttribute("abc", "你好4"); %><%User u=new User();u.setUsername("小明");u.setAge(30);request.setAttribute("user", u);%><c:out value="hello,world!"></c:out><h1>如何输出request/session/application/pagecontext域对象的数据</h1><c:out value="${abc}" default="没有值"escapeXml="false"></c:out><br/><h2>输出对象的值</h2><c:out value="${ername}"></c:out>||<c:outvalue="${user.age}"></c:out><br/><h3>使用EL表达式输出的值</h3>${ername}&&${user.age*2}</body>c_remove.jsp<body><%//下面的标签等价于request.setAttribute("ab", "淮安真美丽"); %><h1>输出:</h1><c:out value="${ab}"></c:out><h1>使用EL表达式输出的值:</h1>${ab}<h1>使用remove后:</h1><c:remove var="ab"scope="request"/><c:out value="${ab}" default="不存在"></c:out></body>c_set.jsp<body><%//下面的标签等价于//request.setAttribute("abc", "中国.北京"); %><c:set var="abc"value="中国.北京"scope="request"></c:set> <h2>输出对象的值</h2><c:out value="${abc}"></c:out><br/><h3>使用EL表达式输出的值</h3>${abc}</body>。
JSTL标签参考手册前言=====================================================================JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的。
把常用的内容,放在这里备份一份,随用随查。
尽量做到不用查,就可以随手就可以写出来。
这算是Java程序员的基本功吧,一定要扎实。
JSTL全名为JavaServer Pages Standard Tag Library,目前最新的版本为1.1版。
JSTL是由JCP(Java Community Process)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签函数库。
Web程序员能够利用JSTL和EL来开发Web程序,取代传统直接在页面上嵌入Java 程序(Scripting)的做法,以提高程序的阅读性、维护性和方便性。
JSTL 1.1必须在支持Servlet 2.4且JSP 2.0以上版本的Container才可使用<%@ taglib %>引入标签库=====================================================================1、以classPath中,加入jar包: standard-1.1.2.jar , jstl-1.1.2.jar2、在相目\WEB-INF\tld\文件夹中放入常用的tld文件:c.tld,fmt.tld3、在jsp文件的顶部加入以下内容:Java代码1.<%@ taglib uri="/jsp/jstl/core" prefix="c" %>2.<%@ taglib uri="/jsp/jstl/fmt" prefix="fmt"%>3.<%@ taglib uri="/jsp/jstl/functions"prefix="fn" %><c:>核心标签库=====================================================================JSTL 核心标签库(C标签)标签共有13个,功能上分为4类:1.表达式控制标签:out、set、remove、catch2.流程控制标签:if、choose、when、otherwise3.循环标签:forEach、forTokens4.URL操作标签:import、url、redirect<c:forEach>标签------------------------------------------------------------------- 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。
JSTL用法一、什么是JSTLJavaServer Pages Standard Tag Library(JSTL)是一个JSP规范的标准标签库,它为JSP页面提供了一组标签和函数,用于简化JSP页面的开发和维护。
JSTL提供了核心标签库、格式化标签库、SQL标签库和XML标签库等,可以帮助开发者更方便地处理数据、格式化输出、执行SQL查询和处理XML数据等任务。
二、JSTL的引入要使用JSTL,首先需要在项目中引入JSTL的相关依赖。
在Maven项目中,可以通过在pom.xml文件中添加以下依赖来引入JSTL:<dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>引入依赖后,就可以在JSP页面中使用JSTL的标签了。
三、核心标签库1. <c:out>标签<c:out>标签用于输出表达式的值,可以防止XSS攻击。
它的使用方式如下:<c:out value="${expression}" />其中,expression是一个JSP表达式,可以是一个变量、一个属性或者一个EL表达式。
<c:out>标签会将expression的值进行HTML转义,以防止恶意代码注入。
2. <c:set>标签<c:set>标签用于设置一个变量的值,可以在JSP页面中使用这个变量。
它的使用方式如下:<c:set var="variableName" value="expression" />其中,variableName是变量的名称,expression是一个JSP表达式,用于给变量赋值。
中国软件与技术服务股份有限公司JSTL用户开发手册中国软件与技术服务股份有限公司应用产品研发中心目录1.JSP核心标签库 (1)2.表达式操作 (1)2.1.<c:out> (1)2.2.<c:set> (2)2.3.<c:remove> (3)2.4.<c:catch> (3)3.流程控制 (6)3.1.<c:if> (6)3.2.<c:choose> (7)3.3.<c:when> (8)3.4.<c:otherwise> (8)4.迭代操作 (9)4.1.<c:forEach> (9)4.2.<c:forTokens> (14)5.URL操作 (16)5.1.<c:import> (16)5.2.<c:url> (17)5.3.<c:redirect> (19)1.JSP核心标签库JSTL全名JavaServer Pages Standard Tag Library,它主要提供给Java Web开发人员一个标准通用的标签函数库。
下面只介绍我们工作中常用到的标签,有兴趣请参考VSS上,jstl1.1使用说明.pdf文件。
为了维持方便,所以大家在以后的页面开发中尽量不要嵌套JSP语法,例如:<%=new Date() %>核心标签库(core)主要有:基本输入输出、流程控制、迭代操作和URL操作。
因平台已经把标签库引入,所以这里就不再说明,接下来一一介绍每个标签的功能。
2.表达式操作表达式操作分类中包含四个标签:<c:out>、<c:set>、<c:remove>和<c:catch>.下面将依序介绍2.1. <c:out>作用:<c:out>主要用来显示数据的内容,就像<%=abcdefg%>一样,<c:out>是在我们以后页面开发中使用最多的表达式。
${imb.multiple == '2'}:计算有效范围内imb对象的属性multiple的值是否等于2,如果等于2则返回true,否则返回false${users}:返回有效范围内名为”users”的值,该值可以是任何对象,如:request.setAttribute(“users”,new ArrayList()); 这样得到的就是一个集合.三、部分标签使用说明1 、 <c:out>[说明]输出值,相当于 struts 中的 <bean:write>[举例]获得 request 中的属性: <c:outvalue="${requestScope.test_all}"/>获得 session 中的属性:<c:outvalue="${sessionScope.test_all}"/>获得 application 中的属性:<c:outvalue="${applicationScope.test}"/>2 、 <c:forEach>[说明]循环某个范围内的一个集合(可以是Collection、Set、List、Array 等)items----表示要循环的集合var---表示当前集合中的某条记录,可以对它进行访问[举例]3 、 <c:if>[说明]逻辑判断[举例]<c:if test="${imb.hmtb.typeid == 4}"><c:if test="${imb.multiple == '2'}">(10,270)</c:if><c:if test="${imb.multiple == '1'}">(10,290)</c:if> </c:if>4 、<c:set>[说明]设置不同的属性,并且指定它们的范围[举例]<c:set value="10000" var="maxUser" scope="application"/><c:set value="20" var="maxIdelTime" scope="session"/><c:set value="next.jsp" var="nextPage" scope="request"/>相当于:application.setAttribute(“maxUser”,”10000”);session.setAttribute(“maxIdelTime”,”20”);request.setAttribute(“nextPage”,”next.jsp”);一、什么是JSTLJSTL(JavaServerPages Standard Tag Library)JSP标准标签库。
. 内部资料不得拷贝JSTLJSTL标准标签库AURISOFTJSTL和EL简介JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。
现在最新版本的JSTL是1.1.2 。
说到了JSTL 就一定要说EL(expression language) jsp的表达式语言,这是一种简单的语言,它是JSP2.0规范的一个新特点。
在之前的JSP中,Java代码以Scriptlet的形式嵌入JSP 页面:<% =str%>。
现在我们可以通过${str}这样的形式来访问后台的数据了。
表达式语言有以下特点:●可获得的名称空间(PageContext属性)。
●嵌套的属性,可以访问集合对象。
●可以执行关系的、逻辑的和算数的运算。
●扩展函数可以和Java类的静态方法映射。
●它可以访问JSP的一系列的隐含对象(request、session、application、page等)。
通过表达式语言,可以非常简单的访问JavaBean中的属性,比如JSP中可以这样访问一个简单的参数:$ {userName} 也可以这样反问一个嵌套的参数:${erName.firstName}表达式语言也可以和JSTL结合使用,如:<c:if test=”${sessionScope.cart.numberOfItems > 0}”>……</c:if>表达式可以包含运行逻辑,如:<c:if test = “${bean1.a < 3 && bean1.a >0”}>……<c:if>表达式包含在${}之间,如果需要在客户端输出${字符,那么可以使用以下的方式:<c:out value=”an expression is ${‘${‘}true}”/>由于在jsp2.0以前没有表达式语言,所以jsp2.0以前的代码中可以包含${之类的代码,如果试图解析这些表达式,肯定造成错误,为了和jsp以前的规范兼容,可以在页面前面声明是否忽略表达式,声明语句如下:<%@ page isELIgnored=”true|false”%>下面我们来看一下EL的操作和他们的优先级别,最上边的优先级高,然后是左边的高:[],()unary -、not、!、empty*、/、div(除)、%、mod (取模)+、binary –< 、>、<=、>=、lt(小于)、gt(大于)、le(小于等于)、ge(大于等于)==、!=、eq(等于)、ne(不等于)&&、and (与)||、or(或)。
JSTL 入门:表达式语言JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。
在developerWorks 上其新系列的第一篇文章中,软件工程师Mark Kolb 向您展示了如何使用JSTL 标记来避免在JSP 页面中使用脚本编制元素。
您还将了解如何通过从表示层删除源代码来简化软件维护。
最后,您将了解JSTL 经过简化的表达式语言,它允许在不必使用功能齐全的编程语言的情况下对JSTL 操作指定动态属性值。
JavaServer Pages(JSP)是用于J2EE 平台的标准表示层技术。
JSP 技术提供了用于执行计算(这些计算用来动态地生成页面内容)的脚本编制元素和操作。
脚本编制元素允许在JSP 页面中包括程序源代码,在为响应用户请求而呈现页面时可以执行这些源代码。
操作将计算操作封装到很象HTML 或XML 标记的标记中,JSP 页面的模板文本通常包含这些标记。
JSP 规范只将几种操作定义成了标准,但从JSP 1.1 开始,开发人员已经能够以定制标记库的方式创建其自己的操作了。
JSP 标准标记库(JSTL)是JSP 1.2 定制标记库集,这些标记库实现大量服务器端Java 应用程序常用的基本功能。
通过为典型表示层任务(如数据格式化和迭代或条件内容)提供标准实现,JSTL 使JSP 作者可以专注于特定于应用程序的开发需求,而不是为这些通用操作“另起炉灶”。
当然,您可以使用JSP 脚本编制元素(scriptlet、表达式和声明)来实现此类任务。
例如,可以使用三个scriptlet 实现条件内容,清单 1 中着重显示了这三个scriptlet。
但是,因为脚本编制元素依赖于在页面中嵌入程序源代码(通常是Java 代码),所以对于使用这些脚本编制元素的JSP 页面,其软件维护任务的复杂度大大增加了。
例如,清单 1 中的scriptlet 示例严格地依赖于花括号的正确匹配。
如果不经意间引入了一个语法错误,则条件内容中的嵌套其它scriptlet 可能会造成严重破坏,并且在JSP 容器编译该页面时,要使所产生的错误信息有意义可能会很困难。
清单 1. 通过scriptlet 实现条件内容修正此类问题通常需要相当丰富的编程经验。
尽管通常会由十分精通页面布局和图形设计的设计人员来开发和维护JSP,但是同一页面中的脚本编制元素出现问题时,需要程序员的介入。
这种状况将单个文件中代码的责任分担给多人,因而使得开发、调试和增强此类JSP 页面成为很麻烦的任务。
通过将常用功能包装到定制标记库的标准集合中,JSTL 使JSP 作者可以减少对编制脚本元素的需求,甚至可以不需要它们,并避免了相关的维护成本。
JSTL 1.0JSTL 1.0 发布于2002 年6 月,由四个定制标记库(core、format、xml和sql)和一对通用标记库验证器(ScriptFreeTLV和PermittedTaglibsTLV)组成。
core标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。
它还提供了用来生成和操作URL 的标记。
顾名思义,format标记库定义了用来格式化数据(尤其是数字和日期)的操作。
它还支持使用本地化资源束进行JSP 页面的国际化。
xml库包含一些标记,这些标记用来操作通过XML 表示的数据,而sql库定义了用来查询关系数据库的操作。
两个JSTL 标记库验证器允许开发人员在其JSP 应用程序中强制使用编码标准。
可以配置ScriptFreeTLV验证器以在JSP 页面中禁用各种类型的JSP 脚本元素— scriptlet、表达式和声明。
类似地,PermittedTaglibsTLV验证器可以用来限制可能由应用程序的JSP 页面访问的定制标记库集(包括JSTL 标记库)。
尽管JSTL 最终将会成为J2EE 平台的必需组件,但目前只有少数应用程序服务器包括它。
JSTL 1.0 的参考实现可作为Apache 软件基金会(Apache Software Foundation)的Jakarta Taglibs 项目(请参阅参考资料)的一部分而获得。
可以将该参考实现中的定制标记库合并到任何支持JSP 1.2 和Servlet 2.3 规范的服务器,以添加对JSTL 的支持。
表达式语言在JSP 1.2 中,可以使用静态字符串或表达式(如果允许的话)指定JSP 操作的属性。
例如,在清单 2 中,对<jsp:setProperty>操作的name和property属性指定了静态值,而用表达式指定了其value属性。
这个操作的效果是将请求参数的当前值赋予命名的bean 特性。
以这种形式使用的表达式被称为请求时属性值(request-time attribute value),这是构建到JSP 规范中的用于动态指定属性值的唯一机制。
清单 2. 合并请求时属性值的JSP 操作因为请求时属性值是用表达式指定的,所以它们往往有和其它脚本元素一样的软件维护问题。
因此,JSTL 定制标记支持另一种用于指定动态属性值的机制。
可以用简化的表达式语言(EL)而不使用完整的JSP 表达式来指定JSTL 操作的属性值。
EL 提供了一些标识符、存取器和运算符,用来检索和操作驻留在JSP 容器中的数据。
EL 在某种程度上以EcmaScript(请参阅参考资料)和XML 路径语言(XML Path Language,XPath)为基础,因此页面设计人员和程序员都应该熟悉它的语法。
EL 擅长寻找对象及其特性,然后对它们执行简单操作;它不是编程语言,甚至不是脚本编制语言。
但是,与JSTL 标记一起使用时,它就能使用简单而又方便的符号来表示复杂的行为。
EL 表达式的格式是这样的:用美元符号($)定界,内容包括在花括号({})中,如清单 3 所示。
清单 3. 说明EL 表达式定界符的JSTL 操作此外,您可以将多个表达式与静态文本组合在一起以通过字符串并置来构造动态属性值,如清单 4 所示。
单独的表达式由标识符、存取器、文字和运算符组成。
标识符用来引用存储在数据中心中的数据对象。
EL 有11 个保留标识符,对应于11 个EL 隐式对象。
假定所有其它标识符都引用限制了作用域的变量。
存取器用来检索对象的特性或集合的元素。
文字表示固定的值—数字、字符、字符串、布尔型或空值。
运算符允许对数据和文字进行组合以及比较。
清单 4. 组合静态文本和多个EL 表达式以指定动态属性值限制了作用域的变量JSP API 通过<jsp:useBean>操作允许从JSP 容器内的四个不同作用域中存储和检索数据。
JSTL 通过提供用于指定和除去这些作用域中的对象的附加操作来扩展这一能力。
此外,EL 提供将这些对象作为限制了作用域的变量进行检索的内置支持。
特别地,任何出现在EL 表达式中但不对应于任何EL 隐式对象的标识符,都被自动假定为引用存储在四个JSP 作用域的其中某个中的对象,这四个作用域是:∙页面作用域∙请求作用域∙会话作用域应用程序作用域您可能还记得,只有在为特定请求处理页面期间才能检索存储在该页面作用域中的对象。
如果对象是存储在请求作用域中的,可以在处理所有参与处理某请求的页面期间检索这些对象(譬如在对某个请求的处理中遇到了一个或多个<jsp:include>或<jsp:forward>操作)。
如果对象是存储在会话作用域中的,则在与Web 应用程序的交互式会话期间,可以由用户访问的任何页面检索它(即,直到与该用户交互相关联的HttpSession对象无效为止)。
可以由任何用户从任何页面访问存储在应用程序作用域中的对象,直到卸载Web 应用程序本身为止(通常是由于关闭JSP 容器所致)。
通过将字符串映射为期望作用域中的对象来将对象存储到该作用域。
然后,就可以通过提供相同字符串来从该作用域检索该对象。
在作用域的映射中查找字符串,并返回被映射的对象。
在Servlet API 中,将此类对象称为相应作用域的属性。
但是,在EL 的上下文中,也将与属性相关联的字符串看作变量的名称,该变量通过属性映射的方式获得特定的值。
在EL 中,与隐式对象无关联的标识符被认为是存储在四个JSP 作用域中的名称对象。
首先对页面作用域检查是否存在这样的标识符,其次对请求作用域、然后对会话作用域、最后对应用程序作用域依次进行这样的检查,然后测试该标识符的名称是否与存储在该作用域中的某个对象的名称匹配。
第一个这样的匹配作为EL 标识符的值被返回。
通过这种方法,可以将EL 标识符看作引用限制了作用域的变量。
从更技术的方面来说,没有映射到隐式对象的标识符是用PageContext实例的findAttribute()方法求值的,该实例表示对页面的处理,在该页面上,当前正在处理用于请求的表达式。
标识符的名称作为参数传递给这个方法,然后该方法依次在四个作用域中搜索具有相同名称的属性。
并将所找到的第一个匹配项作为findAttribute()方法的值返回。
如果未在这四个作用域中找到这样的属性,则返回null。
最终,限制了作用域的变量是四个JSP 作用域的属性,这些属性具有可以用作EL 标识符的名称。
只要对限制了作用域的变量赋予由字母数字组成的名称,就可以通过JSP 中提供的用于设置属性的任何机制来创建它们。
这包括内置的<jsp:useBean>操作,以及由Servlet API 中的几个类定义的setAttribute()方法。
此外,四个JSTL 库中定义的许多定制标记本身就能够设置作为限制了作用域的变量使用的属性值。
隐式对象表 1 中列出了11 个EL 隐式对象的标识符。
不要将这些对象与JSP 隐式对象(一共只有九个)混淆,其中只有一个对象是它们所共有的。
表 1. EL 隐式对象尽管JSP 和EL 隐式对象中只有一个公共对象(pageContext),但通过EL 也可以访问其它JSP 隐式对象。
原因是pageContext拥有访问所有其它八个JSP 隐式对象的特性。
实际上,这是将它包括在EL 隐式对象中的主要理由。
其余所有EL 隐式对象都是映射,可以用来查找对应于名称的对象。
前四个映射表示先前讨论的各种属性作用域。
可以用它们来查找特定作用域中的标识符,而不用依赖于EL 在缺省情况下使用的顺序查找过程。
接下来的四个映射用来获取请求参数和请求头的值。
因为HTTP 协议允许请求参数和请求头具有多个值,所以它们各有一对映射。
每对中的第一个映射返回请求参数或头的主要值,通常是恰巧在实际请求中首先指定的那个值。