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