﻿<?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-家族第一工程师</title><link>http://www.blogjava.net/zqb126/</link><description>业精于勤，成于专注，功在执着</description><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 04:45:38 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 04:45:38 GMT</pubDate><ttl>60</ttl><item><title>JSTL 标签库详细介绍</title><link>http://www.blogjava.net/zqb126/archive/2010/03/23/316321.html</link><dc:creator>冥王子</dc:creator><author>冥王子</author><pubDate>Tue, 23 Mar 2010 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/zqb126/archive/2010/03/23/316321.html</guid><wfw:comment>http://www.blogjava.net/zqb126/comments/316321.html</wfw:comment><comments>http://www.blogjava.net/zqb126/archive/2010/03/23/316321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqb126/comments/commentRss/316321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqb126/services/trackbacks/316321.html</trackback:ping><description><![CDATA[<p>从JSP　1.1规范开始，JSP就支持在JSP中使用自定义标签了，自定义标签的广泛使用造成了程序员重复定义，这样就促成了JSTL（JavaServer Pages Standard Tag Library）的诞生。<br />
作者：丁令(http:///www.DingL.com/)</p>
<p>JSTL简介</p>
<p>JSTL是一个不断完善的开放源代码的JSP标签库，是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上，如tomcat 4.x。但是在即将推出的JSP 2.0中是作为标准支持的。<br />
JSTL目前的最新版本为1.02，最终发布版为1.0。JSTL包含两个部分：标签库和EL（Expression Language表达式语言）语言。标签库目前支持四种标签： <br />
标签 URI 前缀 示例 <br />
Core http://java.sun.com/jstl/core c &lt;c:tagname ...&gt; <br />
XML processing http://java.sun.com/jstl/xml x &lt;x:tagname ...&gt; <br />
I18N capable formatting http://java.sun.com/jstl/fmt fmt &lt;fmt:tagname ...&gt; <br />
Database access (SQL) http://java.sun.com/jstl/sql sql &lt;sql:tagname ...&gt; </p>
<p>&nbsp;</p>
<p>Core支持JSP中的一些基本的操作；<br />
XML processing支持XML文档的处理；<br />
I18N capable formatting支持对JSP页面的国际化；<br />
Database access (SQL)支持JSP对数据库的操作。</p>
<p>由于本人水平有限，本文仅介绍Core标签，如有兴趣，可一起探讨其它三种标签的使用与扩充。</p>
<p>EL语言介绍</p>
<p>EL语言是JSTL输出（输入）一个JAVA表达式的表示形式。<br />
在JSTL中，EL语言只能在属性值中使用。EL语言只能通过建立表达式${exp1}来进行调用。在属性值中使用表达式有三种方式。</p>
<p>1、 value属性包含一个表达式<br />
&lt;some:tag value="${expr}"/&gt;<br />
在这种情况下，表达式值被计算出来并根据类型转换规则赋值给value属性。比如：&lt;c:out value="${username}" /&gt;中的${username}就是一个EL，它相当于JSP语句&lt;%=request.getAttribute(&#8220;username&#8221;)%&gt;或&lt;%=session.getAttribute(&#8220;username&#8221;)%&gt;</p>
<p>2、 value属性包含一个或多个属性，这些属性被文本分割或围绕<br />
&lt;some:tag value="some${expr}${expr}text${expr}"/&gt;<br />
在这种情况下，表达式从左到右进行计算，并将结果转换为字符串型（根据类型转换规则），并将结果赋值给value属性</p>
<p>3、 value属性仅仅包含文本<br />
&lt;some:tag value="sometext"/&gt;<br />
在这种情况下，字符串型属性value将根据类型转换规则转换为标签所希望的类型。</p>
<p>EL语言的操作符<br />
取得某个对象或集合中的属性值<br />
为了获得集合中的属性，EL支持以下两种操作<br />
1． 使用.操作符来获得有名字的属性。例如表达式${user.username}表明对象user的username属性<br />
2． 使用[]操作符来获得有名字或按数字排列的属性。<br />
表达式${user["username"]}和表达式${user. username }含义相同<br />
表达式${row[0]} 表明row集合的第一个条目。<br />
在这里user是一个类的对象，它的属性username必须符合标准JavaBean的规范，即必须为username属性定义相应的getter、setter方法。</p>
<p>Empty操作符(空值检查)</p>
<p>使用empty操作符来决定对象、集合或字符串变量是否为空或null。例如：<br />
${empty param.username}<br />
如果request的参数列表中的username值为null，则表达式的值为true。 EL也可以直接使用比较操作符与null进行比较。如${param.firstname == null}。<br />
比较操作符 <br />
操作符 描述 <br />
==或eq 相等检查 <br />
!=或ne 不等检查 <br />
&lt;或lt 小于检查 <br />
&gt;或gt 大于检查 <br />
&lt;=或le 小于等于检查 <br />
&gt;=或ge 大于等于检查 </p>
<p><br />
数字运算符与逻辑运算符均与JAVA语言相同，不再列表。</p>
<p>Core标签库</p>
<p>1、 通用标签</p>
<p>&lt;c:out&gt;<br />
&lt;c:out&gt;标签用于在JSP中显示数据，它有如下属性 <br />
属 性 描 述 是否必须 缺省值 <br />
value 输出的信息，可以是EL表达式或常量 是 无 <br />
default&nbsp; value为空时显示信息 否 无 <br />
escapeXml 为true则避开特殊的xml字符集 否 true </p>
<p>&nbsp;</p>
<p><br />
例子: <br />
您的用户名是: &lt;c:out value=&#8221;${user.username}&#8221; default=&#8221;guest&#8221;/&gt; </p>
<p><br />
显示用户的用户名，如为空则显示guest</p>
<p>&lt;c:out value="${sessionScope.username}"/&gt; </p>
<p><br />
指定从session中获取username的值显示；</p>
<p>&lt;c:out value="${username}" /&gt; </p>
<p><br />
显示username的值，默认是从request(page)中取，如果request中没有名为username的对象则从session中取，session中没有则从application(servletContext)中取，如果没有取到任何值则不显示。</p>
<p>&lt;c:set&gt;<br />
&lt;c:set&gt;标签用于保存数据，它有如下属性 <br />
属 性 描 述 是否必须 缺省值 <br />
value 要保存的信息，可以是EL表达式或常量 否&nbsp; <br />
target 需要修改属性的变量名，一般为javabean的实例 否 无 <br />
property 需要修改的javabean属性 否 无 <br />
var 需要保存信息的变量 否 无 <br />
scope 保存信息的变量的范围 否 page </p>
<p><br />
如果指定了target属性, 那么property属性也必须指定。<br />
例子： <br />
&lt;c:set value="${test.testinfo}" var="test2" scope=&#8221;session&#8221; /&gt; </p>
<p><br />
将test.testinfo的值保存到session的test2中，其中test是一个javabean的实例，testinfo是test对象的属性。</p>
<p>&lt;c:set target="${cust.address}" property="city" value="${city}"/&gt; </p>
<p><br />
将对象cust.address的city属性值保存到变量city中</p>
<p>&lt;c:remove&gt;<br />
&lt;c:remove&gt;标签用于删除数据，它有如下属性 <br />
属 性 描 述 是否必须 缺省值 <br />
var 要删除的变量 是 无 <br />
scope 被删除变量的范围 否 所有范围，包括page、request、session、application等 </p>
<p><br />
例子: <br />
&lt;c:remove var="test2" scope="session"/&gt; </p>
<p><br />
从session中删除test2变量。</p>
<p>2、 流控制标签</p>
<p>&lt;c:if&gt;</p>
<p>&lt;c:if&gt;标签有如下属性 <br />
属 性 描 述 是否必须 缺省值 <br />
test 需要评价的条件，相当于if (...){}语句中的条件 是 无 <br />
var 要求保存条件结果的变量名 否 无 <br />
scope 保存条件结果的变量范围 否 page </p>
<p>&nbsp;</p>
<p>&lt;c:choose&gt;<br />
这个标签不接受任何属性</p>
<p>&lt;c:when&gt;<br />
&lt;c:when&gt;标签有以下属性 <br />
属 性 描 述 是否必须 缺省值 <br />
test 需要评价的条件 是 无 </p>
<p>&nbsp;</p>
<p>&lt;c:otherwise&gt;<br />
这个标签同样不接受任何属性</p>
<p>例子： <br />
&lt;c:if test="${user.wealthy}"&gt;<br />
user.wealthy is true.<br />
&lt;/c:if&gt; </p>
<p><br />
如果user.wealthy值true，则显示user.wealthy is true.</p>
<p><br />
&lt;c:choose&gt;<br />
&lt;c:when test="${user.generous}"&gt;<br />
user.generous　is true.<br />
&lt;/c:when&gt; <br />
&lt;c:when test="${user.stingy}"&gt;<br />
user.stingy is true.<br />
&lt;/c:when&gt;<br />
&lt;c:otherwise&gt;<br />
user.generous and user.stingy are false.<br />
&lt;/c:otherwise&gt;<br />
&lt;/c:choose&gt; </p>
<p><br />
只有当条件user.generous返回值是true时，才显示user.generous　is true.<br />
只有当条件user.stingy返回值是true时，才显示user.stingy　is true.<br />
其它所有的情况（即user.generous和user.stingy的值都不为true）全部显示user.generous and user.stingy are false.</p>
<p>由于JSTL没有形如if (){&#8230;} else {&#8230;}的条件语句，所以这种形式的语句只能用&lt;c:choose&gt;、&lt;c:when&gt;和&lt;c:otherwise&gt;标签共同来完成了。</p>
<p>3、 循环控制标签</p>
<p>&lt;c:forEach&gt;<br />
&lt;c:forEach&gt;标签用于通用数据，它有以下属性 <br />
属 性 描 述 是否必须 缺省值 <br />
items 进行循环的项目 否 无 <br />
begin 开始条件 否 0 <br />
end 结束条件 否 集合中的最后一个项目 <br />
step 步长 否 1 <br />
var 代表当前项目的变量名 否 无 <br />
varStatus 显示循环状态的变量 否 无 </p>
<p>&nbsp;</p>
<p>例子： <br />
&lt;c:forEach items="${vectors}" var="vector"&gt;<br />
&lt;c:out value="${vector}"/&gt;<br />
&lt;/c:forEach&gt; </p>
<p><br />
相当于java语句 <br />
for (int i=0;i&lt;vectors.size();i++) {<br />
out.println(vectors.get(i));<br />
} </p>
<p><br />
在这里vectors是一个java.util.Vector对象，里面存放的是String数据，vector是当前循环条件下String对象。实际上这里的vectors可以是任何实现了java.util. Collection接口的对象。 </p>
<p>&lt;c:forEach begin="0" end="100" var="i" step="1"&gt;<br />
count=&lt;c:out value="${i}"/&gt;&lt;br&gt;<br />
&lt;/c:forEach&gt;<br />
&nbsp;</p>
<p><br />
输出:<br />
count=0<br />
...<br />
count=100</p>
<p>&lt;c:forTokens&gt;<br />
&lt;c:forTokens&gt;标签有以下属性 <br />
属 性 描 述 是否必须 缺省值 <br />
items 进行循环的项目 是 无 <br />
delims 分割符 是 无 <br />
begin 开始条件 否 0 <br />
end 结束条件 否 集合中的最后一个项目 <br />
step 步长 否 1 <br />
var 代表当前项目的变量名 否 无 <br />
varStatus 显示循环状态的变量 否 无 </p>
<p>&nbsp;</p>
<p>例子 </p>
<p>&lt;c:forTokens items="a:b:c:d" delims=":" var="token"&gt;<br />
&lt;c:out value="${token}"/&gt;<br />
&lt;/c:forTokens&gt;<br />
&nbsp;</p>
<p><br />
这个标签的使用相当于java.util.StringTokenizer类。在这里将字符串a:b:c:d以：分开循环四次，token是循环到当前分割到的字符串。</p>
<p>4.导入文件和URL</p>
<p>JSTL核心标签库支持使用&lt;c:import&gt;来包含文件，使用&lt;c:url&gt;来打印和格式化URL,使用&lt;c:redirect&gt;来重定向URL。</p>
<p>&lt;c:import&gt;<br />
&lt;c:import&gt;标签包含另外一个页面代码到当前页，它有以下属性 <br />
属 性 描 述 是否必须 缺省值 <br />
url 需要导入页面的url 是 无 <br />
context /后跟本地web应用程序的名字 否 当前应用程序 <br />
charEncoding 用于导入数据的字符集 否 ISO-8859-1 <br />
var 接受导入文本的变量名 否 page <br />
scope 接受导入文本的变量的变量范围 否 1 <br />
varReader 用于接受导入文本的java.io.Reader变量名 否 无 <br />
varStatus 显示循环状态的变量 否 无 </p>
<p>&nbsp;</p>
<p>&lt;c:url&gt;<br />
&lt;c:url&gt;标签输出一个url地址，它有以下属性 <br />
属 性 描 述 是否必须 缺省值 <br />
url url地址 是 无 <br />
context /后跟本地web应用程序的名字 否 当前应用程序 <br />
charEncoding 用于导入数据的字符集 否 ISO-8859-1 <br />
var 接受处理过的url变量名，该变量存储url 否 输出到页 <br />
scope 存储url的变量名的变量范围 否 page </p>
<p>&nbsp;</p>
<p>例子： </p>
<p>&lt;c:import url="http://www.url.com/edit.js" var="newsfeed"/&gt;<br />
&nbsp;</p>
<p><br />
将url http://www.url.com/edit.js包含到当前页的当前位置，并将url保存到newsfeed变量中 </p>
<p>&lt;a href="&lt;c:url url="/index.jsp"/&gt;"/&gt;<br />
&nbsp;</p>
<p><br />
在当前页的当前位置输出&lt;a href="http://www.yourname.com/index.jsp"/&gt;，http://www.yourname.com是当前页的所在的位置。</p>
<p><br />
&lt;c:redirect&gt;<br />
&lt;c:redirect&gt;标签将请求重新定向到另外一个页面，它有以下属性 <br />
属 性 描 述 是否必须 缺省值 <br />
url url地址 是 无 <br />
context /后跟本地web应用程序的名字 否 当前应用程序 </p>
<p><br />
例子： </p>
<p>&lt;c:redirect url="http://www.yourname.com/login.jsp"/&gt;<br />
&nbsp;</p>
<p><br />
将请求重新定向到http://www.yourname.com/login.jsp页，相当于response.setRedirect("http://www.yourname.com/login.jsp");</p>
<p>&lt;c:param&gt;<br />
&lt;c:param&gt;标签用来传递参数给一个重定向或包含页面，它有以下属性 <br />
属 性 描 述 是否必须 缺省值 <br />
name 在request参数中设置的变量名 是 无 <br />
value 在request参数中设置的变量值 否 无 </p>
<p><br />
例子： </p>
<p>&lt;c:redirect url="login.jsp"&gt;<br />
&lt;c:param name="id" value="888"/&gt;<br />
&lt;/c:redirect&gt;<br />
&nbsp;</p>
<p><br />
将参数888以id为名字传递到login.jsp页面，相当于login.jsp?id=888</p>
<p><br />
JSTL的优点<br />
1、 在应用程序服务器之间提供了一致的接口，最大程序地提高了WEB应用在各应用服务器之间的移植。<br />
2、 简化了JSP和WEB应用程序的开发。<br />
3、 以一种统一的方式减少了JSP中的scriptlet代码数量，可以达到没有任何scriptlet代码的程序。在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。<br />
4、 允许JSP设计工具与WEB应用程序开发的进一步集成。相信不久就会有支持JSTL的IDE开发工具出现。</p>
<p>总结<br />
上面介绍的仅仅是JSTL的一部分，如果有时间我会继续把其它部分写出来分享给大家。如果要使用JSTL，则必须将jstl.jar和standard.jar文件放到classpath中，如果你还需要使用XML processing及Database access (SQL)标签，还要将相关JAR文件放到classpath中，这些JAR文件全部存在于下载回来的zip文件中。这个zip文件可以从http://jakarta.apache.org/builds/jakarta-taglibs/releases/standard/jakarta-taglibs-standard-1.0.zip下载。</p>
<p>参考资料<br />
1、 http://java.sun.com/products/jsp/jstl/<br />
sun公司的JSTL站点<br />
2、 http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html<br />
jakarta小组的JSTL站点<br />
3、 http://www.manning.com/bayern/appendixA.pdf<br />
JSTL的参考文档，本文很多内容都是从这个PDF文件里翻译的。</p>
<p>jstl入门经典<br />
JSTL 入门：表达式语言--http://www-900.ibm.com/developerWorks/cn/java/j-jstl0211/index.shtml </p>
<p>JSTL 入门：探讨 core--http://www-900.ibm.com/developerWorks/cn/java/j-jstl0318/ </p>
<p>JSTL 入门：表示就是一切--http://www-900.ibm.com/developerWorks/cn/java/j-jstl0415/ </p>
<p>JSTL 入门,第4部分：? 访问SQL和XML内容 --http://www-900.ibm.com/developerWorks/cn/java/j-jstl0520/<br />
&nbsp;</p>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/zqb126/aggbug/316321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqb126/" target="_blank">冥王子</a> 2010-03-23 15:30 <a href="http://www.blogjava.net/zqb126/archive/2010/03/23/316321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>