﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-张春利-文章分类-jstl标签</title><link>http://www.blogjava.net/zcljob/category/10189.html</link><description>张春利</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:59:17 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:59:17 GMT</pubDate><ttl>60</ttl><item><title>迭代</title><link>http://www.blogjava.net/zcljob/articles/41685.html</link><dc:creator>张春利</dc:creator><author>张春利</author><pubDate>Tue, 18 Apr 2006 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/zcljob/articles/41685.html</guid><wfw:comment>http://www.blogjava.net/zcljob/comments/41685.html</wfw:comment><comments>http://www.blogjava.net/zcljob/articles/41685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zcljob/comments/commentRss/41685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zcljob/services/trackbacks/41685.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<a name="2.1">
								<span class="smalltitle">
										<strong>
												<font size="3">迭代</font>
										</strong>
								</span>
						</a>
				</p>
				<p>在 Web 应用程序环境中，迭代主要用于访存和显示数据集，通常是以列表或表中的一系列行的形式显示。实现迭代内容的主要 JSTL 操作是 <code>&lt;c:forEach&gt;</code> 定制标记。该标记支持两种不同样式的迭代：整数范围上的迭代（类似 Java 语言的 <code>for</code> 语句）和集合上的迭代（类似 Java 语言的 <code>Iterator</code> 和 <code>Enumeration</code> 类）。 </p>
				<p>进行整数范围迭代用到了清单 1 中所示的 <code>&lt;c:forEach&gt;</code> 标记的语法。 <code>begin</code> 和 <code>end</code> 属性要么是静态整数值，要么是可以得出整数值的表达式。它们分别指定迭代索引的初始值以及迭代索引的终止值。当使用 <code>&lt;c:forEach&gt;</code> 在整数范围内进行迭代时，这两个属性是必需的，而其它所有属性都是可选的。 </p>
				<br />
				<a name="N40013D">
						<b>清单 1. 通过 &lt;c:forEach&gt; 操作进行数字迭代的语法</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">&lt;c:forEach var="
        <i>name</i>" varStatus="
        <i>name</i>"
    begin="
        <i>expression</i>" end="
        <i>expression</i>" step="
        <i>expression</i>"&gt;
  
        <i>body content</i>
&lt;/c:forEach&gt;

      </font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>当出现 <code>step</code> 时，它也必须是整数值。它指定每次迭代后索引的增量。这样，迭代索引从 <code>begin</code> 属性的值开始，以 <code>step</code> 属性的值为增量进行递增，在迭代索引超过 <code>end</code> 属性的值时停止迭代。注：如果省略了 <code>step</code> 属性，那么步长缺省为 1。 </p>
				<p>如果指定了 <code>var</code> 属性，那么将会创建一个带有指定名称的并限定了作用域的变量，并将每次迭代的当前索引值赋给该变量。这一限定了作用域的变量具有嵌套式可视性 ― 只可以在 <code>&lt;c:forEach&gt;</code> 标记体内对其进行访问。（我们很快将讨论可选属性 <code>varStatus</code> 的用法。）清单 2 显示了对一组固定整数值进行迭代的 <code>&lt;c:forEach&gt;</code> 操作示例。 </p>
				<br />
				<a name="N400186">
						<b>清单 2. 使用 &lt;c:forEach&gt; 标记来生成表列数据，这些数据对应于某一范围内的数值</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">&lt;table&gt;
&lt;tr&gt;&lt;th&gt;Value&lt;/th&gt;
    &lt;th&gt;Square&lt;/th&gt;&lt;/tr&gt;
&lt;c:forEach var="x" begin="0" end="10" step="2"&gt;
  &lt;tr&gt;&lt;td&gt;&lt;c:out value="${x}"/&gt;&lt;/td&gt;
      &lt;td&gt;&lt;c:out value="${x * x}"/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/c:forEach&gt;
&lt;/table&gt;
</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>如图 3 中所示，上面的示例代码生成了一张表，显示前五个偶数及其平方。这是通过将 <code>begin</code> 和 <code>step</code> 属性值指定为 2，而将 <code>end</code> 属性值指定为 10 实现的。此外，用 <code>var</code> 属性创建用于存储索引值的限定了作用域的变量， <code>&lt;c:forEach&gt;</code> 标记体内引用了该变量。尤其是，使用了一对 <code>&lt;c:out&gt;</code> 操作来显示索引及其平方，其中索引的平方是使用一个简单的表达式计算得来的。 </p>
				<br />
				<a name="N4001BB">
						<b>图 3. 清单 2 的输出 </b>
				</a>
				<br />
				<img height="267" alt="清单 2 的输出" src="http://www-128.ibm.com/developerworks/cn/java/j-jstl0318/forEach.jpg" width="467" />
				<br />
				<p>在对集合的成员进行迭代时，用到了 <code>&lt;c:forEach&gt;</code> 标记的另一个属性： <code>items</code> 属性，清单 3 中显示了该属性。当使用这种形式的 <code>&lt;c:forEach&gt;</code> 标记时， <code>items</code> 属性是唯一必需的属性。 <code>items</code> 属性的值应该是一个集合，对该集合的成员进行迭代，通常使用 EL 表达式指定值。如果变量名称是通过 <code>&lt;c:forEach&gt;</code> 标记的 <code>item</code> 属性指定的，那么对于每次迭代该已命名变量都将被绑定到集合后续元素上。 </p>
				<br />
				<a name="N4001E8">
						<b>清单 3. 通过 &lt;c:forEach&gt; 操作对集合进行迭代的语法</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">&lt;c:forEach var="
        <i>name</i>" items="
        <i>expression</i>" varStatus="
        <i>name</i>"
    begin="
        <i>expression</i>" end="
        <i>expression</i>" step="
        <i>expression</i>"&gt;
  
        <i>body content</i>
&lt;/c:forEach&gt;

      </font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>
						<code>&lt;c:forEach&gt;</code> 标记支持 Java 平台所提供的所有标准集合类型。此外，您可以使用该操作来迭代数组（包括基本类型数组）中的元素。表 1 列出了 <code>items</code> 属性所支持的所有值。正如表的最后一行所指出的那样，JSTL 定义了它自己的接口 <code>javax.servlet.jsp.jstl.sql.Result</code> ，用来迭代 SQL 查询的结果。（我们将在本系列后面的文章中详细讨论这一功能。） </p>
				<p>
						<a name="N10207">
								<span class="smalltitle">
										<strong>
												<font size="3">表 1. &lt;c:forEach&gt; 标记的 items 属性所支持的集合 </font>
										</strong>
								</span>
						</a>
				</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="3" width="100%" border="1">
						<tbody>
								<tr valign="top">
										<td>
												<strong>
														<code>items</code> 的值 </strong>
										</td>
										<td>
												<b>所产生的 <code>item</code> 值 </b>
										</td>
								</tr>
								<tr valign="top">
										<td>
												<code>java.util.Collection</code>
										</td>
										<td>调用 <code>iterator()</code> 所获得的元素 </td>
								</tr>
								<tr valign="top">
										<td>
												<code>java.util.Map</code>
										</td>
										<td>
												<code>java.util.Map.Entry</code> 的实例 </td>
								</tr>
								<tr valign="top">
										<td>
												<code>java.util.Iterator</code>
										</td>
										<td>迭代器元素</td>
								</tr>
								<tr valign="top">
										<td>
												<code>java.util.Enumeration</code>
										</td>
										<td>枚举元素</td>
								</tr>
								<tr valign="top">
										<td>
												<code>Object</code> 实例数组 </td>
										<td>数组元素</td>
								</tr>
								<tr valign="top">
										<td>基本类型值数组</td>
										<td>经过包装的数组元素</td>
								</tr>
								<tr valign="top">
										<td>用逗号定界的 <code>String</code></td>
										<td>子字符串</td>
								</tr>
								<tr valign="top">
										<td>
												<code>javax.servlet.jsp.jstl.sql.Result</code>
										</td>
										<td>SQL 查询所获得的行</td>
								</tr>
						</tbody>
				</table>
				<p>可以使用 <code>begin</code> 、 <code>end</code> 和 <code>step</code> 属性来限定在迭代中包含集合中哪些元素。和通过 <code>&lt;c:forEach&gt;</code> 进行数字迭代的情形一样，在迭代集合中的元素时同样要维护一个迭代索引。 <code>&lt;c:forEach&gt;</code> 标记实际上只处理那些与索引值相对应的元素，这些索引值与指定的 <code>begin</code> 、 <code>end</code> 和 <code>step</code> 值相匹配。 </p>
				<p>清单 4 显示了用来迭代集合的 <code>&lt;c:forEach&gt;</code> 标记。对于该 JSP 代码段， <code>entryList</code> 这一限定了作用域的变量被设置成了 <code>Entry</code> 对象列表（确切的说， <code>ArrayList</code> ）。 <code>&lt;c:forEach&gt;</code> 标记依次处理列表中的每个元素，将其赋给一个限定了作用域的变量 <code>blogEntry</code> ，然后生成两个表行 ― 一个用于 Weblog 项的 <code>title</code> ，另一个则用于该项 <code>text</code> 。这些特性是通过一对带有相应 EL 表达式的 <code>&lt;c:out&gt;</code> 操作从 <code>blogEntry</code> 变量检索得到的。注：由于 Weblog 项的标题和文本都可能包含 HTML 标记，因此这两个 <code>&lt;c:out&gt;</code> 标记的 <code>escapeXml</code> 属性都被设置成了 false。图 4 显示了结果。 </p>
				<br />
				<a name="N4002FA">
						<b>清单 4. 使用 &lt;c:forEach&gt; 标记显示表示给定日期的 Weblog 项</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">&lt;table&gt;
  &lt;c:forEach items="${entryList}" var="blogEntry"&gt;
    &lt;tr&gt;&lt;td align="left" class="blogTitle"&gt;
      &lt;c:out value="${blogEntry.title}" escapeXml="false"/&gt;
    &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td align="left" class="blogText"&gt;
      &lt;c:out value="${blogEntry.text}" escapeXml="false"/&gt;
    &lt;/td&gt;&lt;/tr&gt;
  &lt;/c:forEach&gt;
&lt;/table&gt;
</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<a name="N400314">
						<b>图 4. 清单 4 的输出 </b>
				</a>
				<br />
				<img height="312" alt="清单 4 的输出" src="http://www-128.ibm.com/developerworks/cn/java/j-jstl0318/blog1.jpg" width="590" />
				<br />
				<p>不论是对整数还是对集合进行迭代， <code>&lt;c:forEach&gt;</code> 剩余的属性 <code>varStatus</code> 所起的作用相同。和 <code>var</code> 属性一样， <code>varStatus</code> 用于创建限定了作用域的变量。不过，由 <code>varStatus</code> 属性命名的变量并不存储当前索引值或当前元素，而是赋予 <code>javax.servlet.jsp.jstl.core.LoopTagStatus</code> 类的实例。该类定义了一组特性，它们描述了迭代的当前状态，表 2 中列出了这些特性。 </p>
				<p>
						<a name="table1">
								<span class="smalltitle">
										<strong>
												<font size="3">表 2. LoopTagStatus 对象的特性</font>
										</strong>
								</span>
						</a>
				</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="3" width="100%" border="1">
						<tbody>
								<tr valign="top">
										<td>
												<strong>特性</strong>
										</td>
										<td>
												<b>Getter</b>
										</td>
										<td>
												<b>描述</b>
										</td>
								</tr>
								<tr valign="top">
										<td>current</td>
										<td>
												<code>getCurrent()</code>
										</td>
										<td>当前这次迭代的（集合中的）项</td>
								</tr>
								<tr valign="top">
										<td>index</td>
										<td>
												<code>getIndex()</code>
										</td>
										<td>当前这次迭代从 0 开始的迭代索引</td>
								</tr>
								<tr valign="top">
										<td>count</td>
										<td>
												<code>getCount()</code>
										</td>
										<td>当前这次迭代从 1 开始的迭代计数</td>
								</tr>
								<tr valign="top">
										<td>first</td>
										<td>
												<code>isFirst()</code>
										</td>
										<td>用来表明当前这轮迭代是否为第一次迭代的标志</td>
								</tr>
								<tr valign="top">
										<td>last</td>
										<td>
												<code>isLast()</code>
										</td>
										<td>用来表明当前这轮迭代是否为最后一次迭代的标志</td>
								</tr>
								<tr valign="top">
										<td>begin</td>
										<td>
												<code>getBegin()</code>
										</td>
										<td>
												<code>begin</code> 属性值 </td>
								</tr>
								<tr valign="top">
										<td>end</td>
										<td>
												<code>getEnd()</code>
										</td>
										<td>
												<code>end</code> 属性值 </td>
								</tr>
								<tr valign="top">
										<td>step</td>
										<td>
												<code>getStep()</code>
										</td>
										<td>
												<code>step</code> 属性值 </td>
								</tr>
						</tbody>
				</table>
				<p>清单 5 显示了关于如何使用 <code>varStatus</code> 属性的一个示例。这个示例修改了清单 4 中的代码，将 Weblog 项的编号添加到显示 Weblog 标题（title）的表行。它是通过为 <code>varStatus</code> 属性指定一个值，然后访问所生成的限定了作用域的变量的 <code>count</code> 特性来实现这一点的。结果显示在图 5 中。 </p>
				<br />
				<a name="N4003ED">
						<b>清单 5. 使用 varStatus 属性来显示 Weblog 项的数目</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">&lt;table&gt;
  &lt;c:forEach items=
    "${entryList}" var="blogEntry" varStatus="status"&gt;
    &lt;tr&gt;&lt;td align="left" class="blogTitle"&gt;
      &lt;c:out value="${status.count}"/&gt;.
      &lt;c:out value="${blogEntry.title}" escapeXml="false"/&gt;
    &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td align="left" class="blogText"&gt;
      &lt;c:out value="${blogEntry.text}" escapeXml="false"/&gt;
    &lt;/td&gt;&lt;/tr&gt;
  &lt;/c:forEach&gt;
&lt;/table&gt;
</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<a name="N400407">
						<b>图 5. 清单 5 的输出 </b>
				</a>
				<br />
				<img height="312" alt="清单 5 的输出" src="http://www-128.ibm.com/developerworks/cn/java/j-jstl0318/blog2.jpg" width="590" />
				<br />
				<p>除 <code>&lt;c:forEach&gt;</code> 以外， <code>core</code> 库还提供了另一个迭代标记： <code>&lt;c:forTokens&gt;</code> 。JSTL 的这个定制操作与 Java 语言的 <code>StringTokenizer</code> 类的作用相似。清单 6 中显示的 <code>&lt;c:forTokens&gt;</code> 标记除了比 <code>&lt;c:forEach&gt;</code> 的面向集合版本多一个属性之外，其它属性都相同。对于 <code>&lt;c:forTokens&gt;</code> 而言，通过 <code>items</code> 属性指定要标记化的字符串，而通过 <code>delims</code> 属性提供用于生成标记的一组定界符。和 <code>&lt;c:forEach&gt;</code> 的情形一样，可以使用 <code>begin</code> 、 <code>end</code> 和 <code>step</code> 属性将要处理的标记限定为那些与相应索引值相匹配的标记。 </p>
				<br />
				<a name="N40044C">
						<b>清单 6. 使用 &lt;c:forTokens&gt; 操作来迭代字符串标记的语法</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">&lt;c:forTokens var="
        <i>name</i>" items="
        <i>expression</i>"
    delims="
        <i>expression</i>" varStatus="
        <i>name</i>"
    begin="
        <i>expression</i>" end="
        <i>expression</i>" step="
        <i>expression</i>"&gt;
  
        <i>body content</i>
&lt;/c:forTokens&gt;

      </font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=569421</p>
		</div>
<img src ="http://www.blogjava.net/zcljob/aggbug/41685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zcljob/" target="_blank">张春利</a> 2006-04-18 17:10 <a href="http://www.blogjava.net/zcljob/articles/41685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaServer Pages标准标签库 </title><link>http://www.blogjava.net/zcljob/articles/41683.html</link><dc:creator>张春利</dc:creator><author>张春利</author><pubDate>Tue, 18 Apr 2006 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/zcljob/articles/41683.html</guid><wfw:comment>http://www.blogjava.net/zcljob/comments/41683.html</wfw:comment><comments>http://www.blogjava.net/zcljob/articles/41683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zcljob/comments/commentRss/41683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zcljob/services/trackbacks/41683.html</trackback:ping><description><![CDATA[
		<font size="6">JavaServer Pages标准标签库</font>
		<h5 align="left">
				<a name="wp68475">
				</a>
				<i>
						<a href="http://java.sun.com/webservices/docs/1.1/tutorial/doc/Bios.html#wp63547">Stephanie Bodoff</a>
				</i>
		</h5>
		<p align="left">摘 ：<a href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jpstl.17/17.1.htm">http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jpstl.17/17.1.htm</a></p>
		<p align="left">
				<a name="wp68531">
				</a>JavaServer Pages标准标签库(JSTL)封装了许多JSP应用程序共有的核心功能。例如，不需要用脚本或者众多不同厂商的不同迭代器标签对列表进行迭代，JSTL定义了在所有地方都可以使用的标准标签。这种标准化使您可以学习一种标签后，在多个JSP容器中使用它。而且，当标签标准化以后，容器可以优化对它们的实现。</p>
		<p align="left">
				<a name="wp68537">
				</a>JSTL支持通用的、结构化的任务，如迭代和条件、操作XML文档的标签、国际化标签以及以及用SQL访问数据库的标签。它还引入了表达式语言的概念以简化页面的开发。JSTL还提供了集成现有标签库与JSTL的框架。</p>
		<p align="left">
				<a name="wp81152">
				</a>本章通过在前面几章讨论的Duke's Bookstore应用程序的JSP版本的内容展示JSTL。假定您已经熟悉了第<a href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jpstl.17/..%5Cctjp.16%5C16.1.htm" target="_blank">16</a>章中的“<a href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/ctjp.16/16.1.htm#wp66255">使用标签</a>”中的内容。</p>
		<h2 align="left">
				<a name="wp83467">
				</a>
				<b>
						<font size="4">JSP</font>
				</b>
				<font size="4">
						<b>页面示例</b>
				</font>
				<b>
				</b>
		</h2>
		<p align="left">
				<a name="wp83469">
				</a>本章通过如下重新编写JSP版本的、在第<u><a href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jpstl.17/..%5Cctjp.16%5C16.1.htm">16</a></u>章讨论过的Duke's Bookstore应用程序的内容来展示JSTL：</p>
		<p align="left">
				<a name="wp71265">
				</a>·  用JSTL核心标签替换Struts逻辑标签。</p>
		<p align="left">
				<a name="wp71271">
				</a>·  用消息格式标签替换访问消息储存的scriptlet。</p>
		<p align="left">
				<a name="wp71266">
				</a>·  用通过JSTL SQL标签对数据库的直接调用替换JavaBean组件数据库helper。对于大多数应用程序来说，最好将对数据库的调用封装到bean中。JSTL包含SQL标签，在创建已有原型的应用程序并有可能减少创建bean的开销的情况下可以使用这个标签。</p>
		<p align="left">
				<a name="wp82073">
				</a>Duke's Bookstore应用程序的源代码在解开教程压缩包时创建的&lt;<i>JWSDP_HOME</i>&gt;/docs/tutorial/examples/web/bookstore4目录中(见<u><a href="http://java.sun.com/webservices/docs/1.1/tutorial/doc/Preface.html#wp63746">运行示例</a></u>)。</p>
		<p align="left">
				<a name="wp82778">
				</a>要编译、安装和运行这个例子：</p>
		<p align="left">
				<a name="wp82544">
				</a>1.     在终端窗口，进入 &lt;<i>JWSDP_HOME</i>&gt;/docs/tutorial/examples/web/bookstore4.</p>
		<p align="left">
				<a name="wp82560">
				</a>2.     运行ant build。Build目标会进行所有需要的编译并将文件拷贝到&lt;<i>JWSDP_HOME</i>&gt;/docs/tutorial/examples/web/bookstore4/build 目录中。 </p>
		<p align="left">
				<a name="wp74541">
				</a>3.     确保已经启动Tomcat。</p>
		<p align="left">
				<a name="wp72823">
				</a>4.     运行ant install。install目标通知Tomcat新的内容已经可用。</p>
		<p align="left">
				<a name="wp66149">
				</a>5.     如果还没有做的话，启动PointBase数据库服务器并填入数据 (见<a href="http://java.sun.com/webservices/docs/1.1/tutorial/doc/WebApp13.html#wp69868" target="_blank">从</a><a href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/4/4.2.htm#1">Web应用程序访问数据库</a>)。 </p>
		<p align="left">
				<a name="wp75367">
				</a>6.     打开书店URL http://localhost:8080/bookstore4/enter.</p>
		<p align="left">
				<a name="wp66163">
				</a>有关诊断常问题的帮助见<u><a href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/3/3.3.htm#9">常见问题及其解决方法</a></u>和<u><a href="http://java.sun.com/webservices/docs/1.1/tutorial/doc/Servlets3.html#wp71209">故障排除</a></u>。 </p>
		<h2 align="left">
				<a name="wp72409">
				</a>
				<b>
						<font size="4">使用</font>
				</b>
				<font size="4">
						<b>JSTL</b>
				</font>
				<b>
				</b>
		</h2>
		<p align="left">
				<a name="wp72410">
				</a>JSTL包括很多种不同的标签，可应用到不同功能的领域中。因此，通过多个标签库描述符(TLD)明确表明它所覆盖的功能领域，并给每一领域它自己的命名空间。<a href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jpstl.17/17.1.htm#17_1">表</a><a href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jpstl.17/17.1.htm#17_1">17-1</a>总结了这些功能领域，以及在本章和Duke's Bookstore应用程序中使用的逻辑TLD名和前缀。</p>
		<div align="left">
				<table cellpadding="0" border="1">
						<tbody>
								<tr>
										<td colspan="5">
												<p align="left">
														<a name="wp83103">
														</a>
														<i>
																<a name="17_1">
																</a>表</i>
														<i> 17-1 JSTL </i>
														<i>标签</i>
														<i>  </i>
												</p>
										</td>
								</tr>
								<tr>
										<td>
												<p align="center">
														<a name="wp83113">
														</a>
														<b>领域</b>
												</p>
										</td>
										<td>
												<p align="center">
														<a name="wp83115">
														</a>
														<b>功能</b>
												</p>
										</td>
										<td>
												<p align="center">
														<a name="wp83117">
														</a>
														<b>标签</b>
												</p>
										</td>
										<td>
												<p align="center">
														<a name="wp83119">
														</a>
														<b>TLD </b>
												</p>
										</td>
										<td>
												<p align="center">
														<a name="wp83121">
														</a>
														<b>前缀</b>
												</p>
										</td>
								</tr>
								<tr>
										<td rowspan="3">
												<p align="left">
														<a name="wp83123">
														</a>核心 </p>
										</td>
										<td>
												<p align="left">
														<a name="wp83125">
														</a>支持表达式语言 </p>
										</td>
										<td>
												<p align="left">
														<a name="wp83127">
														</a>catch </p>
												<p align="left">
														<a name="wp83128">
														</a>out </p>
												<p align="left">
														<a name="wp83129">
														</a>remove </p>
												<p align="left">
														<a name="wp83130">
														</a>set </p>
										</td>
										<td rowspan="3">
												<p align="left">
														<a name="wp83132">
														</a>/jstl-c </p>
										</td>
										<td rowspan="3">
												<p align="left">
														<a name="wp83134">
														</a>c </p>
										</td>
								</tr>
								<tr>
										<td>
												<p align="left">
														<a name="wp83138">
														</a>流程控制 </p>
										</td>
										<td>
												<p align="left">
														<a name="wp83140">
														</a>choose </p>
												<p align="left">
														<a name="wp83141">
														</a>  when </p>
												<p align="left">
														<a name="wp83142">
														</a>  otherwise </p>
												<p align="left">
														<a name="wp83143">
														</a>forEach </p>
												<p align="left">
														<a name="wp83144">
														</a>forTokens </p>
												<p align="left">
														<a name="wp83145">
														</a>if </p>
										</td>
								</tr>
								<tr>
										<td>
												<p align="left">
														<a name="wp83153">
														</a>URL管理 </p>
										</td>
										<td>
												<p align="left">
														<a name="wp83155">
														</a>import </p>
												<p align="left">
														<a name="wp83156">
														</a>  param<br />redirect </p>
												<p align="left">
														<a name="wp83157">
														</a>  param </p>
												<p align="left">
														<a name="wp83158">
														</a>url </p>
												<p align="left">
														<a name="wp83159">
														</a>  param </p>
										</td>
								</tr>
								<tr>
										<td rowspan="3">
												<p align="left">
														<a name="wp83165">
														</a>XML </p>
										</td>
										<td>
												<p align="left">
														<a name="wp83167">
														</a>核心 </p>
										</td>
										<td>
												<p align="left">
														<a name="wp83169">
														</a>out </p>
												<p align="left">
														<a name="wp83170">
														</a>parse </p>
												<p align="left">
														<a name="wp83171">
														</a>set </p>
										</td>
										<td rowspan="3">
												<p align="left">
														<a name="wp83173">
														</a>/jstl-x </p>
										</td>
										<td rowspan="3">
												<p align="left">
														<a name="wp83175">
														</a>x </p>
										</td>
								</tr>
								<tr>
										<td>
												<p align="left">
														<a name="wp83179">
														</a>流程控制 </p>
										</td>
										<td>
												<p align="left">
														<a name="wp83181">
														</a>choose<br />  when<br />  otherwise </p>
												<p align="left">
														<a name="wp83182">
														</a>forEach </p>
												<p align="left">
														<a name="wp83183">
														</a>if </p>
										</td>
								</tr>
								<tr>
										<td>
												<p align="left">
														<a name="wp83191">
														</a>转换</p>
										</td>
										<td>
												<p align="left">
														<a name="wp83193">
														</a>transform </p>
												<p align="left">
														<a name="wp83194">
														</a>  param </p>
										</td>
								</tr>
								<tr>
										<td rowspan="3">
												<p align="left">
														<a name="wp83200">
														</a>I18n </p>
										</td>
										<td>
												<p align="left">
														<a name="wp83202">
														</a>区域 </p>
										</td>
										<td>
												<p align="left">
														<a name="wp83204">
														</a>setLocale </p>
										</td>
										<td rowspan="3">
												<p align="left">
														<a name="wp83206">
														</a>/jstl-fmt </p>
										</td>
										<td rowspan="3">
												<p align="left">
														<a name="wp83208">
														</a>fmt </p>
										</td>
								</tr>
								<tr>
										<td>
												<p align="left">
														<a name="wp83212">
														</a>编排消息格式 </p>
										</td>
										<td>
												<p align="left">
														<a name="wp83214">
														</a>bundle </p>
												<p align="left">
														<a name="wp83215">
														</a>message </p>
												<p align="left">
														<a name="wp83216">
														</a>  param </p>
												<p align="left">
														<a name="wp83217">
														</a>setBundle </p>
										</td>
								</tr>
								<tr>
										<td>
												<p align="left">
														<a name="wp83225">
														</a>编排数字和日期格式 </p>
										</td>
										<td>
												<p align="left">
														<a name="wp83227">
														</a>formatNumber </p>
												<p align="left">
														<a name="wp83228">
														</a>formatDate </p>
												<p align="left">
														<a name="wp83229">
														</a>parseDate </p>
												<p align="left">
														<a name="wp83230">
														</a>parseNumber </p>
												<p align="left">
														<a name="wp83231">
														</a>setTimeZone </p>
												<p align="left">
														<a name="wp83232">
														</a>timeZone </p>
										</td>
								</tr>
								<tr>
										<td rowspan="2">
												<p align="left">
														<a name="wp83238">
														</a>数据库 </p>
										</td>
										<td>  </td>
										<td>
												<p align="left">
														<a name="wp83242">
														</a>setDataSource </p>
										</td>
										<td rowspan="2">
												<p align="left">
														<a name="wp83244">
														</a>/jstl-sql </p>
										</td>
										<td rowspan="2">
												<p align="left">
														<a name="wp83246">
														</a>sql </p>
										</td>
								</tr>
								<tr>
										<td>
												<p align="left">
														<a name="wp83250">
														</a>SQL </p>
										</td>
										<td>
												<p align="left">
														<a name="wp83252">
														</a>query </p>
												<p align="left">
														<a name="wp83253">
														</a>  dateParam </p>
												<p align="left">
														<a name="wp83254">
														</a>  param </p>
												<p align="left">
														<a name="wp83255">
														</a>transaction </p>
												<p align="left">
														<a name="wp83256">
														</a>update<br />  dateParam </p>
												<p align="left">
														<a name="wp83257">
														</a>  param </p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<p align="left">
				<a name="wp72414">
				</a>例如，要在JSP页面中使用JSTL核心标签，用引用TLD的taglib指令声明库：</p>
		<blockquote>
				<p align="left">&lt;%@ taglib uri="/jstl-core" prefix="c" %&gt;<a name="wp72415"></a></p>
		</blockquote>
		<p align="left">
				<a name="wp72419">
				</a>JSTL标签库有两种版本(见<u><a href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jpstl.17/17.1.htm#luan">孪生库</a></u>)。JSTL-EL库的TLD命名为<i>prefix</i>.tld。JSTL-RT库的TLD命名为<i>prefix</i>-rt.tld。由于在本章讨论的例子使用逻辑TLD名，所以我们用Web应用部署描述符中的taglib元素将逻辑名映射为实际TLD位置。下面是将核心库逻辑TLD名/jstl-c映射到其位置/WEB-INF/c.tld的项：</p>
		<blockquote>
				<p align="left">&lt;taglib&gt;<br /> &lt;taglib-uri&gt;/jstl-c&lt;/taglib-uri&gt;<br /> &lt;taglib-location&gt;/WEB-INF/c.tld&lt;/taglib-location&gt;<br />&lt;/taglib&gt;<a name="wp72420"></a></p>
		</blockquote>
		<p align="left">
				<a name="wp72421">
				</a>在Java WSDP中，JSTL TLD储存在&lt;<i>JWSDP_HOME</i>&gt;/jstl-1.0.3/tld中。在构建Duke's Bookstore应用程序时，这些TLD自动拷贝到&lt;<i>JWSDP_HOME</i>&gt;/docs/tutorial/examples/web/bookstore4/build/WEB-INF中。</p>
		<p align="left">
				<a name="wp72422">
				</a>还可以在taglib指令中用绝对URI引用TLD：</p>
		<p align="left">
				<a name="wp72423">
				</a>·  核心： http://java.sun.com/jstl/core</p>
		<p align="left">
				<a name="wp72424">
				</a>·  XML： http://java.sun.com/jstl/xml</p>
		<p align="left">
				<a name="wp72425">
				</a>·  国际化： http://java.sun.com/jstl/fmt</p>
		<p align="left">
				<a name="wp72426">
				</a>·  SQL： http://java.sun.com/jstl/sql</p>
		<p align="left">
				<a name="wp72427">
				</a>在使用绝对URI时，不必在web.xml中添加taglib元素，JSP容器会自动定位在JSTL库实现中的TLD。</p>
		<p align="left">
				<a name="wp83095">
				</a>除了声明标签库，还需要使JSTL API及其实现对于Web应用程序是可用的。它们是以&lt;<i>JWSDP_HOME</i>&gt;/jstl-1.0.3中的jstl.jar和&lt;<i>JWSDP_HOME</i>&gt;/jstl-1.0.3/standard中的standard.jar文档形式发布的。在构建Duke's Bookstore应用程序时，这些库会自动拷贝到&lt;<i>JWSDP_HOME</i>&gt;/docs/tutorial/examples/web/bookstore4/build/WEB-INF/lib中。</p>
		<h2 align="left">
				<a name="wp65865">
				</a>
				<font size="4">表达式语言支持 </font>
		</h2>
		<p align="left">
				<a name="wp65862">
				</a>JSTL的一个重要功能就是对表达式语言(EL)的支持。表达式语言结合JSTL标签，使得访问应用程序数据和以简单方式操纵它变得容易了，不需要使用scriptlet或者请求时表达式。当前，页面编写者必须使用表达式&lt;%= aName %&gt;访问系统的值或者用户定义的JavaBean组件。如：</p>
		<blockquote>
				<div align="left">&lt;x:aTag att="&lt;%= pageContext.getAttribute("aName") %&gt;"&gt; <a name="wp64305"> </a></div>
		</blockquote>
		<p align="left">
				<a name="wp64502">
				</a>对于嵌入式bean属性就更复杂了：</p>
		<blockquote>
				<div align="left">&lt;%= aName.getFoo().getBar() %&gt;<a name="wp64462"></a></div>
		</blockquote>
		<p align="left">
				<a name="wp64321">
				</a>这使得页面的编写比它需要的更复杂。</p>
		<p align="left">
				<a name="wp83092">
				</a>表达式语言使页面编写者可以用简单的语法访问对象，如对于简单的变量 </p>
		<blockquote>
				<div align="left">&lt;x:atag att="${aName}"&gt; <a name="wp64324"> </a></div>
		</blockquote>
		<p align="left">
				<a name="wp64332">
				</a>或者对于嵌入的属性</p>
		<blockquote>
				<div align="left">&lt;x:aTag att="${aName.foo.bar}"&gt; <a name="wp63924"> </a></div>
		</blockquote>
		<p align="left">
				<a name="wp64485">
				</a>
				<a name="wp65671">
				</a>JSTL表达式语言将JSP<em> scoped </em><em>属性</em><em>提升</em>为业务逻辑与JSP页面交换信息的标准方式。例如，为这个条件标签的test属性提供一个比较名为cart的会话作用域属性中的项目数是否为0的表达式：</p>
		<blockquote>
				<div align="left">&lt;c:if test="${sessionScope.cart.numberOfItems &gt; 0}"&gt;   ... &lt;/c:if&gt;<a name="wp67026"></a></div>
		</blockquote>
		<p align="left">
				<a name="wp68644">
				</a>JSP规范的下一个版本将会对所有自定义标签库的表达式语言进行标准化。这一版本的JSTL包括这一表达式语言的一个快照。</p>
		<h3 align="left">
				<a name="wp67593">
				</a>
				<a name="luan">
				</a>孪生库 </h3>
		<p align="left">
				<a name="wp67594">
				</a>JSTL标签库有两个版本，它们只是在对属性值使用运行时表达式的方式上有所不同。</p>
		<p align="left">
				<a name="wp67610">
				</a>在JSTL-RT标签库，表达式是在页面的脚本语言中指定的。这正是当前标签库的工作方式。</p>
		<p align="left">
				<a name="wp67721">
				</a>在JSTL-EL标签库中，表达式是在JSTL表达式语言中指定的。表达式是以EL的语法所写的一个String文字。</p>
		<p align="left">
				<a name="wp67727">
				</a>在使用EL标签库时，不能为一个属性的值传递脚本语言表达式。这个规则使它可以在转换时验证表达式的语法。</p>
		<h3 align="left">
				<a name="wp66724">
				</a>JSTL 表达式语言 </h3>
		<p align="left">
				<a name="wp69676">
				</a>JSTL表达式语言负责处理表达式和文字。表达式由${ }字符所包围。例如：</p>
		<blockquote>
				<div align="left">&lt;c:if test="${bean1.a &lt; 3}" /&gt;<a name="wp68676"></a></div>
		</blockquote>
		<p align="left">
				<a name="wp68678">
				</a>所有不以${开始的值都认为是文字，用所预期的类型的PropertyEditor将文字解析为预期类型：</p>
		<blockquote>
				<div align="left">&lt;c:if test="true" /&gt;<a name="wp68681"></a></div>
		</blockquote>
		<p align="left">
				<a name="wp68683">
				</a>包含字符的文字值必须进行如下转义：</p>
		<blockquote>
				<div align="left">&lt;mytags:example attr1="an expression is ${'${'}true}" /&gt;<a name="wp68685"></a></div>
		</blockquote>
		<h4 align="left">
				<a name="wp69608">
				</a>属性 </h4>
		<p align="left">
				<a name="wp68672">
				</a>可以通过名称访问属性，也可以加上作用域。属性的属性是用.操作符访问的，并可任意嵌套。</p>
		<p align="left">
				<a name="wp73736">
				</a>EL统一了对.和[ ]操作符的处理。因此，expr-a.expr-b等于expr-a[expr-b]。要判断expr-a[expr-b]，需将expr-a按value-a判断，将expr-b按value-b判断。</p>
		<p align="left">
				<a name="wp73765">
				</a>·  如果value-a是一个Map，返回value-a.get(value-b)。</p>
		<p align="left">
				<a name="wp73768">
				</a>·  如果value-a是一个List或者数组，强制value-b为int并相应并返回value-a.get(value-b)或者Array.get(value-a, value-b)。</p>
		<p align="left">
				<a name="wp73787">
				</a>·  如果value-a是JavaBean对象，强制value-b为String。如果value-b是value-a的可读属性，则返回getter调用的结果。</p>
		<p align="left">
				<a name="wp75132">
				</a>EL通过将标识作为属性查询、根据PageContext.findAttribute(String)的行为对标识进行判断。例如，${product}会查询名为product的属性，搜索页面、请求、会话和应用程序作用域，并返回其值。如果没有找到属性，则返回null。注意与一个在下面一节中描述的隐式对象相匹配的标识会返回该隐式对象而不是属性值。</p>
		<h4 align="left">
				<a name="wp76453">
				</a>隐式对象 </h4>
		<p align="left">
				<a name="wp76454">
				</a>JSTL 表达式语言定义了一组隐式对象： </p>
		<p align="left">
				<a name="wp75174">
				</a>·  pageContext： PageContext对象</p>
		<p align="left">
				<a name="wp75175">
				</a>·  pageScope ：一个Map，它将页面作用域属性名映射为它们的值 </p>
		<p align="left">
				<a name="wp75176">
				</a>·  requestScope：一个Map，它将请求作用域的属性名映射为它们的值</p>
		<p align="left">
				<a name="wp75177">
				</a>·  sessionScope ：一个Map，它将会话作用域的属性名映射为它们的值 </p>
		<p align="left">
				<a name="wp75178">
				</a>·  applicationScope：一个Map，它将应用程序作用域的属性值映射为它们的值</p>
		<p align="left">
				<a name="wp75179">
				</a>·  param：一个Map，它将参数名映射为单个String参数值(通过调用ServletRequest.getParameter(String)) </p>
		<p align="left">
				<a name="wp75180">
				</a>·  paramValues： 一个Map，它将参数名映射为该参数的所有值的String[ ] (通过调用获得ServletRequest.getParameterValues(String) 获得)</p>
		<p align="left">
				<a name="wp76233">
				</a>·  header ：一个Map，它将头名映射到单个String头值(通过调用ServletRequest.getheader(String)获得) </p>
		<p align="left">
				<a name="wp76234">
				</a>·  headerValues： 一个Map，它将头名映射到该参数的所有值的String[ ] (通过调用ServletRequest.getHeaders(String) 获得)</p>
		<p align="left">
				<a name="wp76258">
				</a>·  cookie： 一个Map，它将cookie名映射为单个Cookie (通过调用HttpServletRequest.getCookie(String) 获得) </p>
		<p align="left">
				<a name="wp76262">
				</a>·  initParam ： 一个Map，它将参数名映射到单个String值 (通过调用ServletRequest.getInitParameter(String) 获得) </p>
		<p align="left">
				<a name="wp75170">
				</a>当表达式通过名字引用其中一个对象时，返回的是相应的对象而不是相应的属性。例如：${pageContext}返回PageContext对象，即使有一个现有的包含一些其他值的pageContext属性。<a href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jpstl.17/17.1.htm#wp76682">表17-2</a>显示了使用这种隐式对象的一些例子。</p>
		<div align="left">
				<table cellpadding="0" border="1">
						<tbody>
								<tr>
										<td colspan="2">
												<p>
														<a name="wp76682">
														</a>
														<i>表</i>
														<i>17-2 JSTL</i>
														<i>表达式例子</i>
												</p>
										</td>
								</tr>
								<tr>
										<td>
												<p align="center">
														<a name="wp76686">
														</a>
														<b>表达式</b>
												</p>
										</td>
										<td>
												<p align="center">
														<a name="wp76688">
														</a>
														<b>结果</b>
												</p>
										</td>
								</tr>
								<tr>
										<td>
												<p>
														<a name="wp76690">
														</a>${pageContext.request.contextPath} </p>
										</td>
										<td>
												<p>
														<a name="wp76727">
														</a>上下文路径(从HttpServletRequest获得) </p>
										</td>
								</tr>
								<tr>
										<td>
												<p>
														<a name="wp76694">
														</a>${sessionScope.cart.numberOfItems} </p>
										</td>
										<td>
												<p>
														<a name="wp76752">
														</a>名为cart的会话作用域的numberOfItems属性 </p>
										</td>
								</tr>
								<tr>
										<td>
												<p>
														<a name="wp76698">
														</a>${param["mycom.productId"]} </p>
										</td>
										<td>
												<p>
														<a name="wp76759">
														</a>mycom.productId参数的String 值 </p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<h4 align="left">
				<a name="wp69609">
				</a>Literals </h4>
		<p align="left">
				<a name="wp73712">
				</a>·  Boolean: true和false</p>
		<p align="left">
				<a name="wp73713">
				</a>·  Long: 与在Java中的一样</p>
		<p align="left">
				<a name="wp73715">
				</a>·  Floating point: 与在Java中一样</p>
		<p align="left">
				<a name="wp73716">
				</a>·  String: 带单引号和双引号。"转义为\"，' 转义为\'，而\ 转义为\\。</p>
		<p align="left">
				<a name="wp73717">
				</a>·  Null: null</p>
		<h4 align="left">
				<a name="wp73711">
				</a>操作符</h4>
		<p align="left">
				<a name="wp73684">
				</a>EL提供了下列操作符：</p>
		<p align="left">
				<a name="wp73693">
				</a>·  算术：+、-、*、/和div、%和mod、-</p>
		<p align="left">
				<a name="wp73683">
				</a>·  逻辑： and、&amp;&amp;、or、||、not、!</p>
		<p align="left">
				<a name="wp73682">
				</a>·  关系： ==、eq、!=、ne、&lt;、lt、&gt;、gt、&lt;=、ge、&gt;=、le。可以是针对其他值，也可能针对布尔、字符串、整数或者浮点文字进行比较。</p>
		<p align="left">
				<a name="wp76397">
				</a>·  空： empty 操作符是一个前缀操作符，可以用来决定一个值是否为null或者空。</p>
		<p align="left">
				<a name="wp76850">
				</a>有关这些操作符的优先级和效果参见<a href="http://www.jcp.org/aboutJava/communityprocess/first/jsr052/index.html">JSTL 1.0规范</a>。</p>
		<h3 align="left">
				<a name="wp66806">
				</a>标签协作</h3>
		<p align="left">
				<a name="wp66807">
				</a>标签通常与它们的环境以隐式或者显式的方式协作。隐式协作是通过让上级标签公开定义好的接口、使嵌套的标签无缝地与上级标签协作来实现的。JSTL迭代器标签支持这种模式的协作。</p>
		<p align="left">
				<a name="wp67562">
				</a>显示协作在标签向环境公开信息时出现。传统上，这是通过公开一个脚本变量实现的(由JSP作用域的属性提供实际对象)。因为JSTL有一个表达式语言，因此不太需要脚本变量。所以JSTL标签(包括EL和RT版本)只是以JSP作用域属性公开信息，不使用脚本变量。下面的JSTL规范对于所有导出有关标签信息的标签属性使用名字var。例如，forEach标签以下面的方式公开购物车中正在迭代的当前项目</p>
		<blockquote>
				<div align="left">&lt;c:forEach var="item" items="${sessionScope.cart.items}"&gt;<br />  ...<br />&lt;/c:forEach&gt;<a name="wp66588"></a></div>
		</blockquote>
		<p align="left">
				<a name="wp65151">
				</a>选用名字var以突出公开的作用域变量不是脚本变量(一般情况下对于属性应命名为id)。</p>
		<p align="left">
				<a name="wp65154">
				</a>对于标签公开多种情息的情况，名字var用于公开的主要信息，对于公开的其他二级信息选用其他合适的名字。例如，forEach标签通过status属性公开迭代状态信息。</p>
		<h2 align="left">
				<a name="wp65106">
				</a>核心标签 </h2>
		<p align="left">
				<a name="wp70655">
				</a>核心标签包括那些与表达式、流程控制和一种通用的访问那些基于URL的、其内容可以包含在JSP页面或者在JSP页面中被处理的资源的方式相关的标签。</p>
		<div align="left">
				<table cellpadding="0" border="1">
						<tbody>
								<tr>
										<td colspan="5">
												<p>
														<a name="wp70503">
														</a>
														<i>表</i>
														<i>17-3 </i>
														<i>核心标签</i>
														<i>  </i>
												</p>
										</td>
								</tr>
								<tr>
										<td>
												<p align="center">
														<a name="wp70513">
														</a>
														<b>领域</b>
												</p>
										</td>
										<td>
												<p align="center">
														<a name="wp70515">
														</a>
														<b>功能</b>
												</p>
										</td>
										<td>
												<p align="center">
														<a name="wp70517">
														</a>
														<b>标签</b>
												</p>
										</td>
										<td>
												<p align="center">
														<a name="wp70519">
														</a>
														<b>TLD </b>
												</p>
										</td>
										<td>
												<p align="center">
														<a name="wp70521">
														</a>
														<b>前缀</b>
												</p>
										</td>
								</tr>
								<tr>
										<td rowspan="3">
												<p>
														<a name="wp70523">
														</a>核心 </p>
										</td>
										<td>
												<p>
														<a name="wp70525">
														</a>表达式语言支持 </p>
										</td>
										<td>
												<p>
														<a name="wp73859">
														</a>catch </p>
												<p>
														<a name="wp73860">
														</a>out </p>
												<p>
														<a name="wp73861">
														</a>remove </p>
												<p>
														<a name="wp73862">
														</a>set </p>
										</td>
										<td rowspan="3">
												<p>
														<a name="wp70531">
														</a>/jstl-c </p>
										</td>
										<td rowspan="3">
												<p>
														<a name="wp70533">
														</a>c </p>
										</td>
								</tr>
								<tr>
										<td>
												<p>
														<a name="wp70537">
														</a>流程控制 </p>
										</td>
										<td>
												<p>
														<a name="wp73341">
														</a>choose </p>
												<p>
														<a name="wp73342">
														</a>  when </p>
												<p>
														<a name="wp70539">
														</a>  otherwise </p>
												<p>
														<a name="wp73346">
														</a>forEach </p>
												<p>
														<a name="wp70540">
														</a>forTokens </p>
												<p>
														<a name="wp70541">
														</a>if </p>
										</td>
								</tr>
								<tr>
										<td>
												<p>
														<a name="wp73225">
														</a>URL管理 </p>
										</td>
										<td>
												<p>
														<a name="wp73871">
														</a>import </p>
												<p>
														<a name="wp73872">
														</a>  param </p>
												<p>
														<a name="wp73374">
														</a>redirect </p>
												<p>
														<a name="wp73227">
														</a>  param </p>
												<p>
														<a name="wp73378">
														</a>url </p>
												<p>
														<a name="wp73235">
														</a>  param </p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<h3 align="left">
				<a name="wp63882">
				</a>表达式标签 </h3>
		<p align="left">
				<a name="wp72883">
				</a>out标签判断一个表达式并将判断结果输出为当前JspWriter对象。它对应于JSP语法&lt;%= <i>expression</i> %&gt;。例如，<a href="http://java.sun.com/webservices/docs/1.1/tutorial/examples/web/bookstore4/web/showcart.txt">showcart.jsp</a>像下面这样显示在购物车上的项目：</p>
		<blockquote>
				<div align="left">&lt;c:out value="${sessionScope.cart.numberOfItems}"/&gt;<a name="wp72885"></a></div>
		</blockquote>
		<p align="left">
				<a name="wp72886">
				</a>set标签设置在任何JSP作用域(页面、请求、会话、应用程序)中的属性的值。如果该属性不存在，则创建它。</p>
		<p align="left">
				<a name="wp65014">
				</a>可以用属性值设置JSP作用域属性：</p>
		<blockquote>
				<div align="left">&lt;c:set var="foo" scope="session" value="..."/&gt; <a name="wp65016"> </a></div>
		</blockquote>
		<p align="left">
				<a name="wp65018">
				</a>也可以用标签正文设置JSP作用域属性：</p>
		<blockquote>
				<div align="left">&lt;c:set var="foo"&gt;<br />  ...<br />&lt;/c:set&gt;<a name="wp65020"></a></div>
		</blockquote>
		<p align="left">
				<a name="wp81215">
				</a>例如，下面用名为Remove的请求参数设置名为bookID的页面作用域属性：</p>
		<blockquote>
				<div align="left">&lt;c:set var="bookId" value="${param.Remove}"/&gt;<a name="wp81216"></a></div>
		</blockquote>
		<p align="left">
				<a name="wp81211">
				</a>如果使用RT版本的库，那么语句将为：</p>
		<blockquote>
				<div align="left">&lt;c_rt:set var="bookId"<br />  value="&lt;%= request.getParameter("Remove") %&gt;" /&gt;<a name="wp81212"></a></div>
		</blockquote>
		<p align="left">
				<a name="wp73979">
				</a>要删除一个作用域属性，使用remove标签。调用书店JSP页面<a href="http://java.sun.com/webservices/docs/1.1/tutorial/examples/web/bookstore4/web/receipt.txt">receipt.jsp</a>时，购货会话就结束了，所以像下面这样删除会话属性cart：</p>
		<blockquote>
				<div align="left">&lt;c:remove var="cart" scope="session"/&gt;<a name="wp81116"></a></div>
		</blockquote>
		<p align="left">
				<a name="wp66769">
				</a>JSTL表达式语言减少了对脚本的需要。不过，页面编写者仍然会遇到在页面的脚本语言中一些非JSTL标签属性必须用表达式指定的情况。用标准JSP元素jsp:useBean声明可以在脚本表达式或者scriptlet中使用的脚本变量。例如，<a href="http://java.sun.com/webservices/docs/1.1/tutorial/examples/web/bookstore4/web/showcart.txt">showcart.jsp</a>使用scriptlet从购物车上删除一本书。这本要删除的书的ID作为请求参数传递。请求参数的值首先设置为页面属性(以便在后被标签JSTL sql:query使用)，然后声明为脚本变量并传递给cart.remove方法：</p>
		<blockquote>
				<div align="left">&lt;c:set var="bookId" value="${param.Remove}"/&gt;<br />&lt;jsp:useBean id="bookId" type="java.lang.String" /&gt;<br />&lt;% cart.remove(bookId); %&gt;<br />&lt;sql:query var="books"<br />  dataSource="${applicationScope.bookDS}"&gt;<br />  select * from PUBLIC.books where id = ?<br />  &lt;sql:param value="${bookId}" /&gt;<br />&lt;/sql:query&gt;<a name="wp73995"></a></div>
		</blockquote>
		<p align="left">
				<a name="wp74056">
				</a>catch标签为JSP错误页面机制提供了一种补充。它让页面编写者能够从可以控制的错误条件中正常恢复。页面上最重要的行动<i>不</i>应当封装在catch中，这样它们的异常就会传播到错误页面。页面中次要的行动应当包装到catch中，这样它们就不会调用错误页面机制。</p>
		<p align="left">
				<a name="wp74008">
				</a>抛出的异常储存在由var标识的作用域变量中，它总是有页面作用域。如果没有发生异常，那么如果有由var标识的作用域变量的话，就将它删除。如果没有var，那么异常就仅仅被捕捉而不保存。<span lang="EN" style="mso-ansi-language: EN"><?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span></p>
<img src ="http://www.blogjava.net/zcljob/aggbug/41683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zcljob/" target="_blank">张春利</a> 2006-04-18 17:07 <a href="http://www.blogjava.net/zcljob/articles/41683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>