You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ol...@apache.org on 2020/04/09 23:05:15 UTC

[tomcat-taglibs-standard] tag standard-105 created (now a6ffb63)

This is an automated email from the ASF dual-hosted git repository.

olamy pushed a change to tag standard-105
in repository https://gitbox.apache.org/repos/asf/tomcat-taglibs-standard.git.


      at a6ffb63  (commit)
This tag includes the following new commits:

     new 09b9dd7  This commit was manufactured by cvs2svn to create tag 'standard-105'.
     new a6ffb63  Moving the Standard taglib over to Tomcat

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


[tomcat-taglibs-standard] 02/02: Moving the Standard taglib over to Tomcat

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olamy pushed a commit to tag standard-105
in repository https://gitbox.apache.org/repos/asf/tomcat-taglibs-standard.git

commit a6ffb63dfdf3d800308a93372537ef5a0e7f9884
Author: Henri Yandell <ba...@apache.org>
AuthorDate: Mon Aug 17 04:16:09 2009 +0000

    Moving the Standard taglib over to Tomcat


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


[tomcat-taglibs-standard] 01/02: This commit was manufactured by cvs2svn to create tag 'standard-105'.

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olamy pushed a commit to tag standard-105
in repository https://gitbox.apache.org/repos/asf/tomcat-taglibs-standard.git

commit 09b9dd7c7bd5601779bcf06e2c933efb34da8d98
Author: no_author <de...@apache.org>
AuthorDate: Mon Jan 26 23:24:52 2004 +0000

    This commit was manufactured by cvs2svn to create tag 'standard-105'.
---
 build.xml                                          |   4 +-
 doc/web/ReleaseNotes.html                          |  96 +++++++++++-
 examples/conf/jstl-examples.tld                    |  37 +++++
 .../jsptl/examples/taglib/DefaultLocaleTag.java    |  38 ++---
 .../taglibs/jsptl/examples/taglib/LocalesTag.java  |  71 ++++++---
 examples/web/format/Demo.jsp                       | 116 ++++++++++++++
 examples/web/format/index.html                     |   3 +
 examples/web/index.html                            |   3 +-
 examples/web/iterators/Extensability.jsp           |  45 ++++++
 examples/web/iterators/index.html                  |   9 +-
 .../jsp/jstl/core/ConditionalTagSupport.java       |   4 +-
 src/javax/servlet/jsp/jstl/core/Config.java        |  13 +-
 src/javax/servlet/jsp/jstl/sql/ResultImpl.java     |  13 +-
 src/org/apache/taglibs/standard/Version.java       | 169 +++++++++++++++++++++
 .../standard/tag/common/core/OutSupport.java       |   1 +
 .../tag/common/fmt/FormatNumberSupport.java        |   7 +-
 .../standard/tag/common/fmt/MessageSupport.java    |  40 +++--
 .../standard/tag/common/fmt/SetLocaleSupport.java  |   4 +-
 .../standard/tag/common/sql/QueryTagSupport.java   |   1 +
 .../taglibs/standard/tag/el/fmt/MessageTag.java    |  18 +--
 .../taglibs/standard/tag/rt/fmt/MessageTag.java    |   4 +-
 .../apache/taglibs/standard/tlv/JstlBaseTLV.java   |  47 +++---
 .../apache/taglibs/standard/tlv/JstlCoreTLV.java   |  10 +-
 .../apache/taglibs/standard/tlv/JstlFmtTLV.java    |  10 +-
 .../apache/taglibs/standard/tlv/JstlSqlTLV.java    |  13 +-
 .../apache/taglibs/standard/tlv/JstlXmlTLV.java    |  10 +-
 xml/intro.xml                                      |  35 +++--
 27 files changed, 678 insertions(+), 143 deletions(-)

diff --git a/build.xml b/build.xml
index 80a6e6b..b3eaffd 100644
--- a/build.xml
+++ b/build.xml
@@ -3,7 +3,7 @@
     <!-- ******************** Adjustable Properties *********************** -->
 
     <!-- Version Number -->
-    <property name="standard-version" value="1.0.3" />
+    <property name="standard-version" value="1.0.5" />
 
     <!-- Now bundle with JAXP 1.2 -->
     <property name="isJaxp12" value="true" />
@@ -52,7 +52,7 @@
     <!-- Make sure required dependencies are available -->
     <antcall target="checkRequiredFile">
        <param name="file" value="${servlet23.jar}"/>
-       <param name="fail.message" value="A jar file containing the Servlet 2.3 and JSP1.2 classes is required to compile the Standard Taglib.  Please define the property servlet23.jar in your build.properties file and ensure that the file exists."/>
+       <param name="fail.message" value="A jar file containing the Servlet 2.3 and JSP1.2 classes is required to compile the Standard Taglib.  ${servlet23.jar}  Please define the property servlet23.jar in your build.properties file and ensure that the file exists."/>
     </antcall>
     <antcall target="checkRequiredFile">
        <param name="file" value="${jdbc2_0-stdext.jar}"/>     
diff --git a/doc/web/ReleaseNotes.html b/doc/web/ReleaseNotes.html
index d4e761b..2fe8a64 100644
--- a/doc/web/ReleaseNotes.html
+++ b/doc/web/ReleaseNotes.html
@@ -9,24 +9,65 @@
 <h1>
 Standard: An Implementation of the JSP&#153; Standard Tag Library (JSTL)<br>
 <p>
-Version: 1.0.4-dev (In Development)<br>
+Version: 1.0.5<br>
 Release Notes
 </h1>
 </center>
 
-<p>The Standard 1.0.4-dev release is a minor update to the Standard 1.0.3
+<p>The Standard 1.0.5 release is a minor update to the Standard 1.0.4
 release, which builds on the Standard 1.0 FCS release, an 
 implementation of the final <a href="http://java.sun.com/products/jstl">JSTL 1.0 Specification</a>. The Standard
-1.0.4-dev release includes many bug fixes and updates. An official release of
-JSTL 1.0.4 should happen once important bugs have been fixed and the release is
-stable.</p>
+1.0.5 release includes many bug fixes and updates.</p>
 
 <p>The Standard Taglib, which is hosted at Apache, is used as the source repository for the <a href="http://java.sun.com/products/jstl">JSTL 1.0 reference implementation</a> supplied by Sun Microsystems, Inc.</p>
 <hr/>
 
 <h2>Release History</h2>
 
-<dt><b>As of Today &#149; Standard 1.0.4-dev nightly</b></dt>
+<dt><b>Somewhere in  2004 &#149; Standard 1.0.5</b></dt>
+<p><dd>Bugs fixed since Standard 1.0.4 Taglib release:</dd>
+<ul>
+  <blockquote>
+    <table width="95%" border="1">
+      <tr>
+        <th width="27%">
+          <div align="center">Bug Id</div>
+        </th>
+        <th width="73%">Summary</th>
+      </tr>
+      <tr>
+        <td width="27%" height="15">
+          <div align="center"><a
+href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=15703">15703</a></div>
+        </td>
+        <td width="73%" height="15">Illegal scope attribute without var in "fmt:setLocale" tag</td>
+      </tr>
+      <tr>
+        <td width="27%" height="15">
+          <div align="center"><a
+href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=24892">24892</a></div>
+        </td>
+        <td width="73%" height="15">ResultImpl should implement java.io.Serializable</td>
+      </tr>
+      <tr>
+        <td width="27%" height="15">
+          <div align="center"><a
+href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=25637">25637</a></div>
+        </td>
+        <td width="73%" height="15">IteratorTagSupport example is missing </td>
+      </tr>
+    </table>
+  </blockquote>
+</ul>
+
+<blockquote> 
+  <p>Other changes and additions:</p>
+  <ul>
+    <li>Regarding bug #24892, it's important to note that relying on the serializability of Result objects might not be portable across different implementations of the JSTL spec. Also, ResultImpl will be serializable only if the values returned by the ResultSet are serializable too, which depends on the JDBC driver being used.
+  </ul>
+</blockquote>
+
+<dt><b>September 2003 &#149; Standard 1.0.4</b></dt>
 <p><dd>Bugs fixed since Standard 1.0.3 Taglib release:</dd>
 <ul>
   <blockquote>
@@ -40,20 +81,59 @@ stable.</p>
       <tr>
         <td width="27%" height="15">
           <div align="center"><a
-href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=16069">16912</a></div>
+href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=16912">16912</a></div>
         </td>
         <td width="73%" height="15">
         We take advantage of the new method URLEncoder.encode(String,String) if running on J2SE 1.4.
         &lt;c:param&gt; will then use the proper encoding.
         </td>
       </tr>
+      <tr>
+        <td width="27%" height="15">
+          <div align="center"><a
+href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=17440">17440</a></div>
+        </td>
+        <td width="73%" height="15">
+        Resource bundle that only differs with the variant of the locale will
+now be properly selected.
+        </td>
+      </tr>
+      <tr>
+        <td width="27%" height="15">
+          <div align="center"><a
+href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20197">20197</a></div>
+        </td>
+        <td width="73%" height="15">
+<sql:setDataSource> did not allow the specification of a scope without
+a var attribute to set the SQl DataSource configuration setting. Fixed.
+        </td>
+      </tr>    
+      <tr>
+        <td width="27%" height="15">
+          <div align="center"><a
+href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=22034">22034</a></div>
+        </td>
+        <td width="73%" height="15">
+Page scope not properly set with &lt;c:if&gt;. Fixed.
+        </td>
+      </tr>    
+      <tr>
+        <td width="27%" height="15">
+          <div align="center"><a
+href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=21188">21188</a></div>
+        </td>
+        <td width="73%" height="15">
+Config.find() fails on invalidated sessions. Fixed.
+        </td>
+      </tr>    
     </table>
   </blockquote>
 </ul>
+
 <blockquote> 
   <p>Other changes and additions:</p>
   <ul>
-    <li>TBD</li>
+    <li>Added Version class to easily tell the version of the jar file.</li>
   </ul>
 </blockquote>
 
diff --git a/examples/conf/jstl-examples.tld b/examples/conf/jstl-examples.tld
index aa83751..5f4a1fc 100644
--- a/examples/conf/jstl-examples.tld
+++ b/examples/conf/jstl-examples.tld
@@ -9,6 +9,43 @@
   <uri>/jstl-examples-taglib</uri>
 
   <tag>
+    <name>defaultLocale</name>
+    <tag-class>org.apache.taglibs.standard.examples.taglib.DefaultLocaleTag</tag-class>
+    <body-content>JSP</body-content>
+  </tag>
+
+  <tag>
+    <name>locales</name>
+    <tag-class>org.apache.taglibs.standard.examples.taglib.LocalesTag</tag-class>
+    <body-content>JSP</body-content>
+    <attribute>
+        <name>var</name>
+        <required>required</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>varStatus</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>varTotal</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>begin</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>end</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
     <name>escapeHtml</name>
     <tag-class>org.apache.taglibs.standard.examples.taglib.EscapeHtmlTag</tag-class>
     <body-content>JSP</body-content>
diff --git a/src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java b/examples/src/org/apache/taglibs/jsptl/examples/taglib/DefaultLocaleTag.java
similarity index 74%
copy from src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java
copy to examples/src/org/apache/taglibs/jsptl/examples/taglib/DefaultLocaleTag.java
index 202b2b1..40b0903 100644
--- a/src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java
+++ b/examples/src/org/apache/taglibs/jsptl/examples/taglib/DefaultLocaleTag.java
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights 
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -53,34 +53,28 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.rt.fmt;
+package org.apache.taglibs.standard.examples.taglib;
 
-import javax.servlet.jsp.*;
-import javax.servlet.jsp.tagext.*;
-import javax.servlet.jsp.jstl.fmt.LocalizationContext;
-import org.apache.taglibs.standard.tag.common.fmt.*;
+import java.util.Locale;
+import javax.servlet.jsp.jstl.core.ConditionalTagSupport;
+import javax.servlet.jsp.JspTagException;
 
 /**
- * <p>A handler for &lt;message&gt; that supports rtexprvalue-based
- * attributes.</p>
+ * <p>Tag handler for &lt;locales&gt;
  *
- * @author Jan Luehe
+ * @author Felipe Leme <js...@felipeal.net>
+ * @version $Revision$ $Date$
  */
 
-public class MessageTag extends MessageSupport {
+public class DefaultLocaleTag extends ConditionalTagSupport {
 
-    //*********************************************************************
-    // Accessor methods
+  private static final Locale defaultLocale = Locale.getDefault();
 
-    // for tag attribute
-    public void setKey(String key) throws JspTagException {
-        this.key = key;
-	this.keySpecified = true;
-    }
-
-    // for tag attribute
-    public void setBundle(LocalizationContext locCtxt) throws JspTagException {
-        this.locCtxt = locCtxt;
-        this.bundleSpecified = true;
+  public boolean condition() throws JspTagException {   
+    LocalesTag localesTag = (LocalesTag) findAncestorWithClass( this, LocalesTag.class );
+    if ( localesTag == null ) {
+      throw new JspTagException( "defaultLocale bust be inside locales");
     }
+    return localesTag.getCurrent().equals( defaultLocale );
+   }
 }
diff --git a/src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java b/examples/src/org/apache/taglibs/jsptl/examples/taglib/LocalesTag.java
similarity index 60%
copy from src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java
copy to examples/src/org/apache/taglibs/jsptl/examples/taglib/LocalesTag.java
index 202b2b1..28e7250 100644
--- a/src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java
+++ b/examples/src/org/apache/taglibs/jsptl/examples/taglib/LocalesTag.java
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights 
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -53,34 +53,61 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.rt.fmt;
+package org.apache.taglibs.standard.examples.taglib;
 
-import javax.servlet.jsp.*;
-import javax.servlet.jsp.tagext.*;
-import javax.servlet.jsp.jstl.fmt.LocalizationContext;
-import org.apache.taglibs.standard.tag.common.fmt.*;
+import java.util.Locale;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.jstl.core.LoopTagSupport;
+
+import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
 
 /**
- * <p>A handler for &lt;message&gt; that supports rtexprvalue-based
- * attributes.</p>
+ * <p>Tag handler for &lt;locales&gt;
  *
- * @author Jan Luehe
+ * @author Felipe Leme <js...@felipeal.net>
+ * @version $Revision$ $Date$
  */
+public class LocalesTag extends LoopTagSupport {
 
-public class MessageTag extends MessageSupport {
-
-    //*********************************************************************
-    // Accessor methods
+    private static final Locale[] locales = Locale.getAvailableLocales();
+    private int pointer; 
+    private String varTotal;
+    private String endEL;
+    private String beginEL;
 
-    // for tag attribute
-    public void setKey(String key) throws JspTagException {
-        this.key = key;
-	this.keySpecified = true;
+    public void setVarTotal( String value ) {
+	varTotal = value;
     }
-
-    // for tag attribute
-    public void setBundle(LocalizationContext locCtxt) throws JspTagException {
-        this.locCtxt = locCtxt;
-        this.bundleSpecified = true;
+    public void prepare() {
+	pointer = 0;
+	try {
+	    begin = ( (Integer) ExpressionEvaluatorManager.evaluate( "begin", beginEL, Integer.class,
+								     this, super.pageContext )).intValue();
+	    end = ( (Integer) ExpressionEvaluatorManager.evaluate( "end", endEL, Integer.class,
+								   this, super.pageContext )).intValue();
+	} catch( JspException exc ) {
+	    System.err.println( "Exception evaluating  EL expressions: beginEL = " + beginEL +
+				", endEL = " + endEL );
+	    begin = end = -1;
+	    exc.printStackTrace();
+	}
+	if ( varTotal!=null && varTotal.length()>0 ) {
+	    pageContext.setAttribute( varTotal, new Integer(locales.length) );
+	}
+    
+    } 
+    public boolean hasNext() {
+	return pointer < locales.length;
+    }  
+    public Object next() {
+	return locales[ pointer++ ];
+    }
+  
+    public void setBegin( String value ) {
+  	beginEL = value;
     }
+  
+    public void setEnd( String value ) {
+  	endEL = value;
+    }                     
 }
diff --git a/examples/web/format/Demo.jsp b/examples/web/format/Demo.jsp
new file mode 100644
index 0000000..60fe24e
--- /dev/null
+++ b/examples/web/format/Demo.jsp
@@ -0,0 +1,116 @@
+<%@ page import="javax.servlet.jsp.jstl.core.Config, java.util.*" %>
+
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
+
+<html>
+<head>
+  <title>JSTL: Formatting/I18N Support -- Demo Example</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<h3>Demo</h3>
+
+<c:if test="${!empty param.locale}">
+  <fmt:setLocale value="${param.locale}" scope="page"/>
+</c:if>
+
+<c:if test="${!empty param.fallback}">
+  <% Config.set(request, Config.FMT_FALLBACK_LOCALE, request.getParameter("fallback")); %>
+</c:if>
+
+<table>
+<tr>
+  <td><b>Set application-based locale:</b></td>
+  <td>
+<a href='?locale=en&fallback=<c:out value="${param.fallback}"/>'>English</a> &#149;
+<a href='?locale=fr&fallback=<c:out value="${param.fallback}"/>'>French</a> &#149;
+<a href='?locale=de&fallback=<c:out value="${param.fallback}"/>'>German</a> &#149;
+<a href='?locale=it&fallback=<c:out value="${param.fallback}"/>'>Italian</a> &#149;
+<a href='?locale=es&fallback=<c:out value="${param.fallback}"/>'>Spanish (no bundle)</a> &#149;
+<a href='?locale=&fallback=<c:out value="${param.fallback}"/>'>None</a>
+  </td>
+</tr>
+<tr>
+  <td align="right"><b>Set fallback locale:</b></td>
+  <td>
+<a href='?locale=<c:out value="${param.locale}"/>&fallback=en'>English</a> &#149;
+<a href='?locale=<c:out value="${param.locale}"/>&fallback=fr'>French</a> &#149;
+<a href='?locale=<c:out value="${param.locale}"/>&fallback=de'>German</a> &#149;
+<a href='?locale=<c:out value="${param.locale}"/>&fallback=it'>Italian</a> &#149;
+<a href='?locale=<c:out value="${param.locale}"/>&fallback=es'>Spanish (no bundle)</a> &#149;
+<a href='?locale=<c:out value="${param.locale}"/>&fallback='>None</a>
+  </td>
+</table>
+<p>
+
+Request parameter "locale": <c:out value="${param.locale}"/><br>
+<i>(This value is used to set the application based locale for this example)</i>
+<p>
+
+Application based locale: <%=Config.find(pageContext, Config.FMT_LOCALE)%><br>
+<i>(javax.servlet.jsp.jstl.fmt.locale configuration setting)</i>
+<p>
+
+Browser-Based locales: 
+<% 
+  Enumeration enum = request.getLocales();
+  while (enum.hasMoreElements()) {
+    Locale locale = (Locale)enum.nextElement();
+    out.print(locale);
+    out.print(" ");
+  }
+%>
+<br>
+<i>(ServletRequest.getLocales() on the incoming request)</i>
+<p>
+
+Fallback locale: <%=Config.find(pageContext, Config.FMT_FALLBACK_LOCALE)%><br>
+<i>(javax.servlet.jsp.jstl.fmt.fallbackLocale configuration setting)</i>
+<p>
+
+<jsp:useBean id="now" class="java.util.Date" />
+<h4>
+<fmt:formatDate value="${now}" dateStyle="full"/> &#149;
+<fmt:formatDate value="${now}" type="time"/>
+</h4>
+
+<p>
+
+<fmt:bundle basename="org.apache.taglibs.standard.examples.i18n.Resources">
+<table cellpadding="5" border="1">
+  <tr>
+    <th align="left">KEY</th>
+    <th align="left">VALUE</th>
+  </tr>
+  <tr>
+    <td>greetingMorning</td>
+    <td><fmt:message key="greetingMorning"/></td>
+  </tr>
+  <tr>
+    <td>greetingEvening</td>
+    <td><fmt:message key="greetingEvening"/></td>
+  </tr>
+  <tr>
+    <td>currentTime</td>
+    <td>
+      <fmt:message key="currentTime">
+        <fmt:param value="${now}"/>
+      </fmt:message>
+    </td>
+  </tr>
+  <tr>
+    <td>serverInfo</td>
+    <td><fmt:message key="serverInfo"/></td>
+  </tr>
+  <tr>
+    <td>undefinedKey</td>
+    <td><fmt:message key="undefinedKey"/></td>
+  </tr>
+</table>
+</fmt:bundle>
+
+<p>
+
+</body>
+</html>
diff --git a/examples/web/format/index.html b/examples/web/format/index.html
index 7326505..60931a6 100644
--- a/examples/web/format/index.html
+++ b/examples/web/format/index.html
@@ -28,6 +28,9 @@
 </table>
 <!-- #BeginEditable "body" --> 
 <h2>I18N-Capable Formatting Tags Examples</h2>
+<h3>Demo <a href="../ShowSource.jsp?filename=/format/Demo.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="Demo.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
+Overview demo where the locale to be applied to the page may be changed dynamically.<br>
 <h3>German&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/GermanLocale.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="GermanLocale.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
diff --git a/examples/web/index.html b/examples/web/index.html
index 7166f11..a1054c1 100644
--- a/examples/web/index.html
+++ b/examples/web/index.html
@@ -33,7 +33,8 @@
 <p>The <a href="http://www.jcp.org/aboutJava/communityprocess/review/jsr052/index.html">JSTL 
   1.0 Specification</a> developed by the JSR052 expert group under the <a href="http://www.jcp.org">Java 
   Community Process</a> is a complete JSTL 1.0 reference.</p>
-<p>Documentation on the JSTL tags is available at <a href="http://jakarta.apache.org/taglibs/doc/standard-doc">http://jakarta.apache.org/taglibs/doc/standard-doc</a>. 
+<p>Documentation on the JSTL tags is available at <a
+href="http://jakarta.apache.org/taglibs/doc/standard-1.0-doc">http://jakarta.apache.org/taglibs/doc/standard-doc</a>. 
   It is also available as the standard-doc web application of the standard taglib 
   release. 
 <h3>Mailing Lists</h3>
diff --git a/examples/web/iterators/Extensability.jsp b/examples/web/iterators/Extensability.jsp
new file mode 100644
index 0000000..c642dcd
--- /dev/null
+++ b/examples/web/iterators/Extensability.jsp
@@ -0,0 +1,45 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
+<%@ taglib prefix="ex" uri="/jstl-examples-taglib" %>
+
+
+<c:set var="first"><c:out value="${param['first']}" default="1"/></c:set>
+<c:set var="pageSize"><c:out value="${param['pageSize']}" default="30"/></c:set>
+<c:set var="last" value="${first+pageSize-1}"/>
+
+<c:if test="${first != 1}">
+   <c:url var="prevURL" value="Extensability.jsp">
+      <c:param name="first" value="${first - pageSize}"/>
+   </c:url>
+</c:if>
+
+<c:url var="nextURL" value="Extensability.jsp">
+      <c:param name="first" value="${last+1}"/>
+</c:url>
+
+<table><tr><th>#</th></th><th>Code</th><th colspan="2" align="left">Name</th></tr>
+<ex:locales var="locale" varStatus="status" varTotal="total" begin="${first}" end="${last}">
+   <tr>
+      <td><c:out value="${status.index}"/></td>
+      <td><c:out value="${locale}"/></td>
+      <td><c:out value="${locale.displayName}"/></td>
+      <td><ex:defaultLocale><b>(default locale)</b></ex:defaultLocale></td>
+   </tr>
+</ex:locales>
+</table>
+
+<c:if test="${last > total}">
+   <c:set var="last" value="${total}"/>
+   <c:remove var="nextURL"/>
+</c:if>
+
+<br>
+Showing locales <c:out value="${first}"/> to <c:out value="${last}"/> of <c:out value="${total}"/><br>
+<br>
+<c:if test="${not empty prevURL}">
+<a href="<c:out value="${prevURL}"/>">previous</a>&nbsp;&nbsp;&nbsp;
+</c:if>
+<c:if test="${not empty nextURL}">
+<a href="<c:out value="${nextURL}"/>">next</a>&nbsp;&nbsp;&nbsp;
+</c:if>
+<br>
+
diff --git a/examples/web/iterators/index.html b/examples/web/iterators/index.html
index 385e830..898f59d 100644
--- a/examples/web/iterators/index.html
+++ b/examples/web/iterators/index.html
@@ -57,11 +57,12 @@ Simply displays the default <code>toString()</code> value of the items in the
   is a specialization for the handling of Strings of tokens. Essentially the same 
   as &lt;forEach&gt;, except that it only applies to Strings of tokens and that 
   it has an extra attribute &quot;delims&quot; to specify the token delimiter.</p>
-<h3>Extensibility&nbsp;&nbsp;&nbsp;(ToBeDone)</h3>
-<p>JSTL exposes in its API the abstract class IteratorTagSupport to facilitate 
+<h3>Extensibility&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/iterators/Extensability.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>&nbsp;<a href="Extensability.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
+<p>JSTL exposes in its API the abstract class LoopTagSupport to facilitate 
   the implementation of custom iterator tags that leverage the standard iteration 
-  behavior defined in JSTL. This example shows a custom iterator tag that ...</p>
-<!-- #EndEditable --> 
+  behavior defined in JSTL. This example shows a custom iterator tag that shows all Locale objects available in the server and a custom conditional sub-tag that
+  display the default locale.</p>
+<!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
diff --git a/src/javax/servlet/jsp/jstl/core/ConditionalTagSupport.java b/src/javax/servlet/jsp/jstl/core/ConditionalTagSupport.java
index 1146ac0..6dac3a2 100644
--- a/src/javax/servlet/jsp/jstl/core/ConditionalTagSupport.java
+++ b/src/javax/servlet/jsp/jstl/core/ConditionalTagSupport.java
@@ -166,7 +166,9 @@ public abstract class ConditionalTagSupport
      * @param scope Scope of the 'var' attribute
      */
     public void setScope(String scope) {
-	if (scope.equalsIgnoreCase("request"))
+	if (scope.equalsIgnoreCase("page"))
+	    this.scope = PageContext.PAGE_SCOPE;
+	else if (scope.equalsIgnoreCase("request"))
 	    this.scope = PageContext.REQUEST_SCOPE;
 	else if (scope.equalsIgnoreCase("session"))
 	    this.scope = PageContext.SESSION_SCOPE;
diff --git a/src/javax/servlet/jsp/jstl/core/Config.java b/src/javax/servlet/jsp/jstl/core/Config.java
index f98274a..7406566 100644
--- a/src/javax/servlet/jsp/jstl/core/Config.java
+++ b/src/javax/servlet/jsp/jstl/core/Config.java
@@ -142,7 +142,7 @@ public class Config {
 	case PageContext.REQUEST_SCOPE:
 	    return pc.getAttribute(name + REQUEST_SCOPE_SUFFIX, scope);
 	case PageContext.SESSION_SCOPE:
-	    return pc.getAttribute(name + SESSION_SCOPE_SUFFIX, scope);
+	    return get(pc.getSession(), name);
 	case PageContext.APPLICATION_SCOPE:
 	    return pc.getAttribute(name + APPLICATION_SCOPE_SUFFIX, scope);
 	default:
@@ -180,10 +180,17 @@ public class Config {
      * @param name Configuration variable name
      *
      * @return The <tt>java.lang.Object</tt> associated with the configuration
-     * variable, or null if it is not defined.
+     * variable, or null if it is not defined, if session is null, or if the session
+     * is invalidated. 
      */
     public static Object get(HttpSession session, String name) {
-	return session.getAttribute(name + SESSION_SCOPE_SUFFIX);
+        Object ret = null;
+        if (session != null) {
+            try {
+                ret = session.getAttribute(name + SESSION_SCOPE_SUFFIX);
+            } catch (IllegalStateException ex) {} // when session is invalidated
+        }
+        return ret;
     }
 
     /**
diff --git a/src/javax/servlet/jsp/jstl/sql/ResultImpl.java b/src/javax/servlet/jsp/jstl/sql/ResultImpl.java
index 0aa1aba..ae0ff41 100644
--- a/src/javax/servlet/jsp/jstl/sql/ResultImpl.java
+++ b/src/javax/servlet/jsp/jstl/sql/ResultImpl.java
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights 
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -55,6 +55,7 @@
 
 package javax.servlet.jsp.jstl.sql;
 
+import java.io.Serializable;
 import java.sql.*;
 import java.util.*;
 
@@ -70,7 +71,7 @@ import java.util.*;
  * @author Justyna Horwat
  */
 
-class ResultImpl implements Result {
+class ResultImpl implements Result, Serializable {
     private List rowMap;
     private List rowByIndex;
     private String[] columnNames;
@@ -79,12 +80,14 @@ class ResultImpl implements Result {
     /**
      * This constructor reads the ResultSet and saves a cached
      * copy.
+     * It's important to note that this object will be serializable only
+     * if the objects returned by the ResultSet are serializable too.
      *
      * @param rs an open <tt>ResultSet</tt>, positioned before the first
      * row
-     * @param startRow, beginning row to be cached
-     * @param maxRows, query maximum rows limit
-     * @exception if a database error occurs
+     * @param startRow beginning row to be cached
+     * @param maxRows query maximum rows limit
+     * @exception java.sql.SQLException if a database error occurs
      */
     public ResultImpl(ResultSet rs, int startRow, int maxRows)
         throws SQLException 
diff --git a/src/org/apache/taglibs/standard/Version.java b/src/org/apache/taglibs/standard/Version.java
new file mode 100644
index 0000000..f7c87a9
--- /dev/null
+++ b/src/org/apache/taglibs/standard/Version.java
@@ -0,0 +1,169 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:  
+ *       "This product includes software developed by the 
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written 
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */ 
+
+package org.apache.taglibs.standard;
+
+/**
+ * [lifted from xalan]
+ * <meta name="usage" content="general"/>
+ * Administrative class to keep track of the version number of
+ * the standard tag library.
+ * <P>This class implements the upcoming standard of having
+ * org.apache.project-name.Version.getVersion() be a standard way 
+ * to get version information.  
+ */
+public class Version
+{
+  /**
+   * Get the basic version string for the current release.
+   * Version String formatted like 
+   * <CODE>"<B>standard-taglib</B> v.r[.dd| <B>D</B>nn]"</CODE>.
+   *
+   * Futurework: have this read version info from jar manifest.
+   *
+   * @return String denoting our current version
+   */
+  public static String getVersion()
+  {
+    return getProduct() + " " +
+           getMajorVersionNum() + "." + getReleaseVersionNum()+ "." +
+           getMaintenanceVersionNum() +
+           ((getDevelopmentVersionNum() > 0) ? 
+               ("_D" + getDevelopmentVersionNum()) : "");
+  }
+
+  /**
+   * Print the processor version to the command line.
+   *
+   * @param argv command line arguments, unused.
+   */
+  public static void main(String argv[])
+  {
+    System.out.println(getVersion());
+  }
+
+  /**
+   * Name of product
+   */
+  public static String getProduct()
+  {
+    return "standard-taglib";
+  }
+
+  /**
+   * Major version number.
+   * Version number. This changes only when there is a
+   *          significant, externally apparent enhancement from
+   *          the previous release. 'n' represents the n'th
+   *          version.
+   *
+   *          Clients should carefully consider the implications
+   *          of new versions as external interfaces and behaviour
+   *          may have changed.
+   */
+  public static int getMajorVersionNum()
+  {
+      return 1;
+  }
+
+  /**
+   * Release Number.
+   * Release number. This changes when:
+   *            -  a new set of functionality is to be added, eg,
+   *               implementation of a new W3C specification.
+   *            -  API or behaviour change.
+   *            -  its designated as a reference release.
+   */
+  public static int getReleaseVersionNum()
+  {
+    return 0;
+  }
+
+  /**
+   * Maintenance Drop Number.
+   * Optional identifier used to designate maintenance
+   *          drop applied to a specific release and contains
+   *          fixes for defects reported. It maintains compatibility
+   *          with the release and contains no API changes.
+   *          When missing, it designates the final and complete
+   *          development drop for a release.
+   */
+  public static int getMaintenanceVersionNum()
+  {
+    return 5;
+  }
+
+  /**
+   * Development Drop Number.
+   * Optional identifier designates development drop of
+   *          a specific release. D01 is the first development drop
+   *          of a new release.
+   *
+   *          Development drops are works in progress towards a
+   *          compeleted, final release. A specific development drop
+   *          may not completely implement all aspects of a new
+   *          feature, which may take several development drops to
+   *          complete. At the point of the final drop for the
+   *          release, the D suffix will be omitted.
+   *
+   *          Each 'D' drops can contain functional enhancements as
+   *          well as defect fixes. 'D' drops may not be as stable as
+   *          the final releases.
+   */
+  public static int getDevelopmentVersionNum()
+  {
+    return 0;
+  }
+}
diff --git a/src/org/apache/taglibs/standard/tag/common/core/OutSupport.java b/src/org/apache/taglibs/standard/tag/common/core/OutSupport.java
index 739dd86..f9a8c54 100644
--- a/src/org/apache/taglibs/standard/tag/common/core/OutSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/core/OutSupport.java
@@ -120,6 +120,7 @@ public class OutSupport extends BodyTagSupport {
     public int doStartTag() throws JspException {
 
       needBody = false;			// reset state related to 'default'
+      super.bodyContent = null;  // clean-up body (just in case container is pooling tag handlers)
 
       try {
 	// print value if available; otherwise, try 'default'
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/FormatNumberSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/FormatNumberSupport.java
index f983a9b..7901070 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/FormatNumberSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/FormatNumberSupport.java
@@ -169,7 +169,12 @@ public abstract class FormatNumberSupport extends BodyTagSupport {
 	}
 
 	if ((input == null) || input.equals("")) {
-	    // do nothing
+	    // Spec says:
+            // If value is null or empty, remove the scoped variable 
+            // if it is specified (see attributes var and scope).
+	    if (var != null) {
+	        pageContext.removeAttribute(var, scope);
+            }
 	    return EVAL_PAGE;
 	}
 
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/MessageSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/MessageSupport.java
index 00a2123..3c23bb0 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/MessageSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/MessageSupport.java
@@ -84,9 +84,9 @@ public abstract class MessageSupport extends BodyTagSupport {
     //*********************************************************************
     // Protected state
 
-    protected String key;                         // 'key' attribute
-    protected boolean keySpecified;	          // status
-    protected LocalizationContext locCtxt;        // 'bundle' attribute
+    protected String keyAttrValue;       // 'key' attribute value
+    protected boolean keySpecified;	 // 'key' attribute specified
+    protected LocalizationContext bundleAttrValue; // 'bundle' attribute value
     protected boolean bundleSpecified;   // 'bundle' attribute specified?
 
 
@@ -108,10 +108,12 @@ public abstract class MessageSupport extends BodyTagSupport {
     }
 
     private void init() {
-	key = var = null;
-	keySpecified = false;
-	locCtxt = null;
+	var = null;
 	scope = PageContext.PAGE_SCOPE;
+	keyAttrValue = null;
+	keySpecified = false;
+	bundleAttrValue = null;
+	bundleSpecified = false;
     }
 
 
@@ -144,31 +146,26 @@ public abstract class MessageSupport extends BodyTagSupport {
     // Tag logic
 
     public int doStartTag() throws JspException {
-        if (!bundleSpecified) {
-            // must reset the locCtxt to null so it can be reevaluated
-            // (necessary because the tag may be reused and localization
-            // context used for the tag may have changed).
-            locCtxt = null;
-        }
 	params.clear();
 	return EVAL_BODY_BUFFERED;
     }
 
     public int doEndTag() throws JspException {
 
-        String keyInput = null;
+        String key = null;
+	LocalizationContext locCtxt = null;
 
         // determine the message key by...
         if (keySpecified) {
 	    // ... reading 'key' attribute
-	    keyInput = key;
+	    key = keyAttrValue;
 	} else {
 	    // ... retrieving and trimming our body
 	    if (bodyContent != null && bodyContent.getString() != null)
-	        keyInput = bodyContent.getString().trim();
+	        key = bodyContent.getString().trim();
 	}
 
-	if ((keyInput == null) || keyInput.equals("")) {
+	if ((key == null) || key.equals("")) {
 	    try {
 		pageContext.getOut().print("??????");
 	    } catch (IOException ioe) {
@@ -178,7 +175,7 @@ public abstract class MessageSupport extends BodyTagSupport {
 	}
 
 	String prefix = null;
-	if (locCtxt == null) {
+	if (!bundleSpecified) {
 	    Tag t = findAncestorWithClass(this, BundleSupport.class);
 	    if (t != null) {
 		// use resource bundle from parent <bundle> tag
@@ -190,21 +187,22 @@ public abstract class MessageSupport extends BodyTagSupport {
 	    }
 	} else {
 	    // localization context taken from 'bundle' attribute
+	    locCtxt = bundleAttrValue;
 	    if (locCtxt.getLocale() != null) {
 		SetLocaleSupport.setResponseLocale(pageContext,
 						   locCtxt.getLocale());
 	    }
 	}
 
-	String message = UNDEFINED_KEY + keyInput + UNDEFINED_KEY;
+	String message = UNDEFINED_KEY + key + UNDEFINED_KEY;
 	if (locCtxt != null) {
 	    ResourceBundle bundle = locCtxt.getResourceBundle();
 	    if (bundle != null) {
 		try {
 		    // prepend 'prefix' attribute from parent bundle
 		    if (prefix != null)
-			keyInput = prefix + keyInput;
-		    message = bundle.getString(keyInput);
+			key = prefix + key;
+		    message = bundle.getString(key);
 		    // Perform parametric replacement if required
 		    if (!params.isEmpty()) {
 			Object[] messageArgs = params.toArray();
@@ -216,7 +214,7 @@ public abstract class MessageSupport extends BodyTagSupport {
 			message = formatter.format(messageArgs);
 		    }
 		} catch (MissingResourceException mre) {
-		    message = UNDEFINED_KEY + keyInput + UNDEFINED_KEY;
+		    message = UNDEFINED_KEY + key + UNDEFINED_KEY;
 		}
 	    }
 	}
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/SetLocaleSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/SetLocaleSupport.java
index 9f87c19..ae76d55 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/SetLocaleSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/SetLocaleSupport.java
@@ -235,9 +235,11 @@ public abstract class SetLocaleSupport extends TagSupport {
 	
 	// get response character encoding and store it in session attribute
 	if (pc.getSession() != null) {
-	    pc.setAttribute(RequestEncodingSupport.REQUEST_CHAR_SET,
+            try {
+	        pc.setAttribute(RequestEncodingSupport.REQUEST_CHAR_SET,
 			    response.getCharacterEncoding(),
 			    PageContext.SESSION_SCOPE);
+            } catch (IllegalStateException ex) {} // invalidated session ignored
 	}
     }
  
diff --git a/src/org/apache/taglibs/standard/tag/common/sql/QueryTagSupport.java b/src/org/apache/taglibs/standard/tag/common/sql/QueryTagSupport.java
index b2b2104..81b77c9 100644
--- a/src/org/apache/taglibs/standard/tag/common/sql/QueryTagSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/sql/QueryTagSupport.java
@@ -247,6 +247,7 @@ public abstract class QueryTagSupport extends BodyTagSupport
 	    setParameters(ps, parameters);
 	    ResultSet rs = ps.executeQuery();
 	    result = new ResultImpl(rs, startRow, maxRows);
+            ps.close();
 	}
 	catch (Throwable e) {
 	    throw new JspException(sqlStatement + ": " + e.getMessage(), e);
diff --git a/src/org/apache/taglibs/standard/tag/el/fmt/MessageTag.java b/src/org/apache/taglibs/standard/tag/el/fmt/MessageTag.java
index 5f4b0fb..6c8f200 100644
--- a/src/org/apache/taglibs/standard/tag/el/fmt/MessageTag.java
+++ b/src/org/apache/taglibs/standard/tag/el/fmt/MessageTag.java
@@ -72,12 +72,6 @@ import org.apache.taglibs.standard.tag.common.fmt.*;
 public class MessageTag extends MessageSupport {
 
     //*********************************************************************
-    // Private constants
-
-    private static final Class OBJECT_ARRAY_CLASS = new Object[0].getClass();
-
-
-    //*********************************************************************
     // Private state (implementation details)
 
     private String key_;                         // stores EL-based property
@@ -123,13 +117,13 @@ public class MessageTag extends MessageSupport {
 
     // for EL-based attribute
     public void setKey(String key_) {
-        this.key_ = key_;
+	this.key_ = key_;
 	this.keySpecified = true;
     }
 
     // for EL-based attribute
     public void setBundle(String bundle_) {
-        this.bundle_ = bundle_;
+	this.bundle_ = bundle_;
         this.bundleSpecified = true;
     }
 
@@ -153,13 +147,13 @@ public class MessageTag extends MessageSupport {
          * propagate up.
          */
 
-	if (key_ != null) {
-	    key = (String) ExpressionEvaluatorManager.evaluate(
+	if (keySpecified) {
+	    keyAttrValue = (String) ExpressionEvaluatorManager.evaluate(
 	        "key", key_, String.class, this, pageContext);
 	}
 
-	if (bundle_ != null) {
-	    locCtxt = (LocalizationContext)
+	if (bundleSpecified) {
+	    bundleAttrValue = (LocalizationContext)
 		ExpressionEvaluatorManager.evaluate(
 	            "bundle", bundle_, LocalizationContext.class, this,
 		    pageContext);
diff --git a/src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java b/src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java
index 202b2b1..f2a2268 100644
--- a/src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java
+++ b/src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java
@@ -74,13 +74,13 @@ public class MessageTag extends MessageSupport {
 
     // for tag attribute
     public void setKey(String key) throws JspTagException {
-        this.key = key;
+        this.keyAttrValue = key;
 	this.keySpecified = true;
     }
 
     // for tag attribute
     public void setBundle(LocalizationContext locCtxt) throws JspTagException {
-        this.locCtxt = locCtxt;
+        this.bundleAttrValue = locCtxt;
         this.bundleSpecified = true;
     }
 }
diff --git a/src/org/apache/taglibs/standard/tlv/JstlBaseTLV.java b/src/org/apache/taglibs/standard/tlv/JstlBaseTLV.java
index efa6245..5244780 100644
--- a/src/org/apache/taglibs/standard/tlv/JstlBaseTLV.java
+++ b/src/org/apache/taglibs/standard/tlv/JstlBaseTLV.java
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * Copyright (c) 1999-2004 The Apache Software Foundation.  All rights 
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -102,19 +102,22 @@ public abstract class JstlBaseTLV extends TagLibraryValidator {
     protected static final String APPLICATION_SCOPE = "application";
 
     // Relevant URIs
-    protected final String JSP = "http://java.sun.com/JSP/Page";   
-    private final String CORE_EL = "http://java.sun.com/jstl/core";
-    private final String FMT_EL = "http://java.sun.com/jstl/fmt";
-    private final String SQL_EL = "http://java.sun.com/jstl/sql";
-    private final String XML_EL = "http://java.sun.com/jstl/xml";
-    private final String CORE_RT = "http://java.sun.com/jstl/core_rt";
-    private final String FMT_RT = "http://java.sun.com/jstl/fmt_rt";
-    private final String SQL_RT = "http://java.sun.com/jstl/sql_rt";
-    private final String XML_RT = "http://java.sun.com/jstl/xml_rt";
+    protected final String JSP = "http://java.sun.com/JSP/Page"; 
+    
+    // types of sub-classes - used on method validate()
+    private   static final int TYPE_UNDEFINED = 0;
+    protected static final int TYPE_CORE = 1;
+    protected static final int TYPE_FMT = 2;
+    protected static final int TYPE_SQL = 3;
+    protected static final int TYPE_XML = 4;
+
+    // which tlv is being validated
+    private int tlvType = TYPE_UNDEFINED;
 
     //*********************************************************************
     // Validation and configuration state (protected)
 
+    protected String uri;			// our taglib's uri (as passed by JSP container on XML View)
     protected String prefix;			// our taglib's prefix
     protected Vector messageVector;		// temporary error messages
     protected Map config;			// configuration (Map of Sets)
@@ -142,12 +145,14 @@ public abstract class JstlBaseTLV extends TagLibraryValidator {
     
 
     //*********************************************************************
-    // Validation entry point
+    // Validation entry point - this method is called by the sub-classes to 
+    // do the validation.
 
     public synchronized ValidationMessage[] validate(
-	    String prefix, String uri, PageData page) {
+	    int type, String prefix, String uri, PageData page) {
 	try {
-
+	    this.tlvType = type;
+	    this.uri = uri;
 	    // initialize
 	    messageVector = new Vector();
 
@@ -232,24 +237,24 @@ public abstract class JstlBaseTLV extends TagLibraryValidator {
         return isTag(tagUri, tagLn, JSP, target);
     }
 
+    private boolean isTag( int type, String tagUri, String tagLn, String target) {
+        return ( this.tlvType == type && isTag(tagUri, tagLn, this.uri, target) );
+    }
+
     protected boolean isCoreTag(String tagUri, String tagLn, String target) {
-        return (isTag(tagUri, tagLn, CORE_EL, target)
-	     || isTag(tagUri, tagLn, CORE_RT, target));
+	return isTag( TYPE_CORE, tagUri, tagLn, target );
     }
 
     protected boolean isFmtTag(String tagUri, String tagLn, String target) {
-        return (isTag(tagUri, tagLn, FMT_EL, target) 
-	     || isTag(tagUri, tagLn, FMT_RT, target));
+	return isTag( TYPE_FMT, tagUri, tagLn, target );
     }
 
     protected boolean isSqlTag(String tagUri, String tagLn, String target) {
-        return (isTag(tagUri, tagLn, SQL_EL, target) 
-	     || isTag(tagUri, tagLn, SQL_RT, target));
+	return isTag( TYPE_SQL, tagUri, tagLn, target );
     }
 
     protected boolean isXmlTag(String tagUri, String tagLn, String target) {
-        return (isTag(tagUri, tagLn, XML_EL, target)
-	     || isTag(tagUri, tagLn, XML_RT, target));
+	return isTag( TYPE_XML, tagUri, tagLn, target );
     }
 
     // utility method to determine if an attribute exists
diff --git a/src/org/apache/taglibs/standard/tlv/JstlCoreTLV.java b/src/org/apache/taglibs/standard/tlv/JstlCoreTLV.java
index 97568f1..e7d766a 100644
--- a/src/org/apache/taglibs/standard/tlv/JstlCoreTLV.java
+++ b/src/org/apache/taglibs/standard/tlv/JstlCoreTLV.java
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * Copyright (c) 1999-2004 The Apache Software Foundation.  All rights 
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -131,6 +131,14 @@ public class JstlCoreTLV extends JstlBaseTLV {
 
 
     //*********************************************************************
+    // set its type and delegate validation to super-class
+    public  ValidationMessage[] validate(
+	    String prefix, String uri, PageData page) {
+	return super.validate( TYPE_CORE, prefix, uri, page );
+    }
+
+
+    //*********************************************************************
     // Contract fulfillment
 
     protected DefaultHandler getHandler() {
diff --git a/src/org/apache/taglibs/standard/tlv/JstlFmtTLV.java b/src/org/apache/taglibs/standard/tlv/JstlFmtTLV.java
index d30b892..8b8eba4 100644
--- a/src/org/apache/taglibs/standard/tlv/JstlFmtTLV.java
+++ b/src/org/apache/taglibs/standard/tlv/JstlFmtTLV.java
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * Copyright (c) 1999-2004 The Apache Software Foundation.  All rights 
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -130,6 +130,14 @@ public class JstlFmtTLV extends JstlBaseTLV {
 
 
     //*********************************************************************
+    // set its type and delegate validation to super-class
+    public  ValidationMessage[] validate(
+	    String prefix, String uri, PageData page) {
+	return super.validate( TYPE_FMT, prefix, uri, page );
+    }
+
+
+    //*********************************************************************
     // Contract fulfillment
 
     protected DefaultHandler getHandler() {
diff --git a/src/org/apache/taglibs/standard/tlv/JstlSqlTLV.java b/src/org/apache/taglibs/standard/tlv/JstlSqlTLV.java
index 39be79d..1469ec0 100644
--- a/src/org/apache/taglibs/standard/tlv/JstlSqlTLV.java
+++ b/src/org/apache/taglibs/standard/tlv/JstlSqlTLV.java
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * Copyright (c) 1999-2004 The Apache Software Foundation.  All rights 
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -92,6 +92,14 @@ public class JstlSqlTLV extends JstlBaseTLV {
 
 
     //*********************************************************************
+    // set its type and delegate validation to super-class
+    public  ValidationMessage[] validate(
+	    String prefix, String uri, PageData page) {
+	return super.validate( TYPE_SQL, prefix, uri, page );
+    }
+
+
+    //*********************************************************************
     // Contract fulfillment
 
     protected DefaultHandler getHandler() {
@@ -155,7 +163,8 @@ public class JstlSqlTLV extends JstlBaseTLV {
                     SCOPE, qn, a.getValue(SCOPE))); 
 	    if (qn.startsWith(prefix + ":") && hasEmptyVar(a))
 		fail(Resources.getMessage("TLV_EMPTY_VAR", qn));
-	    if (qn.startsWith(prefix + ":") && hasDanglingScope(a))
+	    if (qn.startsWith(prefix + ":") && hasDanglingScope(a) &&
+                !qn.startsWith(prefix + ":" + SETDATASOURCE))
 		fail(Resources.getMessage("TLV_DANGLING_SCOPE", qn));
 
 	    // now, modify state
diff --git a/src/org/apache/taglibs/standard/tlv/JstlXmlTLV.java b/src/org/apache/taglibs/standard/tlv/JstlXmlTLV.java
index be93715..ea3b0e4 100644
--- a/src/org/apache/taglibs/standard/tlv/JstlXmlTLV.java
+++ b/src/org/apache/taglibs/standard/tlv/JstlXmlTLV.java
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * Copyright (c) 1999-2004 The Apache Software Foundation.  All rights 
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -126,6 +126,14 @@ public class JstlXmlTLV extends JstlBaseTLV {
 
 
     //*********************************************************************
+    // set its type and delegate validation to super-class
+    public  ValidationMessage[] validate(
+	    String prefix, String uri, PageData page) {
+	return super.validate( TYPE_XML, prefix, uri, page );
+    }
+
+
+    //*********************************************************************
     // Contract fulfillment
 
     protected DefaultHandler getHandler() {
diff --git a/xml/intro.xml b/xml/intro.xml
index dd386a0..1c998d1 100644
--- a/xml/intro.xml
+++ b/xml/intro.xml
@@ -3,33 +3,45 @@
 
 <properties>
   <author>Shawn Bayern</author>
-  <title>The Jakarta-Taglibs Project: 'Standard' taglib: JSP[tm] Standard Tag Library (JSTL) implementation</title>
+  <title>The Jakarta-Taglibs Project: Standard-1.0 taglib: JSP[tm] Standard Tag Library (JSTL 1.0) implementation</title>
 </properties>
 
 <body>
 
-  <section name="'Standard' Taglib" href="Welcome">
+  <section name="Standard-1.0 Taglib" href="Welcome">
 
-    <big><b>JSP(tm) Standard Tag Library implementation (1.0)</b></big>
+    <big><b>JSP(tm) Standard Tag Library 1.0 implementation</b></big>
 
-    <p>Jakarta Taglibs hosts the Standard Taglib, an implementation of
+    <p>Jakarta Taglibs hosts the Standard Taglib 1.0, an implementation of
       the <a href="http://java.sun.com/products/jsp/jstl">JSP Standard Tag
-      Library (JSTL)</a>, which was developed under the
+      Library (JSTL)</a>, version 1.0, which was developed under the
       <a href="http://jcp.org/">Java Community Process</a>.
     </p>
 
-    <p><b>NOTE:</b> JSTL requires a JSP container that supports
+    <p><b>NOTE:</b> 
+    Standard-1.0 (JSTL 1.0) requires a JSP container that supports
       the Java Servlet 2.3 and JavaServer Pages 1.2 specifications.
       Jakarta <a href="http://jakarta.apache.org/tomcat/">
-      Tomcat 4</a> supports the new specifications. The Standard 1.0 taglib
-      has been tested with Tomcat 4.0.4.
+      Tomcat 4</a> supports these specifications. The Standard 1.0 taglib
+      has been tested with Tomcat 4.1.24.
     </p>
+    <p><a href="http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html">Standard-1.1</a> 
+    (implementation of the JSTL 1.1 specification) requires a JSP container that supports
+      the Java Servlet 2.4 and JavaServer Pages 2.0 specifications.
+      Jakarta <a href="http://jakarta.apache.org/tomcat/">
+      Tomcat 5</a> supports the new specifications. The Standard-1.1 taglib
+      has been tested with Tomcat 5.0.3.</p>
 
   </section>
 
   <section name="'Standard' Taglib News" href="News">
 
     <news>
+      <newsitem date="09/25/2003">
+       Standard Taglib version 1.0.4 - another bugfix release - is now
+       available from the <a href="http://jakarta.apache.org/site/binindex.cgi#Release%20Builds">
+       Apache Jakarta Project Mirrors</a>.
+      </newsitem>
       <newsitem date="02/20/2003">
        Standard Taglib version 1.0.3 -- another minor bugfix release -- is now
        available from the <a href="http://jakarta.apache.org/site/binindex.cgi#Release%20Builds">
@@ -101,7 +113,7 @@
             doing releases of the taglib, a link can be made to each
             available release. -->
       <li>View the Standard 1.0 taglib documentation
-        <a href="standard/index.html">Standard 1.0 Documentation</a>
+        <a href="standard-1.0/index.html">Standard 1.0 Documentation</a>
       </li>
 
       <li>View the most recent, nightly build of the
@@ -143,7 +155,7 @@
     <p>Download the most recent, nightly snapshot:</p>
     <ul>
       <li>
-        <a href="http://jakarta.apache.org/builds/jakarta-taglibs/nightly/projects/standard/">
+        <a href="http://jakarta.apache.org/builds/jakarta-taglibs/nightly/projects/standard-1.0/">
         Standard Taglib nightly snapshot</a></li>
     </ul>
 
@@ -162,8 +174,7 @@
 
   <section name="JSTL Books" href="Books">
 
-    <p>The following books about JSTL are available, or will be published
-    shortly:</p>
+    <p>The following books about JSTL are available:</p>
 
     <ul>
       <li><a href="http://jstlbook.com/"><i>JSTL in Action</i></a>, Shawn Bayern, Manning</li>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org