﻿<?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/leedo/category/14340.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 12:16:16 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 12:16:16 GMT</pubDate><ttl>60</ttl><item><title>[JSP] JSTL如何简化网页开发？ （1）</title><link>http://www.blogjava.net/leedo/articles/74620.html</link><dc:creator>阳光</dc:creator><author>阳光</author><pubDate>Wed, 11 Oct 2006 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/leedo/articles/74620.html</guid><wfw:comment>http://www.blogjava.net/leedo/comments/74620.html</wfw:comment><comments>http://www.blogjava.net/leedo/articles/74620.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leedo/comments/commentRss/74620.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leedo/services/trackbacks/74620.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td align="middle">
										<font class="p24" color="#000000">
												<b>
														<font color="#515151" size="5">[JSP] JSTL如何简化网页开发？ （1）</font>
												</b>
										</font>
								</td>
						</tr>
						<tr>
								<td align="middle" height="30">
										<font color="#4b4a74">
												<iframe id="enettonglan" marginwidth="0" marginheight="0" src="http://www.yzcc.com/indexad/indexad18.htm" frameborder="0" noresize="" width="550" scrolling="no" height="30">
												</iframe>
										</font>
								</td>
						</tr>
						<tr>
								<td align="middle">
										<font color="#515151">2004-8-27 14:09:00　 作者：未知 摘编：本站转 来源：网上转贴　 <strong>【<a href="http://www.yzcc.com/Sendmail.asp?FileName=14105" target="_blank">发送给好友</a>】<a href="http://bbs.yzcc.com/" target="_blank"><font color="#000000" size="3"></font></a></strong></font>
								</td>
						</tr>
						<tr>
								<td align="middle">
								</td>
						</tr>
						<tr>
								<td>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="2" width="580" align="center" border="0">
				<tbody>
						<tr>
								<td class="p14h">
										<br />
										<span class="myp11">
												<font id="zoom">
														<b>概述</b>
														<br />
														<br />　　Java Server Pages (JSP) 标准标记库 (JSTL)的版本的发布对于JSP/servlet开发者来说是一个重大的进展。有了一个表达语言（EL）和一组四种强大的、易于学习的标准标记库， JSTL极有可能不久后成为实现动态的、基于Java的站点的主要方法。 <br /><br />　　1996年对JSP servlet的介绍使得Java成为动态网页开发的合理的选择。随后出现的Java服务器页(JSP)是走向快速的、可维护的Java网页实现过程的合理进化的一步，紧接着就出现了JSP标记的支持。但是2002中期的JSTL(JSP标准标记库)的发布才是进一步加速和简化开发过程最大的一步。 <br /><br />　　在本文中，我解释了JSTL的功能，也涵盖了你启动JSTL所需的每件事情。假设你有了对Java、JSP、XML和安装一个Web容器的基本理解。如果你对这些主题感到陌生，你可以在Resources（http://www.javaworld.com/javaworld/jw-02- 2003/jw-0228-jstl.html?#resources#resources）上浏览一下背景参考。在下面的阐述中，假定你有XML和 SQL的知识。 <br /><br />　　<b>安装JSTL支持</b><br /><br />　　对于我们的JSTL安装例子来说，我们使用Tomcat 4.1（尽管任意支持Servlet 2.3和JSP1.2说明的servlet容器都应该能工作）。首先，下载Tomcat 4.1并且按指示进行安装（注意：JSTL需要一个JSP1.2 Web容器）。 <br /><br />　　用tomcat4 start程序启动Tomcat，并且运行index.html页来确保Tomcat是激活的、且运行良好。 <br /><br />　　接下来，安装JSTL支持，你可以从Jakarta站点下载JSTL支持，（http: //www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resources#resources）并按照下面步骤： <br /><br />　　1. 从Jakarta站点下载JSTL检索、解压/脱档该文件。（http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resources） <br /><br />　　2. 复制你已经解压为common/lib的jar文件到你的Tomcat安装路径中（尽管我们的项目不需要所有的jar文件）；这使得JSTL文件适糜谀愕娜我釽eb应用。 <br /><br />　　3. 对于任意你想使用JSTL的Web应用来说，复制.tld文件到你的Web应用的WEB-INF目录下。 <br /><br />　　4. 对于你的JSTL的Web应用，编辑web.xml并添加下列输入： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;taglib&gt;
    &lt;taglib-uri&gt;http://java.sun.com/jstl/fmt&lt;/taglib-uri&gt;
    &lt;taglib-location&gt;/WEB-INF/fmt.tld&lt;/taglib-location&gt;
  &lt;/taglib&gt;

  &lt;taglib&gt;
    &lt;taglib-uri&gt;http://java.sun.com/jstl/core&lt;/taglib-uri&gt;
    &lt;taglib-location&gt;/WEB-INF/c.tld&lt;/taglib-location&gt;
  &lt;/taglib&gt;

  &lt;taglib&gt;
    &lt;taglib-uri&gt;http://java.sun.com/jstl/sql&lt;/taglib-uri&gt;
    &lt;taglib-location&gt;/WEB-INF/sql.tld&lt;/taglib-location&gt;
  &lt;/taglib&gt;

  &lt;taglib&gt;
    &lt;taglib-uri&gt;http://java.sun.com/jstl/x&lt;/taglib-uri&gt;
    &lt;taglib-location&gt;/WEB-INF/x.tld&lt;/taglib-location&gt;
  &lt;/taglib&gt;</ccid_code></pre></td></tr></tbody></table><br /><br />　　这些输入让你的Web应用可使用JSTL标记库的表达语言（EL）版本。这些输入的位置有关系！如果你不肯定将他们输入到何处，关于web.xml选项和顺序的权威性指导在文档类型定义（DTD）中定义过：http://java.sun.com/j2ee/dtds/web-app_2_2.dtd。 <br /><br />　　5. 当你创建了一个使用JSTL的JSP页时，将他输入到你的Web应用的主目录下，就像其它JSP和HTML页一样。你可以为该页任意取名，但是它必须有一个.jsp的扩展名。 <br /><br />　　<b>基础原理</b><br /><br />　　首先，所有的JSTL也是JSP页，JSTL只是JSP功能的一个超集。 <br /><br />　　同样，所有的JSTL标记是有效的XML。这意味着：如果你将JSTL标记之外的内容当作临时文本（通常是HTML）时，剩下的JSTL标记必须当作合法的XML来解释。这里有一些隐含的规则，它要求大部分XML语法都是正确的。 <br /><br />　　JSTL提供一组四个标准标记库（core核心、internationalization/format国际标准化/格式、XML和SQL）并支持EL。JSTL和EL的基本设计目的是简化网页开发和实现。 <br /><br />　　在本文中，我们遵循JSTL说明书的命名规则，并且把JSTL标记当作动作。一个JSTL标记对应于某个动作；调用动作明确的提醒我们：他们添加动态行为到一个另外的静态页上。 <br /><br />　　<ccid_code>　　JSTL标记库有两个版本：一个用你以前使用的方法将JSP表达式插入，如&lt;%= . . . %&gt;，另一个使用一个JSTL EL.我会在后面进一步讨论在JSTL中的EL支持。</ccid_code><br /><br />　　<b>EL支持</b><br /><br />　　要理解当前JSTL对EL支持的状态，让我们检查相关的说明书是怎样处理的。Java说明书请求（JSR）专家组成员决定：由于某种原因，EL规范说明应该是JSP说明书的一部份，而不是JSTL说明书的一部分。EL完整的说明书成为JSP2.0的一部分。因为JSTL1.0在JSP1.3之前已经完成，JSTL作者不得不对用于JSTL1.0的EL支持实现做一个合理的猜测（结果可能是相当好的）。一个JSTL维护版本将与JSP1.3说明书保持一致，并为了使EL适合JSP1.3说明书，JSTL维护版本做了一些修正。 <br /><br />　　本文描述的EL概要可能在即将发布的JSTL版本中有一点改动，但是任何改动都是微小的。 <br /><br />　　EL用于简单的语法定义了一套功能强大的语言，它很容易学习。它融合着JavaScript语言和Perl语言较好的部分的一些风格。EL表达式，集成了来自四种标准标记库的JSTL标记，提供了一个巨大的、灵活的属性集。 <br /><br />　　所有的EL表达式都被${}括起来。JSTL中的表达式总是JSTL标记中的属性值的一部分。表达式可以是属性的一部分或者合并和嵌入到一个字符串直接量中。JSTL属性也可以包含简单的字符串直接量。在接下来的JSTL中，我们在一个来自核心库的c:out动作中说明每种情况，这个核心库将它的 value属性值送到JSP输出上： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:out value="${anExpression}"/&gt;
&lt;c:out value="literalText${anExpression}${anotherExpression}"/&gt;
&lt;c:out value="literalText"/&gt;</ccid_code></pre></td></tr></tbody></table><br /><br />　　EL也定义了一套规则用于强制表达式中的值转换为上下文相对应的类型。我们在这里不详细讨论这些规则；然而，它的方法与用Perl语言定义的方式非常相似（就像Perl语言中的做法一样，该方法理所当然的运行良好，但是，偶尔，也会出现可能不是你十分想要的那种结果，但你可以接受）。 <br /><br />　　EL为访问对象属性、集合元素、一组隐藏对象以及使用相关的、逻辑的和算术的操作符提供了支持。对于索引的属性来说，包括数组和java.util.List类在内，元素可用下列语法访问： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>${alist[4]}
${aList[someVariable]}</ccid_code></pre></td></tr></tbody></table><br /><br />　　JavaBean属性和java.util.Map元素（它代表一系列名字/值对）都可以使用下列方法的一个访问得到。在以下的开头两个表达式里，我们可以访问到一个用JavaBean语言命名为aProperty的属性或者用关键字aProperty访问到一个Map实体。在第三个表达式中（注意：我已经省略了引号），我们用保存在变量aVariableContainingPropertyName中的一个名字访问了在anObject之内的一个元素: <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>${anObject.aProperty}
${anObject["aPropertyName"]}
${anObject[aVariableContainingPropertyName]}</ccid_code></pre></td></tr></tbody></table><br /><br />　　在EL中定义了许多隐藏变量： <br /><br />　　◆ pageContext：用于该网页的pageContext对象 <br /><br />　　◆ pageScope, requestScope, sessionScope, 和 applicationScope：这些是映射这些范围的每一个变量到值上的Map集。 <br /><br />　　◆ param 和 paramValues：用页访问传递的参数，与在JSP中一样 <br /><br />　　◆ header 和 headerValues：用页请求传递的头，与在JSP中一样 <br /><br />　　◆ cookie：Map映射cookie程序到特定的cookie对象上 <br /><br /><ccid_code>　　EL定义了全套与你在Java中非常熟悉的那些完全对应的操作符。算法操作符包括+、 -、 *、 / (或 div)、 和% (或 mod)。相关的操作符包括==、！=、&lt;、&gt;、&lt;=、&gt;=，它分别对应于eq、ne、lt、gt、le、和ge。我不想详细阐述这些操作符，因为他们都能自我说明。</ccid_code><br /><br />　　<b>JSTL标记库</b><br /><br />至此，我已经解释了一些基本原理并且涵盖了EL语法。我要专门讨论四种JSTL标记库。我主要讨论核心库，因为它是你一定要使用的；但是，我也会详细的讨论其余几个，以便你能启动它。 <br /><br />　　首先，尽管我应该更多地谈论JSTL标记库的两种风格，我上面提到的每个JSTL标记库以两个版本出现：一个支持使用EL的表达式；另一个支持标准JSP表达式。当你引入任何标记库到一个JSP页时，你要定义一个前缀，该前缀指定了与库中标记相对应的命名空间。 <br /><br />　　四种标准标记库，和他们的JSTL规范定义的前缀常规，列表如下。记住：你可以定义自己的前缀，但是这绝对没有什么好处。 <br /><br />　　四种标准标记库 <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>　　库	　　　　　　EL 库前缀	请求时间 (RT) 库前缀
　　核心	　　　　　　c	　　　　　　c_rt
　　国际标准化/格式　fmt　　　　　　　　fmt_rt
　　SQL/DB 支持	　　sql　　　　　　　sql_rt
　　XML　　　　　　　　x	　　　　　　x_rt</ccid_code></pre></td></tr></tbody></table><br /><br />　　为了使用页中的核心标记库（ 实际上，你使你的页对标记库的命名空间可见），在你的页首包含下列例子中的指令： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;%@ taglib prefix="c" uri=http://java.sun.com/jstl/core %&gt;</ccid_code></pre></td></tr></tbody></table><br /><br />　　为了使用该标记库的标记，用你在你的包含语句中设计好的前缀，在你的页中给每个标记加上前缀： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:out value="${anExpression}"/&gt;</ccid_code></pre></td></tr></tbody></table><br /><br />　　<b>核心数据库</b><br /><br />　　让我们更详细的测试核心数据库，先看看他最通用的功能。 <br /><br />　　<b>显示/设定值和异常处理</b><br /><br />　　核心库的最基本的标记是c:out标记，它在页中显示一个EL表达式的值。一个使用c:out的表达式通常是这样： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>　　We have 
　　&lt;c:out value="${applicationScope.product.inventoryCount}"
　　escapeXml="true" default="0"  /&gt;
　　of those items in stock.</ccid_code></pre></td></tr></tbody></table><br /><br /><ccid_code>　　上例中，value属性是我们送到页输出的表达式。我也说明了选项escapeXml的属性和默认属性。escapeXml的属性指定了XML字符 (&lt;、&gt;、 &amp;、 和 .)是否应该转化为相应的字符实体代码（这样他们可以让这些字符出现在一个HTML页中）；默认属性用于EL不能估算出数值或者数值计算出来为空的情况。</ccid_code><br /><br />　　注意：当EL支持完全贯穿整个JSP2.0的时候，你不需要使用c:out动作；你可以仅嵌套JSP表达式直接在页中。 <br /><br />　　另一个普遍使用的核心动作是c:set，它在页中设定一个变量。你可以用两种方法使用c:set动作，第一种方法设定在var属性中定义的变量到在value属性中定义的值上，方法如下： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:set var="customerID" value="$param:customerNumber" scope="session" /&gt;</ccid_code></pre></td></tr></tbody></table><br /><br />　　上述的选择项scope属性指定了我们要在会话期范围内设定变量customerID；如果范围没有制定，范围默认为页。 <br /><br />　　c:set另一个强大的用途就是将c:set标记的体的内容赋给一个指定的变量： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:set var="cellContents"&gt;
&lt;td&gt;
&lt;c:out value="${myCell}"/&gt;
&lt;/td&gt;
&lt;/c:set&gt;</ccid_code></pre></td></tr></tbody></table><br /><br />　　在上例中，c:set动作定义了名为cellContents（在页的范围内）的变量，该变量拥有在标记的体中定义的内容。在这种情况下，体定义了一个HTML表格单元格元素，计算体中的c:out动作，并且该计算的结果包括在体中的字符串直接量值。 <br /><br />　　就像你预想的那样，JSTL进行异常处理有点早。在典型的JSP页中，你有两种异常处理的方法：试图/捕捉直接嵌入到页中的小脚本代码中的块；或者用一个JSP errorPage指令。JSP errorPage指令提供一个良好的捕捉所有异常的方法来处理页中任何可能的异常。JSTL用一个c:catch动作提供一个好的可选择的方式。这个 c:catch动作提供一个更细粒度的有效方法来处理异常。而且没有嵌入Java代码到页中。一个c:catch动作是这样的： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:catch&gt;
 &lt;!--. . . some set of nested JSTL tags below which
 would be hit on an exception--&gt;
&lt;/c:catch&gt;</ccid_code></pre></td></tr></tbody></table><br /><br />　　c:catch动作有一个可选的属性，即一个指向抛出异常的变量。 <br /><br />　　你可能不怎么愿意使用c:remove标记。这个标记有用于变量名和范围的属性，并且可从指定的范围内删除指定的变量。 <br /><br />　　<b>流程控制</b><br /><br />　　让我们转为讨论JSTL的流程控制和条件标记。如果你已经用任何一种语言使用了条件和流程控制语句，理论上这里没什么新鲜的东西。 <br /><br />　　c:if动作处理简单条件语句的测试。计算测试属性中的Boolean表达式的值，如果表达式为真的话，计算体的内容。在下面的动作中，我们也说明了备选项var属性。为了以后的使用，var属性保存测试结果在页（如果没有指定其他scope属性的话）中。 <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:if test="${status.totalVisits == 1000000}" var="visits"&gt;
   You are the millionth visitor to our site!  Congratulations!
&lt;/c:if&gt;</ccid_code></pre></td></tr></tbody></table><br /><br />　　下面我们展示了用c:choose、 c:when、 和 c:otherwise交换逻辑的JSTL的支持。一组c:when动作可能包括在一个备选的标记内，如果在c:when块中任何表达式计算值为真的话，就不用计算c:choose动作内的测试。如果c:when块中没有一个测试计算值为真的时候：如果出现c:otherwise动作内容时，则计算c: otherwise动作的内容： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:choose&gt;
&lt;c:when test="${item.type == 'book'}"&gt;
...
&lt;/c:when&gt;
&lt;c:when test="${item.type == 'electronics'}"&gt;
...
&lt;/c:when&gt;
&lt;c:when test="${item.type == 'toy'}"&gt;
...
&lt;/c:when&gt;
&lt;c:otherwise&gt;
...
&lt;/c:otherwise&gt;
&lt;/c:choose&gt;</ccid_code></pre></td></tr></tbody></table><br /><br />　　c:foreach动作提供一个容易的方法来迭代一个集合的元素。如果你想只迭代集合的一部分的话，你可以分别用begin、 end、 和 step属性指定起点、终点和一个递增值。在下面的例子中，我们在变量customerNames中迭代一个集合的内容；在每个循环中，下一个元素输入到变量名内并在c:foreach动作的体内计算： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;table&gt;
&lt;c:forEach var="name" items="${customerNames}"&gt;
&lt;tr&gt;&lt;td&gt;&lt;c:out value="${name}"/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/c:forEach&gt;
&lt;/table&gt;</ccid_code></pre></td></tr></tbody></table><br /><br />　　记得Java的StringTokenizer类吗？有了c:forTokens动作，你可以用JSTL获得类似的功能。这个程序片断可使用在 delims属性中定义的定界符通过items String属性中的条目迭代。注意，items 属性不必是一个字符直接量；它可以是任何有效的EL表达式: <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;table&gt;
&lt;c:forTokens items="47,52,53,55,46,22,16,2" delim="," var="dailyPrice"&gt;
&lt;tr&gt;&lt;td&gt;&lt;c:out value="${dailyPrice}"/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/c:forTokens&gt;
&lt;/table&gt;</ccid_code></pre></td></tr></tbody></table><br /><br />　　在接下来的完整的JSTL页中，我列出了已经传递到该页的所有参数。param 和paramValues对象是映射关键字到一个或多个值的Java Map集。在本例中，我们找出了用于集合的每个MapEntry的关键字即参数名，并且使用关键字来查找所有与关键字关联的参数值： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %&gt;
&lt;html&gt;
&lt;body&gt;
&lt;head&gt;
&lt;title&gt;Parameter Listing Example&lt;/title&gt;
&lt;/head&gt;

&lt;br&gt;

&lt;b&gt;Parameter values passed to this page for each parameter: &lt;/b&gt;
&lt;table border="2"&gt;
&lt;c:forEach var="current" items="${param}"&gt;
    &lt;tr&gt;
    &lt;td&gt;
    &lt;b&gt;&lt;c:out value="${current.key}" /&gt;&lt;/b&gt;
    &lt;/td&gt;
        &lt;c:forEach var="aVal" items="${paramValues[current.key]}"&gt;
            &lt;td&gt;
            &lt;c:out value="${aVal}" /&gt;
            &lt;/td&gt;
        &lt;/c:forEach&gt;
    &lt;/tr&gt;
&lt;/c:forEach&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</ccid_code></pre></td></tr></tbody></table></font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/leedo/aggbug/74620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leedo/" target="_blank">阳光</a> 2006-10-11 17:04 <a href="http://www.blogjava.net/leedo/articles/74620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSTL入门(2)：探讨 core――使用定制标记进行流控制和 URL 管理(转)</title><link>http://www.blogjava.net/leedo/articles/71264.html</link><dc:creator>阳光</dc:creator><author>阳光</author><pubDate>Fri, 22 Sep 2006 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/leedo/articles/71264.html</guid><wfw:comment>http://www.blogjava.net/leedo/comments/71264.html</wfw:comment><comments>http://www.blogjava.net/leedo/articles/71264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leedo/comments/commentRss/71264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leedo/services/trackbacks/71264.html</trackback:ping><description><![CDATA[
		<h3 id="articlename">JSTL入门(2)：探讨 core――使用定制标记进行流控制和 URL 管理</h3>
		<div id="atc_info">
		</div>
		<div class="content" id="Zoom">
				<a href="http://www.javaresource.org/jstl/jstl-73908.html">http://www.javaresource.org/jstl/jstl-73908.html</a>
				<br />
				<table height="130" cellpadding="5" width="130" align="left">
						<tbody>
								<tr>
										<td style="PADDING-BOTTOM: 10px; WIDTH: 130px; HEIGHT: 130px">
												<script type="text/javascript">
														<!--
google_ad_client = "pub-2638910793897145";
google_ad_width = 125;
google_ad_height = 125;
google_ad_format = "125x125_as_rimg";
google_cpa_choice = "CAAQlLeU_AEaCMOz4xdgS_KKKMj19IMB";
//-->
												</script>
												<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
												</script>
												<iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/cpa/ads?client=ca-pub-2638910793897145&amp;cpa_choice=CAAQlLeU_AEaCMOz4xdgS_KKKMj19IMB&amp;oe=utf-8&amp;dt=1158893173812&amp;lmt=1157821660&amp;format=125x125_as_rimg&amp;output=html&amp;url=http%3A%2F%2Fwww.javaresource.org%2Fjstl%2Fjstl-73908.html&amp;region=_google_cpa_region_&amp;ref=http%3A%2F%2Fwww.javaresource.org%2Fjstl%2Fjstl-73909.html&amp;cc=100&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_his=1&amp;u_java=true" frameborder="0" width="125" scrolling="no" height="125" allowtransparency="">
												</iframe>
										</td>
								</tr>
						</tbody>
				</table>
				<p>顾名思义，JSP 标准标记库（JSP Standard Tag Library，JSTL）core 库为一些基本功能（如，管理限定了作用域的变量和与 URL 交互等）和基本操作（如，迭代和条件化）提供了定制标记。这些标记不仅可以由页面设计人员直接利用，而且还为与其它 JSTL 库相结合从而提供更复杂的表示逻辑奠定了基础。Mark Kolb 在本文中继续对 JSTL 和 core 库进行探讨，研究用标记来协助流控制和 URL 管理。 <br />通过阅读本系列的第一篇文章，您对 JSTL 有了初步的了解。我们描述了使用其表达式语言（EL）来访问数据和操作数据。正如您所了解的那样，EL 用来为 JSTL 定制标记的属性赋予动态值，因此，它所起的作用与 JSP 表达式一样，为内置操作及其它定制标记库指定请求时的属性值。 <br /><br />为了演示 EL 的用法，我们介绍了 core 库中的三个标记：&lt;c:set&gt;;、&lt;c:remove&gt;; 和 &lt;c:out&gt;;。&lt;c:set&gt;; 和 &lt;c:remove&gt;; 用于管理限定了作用域的变量；而 &lt;c:out&gt;; 用于显示数据，尤其是显示用 EL 计算出的值。在此基础上，接下来本文把注意力集中在 core 库的其余标记上，这些标记可以大致归为两大类别：流控制和 URL 管理。 <br /><br />示例应用程序 <br />为了演示 JSTL 标记，我们将使用来自一个工作应用程序的示例，本系列中余下的文章都将使用此应用程序。由于基于 Java 的 Weblog 日渐流行及为人们所熟悉，因此我们将出于此目的使用一个简单的基于 Java 的 Weblog；参阅参考资料以下载该应用程序的 JSP 页面和源代码。Weblog（也称为 blog）是一种基于 Web 的简短注释的日志，这些注释是有关 Weblog 的作者所感兴趣的主题，通常带有与 Web 上其它地方的相关文章及讨论的链接。图 1 中显示了该应用程序正在运行时的抓屏。<br /></p>
				<table class="attachtable" cellspacing="4" cellpadding="1" align="center" border="3">
						<tbody>
								<tr>
										<td align="middle" colspan="2">
												<br />
												<a href="http://www.javaresource.org/h000/h13/img200607072246000.jpg" target="_blank">
														<img alt="" src="http://www.javaresource.org/h000/h13/img200607072246000.jpg" border="0" />
												</a>
												<br />
												<br />
										</td>
								</tr>
								<tr>
										<td>
												<table cellspacing="4" cellpadding="0" width="100%" align="center" border="0">
														<tbody>
																<tr>
																		<td class="attachrow">
																				<span class="genmed">图 1. Weblog 应用程序</span>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<br />
				<br />
				<hr />
				<p>
						<b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=43751" target="_blank">echoguo</a> 回复于：2003-08-13 19:19:36</b>
						<br />
						<br />虽然完整的实现需要二十四个 Java 类，但在表示层中却只涉及 Weblog 应用程序中的两个类，Entry 和 UserBean。这样，对于理解 JSTL 示例而言，只有这两个类比较重要。图 2 显示了 Entry 和 UserBean 的类图。<br /></p>
				<table class="attachtable" cellspacing="4" cellpadding="1" align="center" border="3">
						<tbody>
								<tr>
										<td align="middle" colspan="2">
												<br />
												<a href="http://www.javaresource.org/h000/h13/img200607072246260.jpg" target="_blank">
														<img alt="" src="http://www.javaresource.org/h000/h13/img200607072246260.jpg" border="0" />
												</a>
												<br />
												<br />
										</td>
								</tr>
								<tr>
										<td>
												<table cellspacing="4" cellpadding="0" width="100%" align="center" border="0">
														<tbody>
																<tr>
																		<td class="attachrow">
																				<span class="genmed">图 2. Weblog 应用程序的类图</span>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<br />
				<hr />
				<p>
						<b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=43751" target="_blank">echoguo</a> 回复于：2003-08-13 19:33:02</b>
						<br />
						<br />Entry 类表示 Weblog 中一个标有日期的项。其 id 属性用于在数据库中存储及检索该项，而 title 和 text 属性则表示该项的实际内容。created 和 lastModified 属性引用了 Java 语言中 Date 类的两个实例，分别用来表示最初创建该项的时间和最后编辑该项的时间。author 属性引用了标识该项的创建者的 UserBean 实例。 <br /><br />UserBean 类存储了有关应用程序的已认证用户的信息，如用户名、全名和电子邮件地址。该类还包含一个用于与相关数据库进行交互的 id 属性。其最后一个属性 roles 引用一列 String 值，这列值标识与相应用户相关的、特定于应用程序的角色。对于 Weblog 应用程序，相关的角色是“User”（所有应用程序用户常用的缺省角色）和“Author”（该角色指定可以创建和编辑 Weblog 项的用户）。 <br /><br />流控制 <br />由于可以用 EL 替代 JSP 表达式来指定动态属性值，因此页面创作人员无需使用脚本编制元素。因为脚本编制元素可能是引起 JSP 页面中维护问题的主要原因，所以 JSTL 的主要优点就在于提供了这样简单（且标准）的替代方法。 <br /><br />EL 从 JSP 容器检索数据，遍历对象层次结构，然后对结果执行简单的操作。不过，除了访问和操作数据之外，JSP 脚本编制元素的另一个常见用法是流控制。尤其是，页面创作人员常借助 scriptlet 来实现迭代或条件内容。然而，因为这样的操作超出了 EL 的能力，所以 core 库提供了几个定制操作来管理流控制，其形式有迭代、条件化和异常处理。 <br /><br />迭代 <br />在 Web 应用程序环境中，迭代主要用于访存和显示数据集，通常是以列表或表中的一系列行的形式显示。实现迭代内容的主要 JSTL 操作是 &lt;c:forEach&gt;; 定制标记。该标记支持两种不同样式的迭代：整数范围上的迭代（类似 Java 语言的 for 语句）和集合上的迭代（类似 Java 语言的 Iterator 和 Enumeration 类）。 <br /><br />进行整数范围迭代用到了清单 1 中所示的 &lt;c:forEach&gt;; 标记的语法。begin 和 end 属性要么是静态整数值，要么是可以得出整数值的表达式。它们分别指定迭代索引的初始值以及迭代索引的终止值。当使用 &lt;c:forEach&gt;; 在整数范围内进行迭代时，这两个属性是必需的，而其它所有属性都是可选的。 <br /><br />清单 1. 通过 &lt;c:forEach&gt;; 操作进行数字迭代的语法 <br />&lt;c:forEach var="name" varStatus="name" <br />    begin="expression" end="expression" step="expression"&gt;; <br />  body content <br />&lt;/c:forEach&gt;; <br /><br /><br />  <br /><br />当出现 step 时，它也必须是整数值。它指定每次迭代后索引的增量。这样，迭代索引从 begin 属性的值开始，以 step 属性的值为增量进行递增，在迭代索引超过 end 属性的值时停止迭代。注：如果省略了 step 属性，那么步长缺省为 1。 <br /><br />如果指定了 var 属性，那么将会创建一个带有指定名称的并限定了作用域的变量，并将每次迭代的当前索引值赋给该变量。这一限定了作用域的变量具有嵌套式可视性 ― 只可以在 &lt;c:forEach&gt;; 标记体内对其进行访问。（我们很快将讨论可选属性 varStatus 的用法。）清单 2 显示了对一组固定整数值进行迭代的 &lt;c:forEach&gt;; 操作示例。 <br /><br />清单 2. 使用 &lt;c:forEach&gt;; 标记来生成表列数据，这些数据对应于某一范围内的数值。 <br />&lt;table&gt;; <br />&lt;tr&gt;;&lt;th&gt;;Value&lt;/th&gt;; <br />    &lt;th&gt;;Square&lt;/th&gt;;&lt;/tr&gt;; <br />&lt;c:forEach var="x" begin="0" end="10" step="2"&gt;; <br />  &lt;tr&gt;;&lt;td&gt;;&lt;c:out value="${x}"/&gt;;&lt;/td&gt;; <br />      &lt;td&gt;;&lt;c:out value="${x * x}"/&gt;;&lt;/td&gt;;&lt;/tr&gt;; <br />&lt;/c:forEach&gt;; <br />&lt;/table&gt;; <br /><br /><br />  <br /><br />如图 3 中所示，上面的示例代码生成了一张表，显示前五个偶数及其平方。这是通过将 begin 和 step 属性值指定为 2，而将 end 属性值指定为 10 实现的。此外，用 var 属性创建用于存储索引值的限定了作用域的变量，&lt;c:forEach&gt;; 标记体内引用了该变量。尤其是，使用了一对 &lt;c:out&gt;; 操作来显示索引及其平方，其中索引的平方是使用一个简单的表达式计算得来的。<br /></p>
				<table class="attachtable" cellspacing="4" cellpadding="1" align="center" border="3">
						<tbody>
								<tr>
										<td align="middle" colspan="2">
												<br />
												<a href="http://www.javaresource.org/h000/h13/img200607072247140.jpg" target="_blank">
														<img alt="" src="http://www.javaresource.org/h000/h13/img200607072247140.jpg" border="0" />
												</a>
												<br />
												<br />
										</td>
								</tr>
								<tr>
										<td>
												<table cellspacing="4" cellpadding="0" width="100%" align="center" border="0">
														<tbody>
																<tr>
																		<td class="attachrow">
																				<span class="genmed">图 3. 清单 2 的输出</span>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<br />
				<hr />
				<p>
						<b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=43751" target="_blank">echoguo</a> 回复于：2003-08-13 22:53:10</b>
						<br />
						<br />在对集合的成员进行迭代时，用到了 &lt;c:forEach&gt;; 标记的另一个属性：items 属性，清单 3 中显示了该属性。当使用这种形式的 &lt;c:forEach&gt;; 标记时，items 属性是唯一必需的属性。items 属性的值应该是一个集合，对该集合的成员进行迭代，通常使用 EL 表达式指定值。如果变量名称是通过 &lt;c:forEach&gt;; 标记的 item 属性指定的，那么对于每次迭代该已命名变量都将被绑定到集合后续元素上。 <br /><br />清单 3. 通过 &lt;c:forEach&gt;; 操作对集合进行迭代的语法 <br />&lt;c:forEach var="name" items="expression" varStatus="name" <br />    begin="expression" end="expression" step="expression"&gt;; <br />  body content <br />&lt;/c:forEach&gt;; <br /><br /><br />  <br /><br />&lt;c:forEach&gt;; 标记支持 Java 平台所提供的所有标准集合类型。此外，您可以使用该操作来迭代数组（包括基本类型数组）中的元素。表 1 列出了 items 属性所支持的所有值。正如表的最后一行所指出的那样，JSTL 定义了它自己的接口 javax.servlet.jsp.<a href="http://www.javaresource.org/jstl/jstl-69.html">jstl</a>.sql.Result，用来迭代 SQL 查询的结果。（我们将在本系列后面的文章中详细讨论这一功能。） <br /><br />表 1. &lt;c:forEach&gt;; 标记的 items 属性所支持的集合 <br /><br />items 的值 所产生的 item 值  <br />java.util.Collection 调用 iterator() 所获得的元素  <br />java.util.Map java.util.Map.Entry 的实例  <br />java.util.Iterator 迭代器元素  <br />java.util.Enumeration 枚举元素  <br />Object 实例数组 数组元素  <br />基本类型值数组 经过包装的数组元素  <br />用逗号定界的 String 子字符串  <br />javax.servlet.jsp.<a href="http://www.javaresource.org/jstl/jstl-69.html">jstl</a>.sql.Result SQL 查询所获得的行  <br /><br /><br /><br />可以使用 begin、end 和 step 属性来限定在迭代中包含集合中哪些元素。和通过 &lt;c:forEach&gt;; 进行数字迭代的情形一样，在迭代集合中的元素时同样要维护一个迭代索引。&lt;c:forEach&gt;; 标记实际上只处理那些与索引值相对应的元素，这些索引值与指定的 begin、end 和 step 值相匹配。 <br /><br />清单 4 显示了用来迭代集合的 &lt;c:forEach&gt;; 标记。对于该 JSP 代码段，entryList 这一限定了作用域的变量被设置成了 Entry 对象列表（确切的说，ArrayList）。&lt;c:forEach&gt;; 标记依次处理列表中的每个元素，将其赋给一个限定了作用域的变量 blogEntry，然后生成两个表行 ― 一个用于 Weblog 项的 title，另一个则用于该项 text。这些特性是通过一对带有相应 EL 表达式的 &lt;c:out&gt;; 操作从 blogEntry 变量检索得到的。注：由于 Weblog 项的标题和文本都可能包含 HTML 标记，因此这两个 &lt;c:out&gt;; 标记的 escapeXml 属性都被设置成了 false。图 4 显示了结果。 <br /><br />清单 4. 使用 &lt;c:forEach&gt;; 标记显示表示给定日期的 Weblog 项 <br />&lt;table&gt;; <br />  &lt;c:forEach items="${entryList}" var="blogEntry"&gt;; <br />    &lt;tr&gt;;&lt;td align="left" class="blogTitle"&gt;; <br />      &lt;c:out value="${blogEntry.title}" escapeXml="false"/&gt;; <br />    &lt;/td&gt;;&lt;/tr&gt;; <br />    &lt;tr&gt;;&lt;td align="left" class="blogText"&gt;; <br />      &lt;c:out value="${blogEntry.text}" escapeXml="false"/&gt;; <br />    &lt;/td&gt;;&lt;/tr&gt;; <br />  &lt;/c:forEach&gt;; <br />&lt;/table&gt;;<br /></p>
				<table class="attachtable" cellspacing="4" cellpadding="1" align="center" border="3">
						<tbody>
								<tr>
										<td align="middle" colspan="2">
												<br />
												<a href="http://www.javaresource.org/h000/h13/img200607072247440.jpg" target="_blank">
														<img alt="" src="http://www.javaresource.org/h000/h13/img200607072247440.jpg" border="0" />
												</a>
												<br />
												<br />
										</td>
								</tr>
								<tr>
										<td>
												<table cellspacing="4" cellpadding="0" width="100%" align="center" border="0">
														<tbody>
																<tr>
																		<td class="attachrow">
																				<span class="genmed">图 4. 清单 4 的输出</span>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<br />
				<hr />
				<p>
						<b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=43751" target="_blank">echoguo</a> 回复于：2003-08-13 22:56:04</b>
						<br />
						<br />不论是对整数还是对集合进行迭代，&lt;c:forEach&gt;; 剩余的属性 varStatus 所起的作用相同。和 var 属性一样，varStatus 用于创建限定了作用域的变量。不过，由 varStatus 属性命名的变量并不存储当前索引值或当前元素，而是赋予 javax.servlet.jsp.<a href="http://www.javaresource.org/jstl/jstl-69.html">jstl</a>.core.LoopTagStatus 类的实例。该类定义了一组特性，它们描述了迭代的当前状态，表 2 中列出了这些特性。 <br /><br />表 2. LoopTagStatus 对象的特性 <br /><br />特性 Getter 描述  <br />current getCurrent() 当前这次迭代的（集合中的）项  <br />index getIndex() 当前这次迭代从 0 开始的迭代索引  <br />count getCount() 当前这次迭代从 1 开始的迭代计数  <br />first isFirst() 用来表明当前这轮迭代是否为第一次迭代的标志  <br />last isLast() 用来表明当前这轮迭代是否为最后一次迭代的标志  <br />begin getBegin() begin 属性值  <br />end getEnd() end 属性值  <br />step getStep() step 属性值  <br /><br /><br /><br />清单 5 显示了关于如何使用 varStatus 属性的一个示例。这个示例修改了清单 4 中的代码，将 Weblog 项的编号添加到显示 Weblog 标题（title）的表行。它是通过为 varStatus 属性指定一个值，然后访问所生成的限定了作用域的变量的 count 特性来实现这一点的。结果显示在图 5 中。 <br /><br />清单 5. 使用 varStatus 属性来显示 Weblog 项的数目 <br />&lt;table&gt;; <br />  &lt;c:forEach items= <br />    "${entryList}" var="blogEntry" varStatus="status"&gt;; <br />    &lt;tr&gt;;&lt;td align="left" class="blogTitle"&gt;; <br />      &lt;c:out value="${status.count}"/&gt;;. <br />      &lt;c:out value="${blogEntry.title}" escapeXml="false"/&gt;; <br />    &lt;/td&gt;;&lt;/tr&gt;; <br />    &lt;tr&gt;;&lt;td align="left" class="blogText"&gt;; <br />      &lt;c:out value="${blogEntry.text}" escapeXml="false"/&gt;; <br />    &lt;/td&gt;;&lt;/tr&gt;; <br />  &lt;/c:forEach&gt;; <br />&lt;/table&gt;;<br /></p>
				<table class="attachtable" cellspacing="4" cellpadding="1" align="center" border="3">
						<tbody>
								<tr>
										<td align="middle" colspan="2">
												<br />
												<a href="http://www.javaresource.org/h000/h13/img200607072248110.jpg" target="_blank">
														<img alt="" src="http://www.javaresource.org/h000/h13/img200607072248110.jpg" border="0" />
												</a>
												<br />
												<br />
										</td>
								</tr>
								<tr>
										<td>
												<table cellspacing="4" cellpadding="0" width="100%" align="center" border="0">
														<tbody>
																<tr>
																		<td class="attachrow">
																				<span class="genmed">图 5. 清单 5 的输出</span>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<br />
				<hr />
				<p>
						<b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=43751" target="_blank">echoguo</a> 回复于：2003-08-13 22:58:50</b>
						<br />
						<br />除 &lt;c:forEach&gt;; 以外，core 库还提供了另一个迭代标记：&lt;c:forTokens&gt;;。JSTL 的这个定制操作与 Java 语言的 StringTokenizer 类的作用相似。清单 6 中显示的 &lt;c:forTokens&gt;; 标记除了比 &lt;c:forEach&gt;; 的面向集合版本多一个属性之外，其它属性都相同。对于 &lt;c:forTokens&gt;; 而言，通过 items 属性指定要标记化的字符串，而通过 delims 属性提供用于生成标记的一组定界符。和 &lt;c:forEach&gt;; 的情形一样，可以使用 begin、end 和 step 属性将要处理的标记限定为那些与相应索引值相匹配的标记。 <br /><br />清单 6. 使用 &lt;c:forTokens&gt;; 操作来迭代字符串标记的语法 <br />&lt;c:forTokens var="name" items="expression" <br />    delims="expression" varStatus="name" <br />    begin="expression" end="expression" step="expression"&gt;; <br />  body content <br />&lt;/c:forTokens&gt;; <br /><br /><br />  <br /><br />条件化 <br />对于包含动态内容的 Web 页面，您可能希望不同类别的用户看到不同形式的内容。例如，在我们的 Weblog 中，访问者应该能够阅读各项，也许还应该能够提交反馈，但只有经过授权的用户才能公布新项，或编辑已有内容。 <br /><br />在同一个 JSP 页面内实现这样的功能，然后使用条件逻辑来根据每条请求控制所显示的内容，这样做常常能够改善实用性和软件维护。core 库提供了两个不同的条件化标记 ― &lt;c:if&gt;; 和 &lt;c:choose&gt;; ― 来实现这些功能。 <br /><br />&lt;c:if&gt;; 是这两个操作中较简单的一个，它简单地对单个测试表达式进行求值，接下来，仅当对表达式求出的值为 true 时，它才处理标记的主体内容。如果求出的值不为 true，就忽略该标记的主体内容。如清单 7 所示，&lt;c:if&gt;; 可以通过其 var 和 scope 属性（它们所起的作用和在 &lt;c:set&gt;; 中所起的作用一样）选择将测试结果赋给限定了作用域的变量。当测试代价非常高昂时，这种能力尤为有用：可以将结果高速缓存在限定了作用域的变量中，然后在随后对 &lt;c:if&gt;; 或其它 JSTL 标记的调用中检索该结果。 <br /><br />清单 7. &lt;c:if&gt;; 条件操作的语法 <br />&lt;c:if test="expression" var="name" scope="scope"&gt;; <br />  body content <br />&lt;/c:if&gt;; <br /><br /><br />  <br /><br />清单 8 显示了与 &lt;c:forEach&gt;; 标记的 LoopTagStatus 对象的 first 特性一起使用的 &lt;c:if&gt;;。如图 6 中所示，在这种情况下，只在 Weblog 项的第一项上显示这组项的创建日期，而不在任何其它项前面重复该日期。 <br /><br />清单 8. 使用 &lt;c:if&gt;; 来为 Weblog 项显示日期 <br />&lt;table&gt;; <br />  &lt;c:forEach items= <br />    "${entryList}" var="blogEntry" varStatus="status"&gt;; <br />    &lt;c:if test="${status.first}"&gt;; <br />      &lt;tr&gt;;&lt;td align="left" class="blogDate"&gt;; <br />            &lt;c:out value="${blogEntry.created}"/&gt;; <br />      &lt;/td&gt;;&lt;/tr&gt;; <br />    &lt;/c:if&gt;; <br />    &lt;tr&gt;;&lt;td align="left" class="blogTitle"&gt;; <br />      &lt;c:out value="${blogEntry.title}" escapeXml="false"/&gt;; <br />    &lt;/td&gt;;&lt;/tr&gt;; <br />    &lt;tr&gt;;&lt;td align="left" class="blogText"&gt;; <br />      &lt;c:out value="${blogEntry.text}" escapeXml="false"/&gt;; <br />    &lt;/td&gt;;&lt;/tr&gt;; <br />  &lt;/c:forEach&gt;; <br />&lt;/table&gt;;<br /></p>
				<table class="attachtable" cellspacing="4" cellpadding="1" align="center" border="3">
						<tbody>
								<tr>
										<td align="middle" colspan="2">
												<br />
												<a href="http://www.javaresource.org/h000/h13/img200607072248430.jpg" target="_blank">
														<img alt="" src="http://www.javaresource.org/h000/h13/img200607072248430.jpg" border="0" />
												</a>
												<br />
												<br />
										</td>
								</tr>
								<tr>
										<td>
												<table cellspacing="4" cellpadding="0" width="100%" align="center" border="0">
														<tbody>
																<tr>
																		<td class="attachrow">
																				<span class="genmed">图 6. 清单 8 的输出</span>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<br />
				<hr />
				<p>
						<b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=43751" target="_blank">echoguo</a> 回复于：2003-08-13 22:59:57</b>
						<br />
						<br />如清单 8 所示，&lt;c:if&gt;; 标记为条件化内容的一些简单情形提供了一种非常简洁的表示法。对于需要进行互斥测试来确定应该显示什么内容的情况下，JSTL core 库还提供了 &lt;c:choose&gt;; 操作。清单 9 中显示了 &lt;c:choose&gt;; 的语法。 <br /><br />清单 9. &lt;c:choose&gt;; 操作的语法 <br />&lt;c:choose&gt;; <br />  &lt;c:when test="expression"&gt;; <br />    body content <br />  &lt;/c:when&gt;; <br />  ... <br />  &lt;c:otherwise&gt;; <br />    body content <br />  &lt;/c:otherwise&gt;; <br />&lt;/c:choose&gt;; <br /><br /><br />  <br /><br />每个要测试的条件都由相应的 &lt;c:when&gt;; 标记来表示，至少要有一个 &lt;c:when&gt;; 标记。只会处理第一个其 test 值为 true 的 &lt;c:when&gt;; 标记体内的内容。如果没有一个 &lt;c:when&gt;; 测试返回 true，那么会处理 &lt;c:otherwise&gt;; 标记的主体内容。注：尽管如此，&lt;c:otherwise&gt;; 标记却是可选的；&lt;c:choose&gt;; 标记至多可有一个嵌套的 &lt;c:otherwise&gt;; 标记。如果所有 &lt;c:when&gt;; 测试都为 false，而且又没有给出 &lt;c:otherwise&gt;; 操作，那么不会处理任何 &lt;c:choose&gt;; 标记的主体内容。 <br /><br />清单 10 显示了运用 &lt;c:choose&gt;; 标记的示例。在这里，检索请求对象而获得协议信息（通过 EL 的 pageContext 隐式对象），并用简单的字符串比较对协议信息进行测试。根据这些测试的结果，会显示相应的文本消息。 <br /><br />清单 10. 使用 &lt;c:choose&gt;; 进行内容条件化 <br />&lt;c:choose&gt;; <br />  &lt;c:when test="${pageContext.request.scheme eq 'http'}"&gt;; <br />    This is an insecure Web session. <br />  &lt;/c:when&gt;; <br />  &lt;c:when test="${pageContext.request.scheme eq 'https'}"&gt;; <br />    This is a secure Web session. <br />  &lt;/c:when&gt;; <br />  &lt;c:otherwise&gt;; <br />    You are using an unrecognized Web protocol. How did this happen?! <br />  &lt;/c:otherwise&gt;; <br />&lt;/c:choose&gt;; <br /><br /><br />  <br /><br />异常处理 <br />最后一个流控制标记是 &lt;c:catch&gt;;，它允许在 JSP 页面内进行初级的异常处理。更确切地说，在该标记的主体内容中产生的任何异常都会被捕获并被忽略（即，不会调用标准的 JSP 错误处理机制）。然而，如果产生了一个异常并且已经指定了 &lt;c:catch&gt;; 标记的可选属性 var，那么会将异常赋给（具有页面作用域的）指定的变量，这使得能够在页面自身内部进行定制错误处理。清单 11 显示了 &lt;c:catch&gt;; 的语法（稍后在清单 18 中给出一个示例）。 <br /><br />清单 11. &lt;c:catch&gt;; 操作的语法 <br />&lt;c:catch var="name"&gt;; <br />  body content <br />&lt;/c:catch&gt;; <br /><br /><br />  <br /><br />URL 操作 <br />JSTL core 库中的其余标记主要是关于 URL。这些标记中的第一个被适当地命名为 &lt;c:url&gt;; 标记，用于生成 URL。尤其是，&lt;c:url&gt;; 提供了三个功能元素，它们在为 J2EE Web 应用程序构造 URL 时特别有用： <br /><br />在前面附加当前 servlet 上下文的名称  <br />为会话管理重写 URL  <br />请求参数名称和值的 URL 编码  <br />清单 12 显示了 &lt;c:url&gt;; 标记的语法。value 属性用来指定基本 URL，然后在必要时标记对其进行转换。如果这个基本 URL 以一个斜杠开始，那么会在它前面加上 servlet 的上下文名称。可以使用 context 属性提供显式的上下文名称。如果省略该属性，那么就使用当前 servlet 上下文的名称。这一点特别有用，因为 servlet 上下文名称是在部署期间而不是开发期间决定的。（如果这个基本 URL 不是以斜杠开始的，那么就认为它是一个相对 URL，这时就不必添加上下文名称。） <br /><br />清单 12. &lt;c:url&gt;; 操作的语法 <br />&lt;c:url value="expression" context="expression" <br />    var="name" scope="scope"&gt;; <br />  &lt;c:param name="expression" value="expression"/&gt;; <br />  ... <br />&lt;/c:url&gt;; <br /><br /><br />  <br /><br />URL 重写是由 &lt;c:url&gt;; 操作自动执行的。如果 JSP 容器检测到一个存储用户当前会话标识的 cookie，那么就不必进行重写。但是，如果不存在这样的 cookie，那么 &lt;c:url&gt;; 生成的所有 URL 都会被重写以编码会话标识。注：如果在随后的请求中存在适当的 cookie，那么 &lt;c:url&gt;; 将停止重写 URL 以包含该标识。 <br /><br />如果为 var 属性提供了一个值（还可以同时为 scope 属性提供一个相应的值，这是可选的），那么将生成的 URL 赋值给这个限定了作用域的指定变量。否则，将使用当前的 JspWriter 输出生成的 URL。这种直接输出其结果的能力允许 &lt;c:url&gt;; 标记作为值出现，例如，作为 HTML &lt;a&gt;; 标记的 href 属性的值，如清单 13 中所示。 <br /><br />清单 13. 生成 URL 作为 HTML 标记的属性值 <br />&lt;a href="&lt;c:url value='/content/sitemap.jsp'/&gt;;"&gt;;View sitemap&lt;/a&gt;; <br /><br /><br />  <br /><br />最后，如果通过嵌套 &lt;c:param&gt;; 标记指定了任何请求参数，那么将会使用 HTTP GET 请求的标准表示法将它们的名称和值添加到生成的 URL 后面。此外，还进行 URL 编码：为了生成有效的 URL，将对这些参数的名称或值中出现的任何字符适当地进行转换。清单 14 演示了 &lt;c:url&gt;; 的这种行为。 <br /><br />清单 14. 生成带请求参数的 URL  <br />&lt;c:url value="/content/search.jsp"&gt;; <br />  &lt;c:param name="keyword" value="${searchTerm}"/&gt;; <br />  &lt;c:param name="month" value="02/2003"/&gt;; <br />&lt;/c:url&gt;; <br /><br /><br />  <br /><br />清单 14 中的 JSP 代码被部署到一个名为 blog 的 servlet 上下文，限定了作用域的变量 searchTerm 的值被设置为 "core library"。如果检测到了会话 cookie，那么清单 14 生成的 URL 将类似于清单 15 中的 URL。注：在前面添加上下文名称，而在后面附加请求参数。此外，keyword 参数值中的空格和 month 参数值中的斜杠都被按照 HTTP GET 参数的需要进行了编码（确切地说，空格被转换成了 +，而斜杠被转换成了 %2F 序列）。 <br /><br />清单 15. 有会话 cookie 时生成的 URL <br />/blog/content/search.jsp?keyword=foo+bar&amp;month=02%2F2003 <br /><br /><br />  <br /><br />当没有会话 cookie 时，生成的结果如清单 16 中所示。同样，servlet 上下文被添加到了前面，而 URL 编码的请求参数被附加到了后面。不过，除此以外还重写了基本 URL 以包含指定的会话标识。当浏览器发送用这种方式重写的 URL 请求时，JSP 容器自动抽取会话标识，并将请求与相应的会话进行关联。这样，需要会话管理的 J2EE 应用程序就无需依赖由应用程序用户启用的 cookie 了。 <br /><br />清单 16. 没有会话 cookie 时生成的 URL <br />/blog/content/search.jsp;jsessionid=233379C7CD2D0ED2E9F3963906DB4290 <br />  ?keyword=foo+bar&amp;month=02%2F2003 <br /><br /><br />  <br /><br />导入内容 <br />JSP 有两种内置机制可以将来自不同 URL 的内容合并到一个 JSP 页面：include 伪指令和 &lt;jsp:include&gt;; 操作。不过，不管是哪种机制，要包含的内容都必须属于与页面本身相同的 Web 应用程序（或 servlet 上下文）。两个标记之间的主要区别在于：include 伪指令在页面编译期间合并被包含的内容，而 &lt;jsp:include&gt;; 操作却在请求处理 JSP 页面时进行。 <br /><br />从本质上讲，core 库的 &lt;c:import&gt;; 操作是更通用、功能更强大的 &lt;jsp:include&gt;; 版本（好像是 &lt;jsp:include&gt;;“服用了兴奋剂”的）。和 &lt;jsp:include&gt;; 一样，&lt;c:import&gt;; 也是一种请求时操作，它的基本任务就是将其它一些 Web 资源的内容插入 JSP 页面中。如清单 17 中所示，它的语法非常类似于 &lt;c:url&gt;; 的语法。 <br /><br />清单 17. &lt;c:import&gt;; 操作的语法 <br />&lt;c:import url="expression" context="expression" <br />    charEncoding="expression" var="name" scope="scope"&gt;; <br />  &lt;c:param name="expression" value="expression"/&gt;; <br />  ... <br />&lt;/c:import&gt;; <br /><br /><br />  <br /><br />通过 url 属性指定将要导入内容的 URL，这个属性是 &lt;c:import&gt;; 的唯一一个必选属性。这里允许使用相对 URL，并且根据当前页面的 URL 来解析这个相对 URL。但是，如果 url 属性的值以斜杠开始，那么它就被解释成本地 JSP 容器内的绝对 URL。如果没有为 context 属性指定值，那么就认为这样的绝对 URL 引用当前 servlet 上下文内的资源。如果通过 context 属性显式地指定了上下文，那么就根据指定的 servlet 上下文解析绝对（本地）URL。 <br /><br />但 &lt;c:import&gt;; 操作并不仅仅限于访问本地内容。也可以将包含协议和主机名的完整 URI 指定为 url 属性的值。实际上，协议甚至不仅局限于 HTTP。&lt;c:import&gt;; 的 url 属性值可以使用 java.net.URL 类所支持的任何协议。清单 18 中显示了这种能力。 <br /><br />其中，&lt;c:import&gt;; 操作用来包含通过 FTP 协议访问的文档内容。此外，还使用了 &lt;c:catch&gt;; 操作，以便在本地处理 FTP 文件传送期间可能发生的任何错误。错误处理是这样实现的：使用 &lt;c:catch&gt;; 的 var 属性为异常指定一个限定了作用域的变量，然后使用 &lt;c:if&gt;; 检查其值。如果产生了异常，那么就会对那个限定了作用域的变量进行赋值：如清单 18 中的 EL 表达式所显示的那样，该变量的值将不会为空。由于 FTP 文档的检索将会失败，因此会显示有关这种情况的错误消息。 <br /><br />清单 18. 将 &lt;c:import&gt;; 与 &lt;c:catch&gt;; 相结合的示例 <br />&lt;c:catch var="exception"&gt;; <br />  &lt;c:import url="ftp://ftp.example.com/package/README"/&gt;; <br />&lt;/c:catch&gt;; <br />&lt;c:if test="${not empty exception}"&gt;; <br />  Sorry, the remote content is not currently available. <br />&lt;/c:if&gt;; <br /><br /><br />  <br /><br />&lt;c:import&gt;; 操作的最后两个（可选的）属性是 var 和 scope。var 属性会导致从指定 URL 获取的内容（作为 String 值）被存储在一个限定了作用域的变量中，而不是包含在当前 JSP 页面中。scope 属性控制该变量的作用域，缺省情况下是页面作用域。如同我们在今后的文章中将要看到的那样，JSTL <a href="http://www.javaresource.org/xml/xml-55.html">xml</a> 库中的标记利用了 &lt;c:import&gt;; 这种能力，即将整个文档存储在一个限定了作用域的变量中。 <br /><br />还要注意的是，可以使用（可选的）嵌套的 &lt;c:param&gt;; 标记来为正在导入的 URL 指定请求参数。与在 &lt;c:url&gt;; 中嵌套 &lt;c:param&gt;; 标记一样，必要时也要对参数名称和参数值进行 URL 编码。 <br /><br />请求重定向 <br />最后一个 core 库标记是 &lt;c:redirect&gt;;。该操作用于向用户的浏览器发送 HTTP 重定向响应，它是 JSTL 中与 javax.servlet.http.HttpServletResponse 的 sendRedirect() 方法功能相当的标记。清单 19 中显示了该标记的 url 和 context 属性，它们的行为分别等同于 &lt;c:import&gt;; 的 url 和 context 属性的行为，是嵌套任何 &lt;c:param&gt;; 标记的结果。 <br /><br />清单 19. &lt;c:redirect&gt;; 操作的语法 <br />&lt;c:redirect url="expression" context="expression"&gt;; <br />  &lt;c:param name="expression" value="expression"/&gt;; <br />  ... <br />&lt;/c:redirect&gt;; <br /><br /><br />  <br /><br />清单 20 显示了 &lt;c:redirect&gt;; 操作，它用一个到指定错误页面的重定向代替了清单 18 中的错误消息。在该示例中，&lt;c:redirect&gt;; 标记的用法与标准 &lt;jsp:forward&gt;; 操作的用法类似。不过请回忆一下：通过请求分派器进行转发是在服务器端实现的，而重定向却是由浏览器来执行的。从开发人员的角度来讲，转发比重定向更有效率，但 &lt;c:redirect&gt;; 操作却更灵活一些，因为 &lt;jsp:forward&gt;; 只能分派到当前 servlet 上下文内的其它 JSP 页面。 <br /><br />清单 20. 响应异常的重定向 <br />&lt;c:catch var="exception"&gt;; <br />  &lt;c:import url="ftp://ftp.example.com/package/README"/&gt;; <br />&lt;/c:catch&gt;; <br />&lt;c:if test="${not empty exception}"&gt;; <br />  &lt;c:redirect url="/errors/remote.jsp"/&gt;; <br />&lt;/c:if&gt;; <br /><br /><br />  <br /><br />从用户的角度来看，主要区别在于重定向会更新浏览器所显示的 URL，并因此影响书签的设置。转发却不这样，它对最终用户是透明的。这样，选择 &lt;c:redirect&gt;; 还是 &lt;jsp:forward&gt;; 还取决于所期望的用户体验。 <br /><br />结束语 <br />JSTL core 库含有多种通用的定制标记，广大的 JSP 开发人员都会使用这些标记。例如，URL 和异常处理标记很好地补充了现有的 JSP 功能，如 &lt;jsp:include&gt;; 和 &lt;jsp:forward&gt;; 操作、include 伪指令以及 page 伪指令的 errorpage 属性。迭代和条件操作使得无需脚本编制元素就能够实现复杂的表示逻辑，尤其在将变量标记（&lt;c:set&gt;; 和 &lt;c:remove&gt;;）与 EL 相结合使用时更是如此。<br /></p>
		</div>
<img src ="http://www.blogjava.net/leedo/aggbug/71264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leedo/" target="_blank">阳光</a> 2006-09-22 10:51 <a href="http://www.blogjava.net/leedo/articles/71264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 EL、JSTL 处理表单数据(转载)</title><link>http://www.blogjava.net/leedo/articles/70471.html</link><dc:creator>阳光</dc:creator><author>阳光</author><pubDate>Tue, 19 Sep 2006 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/leedo/articles/70471.html</guid><wfw:comment>http://www.blogjava.net/leedo/comments/70471.html</wfw:comment><comments>http://www.blogjava.net/leedo/articles/70471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leedo/comments/commentRss/70471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leedo/services/trackbacks/70471.html</trackback:ping><description><![CDATA[
		<h2 class="diaryTitle">使用 EL、JSTL 处理表单数据(转载)                                       </h2>
		<p>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1">
				<span lang="ZH-CN" style="COLOR: red; FONT-FAMILY: SimSun">常见输入类型</span>
				<span lang="EN-US" style="COLOR: red; FONT-FAMILY: Verdana">
						<span style="mso-spacerun: yes">  </span>
				</span>
				<span lang="EN-US" style="COLOR: fuchsia; FONT-FAMILY: Verdana">&lt;input type="text"&gt;</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; mso-outline-level: 2">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">Text</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">（文本框）</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">name</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：字段名称</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">maxlength</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：最多输入字符</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">size</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：文本框宽度</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">value</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：默认值</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; FONT-FAMILY: SimSun; mso-outline-level: 2">
				<span lang="EN-US">Password</span>
				<span lang="ZH-CN">（密码框）</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">name</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：字段名称</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">maxlength</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：最多输入字符</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">size</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：文本框宽度</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">value</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：默认值</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; FONT-FAMILY: SimSun; mso-outline-level: 2">
				<span lang="EN-US">Radio</span>
				<span lang="ZH-CN">（单选按钮）</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">checked</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：默认选取</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">name</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：按钮名称</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">value</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：按钮值</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; FONT-FAMILY: SimSun; mso-outline-level: 2">
				<span lang="EN-US">Check</span>
				<span lang="ZH-CN">（复选框）</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">checked</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：默认选取</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">name</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：按钮名称</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">value</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：按钮值</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; FONT-FAMILY: SimSun; mso-outline-level: 2">
				<span lang="EN-US">Select</span>
				<span lang="ZH-CN">（下拉框）</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">multiple</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：多重选择</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">size</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：字段大小</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">name</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：名称</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">option</span>
				<span lang="EN-US" style="FONT-FAMILY: SimSun"> value</span>
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">：值</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"> </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: green; FONT-FAMILY: SimSun; mso-outline-level: 2">综合示例：</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: SimSun; mso-outline-level: 3"> </p>
		<p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span style="FONT-FAMILY: Verdana">Form</span>
				<span style="FONT-FAMILY: SimSun">.html</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;html&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;head&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;title&gt;CH9 - Form.html&lt;/title&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;meta http-equiv="Content-Type" content="text/html; charset=GB2312"&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/head&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;body&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;form name="Example" method="post" action="Form.jsp"&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;p&gt; <span style="COLOR: red">姓名：&lt;input type="text" name="Name" size="15" maxlength="15"&gt;</span>&lt;/p&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;p&gt;密码：&lt;input type="password" name="Password" size="15" maxlength="15"&gt;&lt;/p&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;p&gt;<span style="COLOR: red">性别：&lt;input type="radio" name="Sex" value="Male" checked&gt;男 </span></p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">
				<span style="COLOR: red">&lt;input type="radio" name="Sex" value="Female"&gt;女</span>&lt;/p&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;p&gt;<span style="COLOR: red">年龄： </span></p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;select name="Old"&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;option value="10"&gt;10 ~ 20&lt;/option&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;option value="20" selected&gt;21 ~ 30&lt;/option&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;option value="30"&gt;31 ~ 40&lt;/option&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;option value="40"&gt;41 ~ 65&lt;/option&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;/select&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/p&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;p&gt; <span style="COLOR: red">兴趣： </span></p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;input type="checkbox" name="Habit" value="Read"&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">看书 </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;input type="checkbox" name="Habit" value="Game"&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">电玩 </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;input type="checkbox" name="Habit" value="Travel"&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">旅游 </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;input type="checkbox" name="Habit" value="Music"&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">听音乐 </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;input type="checkbox" name="Habit" value="Tv"&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5">
				<span style="COLOR: red">看电视</span>&lt;/p&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;p&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: fuchsia; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;input type="submit" value="传送"&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: fuchsia; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;input type="reset" value="清除"&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/p&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/form&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/body&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/html&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p>
		<p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3">
				<span style="FONT-FAMILY: Verdana">Form</span>
				<span style="FONT-FAMILY: SimSun">.jsp</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;%@ page contentType="text/html;charset=GB2312" %&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;html&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;head&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;title&gt;CH9 - Form.jsp&lt;/title&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/head&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;body&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;h2&gt;使用 EL、JSTL 处理表单数据&lt;/h2&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;fmt:requestEncoding value="GB2312" /&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 4">姓名：&lt;c:out value="${param.Name}" default="Nothing" /&gt; &lt;br&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 4">密码：&lt;c:out value=" ${param.Password} " default="Nothing" /&gt;&lt;br&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 4">性别：&lt;c:if test="${param.Sex == 'Male'}"&gt;男&lt;br&gt;&lt;/c:if&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;c:if test="${param.Sex == 'Female'}"&gt;女&lt;br&gt;&lt;/c:if&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 4">年龄：&lt;c:choose&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;c:when test="${param.Old == 10}"&gt;10 ~ 20&lt;br&gt;&lt;/c:when&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;c:when test="${param.Old == 20}"&gt;21 ~ 30&lt;br&gt;&lt;/c:when&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;c:when test="${param.Old == 30}"&gt;31 ~ 40&lt;br&gt;&lt;/c:when&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;c:otherwise&gt;41 ~ 65&lt;br&gt;&lt;/c:otherwise&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 4">兴趣：&lt;c:forEach items="${paramValues.Habit}" var="habit"&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;c:choose&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;c:when test="${habit == 'Read'}"&gt;&lt;li&gt;看书&lt;/li&gt;&lt;/c:when&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;c:when test="${habit == 'Game'}"&gt;&lt;li&gt;电玩&lt;/li&gt;&lt;/c:when&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;c:when test="${habit == 'Travel'}"&gt;&lt;li&gt;旅游&lt;/li&gt;&lt;/c:when&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;c:when test="${habit == 'Music'}"&gt;&lt;li&gt;听音乐&lt;/li&gt;&lt;/c:when&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;c:when test="${habit == 'Tv'}"&gt;&lt;li&gt;看电视&lt;/li&gt;&lt;/c:when&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;/c:choose&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;/c:forEach&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/body&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/html&gt;</p>
<img src ="http://www.blogjava.net/leedo/aggbug/70471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leedo/" target="_blank">阳光</a> 2006-09-19 11:39 <a href="http://www.blogjava.net/leedo/articles/70471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于标签在URI后面传参数的问题 </title><link>http://www.blogjava.net/leedo/articles/70450.html</link><dc:creator>阳光</dc:creator><author>阳光</author><pubDate>Tue, 19 Sep 2006 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/leedo/articles/70450.html</guid><wfw:comment>http://www.blogjava.net/leedo/comments/70450.html</wfw:comment><comments>http://www.blogjava.net/leedo/articles/70450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leedo/comments/commentRss/70450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leedo/services/trackbacks/70450.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed" cellspacing="0" cellpadding="0" width="533" border="0">
				<tbody>
						<tr>
								<td class="titleb" valign="top" background="/skin/20/xmsqie_03.png" height="35">关于&lt;html:link&gt;标签在URI后面传参数的问题</td>
						</tr>
						<tr>
								<td class="loglist" valign="top" align="left" background="/skin/20/xmsqie_07.png">在struts标签&lt;html:link&gt;的page属性指定的URI后面传递参数可以有几种方式： 
<p>1.若明确参数名和参数值则直接在URI后输出，<br />如：&lt;html:link page="/test.do?action=add"&gt;add&lt;/html:link&gt;</p><p>2.对于参数值不确定的，paramName和paramProperty来输出，用paramId属性指定参数名。<br />对于paramName指定的对象应该存在于page、request、session、application其中之一。一般来说，是从Action类传过来的，作为request的属性之一（requst.setAttribute("name",object)）。<br />如果paramName指定的对象是action的ActionForm，则无需使用request.setAttribute方法。<br />例：&lt;html:link page="/test.do" paramId="userid" paramName="uid"&gt;uname&lt;/html:link&gt;<br />若参数值是一个bean对象的属性值（比如ActionForm,或者集合中存放的对象）则：<br />&lt;html:link page="/test.do" paramId="userid" paramName="user" paramProperty="uid"&gt;uname&lt;/html:link&gt;</p><p>3.若两个参数，一个确定一个不确定，则是以上两种方法的结合，即：<br />&lt;html:link page="/test.do?action=modify" paramId="userid" paramName="uid"&gt;modify&lt;/html:link&gt;</p><p>4.对于多个参数的问题，可以使用一个HashMap集合对象来存放所有的参数名及对应的参数值的方式，paramName属性值指定为该HashMap集合对象即可。<br />举例：<br />&lt;%<br />//代码理想的位置应该是在action中<br />//可以在jsp页面测试<br />  java.util.HashMap pms = new java.util.HashMap();<br />  pms.put("code", "001002");<br />  pms.put("name", "tester");<br />  pms.put("alias", new String[]{"matin","jack"});<br />  request.setAttribute("params", pms);<br />%&gt;<br />&lt;html:link action="/test.do" name="params" &gt;test&lt;/html:link&gt;<br />编译后的结果：&lt;a href="/test.do?code=001002&amp;name=tester&amp;alias=matin&amp;alias=jack"&gt;test&lt;/a&gt;<br />这种方式虽然可以解决传多参数的问题，但是实现起来也比较麻烦，特别是对记录集中的数据逐条列出的时候</p><p>5.针对有的网友在&lt;html:link&gt;标签中嵌入使用jsp脚本(scriptlet)的问题，<br />例如:<br />&lt;html:link page="/test.do?code=&lt;%=varible%&gt;"&gt;add&lt;/html:link&gt;，这种写法是错误的，是无法编译的。<br />有的网友认为在struts标签内是不允许使用jsp脚本的，这种说法也不准确。如果前面的写法改成:<br />&lt;html:link page="&lt;%="/test.do?code="+varible%&gt;"&gt;add&lt;/html:link&gt;，就可以被执行，但是要注意URL相对路径的问题。</p><p>虽然在struts标签中嵌入jsp脚本不是真正意义上的struts应用，但是有时在委曲求全的情况下也只能如此了，除非使用自定义标签。比如在form表单中可能需要根据具体数据让某个字段是只读的，就可以用嵌入jsp脚本来实现：<br />&lt;%<br />boolean rdonly=false;<br />if(2==2) rdonly=true;<br />%&gt;<br />&lt;html:text property="userid" readonly="&lt;%=rdonly%&gt;" /&gt; <br /></p><p>6.另外一种比较变态的方法，既不是真正意义上的struts，也不符合xml规范。那就是在&lt;a&gt;标签中用&lt;bean:write&gt;标签输出参数值。<br />如：&lt;a href="test.do?uid=&lt;bean:write name="user" property="userid"/&gt;&amp;name=&lt;bean:write name="user" property="username"/&gt;"&gt;test&lt;/a&gt;<br /></p></td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/leedo/aggbug/70450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leedo/" target="_blank">阳光</a> 2006-09-19 10:37 <a href="http://www.blogjava.net/leedo/articles/70450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSTL 入门: 表达式语言</title><link>http://www.blogjava.net/leedo/articles/65309.html</link><dc:creator>阳光</dc:creator><author>阳光</author><pubDate>Wed, 23 Aug 2006 08:48:00 GMT</pubDate><guid>http://www.blogjava.net/leedo/articles/65309.html</guid><wfw:comment>http://www.blogjava.net/leedo/comments/65309.html</wfw:comment><comments>http://www.blogjava.net/leedo/articles/65309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leedo/comments/commentRss/65309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leedo/services/trackbacks/65309.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JSTL 入门: 表达式语言																						通过避免使用脚本编制元素来简化对 JSP 应用程序的软件维护																																																																																																				...&nbsp;&nbsp;<a href='http://www.blogjava.net/leedo/articles/65309.html'>阅读全文</a><img src ="http://www.blogjava.net/leedo/aggbug/65309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leedo/" target="_blank">阳光</a> 2006-08-23 16:48 <a href="http://www.blogjava.net/leedo/articles/65309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 使用JSTL改进JSP来简化网页的实现过程概述(转载)</title><link>http://www.blogjava.net/leedo/articles/65022.html</link><dc:creator>阳光</dc:creator><author>阳光</author><pubDate>Tue, 22 Aug 2006 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/leedo/articles/65022.html</guid><wfw:comment>http://www.blogjava.net/leedo/comments/65022.html</wfw:comment><comments>http://www.blogjava.net/leedo/articles/65022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leedo/comments/commentRss/65022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leedo/services/trackbacks/65022.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a id="_1f0575fc91e2_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl00_TitleUrl" href="../../sharkafeng/archive/2006/08/07/62176.html">使用JSTL改进JSP来简化网页的实现过程概述 </a>
		</div>
		<div class="postText">
				<strong>
						<font color="#330099">概述</font>
				</strong>
				<br />　
　Java Server Pages (JSP) 标准标记库
(JSTL)的版本的发布对于JSP/servlet开发者来说是一个重大的进展。有了一个表达语言（EL）和一组四种强大的、易于学习的标准标记库，
JSTL极有可能不久后成为实现动态的、基于Java的站点的主要方法。 <br />　　1996年对JSP
servlet的介绍使得Java成为动态网页开发的合理的选择。随后出现的Java服务器页(JSP)是走向快速的、可维护的Java网页实现过程的合
理进化的一步，紧接着就出现了JSP标记的支持。但是2002中期的JSTL(JSP标准标记库)的发布才是进一步加速和简化开发过程最大的一步。 <br />　　在本文中，我解释了JSTL的功能，也涵盖了你启动JSTL所需的每件事情。假设你有了对Java、JSP、XML和安装一个Web容器的基本理解。如果你对这些主题感到陌生，你可以在Resources（<a href="http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resourcesresources" target="_blank"><font color="#0000ff">http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resourcesresources</font></a>）上浏览一下背景参考。在下面的阐述中，假定你有XML和SQL的知识。 <br /><b><font color="#330099">　　安装JSTL支持</font></b><br />　　对于我们的JSTL安装例子来说，我们使用Tomcat 4.1（尽管任意支持Servlet 2.3和JSP1.2说明的servlet容器都应该能工作）。首先，下载Tomcat 4.1并且按指示进行安装（注意：JSTL需要一个JSP1.2 Web容器）。 <br /><br />　　用tomcat4 start程序启动Tomcat，并且运行index.html页来确保Tomcat是激活的、且运行良好。 <br /><br />　　接下来，安装JSTL支持，你可以从Jakarta站点下载JSTL支持，（<a href="http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resourcesresources" target="_blank"><font color="#0000ff">http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resourcesresources</font></a>）并按照下面步骤： <br /><br />　　1.从Jakarta站点下载JSTL检索、解压/脱档该文件。（<a href="http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resources" target="_blank"><font color="#0000ff">http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resources</font></a>） <br /><br />　　2.复制你已经解压为common/lib的jar文件到你的Tomcat安装路径中（尽管我们的项目不需要所有的jar文件）；这使得JSTL文件适用于你的任意Web应用。 <br /><br />　　3.对于任意你想使用JSTL的Web应用来说，复制.tld文件到你的Web应用的WEB-INF目录下。 <br /><br />　　4.对于你的JSTL的Web应用，编辑web.xml并添加下列输入： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;taglib&gt;<br />  &lt;taglib-uri&gt;http://java.sun.com/jstl/fmt&lt;/taglib-uri&gt;<br />  &lt;taglib-location&gt;/WEB-INF/fmt.tld&lt;/taglib-location&gt;<br />  &lt;/taglib&gt;<br />  &lt;taglib&gt;<br />   &lt;taglib-uri&gt;http://java.sun.com/jstl/core&lt;/taglib-uri&gt;<br />   &lt;taglib-location&gt;/WEB-INF/c.tld&lt;/taglib-location&gt;<br />  &lt;/taglib&gt;<br />  &lt;taglib&gt;<br />   &lt;taglib-uri&gt;http://java.sun.com/jstl/sql&lt;/taglib-uri&gt;<br />   &lt;taglib-location&gt;/WEB-INF/sql.tld&lt;/taglib-location&gt;<br />  &lt;/taglib&gt;<br />  &lt;taglib&gt;<br />   &lt;taglib-uri&gt;http://java.sun.com/jstl/x&lt;/taglib-uri&gt;<br />   &lt;taglib-location&gt;/WEB-INF/x.tld&lt;/taglib-location&gt;<br />  &lt;/taglib&gt;</pre></td></tr></tbody></table><br />　　这些输入让你的Web应用可使用JSTL标记库的表达语言（EL）版本。这些输入的位置有关系！如果你不肯定将他们输入到何处，关于web.xml选项和顺序的权威性指导在文档类型定义（DTD）中定义过：<a href="http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"><font color="#0000ff">http://java.sun.com/j2ee/dtds/web-app_2_2.dtd</font></a>。 <br /><br />　　5.当你创建了一个使用JSTL的JSP页时，将他输入到你的Web应用的主目录下，就像其它JSP和HTML页一样。你可以为该页任意取名，但是它必须有一个.jsp的扩展名。 <br /><br /><b><font color="#330099">　　基础原理</font></b><br />　　首先，所有的JSTL也是JSP页，JSTL只是JSP功能的一个超集。 <br /><br />　　同样，所有的JSTL标记是有效的XML。这意味着：如果你将JSTL标记之外的内容当作临时文本（通常是HTML）时，剩下的JSTL标记必须当作合法的XML来解释。这里有一些隐含的规则，它要求大部分XML语法都是正确的。 <br /><br />　　JSTL提供一组四个标准标记库（core核心、internationalization/format国际标准化/格式、XML和SQL）并支持EL。JSTL和EL的基本设计目的是简化网页开发和实现。 <br /><br />　　在本文中，我们遵循JSTL说明书的命名规则，并且把JSTL标记当作动作。一个JSTL标记对应于某个动作；调用动作明确的提醒我们：他们添加动态行为到一个另外的静态页上。 <br /><br />　　JSTL标记库有两个版本：一个用你以前使用的方法将JSP表达式插入，如&lt;%= . . . %&gt;，另一个使用一个JSTL EL.我会在后面进一步讨论在JSTL中的EL支持。 <br /><br /><b><font color="#330099">　　EL支持</font></b><br />　
　要理解当前JSTL对EL支持的状态，让我们检查相关的说明书是怎样处理的。Java说明书请求（JSR）专家组成员决定：由于某种原因，EL规范说明
应该是JSP说明书的一部份，而不是JSTL说明书的一部分。EL完整的说明书成为JSP2.0的一部分。因为JSTL1.0在JSP1.3之前已经完
成，JSTL作者不得不对用于JSTL1.0的EL支持实现做一个合理的猜测（结果可能是相当好的）。一个JSTL维护版本将与JSP1.3说明书保持一
致，并为了使EL适合JSP1.3说明书，JSTL维护版本做了一些修正。 <br /><br />　　本文描述的EL概要可能在即将发布的JSTL版本中有一点改动，但是任何改动都是微小的。 <br /><br />　　EL用于简单的语法定义了一套功能强大的语言，它很容易学习。它融合着JavaScript语言和Perl语言较好的部分的一些风格。EL表达式，集成了来自四种标准标记库的JSTL标记，提供了一个巨大的、灵活的属性集。 <br /><br />　
　所有的EL表达式都被${}括起来。JSTL中的表达式总是JSTL标记中的属性值的一部分。表达式可以是属性的一部分或者合并和嵌入到一个字符串直接
量中。JSTL属性也可以包含简单的字符串直接量。在接下来的JSTL中，我们在一个来自核心库的c:out动作中说明每种情况，这个核心库将它的
value属性值送到JSP输出上： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;c:out value="${anExpression}"/&gt;<br />&lt;c:out value="literalText${anExpression}${anotherExpression}"/&gt;<br />&lt;c:out value="literalText"/&gt;</pre></td></tr></tbody></table><br />　
　EL也定义了一套规则用于强制表达式中的值转换为上下文相对应的类型。我们在这里不详细讨论这些规则；然而，它的方法与用Perl语言定义的方式非常相
似（就像Perl语言中的做法一样，该方法理所当然的运行良好，但是，偶尔，也会出现可能不是你十分想要的那种结果，但你可以接受）。 <br /><br />　　EL为访问对象属性、集合元素、一组隐藏对象以及使用相关的、逻辑的和算术的操作符提供了支持。对于索引的属性来说，包括数组和java.util.List类在内，元素可用下列语法访问： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>${alist[4]}<br />${aList[someVariable]}</pre></td></tr></tbody></table><br />　
　JavaBean属性和java.util.Map元素（它代表一系列名字/值对）都可以使用下列方法的一个访问得到。在以下的开头两个表达式里，我们
可以访问到一个用JavaBean语言命名为aProperty的属性或者用关键字aProperty访问到一个Map实体。在第三个表达式中（注意：我
已经省略了引号），我们用保存在变量aVariableContainingPropertyName中的一个名字访问了在anObject之内的一个元
素: <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>${anObject.aProperty}<br />${anObject["aPropertyName"]}<br />${anObject[aVariableContainingPropertyName]}</pre></td></tr></tbody></table><p>　　在EL中定义了许多隐藏变量： <br />　　● pageContext：用于该网页的pageContext对象 <br />　　● pageScope, requestScope, sessionScope, 和 applicationScope：这些是映射这些范围的每一个变量到值上的Map集。 <br />　　● param 和 paramValues：用页访问传递的参数，与在JSP中一样 <br />　　● header 和 headerValues：用页请求传递的头，与在JSP中一样 <br />　　● cookie：Map映射cookie程序到特定的cookie对象上 <br /><br />　
　EL定义了全套与你在Java中非常熟悉的那些完全对应的操作符。算法操作符包括+、 -、 *、 / (或 div)、 和% (或
mod)。相关的操作符包括==、！=、&lt;、&gt;、&lt;=、&gt;=，它分别对应于eq、ne、lt、gt、le、和ge。我不想详细阐
述这些操作符，因为他们都能自我说明。 </p><p><strong><font color="#330099">　　JSTL标记库</font></strong><br />　　至此，我已经解释了一些基本原理并且涵盖了EL语法。我要专门讨论四种JSTL标记库。我主要讨论核心库，因为它是你一定要使用的；但是，我也会详细的讨论其余几个，以便你能启动它。 <br /><br />　　首先，尽管我应该更多地谈论JSTL标记库的两种风格，我上面提到的每个JSTL标记库以两个版本出现：一个支持使用EL的表达式；另一个支持标准JSP表达式。当你引入任何标记库到一个JSP页时，你要定义一个前缀，该前缀指定了与库中标记相对应的命名空间。 <br /><br />　　四种标准标记库，和他们的JSTL规范定义的前缀常规，列表如下。记住：你可以定义自己的前缀，但是这绝对没有什么好处。</p><center>四种标准标记库<br /><img src="http://www.javafan.net/uploadfiles/20051229115558915.jpg" twffan="done" /></center><p>　　为了使用页中的核心标记库（ 实际上，你使你的页对标记库的命名空间可见），在你的页首包含下列例子中的指令： 
</p><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;%@ taglib prefix="c" uri=http://java.sun.com/jstl/core %&gt;</pre></td></tr></tbody></table><br />　　为了使用该标记库的标记，用你在你的包含语句中设计好的前缀，在你的页中给每个标记加上前缀： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;c:out value="${anExpression}"/&gt;</pre></td></tr></tbody></table><br /><b><font color="#330099">　　</font></b><b><font color="#330099">核心数据库</font></b><br /><br />　　让我们更详细的测试核心数据库，先看看他最通用的功能。 <br /><br /><b>　　显示/设定值和异常处理</b><br /><br />　　核心库的最基本的标记是c:out标记，它在页中显示一个EL表达式的值。一个使用c:out的表达式通常是这样： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>We have &lt;c:out value="${applicationScope.product.inventoryCount}" <br />escapeXml="true" default="0"  /&gt; of those items in stock.</pre></td></tr></tbody></table><br />　
　上例中，value属性是我们送到页输出的表达式。我也说明了选项escapeXml的属性和默认属性。escapeXml的属性指定了XML字符
(&lt;、&gt;、 &amp;、 和
.)是否应该转化为相应的字符实体代码（这样他们可以让这些字符出现在一个HTML页中）；默认属性用于EL不能估算出数值或者数值计算出来为空的情况。
<br /><br />　　注意：当EL支持完全贯穿整个JSP2.0的时候，你不需要使用c:out动作；你可以仅嵌套JSP表达式直接在页中。 <br /><br />　　另一个普遍使用的核心动作是c:set，它在页中设定一个变量。你可以用两种方法使用c:set动作，第一种方法设定在var属性中定义的变量到在value属性中定义的值上，方法如下： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;c:set var="customerID" value="$param:customerNumber" scope="session" /&gt;</pre></td></tr></tbody></table><br />　　上述的选择项scope属性指定了我们要在会话期范围内设定变量customerID；如果范围没有制定，范围默认为页。 <br /><br />　　c:set另一个强大的用途就是将c:set标记的体的内容赋给一个指定的变量： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;c:set var="cellContents"&gt;<br />&lt;td&gt;<br />&lt;c:out value="${myCell}"/&gt;<br />&lt;/td&gt;<br />&lt;/c:set&gt;</pre></td></tr></tbody></table><br />　　在上例中，c:set动作定义了名为cellContents（在页的范围内）的变量，该变量拥有在标记的体中定义的内容。在这种情况下，体定义了一个HTML表格单元格元素，计算体中的c:out动作，并且该计算的结果包括在体中的字符串直接量值。 <br /><br />　
　就像你预想的那样，JSTL进行异常处理有点早。在典型的JSP页中，你有两种异常处理的方法：试图/捕捉直接嵌入到页中的小脚本代码中的块；或者用一
个JSP errorPage指令。JSP
errorPage指令提供一个良好的捕捉所有异常的方法来处理页中任何可能的异常。JSTL用一个c:catch动作提供一个好的可选择的方式。这个
c:catch动作提供一个更细粒度的有效方法来处理异常。而且没有嵌入Java代码到页中。一个c:catch动作是这样的： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;c:catch&gt;<br /> &lt;!--. . . some set of nested JSTL tags below which would be hit on an exception--&gt;<br />&lt;/c:catch&gt;</pre></td></tr></tbody></table><br />　　c:catch动作有一个可选的属性，即一个指向抛出异常的变量。 <br /><br />　　你可能不怎么愿意使用c:remove标记。这个标记有用于变量名和范围的属性，并且可从指定的范围内删除指定的变量。 <p><strong><font color="#330099">　　流程控制</font></strong><br />　　让我们转为讨论JSTL的流程控制和条件标记。如果你已经用任何一种语言使用了条件和流程控制语句，理论上这里没什么新鲜的东西。 <br /><br />　　c:if动作处理简单条件语句的测试。计算测试属性中的Boolean表达式的值，如果表达式为真的话，计算体的内容。在下面的动作中，我们也说明了备选项var属性。为了以后的使用，var属性保存测试结果在页（如果没有指定其他scope属性的话）中。</p><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;c:if test="${status.totalVisits == 1000000}" var="visits"&gt;<br />   You are the millionth visitor to our site!  Congratulations!<br />&lt;/c:if&gt;</pre></td></tr></tbody></table><p>　
　下面我们展示了用c:choose、 c:when、 和
c:otherwise交换逻辑的JSTL的支持。一组c:when动作可能包括在一个备选的标记内，如果在c:when块中任何表达式计算值为真的话，
就不用计算c:choose动作内的测试。如果c:when块中没有一个测试计算值为真的时候：如果出现c:otherwise动作内容时，则计算c:
otherwise动作的内容：</p><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;c:choose&gt;<br />&lt;c:when test="${item.type == 'book'}"&gt;<br />...<br />&lt;/c:when&gt;<br />&lt;c:when test="${item.type == 'electronics'}"&gt;<br />...<br />&lt;/c:when&gt;<br />&lt;c:when test="${item.type == 'toy'}"&gt;<br />...<br />&lt;/c:when&gt;<br />&lt;c:otherwise&gt;<br />...<br />&lt;/c:otherwise&gt;<br />&lt;/c:choose&gt;</pre></td></tr></tbody></table><p>　
　c:foreach动作提供一个容易的方法来迭代一个集合的元素。如果你想只迭代集合的一部分的话，你可以分别用begin、 end、 和
step属性指定起点、终点和一个递增值。在下面的例子中，我们在变量customerNames中迭代一个集合的内容；在每个循环中，下一个元素输入到
变量名内并在c:foreach动作的体内计算：</p><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;table&gt;<br />&lt;c:forEach var="name" items="${customerNames}"&gt;<br />&lt;tr&gt;&lt;td&gt;&lt;c:out value="${name}"/&gt;&lt;/td&gt;&lt;/tr&gt;<br />&lt;/c:forEach&gt;<br />&lt;/table&gt;</pre></td></tr></tbody></table><br />　
　
记得Java的StringTokenizer类吗？有了c:forTokens动作，你可以用JSTL获得类似的功能。这个程序片断可使用在
delims属性中定义的定界符通过items String属性中的条目迭代。注意，items
属性不必是一个字符直接量；它可以是任何有效的EL表达式: <br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;table&gt;<br />&lt;c:forTokens items="47,52,53,55,46,22,16,2" delim="," var="dailyPrice"&gt;<br />&lt;tr&gt;&lt;td&gt;&lt;c:out value="${dailyPrice}"/&gt;&lt;/td&gt;&lt;/tr&gt;<br />&lt;/c:forTokens&gt;<br />&lt;/table&gt;</pre></td></tr></tbody></table><br />　
　在接下来的完整的JSTL页中，我列出了已经传递到该页的所有参数。param 和paramValues对象是映射关键字到一个或多个值的Java
Map集。在本例中，我们找出了用于集合的每个MapEntry的关键字即参数名，并且使用关键字来查找所有与关键字关联的参数值：<br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %&gt;<br />&lt;html&gt;<br />&lt;body&gt;<br />&lt;head&gt;<br />&lt;title&gt;Parameter Listing Example&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;br&gt;<br />&lt;b&gt;Parameter values passed to this page for each parameter: &lt;/b&gt;<br />&lt;table border="2"&gt;<br />&lt;c:forEach var="current" items="${param}"&gt;<br />    &lt;tr&gt;<br />    &lt;td&gt;<br />    &lt;b&gt;&lt;c:out value="${current.key}" /&gt;&lt;/b&gt;<br />    &lt;/td&gt;<br />    &lt;c:forEach var="aVal" items="${paramValues[current.key]}"&gt;<br />     &lt;td&gt;<br />     &lt;c:out value="${aVal}" /&gt;<br />      &lt;/td&gt;<br />   &lt;/c:forEach&gt;<br />  &lt;/tr&gt;<br />&lt;/c:forEach&gt;<br />&lt;/table&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</pre></td></tr></tbody></table><strong><font color="#330099">其他动作</font></strong><br />　
　我们也需要讨论一些其他重要的核心标记库动作。在网页实现中一个潜在的问题范围与URL编码有关。没有URL编码，在网页中传递的URL的某个字符如空
格，可能会迷惑Web服务器。URL编码确保这些特殊的字符用不引起迷惑的字符代替。下列例子在变量myUrl中定义了一个URL,该变量myUrl由一
个URL和一系列参数组成。URL动作（注意，这里只在JSTL意义上的动作）保证所有字符都正确的编码: <table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;c:url value="http://acme.com/exec/register" var="myUrl"&gt;<br />&lt;c:param name="name" value="${param.name}"/&gt;<br />&lt;c:param name="country" value="${param.country}"/&gt;<br />&lt;/c:url&gt;<br />&lt;a href='&lt;c:out value="${myUrl}"/&gt;'&gt;Register&lt;/a&gt;</pre></td></tr></tbody></table><br />　　在上面的代码中，param动作简单的定义了一组名值对。 <br /><br />　　JSP允许设计者用 &lt;JSP:INCLUDE&gt;&lt;/JSP:INCLUDE&gt; <jsp:include></jsp:include><p><jsp:include></jsp:include>　
　&lt;JSP:INCLUDE&gt;指令包括其他页的内容。JSTL用JSTL
c:import动作扩展了这个概念。c:import的主要优势是：你能指定一个任意的URL；也可以包含你的Web应用之外（W3C的任何地方）的页
的内容或者你的服务器上的另一个Web应用内的页的内容。 <br /><br />　　对于一组与HTTP相关的标记来说，没有一个方法处理HTTP重定向是不完整的。JSTL用c:redirect动作支持它。 <br /><br /><b><font color="#330099">　　国际化标记库</font></b><br /><br />　　在讨论了JSTL支持国际化中，我假设你已经有了对下列主题的合理的理解： <br /><br />　　●资源包和Java如何找到它们 <br />　　●Locale类 <br />　　●资源包查找和MessageFormat类 <br />　　●局部编码以及它与Java国际化的关系 <br />　　●Java文本和数据格式化</p><p>　　如果你需要这些主题的更多的信息，请阅读Resources (<a href="http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl-p4.html#resources#resources" target="_blank"><font color="#0000ff">http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl-p4.html#resources#resources</font></a>)上的参考部分与国际化有关的参考文章。 <br /><br />　　我在下面的两个部分讨论了国际化标记库。在第一部分，我包括了你可能使用的格式化和解释相关的动作（它最初对应于java.text封装包中的类），尽管你没有开发过完全的国际化应用程序，可能你也要用到它。在第二部分，我说明了更针对于国际化的动作。 <br /><br />　　如果存在一个远程的可能性，你的应用程序会在你本国之外使用。如果你从一开始就建立在国际化的支持上，那么开发就会更加容易。无论你使用何种方法来开发，即使像JSTL一样容易使用的方法，一开始建立在国际化支持上也是十分有益的。 </p><p><strong><font color="#330099">　　格式标记库：格式动作</font></strong><br />　
　如果你已经使用了Java的 DateFormat
和NumberFormat类，在下面的标记中使用的方法应该看起来眼熟，因为JSTL格式化动作是在这些类之上建立的。这些Java类普遍提供一个
format( )函数，它将一个Java类型转化为一个格式化的String和创建对应于该String的Java对象。 <br /><br />　　
fmt:formatNumber动作有一个value属性和一个pattern属性。value属性是一个与我们看到的其它value属性类似的EL表
达式或者变量。pattern属性与在NumberFormat类中定义的模式一样。下列动作发送一个格式化的String到JSP页的输出上： </p><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;fmt:formatNumber value="1000.001" pattern="#,#00.0#"/&gt;</pre></td></tr></tbody></table><p><br />　
　在这个fmt:formatNumber动作里，我们使用了type属性来指定：格式化我们需要格式化的值为一个货币值。我们保存格式化的结果在一个变
量名为dollars中。在一个美国的locale类中，下面的程序生成一个字符串$3456.79（注意，它将使用的货币值四舍五入了）：</p><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;fmt:formatNumber value="3456.789" type="currency" var="dollars"/&gt;</pre></td></tr></tbody></table><p><br />　　用于上面的type属性的可能值包括currency、 number、 和percent。 <br /><br />　
　在例中，我们使用了另一种方法——使用了一个包括在value属性中的一个格式化的域（currency，每type属性）的一个文本字符串。并且解析
它来获取一个数字。结果储存在由var属性指定的一个变量内。尽管这个属性是可选的，还是会经常使用它。另外，解析的值送到页输出上：</p><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;fmt:parseNumber value="${currencyInput}" type="currency"<br /> var="parsedNumber"/&gt;<br />fmt:formatDate动作有一个value属性、一个format属性、<br />一个指向处理格式化的格式类的属性（典型的，如java.util.Date）：<br />&lt;jsp:useBean id="now" class="java.util.Date" /&gt;<br />&lt;fmt:formatDate value="${now}" timeStyle="long"<br />dateStyle="long"/&gt;</pre></td></tr></tbody></table><br />　　像数字格式化一样，JSTL页提供一个机制来解析一个代表日期的、进入Date对象的字符串： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;fmt:parseDate value="${dateInput}" pattern="MM dd, YYYY" /&gt;</pre></td></tr></tbody></table><br />　　查看java.util.DateFormat类，了解如何处理格式化和模式的更多详细的资料。 <br /><br /><b><font color="#330099">　　格式标记库：国际化动作</font></b><br />　
　Java本地化的一个关键点是ResourceBundle类。JSTL动作允许你用这个类简单的工作。这个例子使用了fmt:bundle动作来得到
与当前Locale 和 fmt:message动作对应的一个ResourceBundle动作，从而查看该资源包中的本地化的字符串： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;fmt:bundle basename="myBundle"&gt;<br />&lt;%-- Use values in myBundle --%&gt;<br />&lt;fmt:message key="Introduction"&gt;<br />   &lt;fmt:param value="${loginName}"/&gt;<br />   &lt;fmt:param value="${loginCount}"/&gt;<br />&lt;/fmt:message&gt;<br />&lt;fmt:formatDate value="${now}" var="parsedDate"/&gt;<br />&lt;/fmt:bundle&gt;</pre></td></tr></tbody></table><br />　　经常，fmt:message动作简单的查看了对应于一个关键词的字符串。在上面的例子中，在ResourceBundle中的字符串包含了取代两个值的占位符。这些值在fmt:param动作中定义过，这就像Java MessageFormat类使用的方法。 <br /><br />　　有一些类似的动作可指定一个时区，时区可应用到在标记的体中计算的任何事上： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;fmt:timeZone value="someTimeZone"&gt;<br />&lt;!-- actions in this context will be evaluated using someTimeZone  --&gt;<br />&lt;/fmt:timeZone&gt;</pre></td></tr></tbody></table><br />　
　上述的fmt:bundle 和
fmt:timeZone动作有分别对应的fmt:setBundle和fmt:setTimeZone的动作。这些动作添加了可选的scope属性；因
此，你可以使用这些动作在任何等同于应用范围的范围内设定一个资源捆绑或者一个时区。 <br /><br />　　如果你用非欧洲的locale类工作的话，你可能得担心编码的问题，JSTL支持用fmt:requestEncoding动作编码。 <br /><br /><b><font color="#330099">　　SQL标记库</font></b><br /><br />　
　JSTL
允许容易的数据库的集成。但是，值得注意的是：沙箱之外的JSTL的执行有一些限制。主要的问题与连接池有关。建立并维护到数据库的连接是很消耗资源的。
JSTL SQL动作使得许多数据库连接建立起来，通常的，每个用户至少有一个。因此，JSTL
SQL标记对于原型开发的或低容量的、基于Web的应用程序意义重大。但是它不适合于大规模的应用程序。一个可缩放的产品应用程序一般是在一个页面内处理
数据库访问如隐藏数据库访问和处理像连接池之类的细节。但是，还是有方法允许你实现连接池和用一点自定义码来使用JSTL
SQL动作（请看："JSTL 1.0: What JSP Applications Need, Part 2" in Resources
：http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl-p5.html#resources#resources).
<br /><br />　　我们看一些简单的例子。这些例子使用来自SQL库的JSTL标记。如果你熟悉SQL基础的话，你应该能够改编这些例子用在你的应用程序上。 <br /><br />　　在下面的程序片断中，我们建立了一条到一个数据库的连接，选择一组匹配一个订单ID的订单项目，并且在一个表格中显示item属性： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;sql:setDataSource<br />      driver="com.cheapDrivers.jdbcDriver"<br />      url="jdbc:cheapDrivers:."<br />      user="guest"<br />      password="password"<br />      var="dataSource" /&gt;<br /><br />&lt;sql:query var="orderItems" dataSource="${dataSource}"&gt;<br />SELECT * FROM items<br />WHERE order_id = &lt;cout value="${orderID}"/&gt; <br />ORDER BY price<br />&lt;/sql:query&gt;<br />&lt;table&gt;<br />&lt;c:forEach var="row" items="${orderItems.rows}"&gt;<br />&lt;tr&gt;<br />&lt;td&gt;&lt;c:out value="${row.itemName}"/&gt;&lt;/td&gt;<br />&lt;td&gt;&lt;c:out value="${row.price}"/&gt;&lt;/td&gt;<br />&lt;td&gt;&lt;c:out value="${row.weight}"/&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/c:forEach&gt;<br />&lt;/table&gt;</pre></td></tr></tbody></table><br />　
　在下一个例子中，我会说明JSTL是如何支持数据库事务的，在数据库中，许多包含对表格多个改动的操作必须是对所有的，或者什么也不做：如果出现一个问
题时，改动必须为空操作。在下面例子中，sql:update动作包含在一个sql:transaction动作内，如果在事务处理过程中，存在任何
SQL错误的话，在事务范围内执行的所有操作都得重来。 <br /><br />　　sql:update动作的命名有一点误导：除了SQL
UPDATE外，sql:update也支持INSERT 和 DELETE，甚至是SQL
CREATE。实际上，它支持不产生结果的任何一条SQL操作。在下面的例子中，sql:update通过插入变量值到一个
PreparedStatement中来执行一个UPDATE动作。在这个代码片断中，我们在两个账户之间传送钱（需要预先包装在一个事务中的某些东西的
一个经典的例子）： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;sql:transaction dataSource="${dataSource}"&gt;<br />&lt;sql:update&gt;<br />UPDATE account<br />SET account_balance =account_balance -?<br />WHERE accountNo = ?<br />&lt;sql:param value="${transferAmount}"/&gt;<br />&lt;sql:param value="${sourceAccount}"/&gt;<br />&lt;/sql:update&gt;<br />&lt;sql:update&gt;<br />UPDATE account<br />SET account_balance =account_balance +?<br />WHERE accountNo = ?<br />&lt;sql:param value="${transferAmount}"/&gt;<br />&lt;sql:param value="${destAccount}"/&gt;<br />&lt;/sql:update&gt;<br />&lt;/sql:transaction&gt;</pre></td></tr></tbody></table><br /><b><font color="#330099">　　</font></b><b><font color="#330099">XML标记库</font></b><br />　　使用标准的XML标记库，你所能做的完整的处理，特别是可扩展性单一语言变换说明（XSLT）的处理，对于另一篇文章来说是一个很好的主题。下面我会涵盖足够的让你开始的知识。 <br /><br />　　在JSTL的XML支持遵循XPath规范。XPath的重要功能之一是为访问XML著名的分层的信息提供一个清晰的语法。也许看到每件是如何工作的最容易的方法就是看看我们如何使用来自于一个真实JSTL页的一个片断里的标记： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>!-- Find and parse our XML document (somewhere on the WWW) --&gt;<br />&lt;c:import url="http://www.cheapstuff.com/orderStatus?id=2435" var="xml"/&gt;<br />&lt;x:parse xml="${xml}" var="doc"/&gt;<br />&lt;!-- access XML data via XPath expressions --&gt;<br />&lt;x:out select="$doc/name"/&gt;<br />&lt;x:out select="$doc/shippingAddress"/&gt;<br />&lt;x:out select="$doc/deliveryDate"/&gt;<br />&lt;!-- Set a scoped variable --&gt;<br />&lt;x:set var="custName" scope="request" select="$doc/name"/&gt;</pre></td></tr></tbody></table><br />　　在上面的输入和解析动作中，我们装载和解析了一个指定的XML文档到一个变量doc里。在上面的每个x:out动作中，我们使用了一个XPath表达式访问了解析的XML文档的元素，并且发送结果到JSP页输出中。 <br /><br />　　上面的设置表达式计算了一个XPath表达式并且将结果输入到一个限定范围的变量里（在上述例子中，它指在一个请求范围内）。 <br /><br />　
　x:out
和x:set动作可以输出一个JspTagException。如果他们没有成功的话（极有可能因为XPath表达式指向并不存在的标记），你的页，像在
所有其他情况下一样，应该智能的处理这些异常（要么通过传统的JSP errorPage指令，要么使用JSTL的c:catch动作）， <br /><br />　
　JSTL容易处理XSLT转换。在下面的示范页中，我们使用来自XML标记库中的x:transform动作，用一个XSLT
stylesheet创建一个来自于XML源文档的一个格式化的页。x:transform动作最重要的属性是XML和XSLT属性，在下面的例子中，我
们设置了一个来自于我们在同一页初始化的变量的xslt属性；我们也在动作的体中设置了XML属性。该动作默认为x:transform动作。 <br /><br />　　默认的，转换的结果送到页输出上；你也可以保存结果到一个带x:var属性的变量内： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %&gt;<br />&lt;%@ taglib uri="http://java.sun.com/jstl/xml" prefix="x" %&gt;<br />&lt;c:set var="xsltSource"&gt; <br />&lt;?xml version="1.0"?&gt;<br />&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;<br />&lt;xsl:template match="/"&gt;<br />      &lt;xsl:apply-templates/&gt;<br />&lt;/xsl:template&gt;<br />&lt;xsl:template match="music"&gt;<br />&lt;html&gt;<br />&lt;head&gt;&lt;/head&gt;<br />&lt;body marginheight="0" marginwidth="0" topmargin="0" leftmargin="0"&gt;<br />&lt;table cellpadding="0" cellspacing="0" border="1" bgcolor="#ffffff"&gt;<br />      &lt;tr&gt;<br />      &lt;td&gt;&lt;STRONG&gt;Artist&lt;/STRONG&gt;&lt;/td&gt;<br />      &lt;td&gt;&lt;STRONG&gt;Album&lt;/STRONG&gt;&lt;/td&gt;<br />      &lt;td&gt;&lt;STRONG&gt;Year&lt;/STRONG&gt;&lt;/td&gt;<br />      &lt;td&gt;&lt;STRONG&gt;Genre&lt;/STRONG&gt;&lt;/td&gt;<br />      &lt;/tr&gt;<br />      &lt;!---Set up for loop to collect all the artist information //--&gt;<br />      &lt;!-- &lt;xsl:for-each select="./*[name()='artists']"&gt; --&gt;<br />      &lt;xsl:for-each select="artists"&gt;<br />        &lt;tr&gt;<br />          &lt;td&gt;&lt;xsl:value-of select="artist"/&gt;&lt;/td&gt;<br />          &lt;td&gt;&lt;xsl:value-of select="album"/&gt;&lt;/td&gt;<br />          &lt;td&gt;&lt;xsl:value-of select="year"/&gt;&lt;/td&gt;<br />         &lt;td&gt;&lt;xsl:value-of select="genre"/&gt;&lt;/td&gt;<br />        &lt;/tr&gt;<br />     &lt;/xsl:for-each&gt;<br />&lt;/table&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br />&lt;/xsl:template&gt;<br />&lt;/xsl:stylesheet&gt;<br />&lt;/c:set&gt; <br />&lt;x:transform xslt="${xsltSource}" &gt;<br />&lt;music&gt;<br />&lt;artists&gt;<br />    &lt;artist&gt;Jonny B&lt;/artist&gt;<br />    &lt;album&gt;Feedback and Distortion&lt;/album&gt;<br />    &lt;year&gt;2001&lt;/year&gt;<br />     &lt;genre&gt;Rock&lt;/genre&gt;<br />      &lt;/artists&gt; <br />     &lt;artists&gt;<br />      &lt;artist&gt;Harmony's Nieces&lt;/artist&gt;<br />      &lt;album&gt;Sappy Pop Ballads&lt;/album&gt;<br />      &lt;year&gt;2002&lt;/year&gt;<br />      &lt;genre&gt;Pop&lt;/genre&gt;<br />      &lt;/artists&gt; <br />&lt;/music&gt;<br />&lt;/x:transform&gt;</pre></td></tr></tbody></table><br />　　你也能使用c:import动作再定义一个额外的源文档和stylesheet，就好像在这个示范的代码片断展示的一样：： <br /><br /><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>&lt;c:import var="${xmlSource}" url="${someDocumentURL}" /&gt;<br />&lt;c:import var="${xsltSource}" url="${anotherDocumentURL}" /&gt;<br />&lt;x:transform xml="${xmlSource}" xslt="${xsltSource}" &gt;</pre></td></tr></tbody></table><br /><b><font color="#330099">　　</font></b><b><font color="#330099">结束语</font></b><br />　　至此，你应该对JSTL、它的四种标准标记库、和它如何使网页开发更为容易 有了很好的理解。现在你开始写一些JSTL! <br /><br />　　【<b>关于作者</b>】 <br />　　Steve Small从事Java开发多年，一直处于技术领导层和开发位置上。他先后为Boeing、 Amazon.com工作过，目前在沃什湾西雅图的PictureIQ公司供职。从1998年起，在华盛顿大学兼职开发和教学Java课程。<a href="http://www.javaworld.com/feedback"><font color="#0000ff">http://www.javaworld.com/feedback</font></a></div>
<img src ="http://www.blogjava.net/leedo/aggbug/65022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leedo/" target="_blank">阳光</a> 2006-08-22 11:21 <a href="http://www.blogjava.net/leedo/articles/65022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 使用JSTL标签做页面资源国际化</title><link>http://www.blogjava.net/leedo/articles/64845.html</link><dc:creator>阳光</dc:creator><author>阳光</author><pubDate>Mon, 21 Aug 2006 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/leedo/articles/64845.html</guid><wfw:comment>http://www.blogjava.net/leedo/comments/64845.html</wfw:comment><comments>http://www.blogjava.net/leedo/articles/64845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leedo/comments/commentRss/64845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leedo/services/trackbacks/64845.html</trackback:ping><description><![CDATA[ 使用JSTL标签做页面资源国际化<br />【摘 要】Web应用开发,如何使用JSTL 标签做页面资源国际化需解决问题描述：1 项目中的文本要实现国际化。<br /><br />　　1、Web应用开发,如何使用JSTL 标签做页面资源国际化需解决问题描述：项目中的文本要实现国际化<br />　　<br />　　2、希望达到按模块分开编写国际化资源文件解决方案：<br />　　<br />　　JSTL 标签支持国际化的标签为<br />　　&lt;fmt:bundle&gt; &lt;fmt:message&gt; &lt;fmt:setBundle&gt;&lt;fmt:param&gt;<br />　　&lt;fmt:bundle&gt; 功能：指定消息资源使用的文件<br />　　&lt;fmt:message&gt;功能：显示消息资源文件中指定key的消息,支持带参数消息<br />　　&lt;fmt:param&gt;　功能：给带参数的消息置参数值<br />　　&lt;fmt:setBundle&gt; 功能：设置消息资源文件<br />　　<br />　　一个支持按模块的多资源文件的国际化例子<br />
                  　　<br />
                  　　步骤1 :定义两个资源文件，分别为<br />
                  　　resources\IAMResources_zh_CN.properties, 内容为<br />
                  　　# 测试使用<br />
                  　　test.common.message = test.common.message1 {0}<br />
                  　　<br />
                  　　resources\UserSynResources_zh_CN.properties 内容为<br />
                  　　# 测试使用<br />
                  　　test.usersyn.message = test.usersyn.message1 {0}<br />
                  　　<br />
                  　　步骤2:定义一个公用的JSP文件 includeTld.jsp，其内容为<br />
                  　　&lt;%-- struts taglib --%&gt;<br />
                  　　&lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" 
                  %&gt;<br />
                  　　&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" 
                  %&gt;<br />
                  　　&lt;%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" 
                  %&gt;<br />
                  　　&lt;%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" 
                  %&gt;<br />
                  　　&lt;%@ taglib uri="/WEB-INF/struts-template.tld" 
                  prefix="template" %&gt;<br />
                  　　&lt;%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" 
                  %&gt;<br />
                  　　&lt;%-- jstl taglib --%&gt;<br />
                  　　&lt;%@ taglib prefix="c" uri="/WEB-INF/c.tld" 
                  %&gt;<br />
                  　　&lt;%@ taglib prefix="fmt" uri="/WEB-INF/fmt.tld" 
                  %&gt;<br />
                  　　&lt;%@ taglib prefix="x" uri="/WEB-INF/x.tld" 
                  %&gt;<br />
                  　　&lt;%@ taglib prefix="sql" uri="/WEB-INF/sql.tld" 
                  %&gt;<br />
                  　　<br />
                  　　&lt;%-- set Common MessageResource --%&gt;<br />
                  　　&lt;fmt:setBundle basename="resources.IAMResources" 
                  var="commonBundle"/&gt;<br />
                  　　&lt;%-- set UserSyn MessageResource --%&gt;<br />
                  　　&lt;fmt:setBundle basename="resources.UserSynResources" 
                  var="userSynBundle"/&gt;<br />
                  　　<br />
                  　　3、 在需要国际化的JSP页面使用按如下编写<br />
                  　　&lt;%@page contentType="text/html; charset=utf-8"%&gt;<br />
                  　　&lt;%@include file="/includeTld.jsp"%&gt;<br />
                  　　<br />
                  　　&lt;fmt:message key="test.common.message" bundle="${commonBundle}"&gt;<br />
                  　　&lt;fmt:param value="liaowufeng"/&gt;<br />
                  　　&lt;/fmt:message&gt;<br />
                  　　<br />
                  　　&lt;fmt:message key="test.usersyn.message" bundle="${userSynBundle}"&gt;<br />
                  　　&lt;fmt:param value="liaowufeng"/&gt;<br />
                  　　&lt;/fmt:message&gt;<img src ="http://www.blogjava.net/leedo/aggbug/64845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leedo/" target="_blank">阳光</a> 2006-08-21 17:43 <a href="http://www.blogjava.net/leedo/articles/64845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP 标准标签库(二)(转载)</title><link>http://www.blogjava.net/leedo/articles/64844.html</link><dc:creator>阳光</dc:creator><author>阳光</author><pubDate>Mon, 21 Aug 2006 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/leedo/articles/64844.html</guid><wfw:comment>http://www.blogjava.net/leedo/comments/64844.html</wfw:comment><comments>http://www.blogjava.net/leedo/articles/64844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leedo/comments/commentRss/64844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leedo/services/trackbacks/64844.html</trackback:ping><description><![CDATA[
		<div id="title">
				<h2>JSP 标准标签库(二)</h2>
				<a href="http://www.matrix.org.cn/user.shtml;jsessionid=2234528EC66FD6423F6C40AA31856204?userid=2">chris</a>
	发表于2003-11-07 
	
		作者:gaven
	
	
	评价:0/0
	评论数:0
	点击数:3396
	[<a href="http://www.matrix.org.cn/favorite.shtml;jsessionid=2234528EC66FD6423F6C40AA31856204?type=article&amp;title=JSP%20%E6%A0%87%E5%87%86%E6%A0%87%E7%AD%BE%E5%BA%93%28%E4%BA%8C%29&amp;url=http%3A%2F%2Fwww.matrix.org.cn%2FarticleView.shtml%3Fid%3D648">收藏</a>]
</div>
		<div id="divnormal">
				<div id="articleview_centerad">
						<script type="text/javascript">
								<!--
google_ad_client = "pub-4196225375348397";
google_alternate_ad_url = "http://www.matrix.org.cn/resource/google_adsense_script.html";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
google_ad_channel ="9027725909";
google_color_border = "F6F6F4";
google_color_bg = "F6F6F4";
google_color_link = "0000CC";
google_color_url = "339999";
google_color_text = "339999";
//-->
						</script>
						<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
						</script>
						<iframe name="google_ads_frame" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4196225375348397&amp;dt=1156151060140&amp;lmt=1122648019&amp;alternate_ad_url=http%3A%2F%2Fwww.matrix.org.cn%2Fresource%2Fgoogle_adsense_script.html&amp;format=336x280_as&amp;output=html&amp;channel=9027725909&amp;url=http%3A%2F%2Fwww.matrix.org.cn%2Fresource%2Farticle%2F648.html&amp;color_bg=F6F6F4&amp;color_text=339999&amp;color_link=0000CC&amp;color_url=339999&amp;color_border=F6F6F4&amp;ad_type=text_image&amp;ref=http%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3Dfmt%253Amessage%26cl%3D3&amp;cc=100&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_his=1&amp;u_java=true&amp;u_nplug=18&amp;u_nmime=55" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" frameborder="0" height="280" scrolling="no" width="336">
						</iframe>
				</div>
				<div id="articleview_summary">
摘要：

转载：转载请保留本信息，本文来自<a href="http://www.matrix.org.cn/resource/article/0/648.html">http://www.matrix.org.cn/resource/article/0/648.html</a></div>
		</div>


英文原文地址：http://www.onjava.com/pub/a/pub/a/onjava/2002/05/08/jstl.html<br /><br />本文是 JSTL 系列的第二篇-- JSP 标准标签库.相关资源：JSP Standard Tag Libraries, Part 1（http://www.onjava.com/pub/a/onjava/2002/03/13/jsp.html）<br /><br /><br />
此文中，我们将更详细地讲述不同标记描述文件（Tag Library
Descriptor，TLD）里的各种标记。我们会通过例子去说明条件、迭代、URL、SQL及XML等标记的使用。文章的目的就是展示JSTL的主要
功能，说明如何使用JSTL以及说明如何使用JSTL去改善JSP的开发。<br /><br />
简单来说，JSTL就是一套可以用在多个方面的自定义功能，JAVA标准组织（Java Community
Process，JCP）在JSR-52里面定义到，JSTL提供表达式语言（expression
language），流程控制及数据检校等功能，JSTL规范的最后版本可以在JCP的网站上找得到。<br /><br />   JSTL要求运行在支持JSP 1.2版的服务器上，JSTL的主旨就是简化JSP的开发以及提供访问、操作数据的简便方式，使用JSTL可以使用大家的工作更轻松。<br /><br />    JSTL包含了多个TLD和JAR文件，这些TLD覆盖很多功能，我们将一个个说明。首先，我们要重点说一下JSTL最突出的功能，表达式语言。<br /><br />
实际上，表达式语言是由JSR-152专家组所提供的，也就是定义JSP
2.0的专家组。JSR-152和JSR-52很多时是在一起工作的，更甚的是，表达式语言已经成为JSP
2.0的一部分。表达式语言提供访问数据的一种简便方法，它支持运算，支持bean，支持集合，同时也支持类型转换和属性的缺省值。<br /><br /><b>使用表达式语言</b><br /><br />   表达式语言是通过 ${expression} 这样的形式来调用的，并且它只能用在属性里面，例如：<br /><br /><pre title="pre code" class="overflow">&lt;c:if test="${product.price &gt;= customer.limit}"&gt;<br />...<br />&lt;/c:if&gt;</pre><br /><br />   在上面的例子，我们使用表达式语言做一个比较运算，它也可以混合一些静态文本，就象下面的例子：<br /><br /><pre title="pre code" class="overflow">&lt;c:forEach var="current"&gt;<br />   &lt;c:out value="Product-${current}"/&gt;<br />&lt;/c:forEach&gt;</pre><br /><br />   在例子里面，我们枚举出一个集合里面的元素，之后将它加在一个字符串后面输出，结果就象：<br /><br />Product-1<br />Product-2<br />Product-3...<br /><br />   从例子里可以看出，相对于以前的代码，使用JSTL之后，在整个过程变得简单清晰。在以前，你需要定义一个对象，要知道对象的类型，并且要掌握一些脚本语言，而这只是去完成一个简单的操作。<br /><br />   现在，有了JSTL，我们可以使用简单的语法去访问数据，表达式语言是非常适合做这样的工作的。<br /><br />   再举一个例子，我们可以将：<br /><br /><pre title="pre code" class="overflow">&lt;jsp:useBean id="customer" type="sample.Customer" scope="request"/&gt; ...<br />Customer Name: &lt;%=customer.getName()%&gt;<br />...<br />&lt;% if (customer.getState().equals("CO")){ %&gt;<br />...<br />&lt;%}%&gt;</pre><br /><br />   转换成：<br /><br /><pre title="pre code" class="overflow">Customer Name: ${ customer. name}<br />&lt;c:if test="${customer. state == param. state}"&gt;<br />...<br />&lt;/c:if&gt;</pre><br /><br />   表达式语言允许直接访问JSP中任何作用域的变量，比如可以用${foo}来代替pageContext.findAttributes("foo")。还有可以能过点或索引来访问bean以及它们的属性，如：<br /><br /><pre title="pre code" class="overflow">${user.address.city} <br />${products.[product.id]}<br />${products.["Part-010"]}</pre><br /><br />
表达式语言提供所有你使用到的运算：==, !=, &lt;,&gt;, &lt;=, &gt;=, &amp;&amp;, ||, !
。这表达式语言中，它们表示为lt, gt, le, ge, eq,
ne，这样可以避免与XML的语法重复。表达式语言也有普通的算术运算同布尔运算。另外，表达式语言还具有自动类型转换的功能，如int value
= "${request.myValue}"会自动转换。<br /><br />   在表达式语言是可以提供属性的缺省值的，使用缺省值是为了避免空指针异常，下面是一个例子，<br /><br /><pre title="pre code" class="overflow">&lt;c:set var="city" value="${user.address.city}" default="N/A" /&gt;</pre><br /><br />   现在，我们已经对表达式语言有所了解，下面，让我们看一下与EL相关的操作。<br /><br /><b>核心操作</b><br /><br />   在核心标记库里使用到表达式语言。&lt;c:out&gt;标记将表达式语言所计算出的值输出到当前的JSP输出流。这个与JSP中的&lt;%= scripting exp %&gt;相似。比如：<br /><br /><pre title="pre code" class="overflow">&lt;c:out value="${customer.name}"  default="N/A" /&gt;</pre><br /><br />
核心标记库里还可以设置和清除变量。变量的缺省作用域是PAGE。例如我们可以用&lt;c:set var="customer"
value=${customer}" /&gt;设置一个页面变量customer，再用一个&lt;c:remove
var="customer" /&gt;去清除它。<br /><br />
现在，能过JSTL，我们可以使用一个标记去捕捉java.lang.Throwable，例如：&lt;c:catch var="myError"
/&gt;。使用这个标记，可以统一页面的异常处理，但这不意味着代替JSP的错误页面机制。通过使用&lt;c:catch&gt;标记，就可以在页面
上控制特定的异常，而不用转到错误页面，其实并不是所有异常都需要转到错误页面。通过使用&lt;c:catch&gt;标记，与用户的交互也变得更友
好。<br /><br /><b>条件操作</b><br /><br />    在条件操作中使用EL是简化JSP的一种强有力的手段。&lt;c:if&gt;标记，它可以构造简单的条件表达式。下面的例子，访问了一个对象的属性：<br /><br /><pre title="pre code" class="overflow">&lt;c:if test="${user.visitCount == 1}"<br />   Welcome back! <br />&lt;/c:if&gt;</pre><br /><br />    当然，有IF就一定会有ELSE。如果是"if/then/else"结构的，则使用&lt;c:choose&gt;, &lt;c:when&gt;和&lt;c:otherwise&gt;标记。<br /><br />   看一看下面的例子，我们对一个查询结果集做过了一些处理，之后使用标记去显示正确的信息。<br /><br /><pre title="pre code" class="overflow">&lt;c:choose&gt;<br />&lt;c:when test="${count == 0}"&gt;<br />   No records matched your selection.<br />&lt;/c:when&gt;<br />&lt;c:otherwise&gt;<br />   &lt;c:out value="${count}"/&gt; records matched your selection.<br />&lt;/c:otherwise&gt;<br />&lt;/c:choose&gt;</pre><br /><br /><b>迭代操作</b><br /><br />
在整个JSTL里面，可能最有用的操作就是迭代操作了。迭代操作的标记有&lt;c:forEach&gt;，&lt;c:forToken&gt;和
&lt;x:forEach&gt;。最后一个是XML的迭代操作。下面我们会说到XML的操作，但现在我们还是继续核心操作。<br /><br />
迭代操作支持所有的J2SE集合类型，包括List, LinkedList, ArrayList, Vector, Stack,
和Set。还有java.util.Map对象，如HashMap, Hashtable, Properties, Provider,
和Attributes。还有数组。当使用基本数据类型的数组时，它会包装成对应的基本类。在迭代操作中，会输出两个东西，当前的数据项和迭代的状态。看
看下面的例子：<br /><br /><pre title="pre code" class="overflow">&lt;table&gt;<br />&lt;c:forEach var="product" <br />              items="${products}" <br />              varStatus="status"&gt;<br />&lt;tr&gt;<br />   &lt;td&gt;&lt;c:out value="${status.count}"/&gt;&lt;/td&gt;<br />   &lt;td&gt;&lt;c:out value="${product.name}"/&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/c:forEach&gt;<br />&lt;/table&gt;</pre><br /><br />   例子中，products是一个集合，当前的数据项入在变量product里面，变量status是当前的迭代状态。是不是很简单。<br /><br /><b>URL操作</b><br /><br />   除了迭找操作外，核心标记库里也提供了URL相关的操作，它包括超链接，引入和重定向。可以使用&lt;c:url&gt;去设定一个URL。假如我们想指定一个带参数的URL，并在链接中使用，那就象下面的例子：<br /><br /><pre title="pre code" class="overflow">&lt;c:url=http://mysite.com/register var="myUrl"&gt;<br />   &lt;c:param name="name" value="${param.name}"/&gt;<br />&lt;/c:url&gt;<br />&lt;a href='&lt;c:out value="${myUrl}"/&gt;'&gt;Register&lt;/a&gt;</pre><br /><br />   JSTL中有很强大的资源引入机制，它可以指定绝对的URL，在同一应用的相对的URL，不同应用的相对的URL，还有FTP资源。下面给出一些例子：<br /><br />绝对URL：&lt;c:import url="http://sample.com/Welcome.html"/&gt; <br />同一应用中的相对的URL：&lt;c:import url="/copyright.html"/&gt; <br />不同应用中的相对的URL：&lt;c:import url="/myLogo.html" context="/common"/&gt; <br />FTP资源：&lt;c:import url="ftp://ftp.sample.com/myFile"/&gt; <br /><br />
通过上面的说明可以看出，&lt;c:import&gt;比&lt;jsp:include&gt;强大得多，但是，也有其它理由去使用&lt;
jsp:include&gt;的。在JSTL中，对于引入的资源使用了缓存，但有时候缓存会是没用的。如果你使用&lt;jsp:
include&gt;，资源的内容会被读入并写到当前的JspWriter，而且是每访问一次就重读一次。而使用&lt;c:import&gt;，资
源的内容则只会读取一次。<br /><br /><b>本地化操作</b><br /><br />
JSTL的另一样重要功能就是本地化操作，通过当前请求的，或者环境配置中的参数，就可以简便地实现本地化操作。这个操作是使用J2SE中的
ResourceBundle机制去存放各种译文的。JSTL通过设定的区域，去找到并使用相应的ResourceBundle。用&lt;fmt:
setLocale&gt;去设置区域，如&lt;fmt:setLocale
value="es_Es"/&gt;，value属性为语言代码和国家代码。也可以直接指定一个ResourceBundle：&lt;fmt:
bundle basename="ApplicationResource_fr"/&gt;。<br /><br />   一旦设置了区域或者绑定特定的信息，那么&lt;fmt:message&gt;标记就会自动地选择正确的ResourceBundle，使用以下的形式就可以输出正确的信息：<br /><br /><pre title="pre code" class="overflow">&lt;fmt:message key="welcome"&gt;<br />   &lt;fmt:param value="${visitCount}" /&gt;<br />&lt;fmt:message/&gt;</pre><br /><br />   你也可以直接使用&lt; fmt:requestEncoding/&gt;标记去设置当前请求的字符集。<br /><br />
获取和显示文字信息只是本地化操作的一半，而另一半就是格式化同解释日期和数字，不同的地域会有不同的日期和数字格式的。使用&lt;fmt:
formatNumber&gt;和&lt;fmt:parseNumber&gt;去格式化数字，金额，百分比数，而且还可以指定格式，就如&lt;
fmt:formatNumber value="12.3" pattern=".00"/&gt;会输出"12.30"。<br /><br />   日期和时间的处理使用&lt;fmt:formatDate&gt;, &lt;fmt:timeZone&gt;, &lt;fmt:setTimeZone&gt;, 和 &lt;fmt:parseDate&gt;。<br /><br /><b>SQL操作</b><br /><br />
SQL操作允许你直接操作数据源，在MVC模式里面是不提倡这样做的，我更是彻底反对在一个正式产品里这样做。它们只适用于快速开发，原型开发或者是一些
小的应用里面，它们是不应该用在一些大型的应用上面的。不过也有许多开发人员想使用它，所以它保留在标准里面。下面我们来看一下SQL操作。<br /><br />   SQL标记可以用来设置数据源，执行查询，访问查询结果，执行更新等。所有的SQL操作都是基于某一数据源的。有几种方式可以设置数据源：在配置文件里设置<br />sql.datasource参数，在程序中直接设置，或者使用&lt;sql:setDataSource&gt;标记。如下面就设置了一个MySql的数据源：<br /><br /><pre title="pre code" class="overflow">&lt;sql:setDataSource var="datasource"  driver="org.gjt.mm.mysql.driver" url="jdbc:mysql://localhost/db" /&gt;</pre><br /><br />
与JDBC中的DriverManager相似，&lt;sql:setDataSource&gt;也只是一个包装。数据源的属性，它可以是一个
JNDI资源，也可以是一个JDBC参数。用&lt;sql:query datasource="${datasource}" ...
/&gt;这样的方式来访问数据。<br /><br />   我们把这些东西都放在一起，它是会是这样的：<br /><br /><pre title="pre code" class="overflow">&lt;sql:query var="customer" datasource="${datasource}" <br />SELECT * FROM customers WHERE state = 'CO' ORDER BY city<br />&lt;/sql:query&gt;<br />&lt;table&gt;<br />&lt;c:forEach var="row" items="${customers.row}"&gt;<br />   &lt;tr&gt;<br />   &lt;td&gt;&lt;c:out value="${row.custName}" /&gt;&lt;/td&gt;<br />   &lt;td&gt;&lt;c:out value="${row.address}" /&gt;&lt;/td&gt;<br />   &lt;/tr&gt;<br />&lt;/c:forEach&gt;<br />&lt;/table&gt;</pre><br /><br />    使用事务和执行更新一样也很简单。例如，我们建立一个事务，并执行几个更新，那就是下面代码：<br /><br /><pre title="pre code" class="overflow">&lt;sql:transaction dataSource="${dataSource}"&gt;<br />&lt;sql:update&gt;<br />   UPDATE account SET Balance =Balance -? WHERE accountNo = ?<br />   &lt;sql:param value="${transferAmount}"/&gt;<br />   &lt;sql:param value="${accountFrom}"/&gt;<br />&lt;/sql:update&gt;<br />&lt;/sql:transaction&gt;</pre><br /><br />   用&lt;sql:dateParam&gt;标记来设定SQL语句中的类型为日期型的参数的值。<br /><br /><b>XML操作</b><br /><br />
JSTL中最后一类操作是XML操作，XML操作也可细分成核心操作，流程控制操作和转换操作。JSTL中的XML操作是基于Xpath的，Xpath是
XML操作专用的表达式语言。JSTL所有的XML操作中，用"select"属性去指定XPath表达式，这些信息将由XPath引擎解释。<br /><br />
XML核心操作与JSTL的核心操作相似，它包含&lt;x:out&gt;, &lt;x:set&gt;,
和&lt;x:parse&gt;标记。&lt;x:parse&gt;标记提供将XML文档转换成结构化数据的功能，之后，这些数据就能被XPath引
擎解释了。例如，有一个关于书籍的XML文档，我们就可以解释它，并打印出来：<br /><br /><pre title="pre code" class="overflow">&lt;c:import url="http://oreilly.com/book?id=1234" var="xml"/&gt;<br />&lt;x:parse source="${xml}" var="bookInfo"/&gt;<br />&lt;x:out select="$bookInfo/title"/&gt;<br />&lt;x:out select="$bookInfo/author"/&gt;</pre><br /><br />   XML类流程控制操作与核心类的流程控制操作一样，包括if, choose, when, otherwise, 和 forEach 这些标记，区别只是它们使用XPath表达式语言。当表达式计算出来后，根据一些规则，结果将转换成一个布尔值。这些规则如下：<br /><br />A number is true if and only if it is neither positive or negative zero nor NaN. <br />一个数字当且仅当它不是一个正数，也不是一个负零，更不是一个NaN（非数字）时，表达式的值为真。<br />A node-set is true if and only if it is non-empty. <br />一个节点当且仅当它不是空节点时，表达式的值为真。<br />A string is true if and only if its length is non-zero. <br />一个字符串当且仅当它的长度不为0是，表达式的值为真。<br /><br />   XML转换操作，是通过XSL样式表来转换XML文档，转换的结果输出到当前页面，另一方面也可以其中的结果保存到变量中。完成一个转换就是导入一个XML文档和XSL样式表，之后做一个转换那么简单：<br /><br /><pre title="pre code" class="overflow">&lt;c:import url="/books" var="xml"/&gt;<br />&lt;c:import url="/WEB-INF/xslt/bookDisplay.xsl" var="xslt"/&gt;<br />&lt;x:transform source="${xml}" xslt="${xslt}"/&gt;</pre><br /><br />   如果你在转换中使用到参数，你可以用&lt;x:param&gt;指定参数名称及参数值。<br /><br /><b>小结</b><br /><br />
现在，你已经学会了使用JSTL中的标记，这样，开发JSP会更容易更快捷。留意JSTL的发展，当JSTL的正式版本发布以后，JSP服务器的提供厂商
就会对此优化。你可以在http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html
中得到JSTL的最后实现版本。<img src ="http://www.blogjava.net/leedo/aggbug/64844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leedo/" target="_blank">阳光</a> 2006-08-21 17:42 <a href="http://www.blogjava.net/leedo/articles/64844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>