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:02:41 UTC

[tomcat-taglibs-standard] tag ea3-03 created (now c503d86)

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

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


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

     new 166522f  This commit was manufactured by cvs2svn to create tag 'ea3-03'.
     new c503d86  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 ea3-03
in repository https://gitbox.apache.org/repos/asf/tomcat-taglibs-standard.git

commit c503d8695a8ab940f05c7c22d446d73df592ac6b
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 'ea3-03'.

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

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

commit 166522f275f34079f70cde09ec8930be1af1959f
Author: no_author <de...@apache.org>
AuthorDate: Wed Jan 2 19:42:01 2002 +0000

    This commit was manufactured by cvs2svn to create tag 'ea3-03'.
---
 README                                             |    5 +
 build.xml                                          |   11 +-
 conf/c-rt.tld                                      |   10 +
 conf/c.tld                                         |   10 +
 conf/fmt-rt.tld                                    |   80 +-
 conf/fmt.tld                                       |   90 +-
 conf/sql-rt.tld                                    |  149 +++
 conf/sql.tld                                       |  178 +++
 conf/x-rt.tld                                      |   33 +-
 conf/x.tld                                         |   33 +-
 doc/conf/web.xml                                   |    2 +-
 .../Conditionals_FunctionalDescription_1_EA1.html  |    4 +-
 doc/web/DB_FunctionalDescription_1_EA3.html        |  645 +++++++++++
 doc/web/EcmaScriptEL.html                          |  599 ++++++++++
 doc/web/GettingStarted.html                        |  179 ++-
 doc/web/I18N_FunctionalDescription_5_EA2.html      |  989 ++++++++++++++++
 doc/web/I18N_FunctionalDescription_6_EA3.html      | 1195 ++++++++++++++++++++
 .../IOT_Import_FunctionalDescription_5_EA2.html    |   23 +-
 doc/web/Overview.html                              |  297 ++++-
 doc/web/ReleaseNotes.html                          |   23 +-
 ...ML_ControlFlow_FunctionalDescription_1_EA2.html |    5 +-
 doc/web/XML_Core_FunctionalDescription_2_EA2.html  |   32 +-
 ...Transformation_FunctionalDescription_3_EA2.html |    7 +-
 doc/web/index.html                                 |   38 +-
 doc/web/spel/index.html                            |   36 +-
 examples/conf/web.xml                              |   12 +
 .../taglibs/jsptl/examples/i18n/Resources_de.java  |    1 +
 .../taglibs/jsptl/examples/startup/Init.java       |   11 +-
 examples/web/ShowSource.jsp                        |   25 +-
 examples/web/Templates/ExamplesTemplate.dwt        |   13 +-
 examples/web/conditionals/If.jsp                   |    2 +-
 examples/web/conditionals/index.html               |   38 +-
 examples/web/ecmascript/ConditionalOperator.jsp    |   10 +-
 examples/web/ecmascript/MapAccess.jsp              |    2 +-
 examples/web/ecmascript/PropertyAccess.jsp         |    2 +-
 examples/web/ecmascript/index.html                 |   65 +-
 examples/web/elsupport/index.html                  |   27 +-
 examples/web/format/Exception.jsp                  |    3 +-
 examples/web/format/FormatDateTime.jsp             |   33 +-
 examples/web/format/FormatNumber.jsp               |   16 +-
 examples/web/format/GermanLocale.jsp               |    4 +-
 examples/web/format/MessageFormat.jsp              |    9 +-
 examples/web/format/ParametricReplacement.jsp      |    3 +
 examples/web/format/index.html                     |   86 +-
 examples/web/import/Absolute.jsp                   |    5 +-
 examples/web/import/ContextRelative.jsp            |    2 +-
 examples/web/import/Encode.jsp                     |    2 +-
 examples/web/import/EncodeContextRelative.jsp      |   17 +-
 examples/web/import/EncodeQueryString.jsp          |    8 +-
 examples/web/import/LocalQueryString.jsp           |   30 +
 examples/web/import/index.html                     |   92 +-
 examples/web/import/index.jsp                      |   87 ++
 examples/web/import/links.html                     |   50 +
 examples/web/import/relativeLinks.html             |   10 +
 examples/web/import/session.jsp                    |   33 +
 examples/web/index.html                            |   48 +-
 examples/web/iterators/Collaboration.jsp           |    4 +-
 examples/web/iterators/DataTypes.jsp               |    2 +-
 examples/web/iterators/SimpleRange.jsp             |    2 +-
 examples/web/iterators/Status.jsp                  |   10 +-
 examples/web/iterators/index.html                  |   43 +-
 examples/web/misc/index.html                       |   17 +-
 examples/web/sql/DriverSetup.jsp                   |   22 +
 examples/web/sql/QueryDirect.jsp                   |  108 ++
 examples/web/sql/QueryIterate.jsp                  |  123 ++
 examples/web/sql/QueryParam.jsp                    |   71 ++
 examples/web/sql/Transaction.jsp                   |   59 +
 examples/web/sql/Update.jsp                        |  106 ++
 examples/web/{misc/index.html => sql/index.jsp}    |   55 +-
 examples/web/sql/links.html                        |   32 +
 examples/web/sql/session.jsp                       |   19 +
 examples/web/xml/index.html                        |  107 +-
 lib/jdbc2_0-stdext.jar                             |  Bin 0 -> 6727 bytes
 .../jsp/jstl/core/ConditionalTagSupport.java}      |  136 ++-
 .../jsp/jstl/core/ExpressionException.java}        |   37 +-
 .../servlet/jsp/jstl/core/IteratorTag.java}        |   47 +-
 .../servlet/jsp/jstl/core/IteratorTagStatus.java   |  204 ++++
 .../servlet/jsp/jstl/core/IteratorTagSupport.java  |  657 +++++++++++
 .../servlet/jsp/jstl/sql/Column.java}              |   29 +-
 src/javax/servlet/jsp/jstl/sql/ColumnMetaData.java |  185 +++
 .../servlet/jsp/jstl/sql/Result.java}              |   38 +-
 .../servlet/jsp/jstl/sql/ResultMetaData.java}      |   31 +-
 .../servlet/jsp/jstl/sql/Row.java}                 |   31 +-
 .../servlet/jsp/jstl/sql/SQLExecutionTag.java}     |   18 +-
 .../javascript/JavascriptExpressionEvaluator.java  |   18 +-
 .../lang/jpath/JPathExpressionEvaluator.java       |    4 +-
 .../lang/jxpath/JXPathExpressionEvaluator.java     |    2 +-
 .../taglibs/standard/lang/spel/Constants.java      |    3 +
 .../TimeZoneTEI.java => lang/spel/Indexer.java}    |   23 +-
 .../taglibs/standard/lang/spel/IntegerLiteral.java |    3 +-
 .../SetTag.java => lang/spel/LiteralIndexes.java}  |  113 +-
 .../standard/lang/spel/PropertyExpression.java     |   41 +-
 .../standard/lang/spel/Resources.properties        |    3 +
 .../taglibs/standard/lang/spel/SpelParser.jj       |   49 +-
 .../standard/lang/spel/parser/SpelParser.java      |  521 +++++----
 .../lang/spel/parser/SpelParserConstants.java      |    4 +
 .../lang/spel/parser/SpelParserTokenManager.java   |    9 +-
 .../lang/support/ExpressionEvaluatorManager.java   |   12 +-
 .../standard/resources/Resources.properties        |   25 +-
 .../ChooseTag.java}                                |  102 +-
 .../core/DeclareTag.java}                          |   28 +-
 .../standard/tag/common/core/ForEachSupport.java   |  435 +++++++
 .../SetTag.java => core/ForTokensSupport.java}     |   80 +-
 .../standard/tag/common/core/ImportSupport.java    |  487 ++++++++
 .../core/NullAttributeException.java}              |   34 +-
 .../common/core/OtherwiseTag.java}                 |   22 +-
 .../tag/common/{xml => core}/ParamSupport.java     |   38 +-
 .../URLEncodeSupport.java}                         |   73 +-
 .../ParseNumberTag.java => common/core/Util.java}  |   31 +-
 .../ParamSupport.java => core/WhenTagSupport.java} |   82 +-
 .../standard/tag/common/fmt/BundleSupport.java     |  117 +-
 .../standard/tag/common/fmt/ExceptionSupport.java  |    9 +-
 .../standard/tag/common/fmt/FormatDateSupport.java |   58 +-
 .../tag/common/fmt/FormatNumberSupport.java        |   37 +-
 .../standard/tag/common/fmt/LocaleSupport.java     |  157 ++-
 .../standard/tag/common/fmt/MessageArgSupport.java |   15 +-
 .../tag/common/fmt/MessageFormatSupport.java       |   23 +-
 .../standard/tag/common/fmt/MessageSupport.java    |   27 +-
 .../standard/tag/common/fmt/ParseDateSupport.java  |   58 +-
 .../tag/common/fmt/ParseNumberSupport.java         |   31 +-
 .../RequestEncodingSupport.java}                   |   58 +-
 .../standard/tag/common/fmt/TimeZoneSupport.java   |   63 +-
 .../common/sql/ColumnImpl.java}                    |   52 +-
 .../tag/common/sql/ColumnMetaDataImpl.java         |  489 ++++++++
 .../DataSourceWrapper.java}                        |  162 +--
 .../common/{xml/SetTag.java => sql/DriverTag.java} |  131 ++-
 .../{xml/SetTag.java => sql/DriverTagSupport.java} |  126 ++-
 .../sql/ParamTagSupport.java}                      |   46 +-
 .../standard/tag/common/sql/QueryTagSupport.java   |  301 +++++
 .../standard/tag/common/sql/ResultImpl.java        |  170 +++
 .../tag/common/sql/ResultMetaDataImpl.java         |  264 +++++
 .../FormatDateTag.java => common/sql/RowImpl.java} |   75 +-
 .../tag/common/sql/TransactionTagSupport.java      |  206 ++++
 .../standard/tag/common/sql/UpdateTagSupport.java  |  252 +++++
 .../standard/tag/common/xml/ParamSupport.java      |    9 +-
 .../standard/tag/common/xml/ParseSupport.java      |   11 +-
 .../taglibs/standard/tag/common/xml/SetTag.java    |    9 +-
 .../standard/tag/common/xml/TransformSupport.java  |  112 +-
 .../tag/common/xml/TransformerSupport.java         |    9 +-
 .../xml/SetTag.java => el/core/ExprTag.java}       |  115 +-
 .../core/ExpressionLanguageTag.java}               |   75 +-
 .../ParamTag.java => el/core/ExpressionUtil.java}  |   43 +-
 .../FormatDateTag.java => core/ForEachTag.java}    |  101 +-
 .../FormatDateTag.java => core/ForTokensTag.java}  |  122 +-
 .../{common/xml/SetTag.java => el/core/IfTag.java} |   86 +-
 .../ParseNumberTag.java => core/ImportTag.java}    |   48 +-
 .../standard/tag/el/{xml => core}/ParamTag.java    |   26 +-
 .../tag/{common/xml => el/core}/SetTag.java        |  103 +-
 .../{xml/ParamTag.java => core/URLEncodeTag.java}  |   28 +-
 .../xml/SetTag.java => el/core/WhenTag.java}       |   80 +-
 .../taglibs/standard/tag/el/fmt/FormatDateTag.java |   14 +-
 .../standard/tag/el/fmt/FormatNumberTag.java       |   14 +-
 .../standard/tag/el/fmt/MessageFormatTag.java      |   20 +-
 .../taglibs/standard/tag/el/fmt/MessageTag.java    |   20 +-
 .../taglibs/standard/tag/el/fmt/ParseDateTag.java  |   26 +-
 .../standard/tag/el/fmt/ParseNumberTag.java        |   14 +-
 ...ssageFormatTag.java => RequestEncodingTag.java} |   13 +-
 .../xml/SetTag.java => el/sql/DriverTag.java}      |   82 +-
 .../MessageFormatTag.java => el/sql/ParamTag.java} |   33 +-
 .../FormatDateTag.java => el/sql/QueryTag.java}    |   53 +-
 .../MessageTag.java => el/sql/TransactionTag.java} |   37 +-
 .../FormatDateTag.java => el/sql/UpdateTag.java}   |   53 +-
 .../taglibs/standard/tag/el/xml/ParamTag.java      |    4 +-
 .../FormatDateTag.java => core/ForEachTag.java}    |   38 +-
 .../FormatDateTag.java => core/ForTokensTag.java}  |   47 +-
 .../{common/xml/SetTag.java => rt/core/IfTag.java} |   78 +-
 .../rt/{xml/ParamTag.java => core/ImportTag.java}  |   22 +-
 .../standard/tag/rt/{xml => core}/ParamTag.java    |    9 +-
 .../URLEncodeTag.java}                             |   12 +-
 .../rt/core/WhenTag.java}                          |   63 +-
 .../taglibs/standard/tag/rt/fmt/FormatDateTag.java |    5 +
 .../standard/tag/rt/fmt/FormatNumberTag.java       |    5 +
 .../standard/tag/rt/fmt/MessageFormatTag.java      |    5 +
 .../taglibs/standard/tag/rt/fmt/MessageTag.java    |    5 +
 .../taglibs/standard/tag/rt/fmt/ParseDateTag.java  |   10 +
 .../standard/tag/rt/fmt/ParseNumberTag.java        |    5 +
 ...ssageFormatTag.java => RequestEncodingTag.java} |    4 +-
 .../MessageFormatTag.java => sql/DriverTag.java}   |   31 +-
 .../LocaleTEI.java => tag/rt/sql/ParamTag.java}    |   23 +-
 .../rt/{fmt/MessageTag.java => sql/QueryTag.java}  |   38 +-
 .../rt/sql/TransactionTag.java}                    |   23 +-
 .../rt/{fmt/MessageTag.java => sql/UpdateTag.java} |   38 +-
 .../taglibs/standard/tag/rt/xml/ParamTag.java      |    2 +-
 src/org/apache/taglibs/standard/tei/Util.java      |   21 +-
 .../apache/taglibs/standard/tlv/JstlBaseTLV.java   |   36 +
 .../apache/taglibs/standard/tlv/JstlCoreTLV.java   |   42 +-
 .../taglibs/standard/tlv/JstlCoreTLVHelper.java    |    6 +-
 .../tlv/{JstlXmlTLV.java => JstlFmtTLV.java}       |  133 ++-
 .../apache/taglibs/standard/tlv/JstlXmlTLV.java    |   49 +-
 xml/intro.xml                                      |   80 +-
 190 files changed, 12344 insertions(+), 2627 deletions(-)

diff --git a/README b/README
index d005775..d73f13a 100644
--- a/README
+++ b/README
@@ -25,6 +25,8 @@ Included in this distibution:
 	    Note that these are not formal specifications, just technical
 	    overviews of functionality and intent.
 
+	Release notes:  Changes since EA1 and other historical info.
+
     EXAMPLES ('examples' directory)
 
 	The standard-examples application included with this distribution
@@ -51,14 +53,17 @@ Included in this distibution:
           .core	   core library (common)
 	  .fmt	   internationalization-capable formatting tags (common)
 	  .xml	   XML manipulation library (common)
+	  .sql	   SQL library (common)
       .el	   handlers specific to expression language (EL) evaluation
           .core	   core library (EL)
 	  .fmt	   internationalization-capable formatting tags (EL)
 	  .xml	   XML manipulation library (EL)
+	  .sql	   SQL library (EL)
       .rt	   handlers specific to rtexprvalue (rt) evaluation
           .core	   core library (rt)
 	  .fmt	   internationalization-capable formatting tags (rt)
 	  .xml	   XML manipulation library (rt)
+	  .sql	   SQL library (rt)
    .tei         TagExtraInfo classes (common to both libraries)
    .tlv		TagLibraryValidator classes (and associated helpers)
    .lang        expression-language support and implementation
diff --git a/build.xml b/build.xml
index 69e0b36..092751f 100644
--- a/build.xml
+++ b/build.xml
@@ -5,6 +5,7 @@
     <property file="../build.properties"/>
     <property file="../common.properties"/>
     <property name="js.jar"   value="lib/js.jar"/>
+    <property name="jdbc.jar"   value="lib/jdbc2_0-stdext.jar"/>
     <property name="jaxen-full.jar"   value="lib/jaxen-full.jar"/>
     <property name="saxpath.jar"      value="lib/saxpath.jar"/>
     <property name="crimson.jar"      value="lib/crimson.jar"/>
@@ -136,8 +137,8 @@
               tofile="${build.examples}/WEB-INF/scriptfree.tld"/>
     -->
     <!-- Copy the 'standard' jar files -->
-    <copy file="${dist.library}/jstl.jar"
-              tofile="${build.examples}/WEB-INF/lib/jstl.jar"/>
+    <copy file="${dist.library}/standard.jar"
+              tofile="${build.examples}/WEB-INF/lib/standard.jar"/>
     <javac srcdir="${examples.src}" destdir="${build.examples}/WEB-INF/classes"
         classpath="${servlet23.jar}:${build.library}"/>
   </target>
@@ -179,7 +180,7 @@
 -->
 
     <javac srcdir="${library.src}" destdir="${build.library}"
-           classpath="${servlet23.jar}:${jxpath.jar}:${js.jar}:${jaxen-full.jar}:${saxpath.jar}:${crimson.jar}:${xalan.jar}"
+           classpath="${servlet23.jar}:${jxpath.jar}:${js.jar}:${jdbc.jar}:${jaxen-full.jar}:${saxpath.jar}:${crimson.jar}:${xalan.jar}"
 	   debug="on"/>
   </target>
 
@@ -208,10 +209,10 @@
   <!-- Create the library distribution files -->
   <target name="library-dist" depends="library">
     <!-- Create the tag library jar -->
-    <jar jarfile="${dist.library}/jstl.jar"
+    <jar jarfile="${dist.library}/standard.jar"
          basedir="${build.library}"/>
     <!-- Create the 'standard' API jar -->
-    <jar jarfile="${dist.library}/jstl-api.jar"
+    <jar jarfile="${dist.library}/jstl.jar"
          basedir="${build.library}"
          includes="javax/**"/>
     <copy todir="${dist.dir}/${taglib.name}">
diff --git a/conf/c-rt.tld b/conf/c-rt.tld
index 4445452..ce755e0 100644
--- a/conf/c-rt.tld
+++ b/conf/c-rt.tld
@@ -94,6 +94,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>varReader</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -268,6 +273,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>value</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
diff --git a/conf/c.tld b/conf/c.tld
index b1ee816..9da7655 100644
--- a/conf/c.tld
+++ b/conf/c.tld
@@ -165,6 +165,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>varReader</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -354,6 +359,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>value</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
diff --git a/conf/fmt-rt.tld b/conf/fmt-rt.tld
index a51ba46..87811ec 100644
--- a/conf/fmt-rt.tld
+++ b/conf/fmt-rt.tld
@@ -20,6 +20,20 @@
   </validator>
 
   <tag>
+    <name>requestEncoding</name>
+    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.RequestEncodingTag</tag-class>
+    <body-content>EMPTY</body-content>
+    <description>
+        Sets the request character encoding
+    </description>
+    <attribute>
+        <name>value</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
     <name>exception</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.ExceptionTag</tag-class>
     <body-content>EMPTY</body-content>
@@ -46,7 +60,6 @@
   <tag>
     <name>locale</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.LocaleTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.LocaleTEI</tei-class>
     <body-content>EMPTY</body-content>
     <description>
         Establishes the locale to use for resource bundles and formatting
@@ -71,7 +84,6 @@
   <tag>
     <name>timeZone</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.TimeZoneTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.TimeZoneTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Establishes the time zone in which to represent a &lt;formatDate&gt;
@@ -97,7 +109,6 @@
   <tag>
     <name>bundle</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.BundleTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.BundleTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Loads a resource bundle containing localized messages
@@ -127,14 +138,13 @@
   <tag>
     <name>message</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.MessageTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.MessageTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Maps key to localized message and performs parametric replacement
     </description>
     <attribute>
         <name>key</name>
-        <required>true</required>
+        <required>false</required>
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
@@ -143,6 +153,11 @@
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
+        <name>messageArgs</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -157,14 +172,18 @@
   <tag>
     <name>messageFormat</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.MessageFormatTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.MessageFormatTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Performs parametric replacement on a given pattern string
     </description>
     <attribute>
         <name>value</name>
-        <required>true</required>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>messageArgs</name>
+        <required>false</required>
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
@@ -198,13 +217,13 @@
     <name>formatNumber</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.FormatNumberTag</tag-class>
     <tei-class>org.apache.taglibs.standard.tei.FormatNumberTEI</tei-class>
-    <body-content>EMPTY</body-content>
+    <body-content>JSP</body-content>
     <description>
         Formats a numeric value as a number, currency, or percentage
     </description>
     <attribute>
         <name>value</name>
-        <required>true</required>
+        <required>false</required>
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
@@ -218,6 +237,11 @@
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -233,13 +257,13 @@
     <name>parseNumber</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.ParseNumberTag</tag-class>
     <tei-class>org.apache.taglibs.standard.tei.ParseNumberTEI</tei-class>
-    <body-content>EMPTY</body-content>
+    <body-content>JSP</body-content>
     <description>
         Parses the string representation of a number, currency, or percentage
     </description>
     <attribute>
         <name>value</name>
-        <required>true</required>
+        <required>false</required>
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
@@ -253,6 +277,11 @@
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -303,6 +332,11 @@
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -318,13 +352,13 @@
     <name>parseDate</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.ParseDateTag</tag-class>
     <tei-class>org.apache.taglibs.standard.tei.ParseDateTEI</tei-class>
-    <body-content>EMPTY</body-content>
+    <body-content>JSP</body-content>
     <description>
         Parses the string representation of a date and/or time
     </description>
     <attribute>
         <name>value</name>
-        <required>true</required>
+        <required>false</required>
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
@@ -333,11 +367,31 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>dateStyle</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>timeStyle</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>pattern</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
+        <name>timeZone</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
diff --git a/conf/fmt.tld b/conf/fmt.tld
index af0cd5f..b340577 100644
--- a/conf/fmt.tld
+++ b/conf/fmt.tld
@@ -12,11 +12,12 @@
 
   <validator>
     <validator-class>
-	org.apache.taglibs.standard.tlv.JstlCoreTLV
+	org.apache.taglibs.standard.tlv.JstlFmtTLV
     </validator-class>
     <init-param>
 	<param-name>expressionAttributes</param-name>
 	<param-value>
+            requestEncoding:value 
 	    exception:value
 	    exception:bundle
 	    exception:stackTrace
@@ -27,17 +28,24 @@
 	    bundle:prefix
 	    message:key
 	    message:bundle
+	    message:messageArgs
 	    messageFormat:value
+	    messageFormat:messageArgs
 	    messageArg:value
 	    formatNumber:value
 	    formatNumber:pattern
+	    formatNumber:parseLocale
 	    parseNumber:value
 	    parseNumber:pattern
+	    parseNumber:parseLocale
 	    formatDate:value
 	    formatDate:pattern
 	    formatDate:timeZone
+	    formatDate:parseLocale
 	    parseDate:value
 	    parseDate:pattern
+	    parseDate:timeZone
+	    parseDate:parseLocale
 	</param-value>
 	<description>
 	    Whitespace-separated list of colon-separated token pairs
@@ -59,6 +67,20 @@
   </listener>
 
   <tag>
+    <name>requestEncoding</name>
+    <tag-class>org.apache.taglibs.standard.tag.el.fmt.RequestEncodingTag</tag-class>
+    <body-content>EMPTY</body-content>
+    <description>
+        Sets the request character encoding
+    </description>
+    <attribute>
+        <name>value</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
     <name>exception</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.ExceptionTag</tag-class>
     <body-content>EMPTY</body-content>
@@ -85,7 +107,6 @@
   <tag>
     <name>locale</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.LocaleTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.LocaleTEI</tei-class>
     <body-content>EMPTY</body-content>
     <description>
         Establishes the locale to use for resource bundles and formatting
@@ -110,7 +131,6 @@
   <tag>
     <name>timeZone</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.TimeZoneTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.TimeZoneTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Establishes the time zone in which to represent a &lt;formatDate&gt;
@@ -136,7 +156,6 @@
   <tag>
     <name>bundle</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.BundleTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.BundleTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Loads a resource bundle containing localized messages
@@ -166,14 +185,13 @@
   <tag>
     <name>message</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.MessageTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.MessageTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Maps key to localized message and performs parametric replacement
     </description>
     <attribute>
         <name>key</name>
-        <required>true</required>
+        <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
@@ -182,6 +200,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>messageArgs</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -196,14 +219,18 @@
   <tag>
     <name>messageFormat</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.MessageFormatTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.MessageFormatTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Performs parametric replacement on a given pattern string
     </description>
     <attribute>
         <name>value</name>
-        <required>true</required>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>messageArgs</name>
+        <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
@@ -237,13 +264,13 @@
     <name>formatNumber</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.FormatNumberTag</tag-class>
     <tei-class>org.apache.taglibs.standard.tei.FormatNumberTEI</tei-class>
-    <body-content>EMPTY</body-content>
+    <body-content>JSP</body-content>
     <description>
         Formats a numeric value as a number, currency, or percentage
     </description>
     <attribute>
         <name>value</name>
-        <required>true</required>
+        <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
@@ -257,6 +284,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -272,13 +304,13 @@
     <name>parseNumber</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.ParseNumberTag</tag-class>
     <tei-class>org.apache.taglibs.standard.tei.ParseNumberTEI</tei-class>
-    <body-content>EMPTY</body-content>
+    <body-content>JSP</body-content>
     <description>
         Parses the string representation of a number, currency, or percentage
     </description>
     <attribute>
         <name>value</name>
-        <required>true</required>
+        <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
@@ -292,6 +324,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -342,6 +379,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -357,13 +399,13 @@
     <name>parseDate</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.ParseDateTag</tag-class>
     <tei-class>org.apache.taglibs.standard.tei.ParseDateTEI</tei-class>
-    <body-content>EMPTY</body-content>
+    <body-content>JSP</body-content>
     <description>
         Parses the string representation of a date and/or time
     </description>
     <attribute>
         <name>value</name>
-        <required>true</required>
+        <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
@@ -372,11 +414,31 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>dateStyle</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>timeStyle</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>pattern</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>timeZone</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
diff --git a/conf/sql-rt.tld b/conf/sql-rt.tld
new file mode 100644
index 0000000..46eeeee
--- /dev/null
+++ b/conf/sql-rt.tld
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE taglib
+  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+<taglib>
+  <tlib-version>1.0 EA3</tlib-version>
+  <jsp-version>1.2</jsp-version>
+  <short-name>sql-rt</short-name>
+  <uri>http://java.sun.com/jstl/ea/sql-rt</uri>
+  <display-name>JSTL sql RT</display-name>
+  <description>JSTL 1.0 sql library</description>
+
+  <validator>
+    <validator-class>
+        org.apache.taglibs.standard.tlv.JstlCoreTLV
+    </validator-class>
+    <description>
+        Provides core validation features for JSTL tags.
+    </description>
+  </validator>
+
+  <tag>
+    <name>transaction</name>
+    <tag-class>org.apache.taglibs.standard.tag.rt.sql.TransactionTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Provides nested database action elements with a shared Connection,
+        set up to execute all statements as one transaction.
+    </description>
+    <attribute>
+        <name>dataSource</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>query</name>
+    <tag-class>org.apache.taglibs.standard.tag.rt.sql.QueryTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Executes the SQL query defined in its body or through the
+        sql attribute.
+    </description>
+    <attribute>
+        <name>var</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>sql</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>dataSource</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>startRow</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>maxRows</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>update</name>
+    <tag-class>org.apache.taglibs.standard.tag.rt.sql.UpdateTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Executes the SQL update defined in its body or through the
+        sql attribute.
+    </description>
+    <attribute>
+        <name>var</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>sql</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>dataSource</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>param</name>
+    <tag-class>org.apache.taglibs.standard.tag.rt.sql.ParamTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Sets a parameter in an SQL statement to the specified value.
+    </description>
+    <attribute>
+        <name>value</name>
+        <required>true</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>driver</name>
+    <tag-class>org.apache.taglibs.standard.tag.common.sql.DriverTag</tag-class>
+    <body-content>empty</body-content>
+    <description>
+        Creates a simple DataSource suitable only for prototyping.
+    </description>
+    <attribute>
+        <name>var</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>driverClassName</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>jdbcURL</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>userName</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+</taglib>
diff --git a/conf/sql.tld b/conf/sql.tld
new file mode 100644
index 0000000..14ed36b
--- /dev/null
+++ b/conf/sql.tld
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE taglib
+  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+<taglib>
+  <tlib-version>1.0 EA3</tlib-version>
+  <jsp-version>1.2</jsp-version>
+  <short-name>sql</short-name>
+  <uri>http://java.sun.com/jstl/ea/sql</uri>
+  <display-name>JSTL sql</display-name>
+  <description>JSTL 1.0 sql library</description>
+
+  <validator>
+    <validator-class>
+	org.apache.taglibs.standard.tlv.JstlCoreTLV
+    </validator-class>
+    <init-param>
+        <param-name>expressionAttributes</param-name>
+        <param-value>
+        transaction:dataSource
+        query:sql
+        query:dataSource
+        query:startRow
+        query:maxRows
+        update:sql
+        update:dataSource
+        param:value
+        driver:driver
+        driver:jdbcURL
+        driver:userName
+        </param-value>
+        <description>
+            Whitespace-separated list of colon-separated token pairs
+            describing tag:attribute combinations that accept expressions.
+            The validator uses this information to determine which
+            attributes need their syntax validated.
+        </description>
+     </init-param>
+    <description>
+	Provides core validation features for JSTL tags.
+    </description>
+  </validator>
+
+  <!-- The validator also listens in order to recover a context parameter -->
+  <listener>
+    <listener-class>
+	org.apache.taglibs.standard.tlv.JstlCoreTLVHelper
+    </listener-class>
+  </listener>
+
+  <tag>
+    <name>transaction</name>
+    <tag-class>org.apache.taglibs.standard.tag.el.sql.TransactionTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Provides nested database action elements with a shared Connection,
+        set up to execute all statements as one transaction.
+    </description>
+    <attribute>
+        <name>dataSource</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>query</name>
+    <tag-class>org.apache.taglibs.standard.tag.el.sql.QueryTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Executes the SQL query defined in its body or through the
+        sql attribute.
+    </description>
+    <attribute>
+        <name>var</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>sql</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>dataSource</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>startRow</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>maxRows</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>update</name>
+    <tag-class>org.apache.taglibs.standard.tag.el.sql.UpdateTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Executes the SQL update defined in its body or through the
+        sql attribute.
+    </description>
+    <attribute>
+        <name>var</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>sql</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>dataSource</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>param</name>
+    <tag-class>org.apache.taglibs.standard.tag.el.sql.ParamTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Sets a parameter in an SQL statement to the specified value.
+    </description>
+    <attribute>
+        <name>value</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>driver</name>
+    <tag-class>org.apache.taglibs.standard.tag.el.sql.DriverTag</tag-class>
+    <body-content>empty</body-content>
+    <description>
+        Creates a simple DataSource suitable only for prototyping.
+    </description>
+    <attribute>
+        <name>var</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>driver</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>jdbcURL</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>userName</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+  </tag>
+</taglib>
diff --git a/conf/x-rt.tld b/conf/x-rt.tld
index 4e88913..ef95e94 100644
--- a/conf/x-rt.tld
+++ b/conf/x-rt.tld
@@ -49,20 +49,14 @@
     <tag-class>org.apache.taglibs.standard.tag.common.core.IfTag</tag-class>
     <body-content>JSP</body-content>
     <description>
-        Simple conditional tag, which evalutes its body if the
-        supplied condition is true and optionally exposes a Boolean
-        scripting variable representing the evaluation of this condition
+        XML conditional tag, which evalutes its body if the
+        supplied XPath expression evalutes to 'true' as a boolean
     </description>
     <attribute>
         <name>select</name>
         <required>true</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
-    <attribute>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
   </tag>
 
   <tag>
@@ -119,7 +113,7 @@
     <tag-class>org.apache.taglibs.standard.tag.rt.xml.ParseTag</tag-class>
     <body-content>JSP</body-content>
     <description>
-	Parses XML content from 'source' attribute or 'body'; exposes as 'var'.
+	Parses XML content from 'source' attribute or 'body'
     </description>
     <attribute>
         <name>var</name>
@@ -132,6 +126,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>source</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
@@ -148,7 +147,7 @@
     <tag-class>org.apache.taglibs.standard.tag.common.xml.SetTag</tag-class>
     <body-content>JSP</body-content>
     <description>
-	Sets the result of an XPath expression evaluation in a 'scope'
+	Saves the result of an XPath expression evaluation in a 'scope'
     </description>
     <attribute>
         <name>var</name>
@@ -160,13 +159,11 @@
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
-    <!--
     <attribute>
         <name>scope</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
-    -->
   </tag>
 
   <tag>
@@ -184,6 +181,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>result</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
@@ -218,6 +220,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
 	<name>xslt</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
@@ -230,7 +237,7 @@
     <body-content>JSP</body-content>
     <description>
         Subtag of &lt;choose&gt; that includes its body if its
-        condition evalutes to 'true'
+        expression evalutes to 'true'
     </description>
     <attribute>
         <name>select</name>
diff --git a/conf/x.tld b/conf/x.tld
index b444d29..c61aca1 100644
--- a/conf/x.tld
+++ b/conf/x.tld
@@ -74,20 +74,14 @@
     <tag-class>org.apache.taglibs.standard.tag.common.xml.IfTag</tag-class>
     <body-content>JSP</body-content>
     <description>
-        Simple conditional tag, which evalutes its body if the
-        supplied condition is true and optionally exposes a Boolean
-        scripting variable representing the evaluation of this condition
+      XML conditional tag, which evalutes its body if the
+      supplied XPath expression evalutes to 'true' as a boolean
     </description>
     <attribute>
         <name>select</name>
         <required>true</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
-    <attribute>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
   </tag>
 
   <tag>
@@ -144,7 +138,7 @@
     <tag-class>org.apache.taglibs.standard.tag.el.xml.ParseTag</tag-class>
     <body-content>JSP</body-content>
     <description>
-	Parses XML content from 'source' attribute or 'body'; exposes as 'var'.
+	Parses XML content from 'source' attribute or 'body'
     </description>
     <attribute>
         <name>var</name>
@@ -157,6 +151,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>source</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -173,7 +172,7 @@
     <tag-class>org.apache.taglibs.standard.tag.common.xml.SetTag</tag-class>
     <body-content>JSP</body-content>
     <description>
-	Sets the result of an XPath expression evaluation in a 'scope'
+	Saves the result of an XPath expression evaluation in a 'scope'
     </description>
     <attribute>
         <name>var</name>
@@ -185,13 +184,11 @@
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
-    <!--
     <attribute>
         <name>scope</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
-    -->
   </tag>
 
   <tag>
@@ -209,6 +206,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>result</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -243,6 +245,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
 	<name>xslt</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -255,7 +262,7 @@
     <body-content>JSP</body-content>
     <description>
         Subtag of &lt;choose&gt; that includes its body if its
-        condition evalutes to 'true'
+        expression evalutes to 'true'
     </description>
     <attribute>
         <name>select</name>
diff --git a/doc/conf/web.xml b/doc/conf/web.xml
index 39236b3..eacf87d 100644
--- a/doc/conf/web.xml
+++ b/doc/conf/web.xml
@@ -7,7 +7,7 @@
 <web-app>
 
   <description>
-  Documentation for the 'standard' tag library (JSTL EA2)
+  Documentation for the 'standard' tag library (JSTL EA3)
   </description>
 
 </web-app>
diff --git a/doc/web/Conditionals_FunctionalDescription_1_EA1.html b/doc/web/Conditionals_FunctionalDescription_1_EA1.html
index 96a2cb7..80a31fd 100644
--- a/doc/web/Conditionals_FunctionalDescription_1_EA1.html
+++ b/doc/web/Conditionals_FunctionalDescription_1_EA1.html
@@ -39,11 +39,11 @@ of possible alternative tags gets its body content evaluated. In the example
 below, the information displayed for a specific product depends on the
 verbosity level selected.
 <p><tt>&nbsp; &lt;choose></tt> <br>
-  <tt>&nbsp;&nbsp;&nbsp; &lt;when test="$verbosityLevel == 'short'></tt> <br>
+  <tt>&nbsp;&nbsp;&nbsp; &lt;when test="$verbosityLevel == 'short'"></tt> <br>
   <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:expr value=&quot;$product.shortDescription&quot;/&gt;</tt> 
   <br>
   <tt>&nbsp;&nbsp;&nbsp; &lt;/when></tt> <br>
-  <tt>&nbsp;&nbsp;&nbsp; &lt;when test="$verbosityLevel == 'medium'></tt> <br>
+  <tt>&nbsp;&nbsp;&nbsp; &lt;when test="$verbosityLevel == 'medium'"></tt> <br>
   <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:expr value=&quot;$product.mediumDescription&quot;/&gt;</tt> 
   <br>
   <tt>&nbsp;&nbsp;&nbsp; &lt;/when></tt><br>
diff --git a/doc/web/DB_FunctionalDescription_1_EA3.html b/doc/web/DB_FunctionalDescription_1_EA3.html
new file mode 100644
index 0000000..830de57
--- /dev/null
+++ b/doc/web/DB_FunctionalDescription_1_EA3.html
@@ -0,0 +1,645 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="GENERATOR" content="Mozilla/4.76 [en] (Windows NT 5.0; U) [Netscape]">
+   <title>Database Tags -- Functional Description</title>
+<style media="screen" type="text/css"><!--
+.fixme { color: red }
+--></style>
+</head>
+<body bgcolor="#FFFFFF">
+<h3> 
+  <hr width="100%" noshade>
+</h3>
+<h2> SQL Actions &#151; Functional Description <br>
+</h2>
+<h2><tt>&lt;sql:query&gt;<br>
+  &lt;sql:update&gt;<br>
+  &lt;sql:transaction&gt;<br>
+  &lt;sql:param&gt;<br>
+  &lt;sql:driver&gt;<br>
+  </tt></h2>
+<h2><tt>interface SQLExecutionTag<br>
+  interface Result<br>
+  interface Row<br>
+  interface ResultMetaData<br>
+  interface ColumnMetaData<br>
+  interface Column</tt><tt><br>
+  </tt></h2>
+<hr width="100%" noshade>
+<h3>1. Introduction</h3>
+<p>Many dynamic web applications need to access relational databases for the dynamic 
+  aspects of their presentation layer. While it can be argued that database operations 
+  should be handled in the business logic of a web application designed with an 
+  MVC architecture, the fact of the matter is that real world applications will 
+  sometimes require this capability within the JSP pages for various reasons (e.g. 
+  prototyping/testing, small scale/simple applications, lack of developer resources, 
+  etc).</p>
+<p>With JSTL, we do not want to force a unique way to design web applications. 
+  Our goal is to provide the right set of common tools needed by page authors 
+  to be successful in their projects. A set of database tags has been clearly 
+  identified as one of these required common tools</p>
+<hr width="100%" noshade>
+<h3>2. Overview<br>
+</h3>
+<p>The JSTL database actions allow a page author to </p>
+<ul>
+  <li>perform database queries (select)</li>
+  <li>easily access query results</li>
+  <li>perform database updates (insert, update, delete)</li>
+  <li>group database operations within transactions</li>
+</ul>
+<p><b>DataSource</b></p>
+<p>Database actions operate on a DataSource. A DataSource is an object associated 
+  with the database to be accessed. It provides a factory for Connection objects. 
+  With the JSTL database tagset, a DataSource can be specified either as a javax.sql.DataSource 
+  object, or as a path to a JNDI resource (in containers that support it; i.e. 
+  J2EE containers, or others that support this specific mechanism for referencing 
+  resources.)</p>
+<p>There are many ways by which a page author can get access to a DataSource, 
+  namely: </p>
+<blockquote> 
+  <p>1. Transparent collaboration (implicit scoped attribute)</p>
+  <p>Initialization code in the application logic (e.g. application event listener, 
+    initialization servlet) can be used to set the default DataSource associated 
+    with a web application via the scoped attribute &quot;javax.servlet.jsp.jstl.DataSource&quot;. 
+    With this approach, an application with a single database makes the DataSource 
+    that is being used by the database actions totally transparent to the page 
+    author</p>
+  <p>2. Explicit collaboration via application logic</p>
+  <p>The controller code in an MVC-based application sets a JSP scoped attribute 
+    representing the DataSource. The attribute's name and scope are communicated 
+    to the page author who uses that information in the &quot;dataSource&quot; 
+    attribute of the database actions. For example:</p>
+  <blockquote> 
+    <p><code>&lt;sql:query dataSource=&quot;$dataSource&quot; ...&gt;</code></p>
+  </blockquote>
+  <p>3. Explicit collaboration via &lt;sql:driver&gt; action</p>
+  <p>If a DataSource cannot be set within the application logic (prototype/simple 
+    project with no developer at hand), the &lt;sql:driver&gt; action can be used 
+    as a simplified alternative for the creation of a DataSource object wrapped 
+    around a JDBC driver. For example:</p>
+  <blockquote> 
+    <p><code>&lt;sql:driver var=&quot;dataSource&quot; <br>
+      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+      driver=&quot;org.gjt.mm.mysql.Driver&quot; <br>
+      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+      &nbsp;url=&quot;//localHost/myDB&quot;&gt;</code><br>
+      <code>&lt;sql:query dataSource=&quot;$dataSource&quot; .../&gt;</code> 
+    </p>
+  </blockquote>
+</blockquote>
+<p><b>Querying a database</b></p>
+<p>The most common usage of the database actions is to query a database and display 
+  the results. In the example below, customers from China are selected from the 
+  &quot;customers&quot; table of the database, they are ordered by last name, 
+  and finally displayed in an HTML table.</p>
+<blockquote> 
+  <p><code>&lt;sql:query var=&quot;customers&quot; dataSource=&quot;$dataSource&quot;<i>&gt;<br>
+    </i>&nbsp;&nbsp; SELECT * FROM customers<br>
+    &nbsp; &nbsp;WHERE country = 'China'<br>
+    &nbsp;&nbsp;&nbsp;ORDER BY lastname<br>
+    &lt;/sql:query&gt;<i> </i></code></p>
+</blockquote>
+<blockquote> 
+  <p><code><font color="#666666">&lt;table&gt;</font><i><br>
+    </i>&lt;jc:forEach var=&quot;row&quot; items=&quot;$customers.rows&quot;&gt;<br>
+    &nbsp;&nbsp;<font color="#666666">&lt;tr&gt; </font><br>
+    &nbsp;&nbsp;&nbsp;&nbsp;<font color="#666666">&lt;td&gt;</font>&lt;jc:expr 
+    value=&quot;$row.lastName&quot;/&gt;<font color="#666666">&lt;/td&gt;</font><br>
+    &nbsp;&nbsp;&nbsp;&nbsp;<font color="#666666">&lt;td&gt;</font>&lt;jc:expr 
+    value=&quot;$row.firstName&quot;/&gt;<font color="#666666">&lt;/td&gt;</font><br>
+    &nbsp;&nbsp;&nbsp;&nbsp;<font color="#666666">&lt;td&gt;</font>&lt;jc:expr 
+    value=&quot;$row.address&quot;/&gt;<font color="#666666">&lt;/td&gt;</font> 
+    <br>
+    &nbsp;&nbsp;<font color="#666666">&lt;/tr&gt; </font><br>
+    &lt;/jc:forEach&gt;<br>
+    <font color="#666666">&lt;/table&gt;</font> </code></p>
+</blockquote>
+<p><b>Updating a database</b></p>
+<p>It is possible to update a database via the &lt;sql:update&gt; action. Updates 
+  to the database can be grouped within a &lt;sql:transaction&gt; action to ensure 
+  database integrity. For example, the following code transfers money between 
+  two accounts.</p>
+<blockquote> 
+  <p><code>&lt;sql:transaction dataSource=&quot;$dataSource&quot;&gt;<br>
+    &nbsp;&nbsp;&lt;sql:update&gt; <br>
+    &nbsp;&nbsp;&nbsp; UPDATE account <br>
+    &nbsp;&nbsp;&nbsp;&nbsp;SET Balance = Balance - ?<br>
+    &nbsp; &nbsp;&nbsp;WHERE accountNo = ?<br>
+    </code><code>&nbsp;&nbsp;&nbsp;&nbsp;&lt;sql:param value=&quot;$transferAmount&quot;&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&lt;sql:param value=&quot;$accountFrom&quot;&gt;<br>
+    &nbsp;&nbsp;&lt;/sql:update&gt;<br>
+    &nbsp;&nbsp;&lt;sql:update&gt; <br>
+    &nbsp;&nbsp;&nbsp; UPDATE account <br>
+    &nbsp;&nbsp;&nbsp;&nbsp;SET Balance = Balance + ?<br>
+    &nbsp; &nbsp;&nbsp;WHERE accountNo = ?<br>
+    </code><code>&nbsp;&nbsp;&nbsp;&nbsp;&lt;sql:param value=&quot;$transferAmount&quot;&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&lt;sql:param value=&quot;$accountTo&quot;&gt;<br>
+    &nbsp;&nbsp;&lt;/sql:update&gt;<br>
+    &lt;/sql:transaction&gt; </code></p>
+</blockquote>
+<p><b>SQL Statement Parameters</b></p>
+<p>The JSTL database tagset also supports SQL statements that take parameters 
+  to supply values to be used in place of question mark placeholders (as seen 
+  in example above). This support is extensible via interface SQLExecutionTag 
+  so that custom &quot;parameter&quot; tags can be developed to easily set the 
+  value of statement parameters from any kind of input data.</p>
+<hr width="100%" noshade>
+<h3>3. Actions</h3>
+<h3>3.1 &lt;sql:query&gt;</h3>
+<h4>Synopsis</h4>
+<p>&lt;sql:query&gt; is the general purpose action for performing SQL queries 
+  on a database and gettting back a single result set containing rows of data.</p>
+<p>This action may or not have a body. If the action has no body, it is of the 
+  form:</p>
+<blockquote> 
+  <p><code>&lt;sql:query var=<i>&quot;varName&quot;</i> sql=&quot;<i>sqlQuery</i>&quot; 
+    [dataSource=<i>dataSourceSpec</i>]<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[maxRows=&quot;<i>maxRows</i>&quot;] 
+    [startRow=&quot;<i>startRow</i>&quot;] </code><code>/&gt;</code></p>
+  </blockquote>
+<p>If the action has a body, it is of the form:</p>
+<blockquote> 
+  <p><code>&lt;sql:query var=<i>&quot;varName&quot;</i> [sql=&quot;<i>sqlQuery</i>&quot;] 
+    [dataSource=<i>dataSourceSpec</i>]&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[maxRows=&quot;<i>maxRows</i>&quot;] 
+    [startRow=&quot;<i>startRow</i>&quot;</code><code>]&gt;<br>
+    </code><code>&nbsp;&nbsp;... optional query statement ...<br>
+    </code><code>&nbsp;&nbsp;... optional &lt;sql:param&gt; actions ...<br>
+    &lt;/sql:query&gt;</code></p>
+  <p>In the &quot;body&quot; form, the SQL query statement can be specified either 
+    via attribute &quot;sql&quot; or within the tag's body.</p>
+  </blockquote>
+<p><code>dataSourceSpec ::= javax.sql.DataSource object | &quot;jndiPathToDataSource&quot;</code><br>
+</p>
+<h4>Details</h4>
+<p>The results of the query are exposed via an object that implements the Result 
+  interface (see section 4.1) in the attribute named by &quot;var&quot;.</p>
+<p>For example:</p>
+<blockquote>
+  <p><code>&lt;sql:query var=&quot;customers&quot; dataSource=&quot;$dataSource&quot;<i>&gt;<br>
+    </i>&nbsp;&nbsp; SELECT * FROM employees<br>
+    &nbsp; &nbsp;WHERE country = 'China'<br>
+    &nbsp;&nbsp;&nbsp;ORDER BY lastname<br>
+    &lt;/sql:query&gt;<i> </i></code></p>
+</blockquote>
+<p>If the query produces no results, then an <i>empty</i> (i.e. size is 0) Result 
+  object is returned.</p>
+<p>The SQL query statement can be specified either via attribute &quot;sql&quot; 
+  or within the tag's body (mutually exclusive). Optional parameter markers (?) 
+  can be specified in the query statement as supported by JDBC. The values of 
+  these parameters are set via subtag &lt;sql:param&gt;. &lt;sql:query&gt; implements 
+  interface SQLExecutionTag (see section 4.2) to make this extensible to custom 
+  tags. </p>
+<p>The set of rows stored within the Result data structure can be limited by attribute 
+  &quot;maxRows&quot;. If unspecified, all rows resulting from the query are stored. 
+  Attribute &quot;startRow&quot; can be used to specify the starting row for the 
+  results. For example, if set at 10, this means that the first 9 rows will be 
+  skipped before the rows returned by the query are stored in the Result data 
+  structure (up to maxRows if applicable).</p>
+<p>These two attributes protect against &quot;runaway queries&quot;, allow efficient 
+  access to the top rows of large result sets, and also provide a poor-man's way 
+  of paging through a large set of results by bumping the startRow up by maxRows 
+  on each page.<br>
+  <br>
+  It is also possible to configure a default &quot;maxRows&quot; value that applies 
+  by default to all &lt;sql:query&gt; actions. This is done via context parameter 
+  &quot;javax.servlet.jsp.jstl.sql.maxRows&quot;. This global value for maxRows 
+  can be turned off by giving the maxRows attribute of an &lt;sql:query&gt; action 
+  the value -1.</p>
+<p>The tag retrieves and releases a Connection using the following algorithm: 
+</p>
+<ol>
+  <li>If the optional &quot;dataSource&quot; attribute is provided, then a connection 
+    is retrieved through getConnection() against this DataSource, and released 
+    by the tag handler before the tag completes its processing (result set is 
+    cached in the Result object). If the 'dataSource' attribute's value resolves 
+    to a String, after rtexpr/EL evaluation, this String is used as a JNDI path 
+    to a DataSource in containers that support it (i.e., J2EE containers, or others 
+    that support this specific mechanism for referencing resources.)</li>
+  <li>If &quot;dataSource&quot; is not present, but we are the child tag of a 
+    &lt;sql:transaction&gt; tag, retrieve a Connection from our parent and do 
+    nothing to release it. The connection is managed by the parent.</li>
+  <li>If neither (1) nor (2), then look for a DataSource named by scoped attribute 
+    &quot;javax.servlet.jsp.jstl.DataSource&quot;. Handling of the connection 
+    is then as described in 1.</li>
+</ol>
+<p>It is illegal for &lt;sql:query&gt; to specify a DataSource when nested within 
+  &lt;sql:transaction&gt; (throws JspTagException).</p>
+<h3>3.2 &lt;sql:update&gt;</h3>
+<h4>Synopsis</h4>
+<p>&lt;sql:update&gt; executes an SQL INSERT, UPDATE or DELETE statement. In addition, 
+  SQL statements that return nothing, such as SQL DDL statements, can be executed.</p>
+<p>This action may or not have a body. If the action has no body, it is of the 
+  form:</p>
+<blockquote> 
+  <p><code>&lt;sql:update sql=&quot;<i>sqlUpdate</i>&quot; <br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [var=<i>&quot;varName&quot;</i>] 
+    <br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [dataSource=<i>dataSourceSpec</i>]/&gt;</code></p>
+</blockquote>
+<p>If the action has a body, it is of the form:</p>
+<blockquote> 
+  <p><code>&lt;sql:update [sql=&quot;<i>sqlUpdate</i>&quot;] <br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[var=<i>&quot;varName&quot;]</i></code><code><br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[dataSource=<i>dataSourceSpec</i>]&gt;<br>
+    &nbsp;&nbsp;... optional update statement ...<br>
+    &nbsp;&nbsp;... optional &lt;sql:param&gt; actions ...<br>
+    &lt;/sql:query&gt;</code></p>
+  <p>The SQL update statement can be specified either via attribute &quot;sql&quot; 
+    or within the tag's body.</p>
+</blockquote>
+<p><code>dataSourceSpec ::= javax.sql.DataSource object | <br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+  &quot;<i>jndiPathToDataSource</i>&quot;</code><br>
+</p>
+<h4>Details</h4>
+<p>The result of the database update is optionally exposed in the attribute named 
+  by &quot;var&quot;. This result is a java.lang.Integer object that tells how 
+  many rows were affected by the statement. The value 0 is returned if no rows 
+  were affected by INSERT, DELETE, or UPDATE, as well as for DDL statements that 
+  return nothing (e.g. CREATE TABLE). This is the same behavior as Statement.executeUpdate() 
+  in JDBC.</p>
+<p>For example:
+<blockquote>
+  <p><code>&lt;sql:update&gt;<br>
+    &nbsp;&nbsp; UPDATE account <br>
+    &nbsp;&nbsp;&nbsp;SET BALANCE = ?<br>
+    &nbsp; &nbsp;WHERE accountNo = ?<br>
+    </code><code>&nbsp;&nbsp;&lt;sql:param value=&quot;$balance&quot;&gt;<br>
+    &nbsp;&nbsp;&lt;sql:param value=&quot;$accountNo&quot;&gt;<br>
+    &lt;/sql:update&gt;</code></p>
+  </blockquote>
+<p>The tag acts identically to &lt;sql:query&gt; with respect to connection management, 
+  the &quot;sql&quot; and &quot;dataSource&quot; attributes, PreparedStatement 
+  lifecycle, etc.</p>
+<h3>3.3 &lt;sql:transaction&gt;</h3>
+<h4>Synopsis</h4>
+<p>&lt;sql:transaction&gt; serves to establish a transaction context for its &lt;sql:query&gt; 
+  and &lt;sql:update&gt; subtags. </p>
+<p><code>&lt;sql:transaction [dataSource=<i>dataSourceSpec</i>] <br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+  [transactionIsolation=<i>&quot;transactionIsolationLevel&quot;</i>]&gt;<br>
+  &nbsp;&nbsp;&nbsp;... &lt;sql:query&gt; and &lt;sql:update&gt; statements ...<br>
+  &lt;/sql:transaction&gt; </code></p>
+<p><code>dataSourceSpec ::= javax.sql.DataSource object | &quot;jndiPathToDataSource&quot;<br>
+  transactionIsolationLevel ::= &quot;none&quot; | &quot;read_committed&quot; 
+  | &quot;read_uncommitted&quot; | <br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;repeatable_read&quot; 
+  | &quot;serializable&quot;</code><br>
+</p>
+<p>The transaction isolation levels are the same as the ones supported in JDBC 
+  by java.sql.Connection.<br>
+</p>
+<h4>Details</h4>
+Behavior is defined as follows: 
+<ul>
+  <li>in doStartTag(), call Connection.getTransactionIsolation(). 
+    <ul>
+      <li>If this equals TRANSACTION_NONE 
+        <ul>
+          <li>fail by throwing an exception.</li>
+        </ul>
+      </li>
+      <li>If this does not equal TRANSACTION_NONE 
+        <ul>
+          <li>call Connection.setAutoCommit(false).</li>
+        </ul>
+      </li>
+    </ul>
+  </li>
+  <li>If the &quot;transactionIsolation&quot; attribute is specified 
+    <ul>
+      <li>save current transaction isolation level and set the specified one for 
+        the connection.</li>
+    </ul>
+  </li>
+  <li>in doEndTag(), call Connection.commit()</li>
+  <li>in doCatch(), call Connection.rollback()</li>
+  <li>in doFinally() 
+    <ul>
+      <li>restore the transaction isolation level via Connection.setTransactionIsolation(), 
+        if one was saved </li>
+      <li>reset auto commit: Connection.setAutoCommit(true)</li>
+      <li>close the connection</li>
+    </ul>
+  </li>
+</ul>
+<p>Throughout the transaction, any SQLException that occurs is simply propagated.</p>
+<p>The same connection-management scheme as &lt;sql:query&gt; is used to acquire 
+  a Connection, except that the parent isn't checked for DataSource (&lt;sql:transaction&gt; 
+  tags cannot be nested as a means of propagating a Connection). It is iIllegal 
+  for nested &lt;sql:query&gt; and &lt;sql:update&gt; subtags to specify a DataSource.</p>
+<p>The behavior of the &lt;sql:transaction&gt; action is undefined if it executes 
+  in the context of a larger JTA user transaction.</p>
+<h3>3.4 &lt;sql:driver&gt;</h3>
+<h4>Synopsis</h4>
+<p>&lt;sql:driver&gt; facilitates the wrapping of a DataSource object around a 
+  JDBC driver for prototype/simple applications.</p>
+<p><code>&lt;sql:driver var=<i>&quot;varName&quot;</i><br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[driver=&quot;<i>driverClassName</i>&quot;] 
+  <br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[url=&quot;<i>jdbcUrl</i>&quot;]<br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[user=&quot;<i>userName</i>&quot;] 
+  /&gt;</code></p>
+<h4>Details<br>
+</h4>
+<p>The &lt;sql:driver&gt; action is <b> only intended for prototyping and simple 
+  applications</b>. An application's business logic (e.g. via a life cycle event 
+  listener or controller servlet) should normally be used to create a DataSource 
+  and make it available to the rest of the application.</p>
+<p>Four configuration parameters can be specified to create a DataSource object 
+  wrapped around a JDBC driver manager:</p>
+<ol>
+  <li>JDBC driver class name -- used to access a database of a specific type</li>
+  <li> JDBC URL to the database -- used to locate a specific database</li>
+  <li> user name -- identifies the user accessing the database</li>
+  <li> password -- the user's password</li>
+</ol>
+<p>All parameters, except for &quot;password&quot;, can be specified via an action 
+  attribute or a context init parameter (see below). Action attributes take precedence 
+  over context init parameters. The password configuration parameter can only 
+  be specified via a context init parameter to prevent situations where sensitive 
+  information would be hard coded in a JSP page.</p>
+<p>The context init parameters are:</p>
+<ul>
+  <li>javax.servlet.jsp.jstl.sql.driver</li>
+  <li> javax.servlet.jsp.jstl.sql.url</li>
+  <li> javax.servlet.jsp.jstl.sql.user</li>
+  <li> javax.servlet.jsp.jstl.sql.password</li>
+</ul>
+<p>For example, assuming a prototype web application whose database is accessible 
+  by anyone without any password:</p>
+<blockquote> 
+  <p><code>&lt;sql:driver var=&quot;dataSource&quot; <br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driver=&quot;org.gjt.mm.mysql.Driver&quot; 
+    <br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url=&quot;//localhost/appDB&quot;/&gt;</code></p>
+</blockquote>
+<h3>3.5 &lt;sql:param&gt;</h3>
+<h4>Synopsis</h4>
+<p>&lt;sql:param&gt; is used as a subtag of SQLExecutionTag actions such as &lt;sql:query&gt; 
+  and &lt;sql:update&gt; to set the values of parameter markers ('?') specified 
+  in the SQL statement.</p>
+<p>This action may or not have a body. If the action has no body, it is of the 
+  form:</p>
+<blockquote> 
+  <p><code>&lt;sql:param value=<i>&quot;parameterValue&quot;</i>/&gt;</code></p>
+</blockquote>
+<p>If the action has a body, it is of the form:</p>
+<blockquote> 
+  <p><code>&lt;sql:param&gt;<br>
+    &nbsp;&nbsp;... parameter value ...<br>
+    &lt;/sql:param&gt;</code></p>
+</blockquote>
+<h4>Details<br>
+</h4>
+<p> If tag body is used, it is first run through String.trim().</p>
+<p>With the value specified, &lt;sql:param&gt; locates its nearest SQLExecutionTag 
+  ancestor and calls SQLExecutionTag.addSQLParameter(value). The mapping from 
+  Java object types to SQL types is handled according to the JDBC specification 
+  (see method java.sql.PreparedStatement.setObject()).</p>
+<hr width="100%" noshade>
+<h3>4. Interfaces</h3>
+<h3>4.1 &lt;sql:query&gt; result related interfaces</h3>
+<blockquote> 
+  <p><code>public interface Result { <br>
+    &nbsp;&nbsp;public Row[] getRows(); &nbsp;</code><code><br>
+    </code><code>&nbsp;&nbsp;public ResultMetaData getmetaData(); </code><code><br>
+    &nbsp;&nbsp;public int getSize(); &nbsp;// number of rows in the Result<br>
+    &nbsp;&nbsp;public boolean isLimitedByMaxRows();</code><code><br>
+    }</code><code> </code><code> </code></p>
+  <p> <code>public interface ResultMetaData {<br>
+    &nbsp;&nbsp;public ColumnMetaData get(String name);<br>
+    &nbsp;&nbsp;public ColumnMetaData get(int index);<br>
+    &nbsp;&nbsp;public ColumnMetaData[] getColumns();<br>
+    &nbsp;&nbsp;// @@@ non-column meta data here as well<br>
+    }</code></p>
+  <p><code> public interface Row {<br>
+    &nbsp;&nbsp;public Column get(String name);<br>
+    &nbsp;&nbsp;public Column get(int index); <br>
+    &nbsp;&nbsp;public Column[] getColumns();<br>
+    }</code></p>
+  <p><code> public interface ColumnMetaData {<br>
+    &nbsp;&nbsp;public String getName();<br>
+    &nbsp;&nbsp;public int getType();<br>
+    &nbsp;&nbsp;public String getTypeName();<br>
+    &nbsp;&nbsp;... all other relevant <br>
+    &nbsp;&nbsp;... java.sql.ResultSetMetaData information<br>
+    } </code></p>
+  <p><code> public interface Column extends ColumnMetaData {<br>
+    &nbsp;&nbsp;public Object getValue();<br>
+    &nbsp;&nbsp;public String toString();</code><br>
+    } </p>
+  
+</blockquote>
+<p>One key incentive for defining new interfaces representing the result of a 
+  query is to allow simpler access to result data via the Expression Language. 
+  Here are some sample use cases:</p>
+<p>Use case 1: iteration (probably most common use case)</p>
+<blockquote> 
+  <p><code>&lt;c:forEach var=&quot;row&quot; items=&quot;$result.rows&quot;&gt;<br>
+    &nbsp;&nbsp;Price is: &lt;c:expr value=&quot;$row.get('price')&quot;/&gt;</code><code><br>
+    &nbsp;&nbsp;Quantity is: &lt;c:expr value=&quot;$row.columns[3]&quot;/&gt;<br>
+    &lt;/c:forEach&gt;</code></p>
+  </blockquote>
+<p>[Note: <code>$row.get('price')</code> could be replaced by <code>$row.price</code> 
+  if EL supports the mapping <code>$a.prop -&gt; a.get(&quot;prop&quot;)</code>]<br>
+  <br>
+  Use case 2: direct access from $result </p>
+<blockquote>
+  <p><code>Price is: $result.rows[24].price<br>
+    Price is: $result.rows[24].columns[3] </code></p>
+</blockquote>
+<p><br>
+  Use case 3: Putting it all together:</p>
+<blockquote> 
+  <p><code>&lt;table&gt;<br>
+    &nbsp;&nbsp;&lt;!-- header --&gt;<br>
+    &nbsp;&nbsp;&lt;tr&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- for each column in the result --&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&lt;c:forEach var=&quot;metaData&quot; items=&quot;$result.metaData.columns&quot;&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- Column Name --&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;$metaData.name&lt;/th&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&lt;/c:forEach&gt;<br>
+    &nbsp;&nbsp;&lt;/tr&gt;<br>
+    &nbsp;&nbsp;&lt;!-- for each row in the result --&gt;<br>
+    &nbsp;&nbsp;&lt;c:forEach var=&quot;row&quot; items=&quot;$result.rows&quot;&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- for each column in the row --&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&lt;c:forEach var=&quot;column&quot; items=&quot;$row.columns&quot;&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;c:expr value=&quot;$column&quot;/&gt;&lt;/td&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&lt;/c:forEach&gt;<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br>
+    &nbsp;&nbsp;&lt;/c:forEach&gt;<br>
+    &lt;/table&gt;</code></p>
+</blockquote>
+<p>
+<h3>4.2 Interface SQLExecutionTag</h3>
+<p>The SQLExecutionTag interface identifies a tag handler that can accept parameter 
+  values from nested tag handlers.</p>
+<blockquote> 
+  <p><code>public interface SQLExecutionTag {<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;public void addSQLParameter(Object value) throws SQLException;<br>
+    }</code></p>
+</blockquote>
+<p>This interface is implemented by both &lt;sql:query&gt; and &lt;sql:update&gt;. 
+  Action &lt;sql:param&gt; invokes method addSQLParameter() of the SQLExecutionTag 
+  interface to set parameter values. </p>
+<p>The parameter's index and semantic interpretation are both the responsibility 
+  of the tag handler; a typical implementation will keep an internal index and 
+  increment it once for each call. </p>
+<p>This interface is public to allow for custom actions that can facilitate the 
+  setting of statement parameters. For example, let's assume an end-user enters 
+  a date in three separate fields: year, month, and day. If the database table 
+  has a single column for the complete date, one could develop a &lt;foo:dateParam&gt; 
+  action to set the corresponding parameter as follows:</p>
+<blockquote>
+  <p> <code>&lt;foo:dateParam year=&quot;$year&quot; month=&quot;$month&quot; 
+    day=&quot;$day&quot; /&gt;</code></p>
+</blockquote>
+<p>Please note that the JSTL internationalization tags support the parsing of 
+  string representations of dates and numbers into their associated data type 
+  (java.util.Date and java.lang.Number respectively). For example:</p>
+<blockquote>
+  <p> <code>&lt;fmt:parseDate var=&quot;myDate&quot; value=&quot;$param:someDate 
+    /&gt;<br>
+    &lt;sql:param value=&quot;$myDate&quot; /&gt;</code></p>
+</blockquote>
+<p></p>
+<hr width="100%" noshade>
+<p></p>
+<h3>5. Summary</h3>
+<table border="1" cellpadding="5">
+  <tr> 
+    <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">SQL Actions</font></b></td>
+  </tr>
+  <tr bgcolor="#FFFF66"> 
+    <td><b>Action</b></td>
+    <td><b>Sample usage</b></td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>&lt;sql:query&gt;</b></code></p>
+      <p><code>&lt;sql:query var=<i>&quot;varName&quot;</i> <br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql=&quot;<i>sqlQuery</i>&quot;<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [dataSource=<i>dataSourceSpec</i>]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[maxRows=&quot;<i>maxRows</i>&quot;]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[startRow=&quot;<i>startRow</i>&quot;]/&gt;</code></p>
+      <p><code>&lt;sql:query var=<i>&quot;varName&quot;<br>
+        &nbsp;&nbsp;&nbsp; </i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[sql=&quot;<i>sqlQuery</i>&quot;]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [dataSource=<i>dataSourceSpec</i>]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[maxRows=&quot;<i>maxRows</i>&quot;]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[startRow=&quot;<i>startRow</i>&quot;]/&gt; 
+        </code><code><br>
+        &nbsp;&nbsp;... optional query statement ...<br>
+        &nbsp;&nbsp;... optional &lt;sql:param&gt; actions ...<br>
+        &lt;/sql:query&gt;</code></p>
+      <p>General purpose action for performing SQL queries on a database and gettting 
+        back a single result set containing rows of data.</p>
+    </td>
+    <td> 
+      <p><code>&lt;sql:query var=&quot;customers&quot;<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+        dataSource=&quot;$dataSource&quot;<i>&gt;<br>
+        </i>&nbsp;&nbsp; SELECT * FROM employees<br>
+        &nbsp; &nbsp;WHERE country = 'China'<br>
+        &nbsp;&nbsp;&nbsp;ORDER BY lastname<br>
+        &lt;/sql:query&gt;<i> </i></code></p>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>&lt;sql:update&gt;</b></code></p>
+      <p><code>&lt;sql:update [var=<i>&quot;varName&quot;</i>] <br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql=&quot;<i>sqlUpdate</i>&quot;<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [dataSource=<i>dataSourceSpec</i>]/&gt;</code></p>
+      <p><code>&lt;sql:update [var=<i>&quot;varName&quot;]<br>
+        &nbsp;&nbsp;&nbsp; </i></code><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[sql=&quot;<i>sqlUpdate</i>&quot;]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [dataSource=<i>dataSourceSpec</i>]&gt;<br>
+        &nbsp;&nbsp;... optional query statement ...<br>
+        &nbsp;&nbsp;... optional &lt;sql:param&gt; actions ...<br>
+        &lt;/sql:update&gt;</code></p>
+      <p>General purpose action for &quot;updates&quot;; i.e. statements that 
+        update the database (insert, update, delete) and return nothing or a single 
+        integer. </p>
+    </td>
+    <td> 
+      <p><code>&lt;sql:update&gt;<br>
+        &nbsp;&nbsp;UPDATE account <br>
+        &nbsp;&nbsp;SET BALANCE = ?<br>
+        &nbsp; WHERE accountNo = ?<br>
+        </code><code>&nbsp;&nbsp;&lt;sql:param<br>
+        &nbsp;&nbsp;&nbsp;&nbsp; value=&quot;$balance&quot;&gt;<br>
+        &nbsp;&nbsp;&lt;sql:param<br>
+        &nbsp;&nbsp;&nbsp; &nbsp;value=&quot;$accountNo&quot;&gt;<br>
+        &lt;/sql:update&gt;</code></p>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>&lt;sql:transaction&gt;<br>
+        </b></code><br>
+        <code>&lt;sql:transaction <br>
+        &nbsp;&nbsp; &nbsp;[dataSource=<i>dataSourceSpec</i>] <br>
+        &nbsp;&nbsp;&nbsp;&nbsp;[transactionIsolation=<i>&quot;transactionIsolationLevel&quot;</i>]&gt;<br>
+        &nbsp;&nbsp;... &lt;sql:query&gt; and &lt;sql:update&gt; statements ...<br>
+        &lt;/sql:transaction&gt; </code></p>
+    </td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>&lt;sql:driver&gt;<br>
+        </b></code><br>
+        <code>&lt;sql:driver var=<i>&quot;varName&quot;</i><br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[driver=&quot;<i>driverClassName</i>&quot;] 
+        <br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[jdbcUrl=&quot;<i>jdbcUrl</i>&quot;]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[userName=&quot;<i>userName</i>&quot;] 
+        /&gt;</code><br>
+      </p>
+      <p>Facilitates the setup of a DataSource object around a JDBC driver for 
+        prototype/simple applications. </p>
+    </td>
+    <td>&nbsp; </td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>&lt;sql:param&gt;<br>
+        </b></code> </p>
+      <p><code>&lt;sql:param value=<i>&quot;parameterValue&quot;</i>/&gt;</code></p>
+      <p><code>&lt;sql:param&gt;<br>
+        &nbsp;&nbsp;... parameter value ...<br>
+        &lt;/sql:param&gt;</code><br>
+      </p>
+      <p>Subtag of SQLExecutionTag actions such as &lt;sql:query&gt; and &lt;sql:update&gt; 
+        to set the values of parameter markers ('?') specified in the SQL statement.</p>
+    </td>
+    <td>&nbsp; </td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>&lt;sql:query&gt; result related interfaces<br>
+        </b></code> </p>
+      <p><code>public interface Result<br>
+        </code><code> </code><code>public interface ResultMetaData<br>
+        </code><code>public interface Row</code><code><br>
+        public interface ColumnMetaData</code><code><br>
+        public </code><code>interface Column</code></p>
+      </td>
+    <td>&nbsp; </td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>interface SQLExecutionTag</b></code> </p>
+      <p>Identifies a tag handler that can accept parameter values from nested 
+        tag handlers.</p>
+    </td>
+    <td>&nbsp; </td>
+  </tr>
+</table>
+</body>
+</html>
diff --git a/doc/web/EcmaScriptEL.html b/doc/web/EcmaScriptEL.html
new file mode 100644
index 0000000..2f32db8
--- /dev/null
+++ b/doc/web/EcmaScriptEL.html
@@ -0,0 +1,599 @@
+<html>
+<head>
+<title>EcmaScript Expression Language Support</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF" text="#000000">
+<h1>EcmaScript as an Expression Language for JSTL</h1>
+<h2>Overview</h2>
+<p>EcmaScript is an object-based scripting language for client and server applications. 
+  EcmaScript is the standardized version of JavaScript and behaves the same way 
+  in all applications that support the standard. JavaScript implementations correspond 
+  to the <a href="http://www.ecma.ch/ecma1/stand/ecma-262.htm">ECMA-262</a> Language 
+  Specification standardized by the European standards body.</p>
+<p>Rhino 1.5, one of the supported JSTL EL's, implements JavaScript 1.5, which 
+  conforms to Edition 3 of the EcmaScript Standard. <a href="http://www.mozilla.org/rhino">Rhino</a> 
+  is an open source Java implementation of JavaScript. </p>
+<table border="1" cellpadding="5" align="center">
+  <tr> 
+    <th>Name</th>
+    <th>Links</th>
+    <th>Date</th>
+    <th>Description</th>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">ECMA-262</div>
+    </td>
+    <td> 
+      <div align="left"><a href="http://www.mozilla.org/js/language/E262.pdf">PDF</a></div>
+    </td>
+    <td> 
+      <div align="left">June 1997</div>
+    </td>
+    <td> 
+      <div align="left">The original ECMAScript standard.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">ECMA-262 Edition 2</div>
+    </td>
+    <td> 
+      <div align="left"><a href="http://www.mozilla.org/js/language/E262-2.pdf">PDF</a></div>
+    </td>
+    <td> 
+      <div align="left">August 1998 </div>
+    </td>
+    <td> 
+      <div align="left">The second revision of the ECMAScript standard; also ISO 
+        standard 16262.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">ECMA-262 Edition 3</div>
+    </td>
+    <td> 
+      <div align="left"><a href="http://www.mozilla.org/js/language/E262-3.pdf">PDF</a></div>
+    </td>
+    <td> 
+      <div align="left">December 1999</div>
+    </td>
+    <td> 
+      <div align="left">The third, and most recent, revision of the ECMAScript 
+        standard. Corresponds to JavaScript 1.5.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Proposed EcmaScript Edition 4</div>
+    </td>
+    <td> 
+      <div align="left"><a href="http://www.mozilla.org/js/language/es4/index.html">Home 
+        Page</a></div>
+    </td>
+    <td> 
+      <div align="left">?</div>
+    </td>
+    <td> 
+      <p align="left"><a href="http://www.mozilla.org/js/language/js20/index.html">JavaScript 
+        2.0</a> is the next version of the JavaScript language. It closely matches 
+        the ECMAScript Edition 4 standard under development. The intent is to 
+        make JavaScript 2.0 and ECMAScript Edition 4 be the same language.</p>
+    </td>
+  </tr>
+</table>
+<p>This document gives a brief overview of the main EcmaScript features a page 
+  author may be interested in. </p>
+<h2>Expression Support</h2>
+<p>An expression is any valid set of literals, variables, operators, and expressions 
+  that evaluates to a single value; the value can be a number, a string, a logical 
+  value, or an object.<br>
+</p>
+<p>EcmaScript has the following types of expressions: </p>
+<ul>
+  <li>Arithmetic: evaluates to a number</li>
+  <li>String: evaluates to a character string</li>
+  <li>Logical: evaluates to true or false </li>
+  <li>Object: evaluates to an object </li>
+</ul>
+<h2>Operator Support</h2>
+<p>The following operators should be of interest to a page author.<br>
+</p>
+<h3>Comparison operators</h3>
+<p>A comparison operator compares its operands and returns a logical value based 
+  on whether the comparison is true. The operands can be numerical, string, logical, 
+  or object values. Strings are compared based on standard lexicographical ordering, 
+  using Unicode values.</p>
+<p></p>
+<p></p>
+<p></p>
+<table border="1" align="center" cellpadding="5">
+  <tr> 
+    <th>Operator</th>
+    <th>Description</th>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Equal (==)</div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the operands are equal.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Not equal (!=) </div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the operands are not equal.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Strict equal (===)</div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the operands are equal and of the same 
+        type.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Strict not equal (!==) </div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the operands are not equal and/or not 
+        of the same type. </div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Greater than (&gt;)</div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the left operand is greater than the right 
+        operand.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Greater than or equal (&gt;=)</div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the left operand is greater than or equal 
+        to the right operand.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Less than (&lt;)</div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the left operand is less than the right 
+        operand.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Less than or equal (&lt;=)</div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the left operand is less than or equal 
+        to the right operand.</div>
+    </td>
+  </tr>
+</table>
+<h3>Arithmetic Operators</h3>
+<p>Arithmetic operators take numerical values (either literals or variables) as 
+  their operands and return a single numerical value. These operators work as 
+  they do in most other programming languages, except the / operator returns a 
+  floating-point division in EcmaScript, not a truncated division as it does in 
+  languages such as C or Java.</p>
+<table border="1" align="center" cellpadding="5">
+  <tr> 
+    <th>Operator</th>
+    <th>Description</th>
+  </tr>
+  <tr> 
+    <td> 
+      <p align="left">% (Modulus)</p>
+    </td>
+    <td> 
+      <div align="left">Binary operator. Returns the integer remainder of dividing 
+        the two operands.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">++ (Increment)</div>
+    </td>
+    <td> 
+      <div align="left">Unary operator. Adds one to its operand. Can be used as 
+        a prefix or postfix operator.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">-- (Decrement)</div>
+    </td>
+    <td> 
+      <div align="left">Unary operator. Subtracts one to its operand. Can be used 
+        as a prefix or postfix operator.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">- (Unary negation)</div>
+    </td>
+    <td> 
+      <div align="left">Unary operator. Returns the negation of its operand.</div>
+    </td>
+  </tr>
+</table>
+<h3>Logical Operators</h3>
+<p>Logical operators are typically used with Boolean (logical) values; when they 
+  are, they return a Boolean value. However, the &amp;&amp; and || operators return 
+  the value of one of the specified operands.</p>
+<table border="1" align="center" cellpadding="5">
+  <tr> 
+    <th>Operator</th>
+    <th>Usage</th>
+    <th>Description</th>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Logical AND</div>
+    </td>
+    <td> 
+      <div align="left">expr1 &amp;&amp; expr2 </div>
+    </td>
+    <td> 
+      <div align="left">Returns expr1 if it can be converted to false; otherwise, 
+        returns expr2. </div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Logical OR </div>
+    </td>
+    <td> 
+      <div align="left">expr1 || expr2 </div>
+    </td>
+    <td> 
+      <div align="left">Returns expr1 if it can be converted to true; otherwise, 
+        returns expr2. </div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Logical NOT</div>
+    </td>
+    <td> 
+      <div align="left">!expr </div>
+    </td>
+    <td> 
+      <div align="left">Returns false if its single operand can be converted to 
+        true; otherwise, returns true. </div>
+    </td>
+  </tr>
+</table>
+<h3>String Operators</h3>
+<p>In addition to the comparison operators, which can be used on string values, 
+  the concatenation operator (+) concatenates two string values together, returning 
+  another string that is the union of the two operand strings. </p>
+<p></p>
+<h3>Special Operators</h3>
+<p>Some special operators of interest:</p>
+<table border="1" align="center" cellpadding="5">
+  <tr> 
+    <th>Operator</th>
+    <th>Usage</th>
+    <th>Description</th>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">conditional</div>
+    </td>
+    <td> 
+      <div align="left">condition ? val1 : val2</div>
+    </td>
+    <td> 
+      <div align="left">The conditional operator can have one of two values based 
+        on a condition. </div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">in</div>
+    </td>
+    <td> 
+      <div align="left">val in Object</div>
+    </td>
+    <td> 
+      <div align="left">The in operator returns true if the specified property 
+        is in the specified object.</div>
+    </td>
+  </tr>
+</table>
+<h2>Reserved Words</h2>
+<p>The reserved words in this list cannot be used as EcmaScript variables, functions, 
+  methods, or object names.</p>
+<table width="95%" border="1" height="298">
+  <tr> 
+    <td> 
+      <p align="center"></p>
+      <p align="center"></p>
+      <p align="center"> </p>
+      <p align="center"> abstract</p>
+    </td>
+    <td> 
+      <div align="center">else</div>
+    </td>
+    <td> 
+      <div align="center">instanceof</div>
+    </td>
+    <td> 
+      <div align="center">switch</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">boolean</div>
+    </td>
+    <td> 
+      <div align="center">enum</div>
+    </td>
+    <td> 
+      <div align="center">int</div>
+    </td>
+    <td> 
+      <div align="center">synchronized</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">break</div>
+    </td>
+    <td> 
+      <div align="center">export</div>
+    </td>
+    <td> 
+      <div align="center">interface</div>
+    </td>
+    <td> 
+      <div align="center">this</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">byte</div>
+    </td>
+    <td> 
+      <div align="center">extends</div>
+    </td>
+    <td> 
+      <div align="center">long</div>
+    </td>
+    <td> 
+      <div align="center">throw</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">case</div>
+    </td>
+    <td> 
+      <div align="center">false</div>
+    </td>
+    <td> 
+      <div align="center">native</div>
+    </td>
+    <td> 
+      <div align="center">throws</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">catch</div>
+    </td>
+    <td> 
+      <div align="center">final</div>
+    </td>
+    <td> 
+      <div align="center">new</div>
+    </td>
+    <td> 
+      <div align="center">transient</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">char</div>
+    </td>
+    <td> 
+      <div align="center">finally</div>
+    </td>
+    <td> 
+      <div align="center">null</div>
+    </td>
+    <td> 
+      <div align="center">true</div>
+    </td>
+  </tr>
+  <tr> 
+    <td height="20"> 
+      <div align="center">class</div>
+    </td>
+    <td height="20"> 
+      <div align="center">float</div>
+    </td>
+    <td height="20"> 
+      <div align="center">package</div>
+    </td>
+    <td height="20"> 
+      <div align="center">try</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">const</div>
+    </td>
+    <td> 
+      <div align="center">for</div>
+    </td>
+    <td> 
+      <div align="center">private</div>
+    </td>
+    <td> 
+      <div align="center">typeof</div>
+    </td>
+  </tr>
+  <tr> 
+    <td height="18"> 
+      <div align="center">continue</div>
+    </td>
+    <td height="18"> 
+      <div align="center">function</div>
+    </td>
+    <td height="18"> 
+      <div align="center">protected</div>
+    </td>
+    <td height="18"> 
+      <div align="center">var</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">debugger</div>
+    </td>
+    <td> 
+      <div align="center">goto</div>
+    </td>
+    <td> 
+      <div align="center">public</div>
+    </td>
+    <td> 
+      <div align="center">void</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">default</div>
+    </td>
+    <td> 
+      <div align="center">if</div>
+    </td>
+    <td> 
+      <div align="center">return</div>
+    </td>
+    <td> 
+      <div align="center">volatile</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">delete</div>
+    </td>
+    <td> 
+      <div align="center">implements</div>
+    </td>
+    <td> 
+      <div align="center">short</div>
+    </td>
+    <td> 
+      <div align="center">while</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">do</div>
+    </td>
+    <td> 
+      <div align="center">import</div>
+    </td>
+    <td> 
+      <div align="center">static</div>
+    </td>
+    <td> 
+      <div align="center">with</div>
+    </td>
+  </tr>
+  <tr> 
+    <td height="2"> 
+      <div align="center">double</div>
+    </td>
+    <td height="2"> 
+      <div align="center">in </div>
+    </td>
+    <td height="2"> 
+      <div align="center">super</div>
+    </td>
+    <td height="2"> 
+      <div align="center"></div>
+    </td>
+  </tr>
+</table>
+<h2>Type Conversion</h2>
+<p>Values passed from Java to JavaScript are converted as follows: </p>
+<table width="95%" border="1">
+  <tr> 
+    <th>Java Types</th>
+    <th>Converted JavaScript Types</th>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">byte, char, short, int, long, float, and double</div>
+    </td>
+    <td> 
+      <div align="center">JavaScript numbers. Instances of java.lang.Double and 
+        java.lang.Integer are converted to JavaScript objects, not to JavaScript 
+        numbers.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">boolean</div>
+    </td>
+    <td> 
+      <div align="center">JavaScript boolean</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">arrays</div>
+    </td>
+    <td> 
+      <div align="center">JavaScript pseudo-Array object</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">Java object of any other class</div>
+    </td>
+    <td> 
+      <div align="center">JavaScript wrapper</div>
+    </td>
+  </tr>
+</table>
+<h2>Expression Exceptions</h2>
+<p>When you are evaluating JavaScript code in Java, the following situations can 
+  cause run-time errors: </p>
+<ul>
+  <li>The JavaScript code is not evaluated, either due to a JavaScript compilation 
+    error or to some other error that occurred at run time. 
+    <p>The JavaScript interpreter generates an error message that is converted 
+      into an instance of JSException. </p>
+  </li>
+  <li>Java successfully evaluates the JavaScript code, but the JavaScript code 
+    executes an unhandled throw statement. 
+    <p>JavaScript throws an exception that is wrapped as an instance of JSException. 
+      Use the getWrappedException method of JSException to unwrap this exception 
+      in Java. </p>
+  </li>
+</ul>
+<p>&nbsp;</p>
+</body>
+</html>
diff --git a/doc/web/GettingStarted.html b/doc/web/GettingStarted.html
index 95ff548..9c317d9 100644
--- a/doc/web/GettingStarted.html
+++ b/doc/web/GettingStarted.html
@@ -5,7 +5,7 @@
 </head>
 
 <body bgcolor="#FFFFFF">
-<h1>Getting started with JSTL (EA2)</h1>
+<h1>Getting started with JSTL (EA3)</h1>
 
 <p>This document describes how to get up and running quickly with JSTL's
 second early-access release.  It can be useful to page authors and tag
@@ -24,13 +24,13 @@ you have any comments, please email us at
 <hr />
 <h2>Introduction</h2>
 
-<a name="#1.1" />
+<a name="#1.1" /></a>
 <h3>What is JSTL?  Where does it come from?</h3>
 
 <p>JSTL is the JSP(tm) Standard Tag Library.  It is an effort of the Java
 Community Process (JCP) and comes out of the JSR-052 expert group.</p>
 
-<a name="#1.2" />
+<a name="#1.2" /></a>
 <h3>What does JSTL do?</h3>
 
 <p>JSTL encapsulates, as simple tags, core functionality common to many
@@ -61,16 +61,17 @@ good news is that you still have time to comment on JSTL before it is
 finalized:  mail us at <a href="mailto:jsr052-comments@sun.com">
 jsr052-comments@sun.com</a> if you have any comments.</p>
 
-<h3>What has changed since EA1?</h3>
-<p>Please see the <a href="ReleaseNotes.html">Release Notes</a> document
-for information on JSTL RI changes.</p>
+<h3>What has changed in this release?</h3>
+<p>Please see the <a href="ReleaseNotes.html">Release Notes</a> document for 
+  information on JSTL RI changes.</p>
+
+<p>&nbsp;</p>
 
 <hr />
-<h2><a name="#2" />Getting started quickly</h2>
+<h2><a name="#2" /></a>Getting started quickly</h2>
 
-<p>JSTL EA2 uses features provided only by the JSP 1.2 standard draft, so
-it requires a JSP 1.2 container.  We recommend you test JSTL with Tomcat
-4.0.</p>
+<p>JSTL EA3 uses features provided only by the JSP 1.2 standard draft, so it requires 
+  a JSP 1.2 container. We recommend you test JSTL with Tomcat 4.0.</p>
 
 <p>To install Tomcat, follow the instructions at <a
 href="http://jakarta.apache.org/tomcat">http://jakarta.apache.org/tomcat</a>.
@@ -88,6 +89,11 @@ directory of your Tomcat distribution) for more information about XML
 parsers in Tomcat 4.</p>
 -->
 
+<p>To use JSTL, include the 'standard.jar' file in your application's
+WEB-INF/lib directory.  If you use the default expression language
+(ECMAScript), you should also include the distribution's 'js.jar' file in
+WEB-INF/lib.</p>
+
 <h3>Multiple tag libraries</h3>
 
 <p>See the <a href="Overview.html">Overview Document</a> for information
@@ -105,119 +111,98 @@ at the top of your JSP page, as follows:</p>
 
 <h3>Expression languages</h3>
 
-<p>Half of JSTL's tag libraries -- the recommended ones -- rely on an 
-expression language.  To facilitate experimentation and feedback, the
-JSTL RI currently lets you switch between a number of different languages.
-For EA2, the ECMAScript language is the default.</p>
+<p>Half of JSTL's tag libraries -- the recommended ones -- rely on an expression 
+  language. To facilitate experimentation and feedback, the JSTL RI currently 
+  lets you switch between a number of different languages. Since EA2, the ECMAScript 
+  language has been set as the default.</p>
 
 <p>The  expression language for a web application is configured by
 setting the servlet context parameter
 <tt>javax.servlet.jsp.jstl.temp.ExpressionEvaluatorClass</tt> to the class
 containing the expression-evaluation logic you wish to use. In
-<tt>jstl.jar</tt>, the SPEL is identified by the class
+<tt>standard.jar</tt>, the SPEL is identified by the class
 <tt>org.apache.taglibs.standard.lang.spel.Evaluator</tt>; JPath is identified
 by the class
 <tt>org.apache.taglibs.standard.lang.jpath.JPathExpressionEvaluator</tt>;
 JXPath's evaluator is
 <tt>org.apache.taglibs.standard.lang.jxpath.JXPathExpressionEvaluator</tt>;
 and the JavaScript/Rhino evaluator is
-<tt>org.apache.taglibs.standard.lang.javascript.javascript.JavascriptExpressionEvaluator</tt>.
+<tt>org.apache.taglibs.standard.lang.javascript.JavascriptExpressionEvaluator</tt>.
 (For an example of how this context parameter is set, see the
 <tt>web.xml</tt> file that comes with the <tt>jstl-examples</tt>
 application.)</p>
 
-<p>In JSTL EA2, you can also mix different expression languages on the
-same page using the <tt>&lt;expressionLanguage&gt;</tt> tag.  This tag's
-<tt>evaluator</tt> attribute points to the class containing the
-expression-evaluation logic you wish to use.  See the Functional
-Description of expression-language support for more information.</p>
+<p>In JSTL EA, you can also mix different expression languages on the same page 
+  using the <tt>&lt;expressionLanguage&gt;</tt> tag. This tag's <tt>evaluator</tt> 
+  attribute points to the class containing the expression-evaluation logic you 
+  wish to use. See the Functional Description of expression-language support for 
+  more information.</p>
 
 <p>The attributes in tags for the EL version of the library do not accept
 rtexprvalues.  Instead, you specify literal expressions that the tags
 evaluate at runtime.  For example:</p>
 
 <pre>
-    &lt;jx:forEach items="<b>$page:myItems</b>" /&gt;
+    &lt;c:forEach items="<b>$page:myItems</b>" /&gt;
 </pre>
-
-<i><b>Important:</b> The expression-language support included with JSTL
-JSTL EA2 should be considered even more experimental than the rest of the
-package.  You should not assume that either the "pluggability" mechanism
-or the prepackaged languages themselves will remain in JSTL's final
-version, or even in the next EA releases.</i>
-
-<h3>Topics covered in JSTL EA2</h3>
-
-<p>As we mentioned above, JSTL EA2 includes core tags to support
-iteration, conditionals, and expression-language support.  For more
-information on precisely how these tags work, you should read the
-"Functional Description" documents provided as part of this distribution.  
-Here, we just offer a quick roadmap of each feature in order to help
-orient you.</p>
-
-<dl>
-<dt><b>Iteration</b></dt>
-
-<dd>The core iteration tag is &lt;forEach&gt;, which iterates over most
-collections and similar objects you'd think to iterate over.  
-&lt;forTokens&gt; lets you iterate over tokens in a <tt>String</tt>
-object; it lets you specify the <tt>String</tt> and the delimiters.</dd>
-
-<dt><b>Conditionals</b></dt>
-
-<dd>JSTL EA2 supports a simple conditional &lt;if&gt; tag along with
-a collection of tags -- &lt;choose&gt;, &lt;when&gt;, and &lt;otherwise&gt;
--- that support mutually exclusive conditionals.  These latter three
-tags let you implement a typical <tt>if/else if/else if/else</tt>
-structure.</dd>
-
-<dt>
-<b>Expression languages</b></dt>
-
-<dd>We described the EL support in JSTL EA2 above.  In addition to
-&lt;expressionLanguage&gt;, JSTL EA2 provides a few other tags to
-facilitate use of expression language.  &lt;expr&gt; prints out the value
-of a particular expression in the current EL, similar to the way that the
-scriptlet expression (&lt;%= ... %=&gt;) syntax prints out the value of a
-expression in the scripting language (typically Java).  &lt;set&gt; lets
-you set a scoped attribute (e.g., a value in the request, page, session,
-or application scopes) with the value of an expression.</dd>
-
-<dt>
-<b>Text inclusion</b></dt>
-
-<dd>JSP supports the <tt>jsp:include</tt> tag, but this standard action is
-limited in that it only supports relative URLs.  JSTL EA2 introduces the
-<tt>c:import</tt> tag, which lets you retrieve absolute URLs.  For
-instance, you can use <tt>c:import</tt> to retrieve information from the
-web using HTTP URLs, or from a file server using an FTP URL.  The tag also
-has some advanced support for performance optimizations, avoiding
-unnecessary buffering of data that's retrieved.</dd>
-
-<dt>
-<b>I18N-capable text formatting</b></dt>
-
-<dd>Formatting data is one of the key tasks in many JSP pages.  JSTL
-introduces tags to support data formatting and parsing.  These tags
-rely on convenient machinery to support internationalized applications.
-</dd>
-
-<dt>
-<b>XML manipulation</b></dt>
-
-<dd>You can't look anywhere these days without seeing XML, and JSTL
-gives you convenient support for manipulating it from your JSP pages.
-Parse documents, use XPath to select content, and perform XSLT transformations
-from within your JSP pages.</dd>
-
+<i><b>Important:</b> The expression-language support included with JSTL EA should 
+be considered even more experimental than the rest of the package. You should 
+not assume that either the "pluggability" mechanism or the prepackaged languages 
+themselves will remain in JSTL's final version, or even in the next EA releases.</i> 
+<h3>Topics covered in JSTL EA3</h3>
+
+<p>As we mentioned above, JSTL EA3 includes core tags to support iteration, conditionals, 
+  and expression-language support. For more information on precisely how these 
+  tags work, you should read the "Functional Description" documents provided as 
+  part of this distribution. Here, we just offer a quick roadmap of each feature 
+  in order to help orient you.</p>
+
+<dl> 
+  <dt><b>Iteration</b></dt>
+  <dd>The core iteration tag is &lt;forEach&gt;, which iterates over most collections 
+    and similar objects you'd think to iterate over. &lt;forTokens&gt; lets you 
+    iterate over tokens in a <tt>String</tt> object; it lets you specify the <tt>String</tt> 
+    and the delimiters.</dd>
+  <dt><b>Conditionals</b></dt>
+  <dd>JSTL supports a simple conditional &lt;if&gt; tag along with a collection 
+    of tags -- &lt;choose&gt;, &lt;when&gt;, and &lt;otherwise&gt; -- that support 
+    mutually exclusive conditionals. These latter three tags let you implement 
+    a typical <tt>if/else if/else if/else</tt> structure.</dd>
+  <dt> <b>Expression languages</b></dt>
+  <dd>We described the EL support in JSTL above. In addition to &lt;expressionLanguage&gt;, 
+    JSTL provides a few other tags to facilitate use of expression language. &lt;expr&gt; 
+    prints out the value of a particular expression in the current EL, similar 
+    to the way that the scriptlet expression (&lt;%= ... %=&gt;) syntax prints 
+    out the value of a expression in the scripting language (typically Java). 
+    &lt;set&gt; lets you set a scoped attribute (e.g., a value in the request, 
+    page, session, or application scopes) with the value of an expression.</dd>
+  <dt> <b>Text inclusion</b></dt>
+  <dd>JSP supports the <tt>jsp:include</tt> tag, but this standard action is limited 
+    in that it only supports relative URLs. JSTL introduces the <tt>c:import</tt> 
+    tag, which lets you retrieve absolute URLs. For instance, you can use <tt>c:import</tt> 
+    to retrieve information from the web using HTTP URLs, or from a file server 
+    using an FTP URL. The tag also has some advanced support for performance optimizations, 
+    avoiding unnecessary buffering of data that's retrieved.</dd>
+  <dt> <b>I18N-capable text formatting</b></dt>
+  <dd>Formatting data is one of the key tasks in many JSP pages. JSTL introduces 
+    tags to support data formatting and parsing. These tags rely on convenient 
+    machinery to support internationalized applications. </dd>
+  <dt> <b>XML manipulation</b></dt>
+  <dd>You can't look anywhere these days without seeing XML, and JSTL gives you 
+    convenient support for manipulating it from your JSP pages. Parse documents, 
+    use XPath to select content, and perform XSLT transformations from within 
+    your JSP pages.</dd>
+  <dt><b>Database access</b></dt>
+  <dd>Easily access relational databases using the SQL actions.</dd>
+  <dt>&nbsp;</dt>
 </dl>
 
 <h3>For tag developers...</h3>
 
-<p>Developers of custom tags should also read the "Functional
-Descriptions" provided for each topic addressed by JSTL EA2.  JSTL EA2
-provides some abstract classes that assist with rapid development of tags
-and promote integration of custom tags with JSTL's tag set.</p>
+<p>Developers of custom tags should also read the "Functional Descriptions" provided 
+  for each topic addressed by JSTL EA. JSTL EA provides some abstract classes 
+  that assist with rapid development of tags and promote integration of custom 
+  tags with JSTL's tag set.</p>
 
 <p>For instance, custom tags can use JSTL's expression-language
 mechanism.  As another example, extending
diff --git a/doc/web/I18N_FunctionalDescription_5_EA2.html b/doc/web/I18N_FunctionalDescription_5_EA2.html
new file mode 100644
index 0000000..e8192d7
--- /dev/null
+++ b/doc/web/I18N_FunctionalDescription_5_EA2.html
@@ -0,0 +1,989 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="GENERATOR" content="Mozilla/4.76C-CCK-MCD Netscape [en] (X11; U; SunOS 5.7 sun4u) [Netscape]">
+   <title>I18N -- Functional Description</title>
+<style media="screen" type="text/css"><!--
+.fixme { color: red }
+--></style>
+</head>
+<body bgcolor="#FFFFFF">
+
+<h3>
+
+<hr width="100%" noshade></h3>
+
+<h2>
+I18N/Formatting Tags - Functional Description&nbsp;<br>
+</h2>
+
+<h2>
+<tt>&lt;fmt:locale><br>
+&lt;fmt:timeZone><br>
+&lt;fmt:bundle><br>
+&lt;fmt:message><br>
+&lt;fmt:messageFormat><br>
+&lt;fmt:messageArg><br>
+&lt;fmt:formatNumber><br>
+&lt;fmt:parseNumber><br>
+&lt;fmt:formatDate><br>
+&lt;fmt:parseDate><br>
+&lt;fmt:exception></tt></h2>
+
+<hr width="100%" noshade>
+<h3>
+1. Introduction</h3>
+With the explosion of application development based on web technologies,
+and the deployment of such applications on the Internet, applications must
+be able to adapt to the languages and formatting conventions of their clients.
+This means that page authors must be able to tailor any locale-specific
+page content according to the conventions of the client's language and
+cultural formatting conventions. For example, the number <tt>345987.246
+</tt>should
+be formatted as <tt>345 987,246 </tt>for French, <tt>345.987,246
+</tt>for
+German, and <tt>345,987.246</tt><i> </i>for clients<i> </i>in the U.S.
+<p>The process of designing an application (or page content) so that it
+can be adapted to various languages and regions without requiring any engineering
+changes is known as <i>internationalization</i>, or I18N for short. Once
+a web application has been internationalized, it can be adapted for a number
+of regions or languages by adding locale-specific components and translating
+text. This process is known as <i>localization</i>.
+<p>There are two approaches to internationalizing a web application:
+<ul>
+<li>
+Provide a version of the JSP in each of the target locales and have a controller
+servlet dispatch the request to the appropriate page (depending on the
+requested locale). This approach is useful if large amounts of data on
+a page or an entire web application need to be internationalized.</li>
+
+<li>
+Isolate any locale-sensitive data on a page (such as error messages, string
+literals, or button labels) into resource bundles, and access the data
+via I18N tags, so that the corresponding translated message is fetched
+automatically and inserted into the page.</li>
+</ul>
+This proposal supports both approaches. It defines two sets of<font size=+0>
+tags: I18N tags, whose purpose is to assist page authors with creating
+internationalized page content that can be localized into any locale available
+in the JSP container&nbsp; (this addresses the second approach), and formatting
+tags, which allow various data elements such as numbers, currencies, dates
+and times to be formatted and parsed in a locale-sensitive or customized
+manner (this may be used in either approach).</font>
+<h3>
+2. Locale selection</h3>
+JSTL supports both browser- and application-based locales, which are discussed
+in more detail.
+<h4>
+2.1 Browser-based locales</h4>
+By default, browser-sensing capabilities for locales are enabled. This
+means that the client determines (via its browser settings) which locale
+to use, and allows page authors to cater to the language preferences of
+their clients. For example, a shopping application may want to greet its
+customers in their language, and it may even want to label its GUI components
+in that language (for example, a cancel button would be labelled
+<tt>Cancel</tt>&nbsp;
+for English and <tt>Abbrechen</tt> for German speaking customers).
+<p>Any action that requires a locale first calls the <tt>getLocales()</tt>
+method on the incoming request, which provides a list, in order of preference,
+of the locales that the client wants to use. This list is processed differently
+depending on whether the action is an I18N or a formatting tag.
+<h5>
+2.1.1 Resource bundle locale</h5>
+Any I18N actions that acquire a resource bundle based on its base name
+(that is, the <tt>&lt;bundle></tt> action which (always) takes a <tt>basename</tt>
+attribute and the <tt>&lt;message></tt> action which may use the default
+resource bundle base name defined by the <tt>javax.servlet.jsp.jstl.i18n.basename
+</tt>attribute)
+determine the best matching locale by comparing the list of client locales
+against the list of available locales for the resource bundle in question,
+as follows:
+<p>For each of the client's preferred locales (in order of preference),
+the action checks if there is a matching locale for the resource bundle
+in question, by passing the resource bundle's base name and the client's
+requested locale to the <tt>java.util.ResourceBundle.getBundle()</tt> method.
+The returned locale may either match both the country and language of the
+requested locale (exact match), only its language, or neither. If there
+is an exact match, it is used, and no further client locales are checked.
+Otherwise, the first match on language is used. If no such match exists,
+the fallback locale is used by searching the <tt>javax.servlet.jsp.jstl.i18n.fallbackLocale</tt>
+attribute in the page, request, session (if valid), and application scope(s)
+(in this order) (see Section 16: <i>Configuration parameters</i>). If this
+attribute does not exist, the default locale of the JSP container's Java
+runtime is used.
+<p>For example, if the client's preferred locales were <tt>ja</tt>, <tt>en-UK</tt>,
+<tt>en-US</tt>,
+<tt>en-CA</tt>,
+and f<tt>r </tt>(in this order), and the available ones (for the resource
+bundle in question) <tt>en</tt> and
+<tt>fr</tt>, the best match would be
+<tt>en</tt>;
+if the available ones were
+<tt>en</tt>,
+<tt>en-US</tt>, and
+<tt>fr</tt>,
+then the best match would be <tt>en-US</tt>.
+<p>&nbsp;The behavior is implementation-defined if the set of available
+resource bundles changes during execution of the page. Implementations
+may thus cache the best matching locale for a given resource bundle when
+one is found.
+<h5>
+2.1.2 Formatting locale</h5>
+This is the locale used by the <tt>&lt;formatNumber></tt>, <tt>&lt;parseNumber></tt>,
+<tt>&lt;formatDate></tt>,
+and <tt>&lt;parseDate></tt> actions.
+<p>If the formatting action is enclosed within a <tt>&lt;bundle> </tt>action,
+the locale of the parent bundle is used as the formatting locale.
+<p>Otherwise, if the <tt>javax.servlet.jsp.jstl.i18n.basenam</tt>e attribute
+is set, the best matching locale for that base name is determined (according
+to the algorithm described in Section 2.1.1) and used as the formatting
+locale.
+<p>Otherwise, the formatting action checks, for each of the client's preferred
+locales (in order of preference), if there is a matching locale available.
+The <tt>&lt;formatNumber>
+</tt>and<tt> &lt;parseNumber></tt>, and the <tt>&lt;formatDate>
+</tt>and
+<tt>&lt;parseDate>
+</tt>actions
+determine the available locales by calling <tt>java.text.NumberFormat.getAvailableLocales()</tt>
+and <tt>java.text.DateFormat.getAvailableLocales()</tt>, respectively.
+If there is an exact match (that is, a client locale matches both the language
+and country of an available locale), it is used, and no further client
+locales are checked. Otherwise, the first match on language is used. If
+no such match exists, the default locale of the JSP container's Java runtime
+is used. Once the best matching locale has been determined, it is cached,
+so that any subsequent formatting actions on the same page do not have
+to determine it again.
+<h4>
+2.2. Application-based locales</h4>
+The browser-sensing capabilities for locales can be disabled by setting
+the <tt>javax.servlet.jsp.jstl.i18n.locale</tt> (scoped) attribute. This
+attribute may be set directly by application code for any of the JSP scopes.
+For example, an application might let its users pick their preferred locale
+and then set the <tt>javax.servlet.jsp.jstl.i18n.locale
+</tt>attribute
+accordingly. Alternatively, the <tt>&lt;locale> </tt>action may be used
+to set the <tt>javax.servlet.jsp.jstl.i18n.locale </tt>attribute with page
+scope only. This may be useful in the case where a client's preferred locale
+is retrieved from a database (using the JSTL database tags)and installed
+on the page using the <tt>&lt;locale></tt> tag.
+<p>The <tt>javax.servlet.jsp.jstl.i18n.locale</tt> attribute is searched
+in the page, request, session (if valid), and application scope(s) (in
+this order).
+<h3>
+3. Response encoding</h3>
+It is the page author's responsibility to make sure that a page's character
+encoding accommodates all characters, including any valid Java (Unicode
+2.0) character, that the page's actions may output at runtime.
+<p>Because this proposal's I18N tags address situations requiring multiple
+locales, they are perhaps more likely than most to output characters that
+cannot be accommodated by the default ISO-8859-1 character encoding.
+<p>Page authors should take note of this and consider using the page directive's
+<tt>contentType</tt>
+attribute to explicitly set the character encoding in the <tt>Content-Type</tt>
+response header in situations where the default (ISO-8859-1) is not sufficient.
+<h3>
+4. Time zone</h3>
+The <tt>javax.servlet.jsp.jstl.i18n.timeZone </tt>JSP attribute specifies
+the time zone in which any time information formatted using the <tt>&lt;formatDate></tt>
+action is represented. This allows any time information on a page to be
+tailored to the preferred time zone of its clients, which is useful if
+the server hosting the page containing the time information and its clients
+reside in different time zones. Page authors could be advised to always
+use the "long" time format which includes the time zone, but that would
+still require clients to convert the formatted time into their own time
+zone.
+<p>The <tt>javax.servlet.jsp.jstl.i18n.timeZone</tt> attribute may be set
+directly by application code for any of the JSP scopes. For example, an
+application might let its users pick their preferred time zone and then
+set the <tt>javax.servlet.jsp.jstl.i18n.timeZone
+</tt>attribute accordingly.
+Alternatively, the <tt>&lt;timeZone></tt> action may be used to set the
+<tt>javax.servlet.jsp.jstl.i18n.timeZone</tt>
+attribute for the current page context. This may be useful in the case
+where a client's preferred time zone is retrieved from a database (using
+the JSTL database tags) and imported into the page using the <tt>&lt;timeZone></tt>
+tag.
+<p>The <tt>javax.servlet.jsp.jstl.i18n.timeZone </tt>attribute is searched
+in the page, request, session (if valid), and application scope(s) (in
+this order). If not found, the JSP container's time zone is used.
+<h3>
+5. &lt;locale></h3>
+The <tt>&lt;locale></tt> action is used to set or override the JSP attribute
+<tt>javax.servlet.jsp.jstl.i18n.locale</tt>
+with the locale specified by the <tt>value</tt> attribute in the scope
+given by the <tt>scope</tt> attribute (default: "page").
+<p>The locale specified by the <tt>value</tt> attribute must contain a
+two-letter (lower-case) language code (as defined by ISO-639), and may
+contain a two-letter (upper-case) country code (as defined by ISO-3166)<tt>.
+</tt>Language
+and country codes must be separated by hyphen ('-') or underscore ('_').
+<p>Optionally, a (vendor- or browser-specific) variant may be specified
+using the <tt>variant</tt> attribute. See the <tt>java.util.Locale</tt>
+javadocs for more information on variants.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:locale value="en-US" variant="UNIX"/></tt>
+<p>By using this action, the browser-sensing capabilities for locales described
+in Section 2 of this functional description are disabled. This means that
+if this action is being used, it should be declared at the beginning of
+a page, before any other I18N/Formatting tags. Otherwise, a different locale
+might be used up to the position in the page where the <tt>&lt;locale></tt>
+action is specified.
+<h3>
+6. &lt;timeZone></h3>
+The <tt>&lt;timeZone></tt> action establishes the time zone (specified
+via the <tt>value</tt> attribute) to be used by any nested <tt>&lt;formatDate></tt>
+actions:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:timeZone value="America/Los_Angeles"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate type="time"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:timeZone></tt>
+<p>The time zone may be specified as either an abbreviation (such as "PST"),
+a full name (such as "America/Los_Angeles"), or a custom format (such as
+"GMT-8:00). See
+<tt>java.util.TimeZone.getTimeZone()
+</tt>for more details
+on the supported time zone formats.
+<p>The <tt>var</tt> attribute may be used to expose the time zone as a
+JSP-scoped attribute of type <tt>java.util.TimeZone
+</tt>(with visibility
+<tt>AT_END</tt>),
+so that it can be referenced by any subsequent
+<tt>&lt;formatDate></tt>
+actions that are not nested inside a <tt>&lt;timeZone></tt> action and
+take a <tt>timeZone</tt> attribute:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:timeZone value="America/Los_Angeles"
+var="losAngelesTimeZone"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate type="time" timeZone="$losAngelesTimeZone"/></tt>
+<p>A <tt>&lt;timeZone></tt> action that is specified without a body and
+without the <tt>var</tt> attribute can be used to set or override the
+<tt>javax.servlet.jsp.jstl.i18n.timeZone</tt>
+attribute in the scope given by the <tt>scope</tt> attribute (default:
+"page"), thereby making its time zone the (new) default in that scope:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:timeZone value="America/Los_Angeles"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate type="time"/></tt>
+<h3>
+7. &lt;bundle></h3>
+The <tt>&lt;bundle> </tt>action loads the resource bundle whose base name
+is specified via the <tt>basename</tt> attribute:
+<p>&nbsp;<tt>&nbsp;&nbsp; &lt;fmt:bundle basename="com.acme.labels.ButtonLabels"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;user-of-bundle/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:bundle></tt>
+<p>The resource bundle's locale is determined according to Section 2 of
+this functional description.
+<p>The <tt>var</tt> attribute may be used to expose the resource bundle
+as a JSP-scoped attribute of type <tt>java.util.ResourceBundle
+</tt>(with
+visibility <tt>AT_END</tt>), so that it can be referenced by any subsequent
+<tt>&lt;message></tt>
+actions that take a <tt>bundle</tt> attribute:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="com.acme.labels.ButtonLabels"
+var="buttonLabels"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Submit" bundle="$buttonLabels"/></tt>
+<p>Exposing a resource bundle via the <tt>var</tt> attribute is useful
+if the bundle needs to be accessed multiple times.
+<p>A <tt>&lt;bundle></tt> action that is specified without a body and without
+the <tt>var</tt> attribute can be used to set or override the <tt>javax.servlet.jsp.jstl.i18n.basename</tt>
+attribute in the scope given by the <tt>scope</tt> attribute (default:
+"page"), thereby making its base name the (new) default in that scope:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="com.acme.labels.ButtonLabels"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Submit"/></tt>
+<p>The <tt>prefix</tt> attribute is provided as a convenience for very
+long key names: Its value is prepended to any message key (see the <tt>&lt;message></tt>
+action) that is to be looked up in the resource bundle that was loaded
+by this action.
+<h3>
+8. &lt;message></h3>
+The <tt>&lt;message></tt> action retrieves the localized message corresponding
+to the message key specified by the
+<tt>key</tt> attribute.
+<p>The resource bundle in which to look up the message key may be given
+by the <tt>bundle</tt> attribute. If this attribute is missing, and the
+<tt>&lt;message>
+</tt>action
+is nested inside a <tt>&lt;bundle></tt> tag, the resource bundle to use
+is taken from the enclosing <tt>&lt;bundle></tt> tag. Otherwise, the resource
+bundle with the default base name given by the
+<tt>javax.servlet.jsp.jstl.i18n.basename
+</tt>attribute
+is used,&nbsp; which is searched in the page, request, session (if valid),
+and application scope(s) (in this order).
+<p>The <tt>&lt;message></tt> action outputs its result to the current
+<tt>JspWriter</tt>
+object, unless the <tt>var</tt> attribute is specified, in which case the
+result is stored in the named JSP attribute.
+<p>Example:
+<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <tt>&lt;fmt:message key="Welcome"/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;%-- Key is looked up in default bundle --%></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="Errors" var="errorBundle"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="Greetings"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Welcome"/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;%-- Key is looked up in parent &lt;bundle> tag --%></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="WrongPassword"
+bundle="$errorBundle"/>&nbsp; &lt;%-- Key is looked up in errorBundle --%></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:bundle></tt>
+<p>If the given key is not found in the resource bundle, or a resource
+bundle with the given base name does not exist, a message is logged to
+the servlet context, and an error message of the form <tt>"???&lt;key>???"</tt>
+(where
+<tt>&lt;key></tt> is the name of the undefined key) is output to
+the current <tt>JspWriter
+</tt>object.
+<p>If the message corresponding to the given key is <i>compound</i>, that
+is, contains one or more variables, it can be supplied with argument values
+for these variables by using a <tt>&lt;messageArg></tt> subtag for each
+argument value. This procedure is referred to as <i>parametric replacement.</i>
+If the message is compound, but no <tt>&lt;messageArg></tt> subtags are
+given, the message is left unmodified.
+<p>If the parent <tt>&lt;bundle></tt> action specifies a <tt>prefix</tt>
+attribute, its value is prepended to any key names to be looked up in that
+bundle. For example, using the <tt>prefix</tt> attribute, the key names
+in:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="Labels"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="com.acme.labels.firstName"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="com.acme.labels.lastName"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:bundle></tt>
+<p>may be abbreviated to:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="Labels" prefix="com.acme.labels."></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="firstName"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="lastName"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:bundle></tt>
+<h3>
+9. &lt;messageFormat></h3>
+The <tt>&lt;messageFormat> </tt>action performs parametric replacement
+on the pattern string specified via the <tt>value</tt> attribute, using
+the runtime's default locale.
+<p>The argument values for parametric replacement must be supplied via
+<tt>&lt;messageArg></tt>
+subtags. Each <tt>&lt;messageArg></tt> subtag replaces one parameter in
+the pattern. Parametric replacement takes place in the order of the
+<tt>&lt;messageArg></tt>
+subtags. If no <tt>&lt;messageArg></tt> subtag is given, the specified
+pattern is left unmodified.
+<p>The result is output to the current <tt>JspWriter</tt> object, unless
+the <tt>var</tt> attribute is given, in which case it is stored in the
+named JSP attribute.
+<p>The <tt>&lt;messageFormat></tt> action is useful if a pattern needs
+to be supplied from sources other than resource bundles, or if a pattern
+extracted from a resource bundle needs to be used multiple times.
+<p>For example, when displaying a list of products, the same internationalized
+message (pattern) would be used to display the price, but rather than looking
+up the same pattern for every single product, the pattern could be looked
+up once (using the <tt>&lt;message></tt> action) and then passed in to
+the <tt>&lt;messageFormat></tt> action for each product, as follows:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="..." var="i18n"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="store.product.price" bundle="$i18n"
+var="priceMsg"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;c:forEach ...></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... &lt;fmt:messageFormat value="$priceMsg">...&lt;/fmt:messageFormat></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/c:forEach></tt>
+<p>instead of the less efficient alternative:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="..." var="i18n"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;c:forEach ...></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... &lt;fmt:message key="store.product.price"
+bundle="$i18n">...&lt;/fmt:message></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/c:forEach></tt>
+<h3>
+10. &lt;messageArg></h3>
+The <tt>&lt;messageArg></tt> action provides one argument (for parametric
+replacement) to the compound message or pattern in its parent
+<tt>&lt;message></tt>
+or <tt>&lt;messageFormat></tt> action, respectively.
+<p>One <tt>&lt;messageArg> </tt>action must be specified for each variable
+in the compound message or pattern. Parametric replacement takes place
+in the order of the <tt>&lt;messageArg></tt> tags.
+<p>The argument value can be specified either via the <tt>value</tt> attribute:
+<pre>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Welcome">
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:messageArg value="$dateArg"/>
+&nbsp;&nbsp;&nbsp; &lt;/fmt:message></pre>
+or inline via the tag's body content:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Welcome"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:messageArg></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;acme:doIt .../></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/fmt:messageArg></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:message></tt>
+<h3>
+11. &lt;formatNumber></h3>
+The <tt>&lt;formatNumber></tt> action allows the formatting of numbers,
+currencies, and percentages, using predefined or customized formatting
+styles.
+<p>Depending on the value of the <tt>type</tt> attribute, which must be
+one of "number", "currency", or "percent" (default: "number"), the numeric
+value specified by the <tt>value</tt> attribute is formatted as a number,
+currency, or percentage, respectively, using the default formatting pattern
+for numbers (currencies, percentages) of the page's locale, which is determined
+according to Section 2 of this functional description.
+<p>The result is output to the current
+<tt>JspWriter</tt> object, unless
+the <tt>var</tt> attribute is given, in which case it is stored (as a string)
+in the named JSP attribute.
+<p>Example: The output of
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatNumber value="9876543.21" type="currency"/></tt>
+<p>varies with the page's locale (given in parentheses), as follows:
+<p><tt>&nbsp;&nbsp;&nbsp; 9 876 543,21 F&nbsp;&nbsp; (fr_FR)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; 9.876.543,21 DM&nbsp; (de_DE)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; $9,876,543.21&nbsp;&nbsp;&nbsp; (en_US)</tt>
+<p>When formatting the given value as a number, the predefined formatting
+pattern of the page's locale can be overridden by using the <tt>pattern</tt>
+attribute, allowing page authors to control the display of leading and
+trailing zeros, prefixes and suffixes, grouping (thousands) separators,
+and the decimal separator of the formatted number. The given pattern string
+must follow the <a href="http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html">Number
+Format Pattern Syntax&nbsp;</a> specified in the tutorial trail on internationalization
+at <tt>java.sun.com</tt>.
+<p>For example, a pattern of ".000" will cause any numeric value formatted
+with it to be represented with 3 fraction digits, adding trailing zeros
+if necessary, so that
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatNumber value="12.3" pattern=".000"/></tt>
+<p>will output "12.300".
+<p>Likewise, a pattern of "#,#00.0#" specifies that any numeric value formatted
+with it will be represented with a minimum of 2 integer digits, 1 fraction
+digit, and a maximum of 2 fraction digits, with every 3 integer digits
+grouped. Applied to "123456.7891", as in:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatNumber value="123456.7891" pattern="#,#00.0#"/></tt>
+<p>the formatted output will be "123,456.79" (note that rounding is handled
+automatically).
+<p>The <tt>value</tt> and <tt>pattern</tt> attributes accept both string
+literals and EL values. If the input to the <tt>value</tt> attribute is
+a string literal, it is first parsed into an instance of <tt>java.lang.Number
+</tt>according
+to the default pattern of the page's locale. If the numeric string uses
+a format different from the locale's default, it must be parsed using the
+<tt>&lt;parseNumber></tt>
+action.
+<p>The <tt>type</tt> attribute accepts (case-insensitive) literals only,
+causing an error at translation-time validation if the specified literal
+is illegal.
+<p>The <tt>pattern</tt> attribute may be used only when formatting numbers
+(that is, if the <tt>type</tt> attribute is missing or is equal to "number").
+Using it with a <tt>type</tt> attribute equal to "currency" or "percent"
+causes a translation-time error.
+<h3>
+12. &lt;parseNumber></h3>
+The <tt>&lt;parseNumber></tt> action is used for parsing numbers, currencies,
+and percentages.
+<p>Depending on the value of the <tt>type</tt> attribute, which must be
+one of "number", "currency", or "percent" (default: "number"), the string
+specified via the <tt>value</tt> attribute is parsed as a number, currency,
+or percentage, respectively, using the default formatting pattern for numbers
+(currencies, percentages) of the page's locale, which is determined according
+to Section 2 of this functional description.
+<p>If the number specified via the <tt>value</tt> attribute uses a format
+different from the page locale's default, the pattern required to parse
+it may be specified using the <tt>pattern</tt> attribute.
+<p>If the <tt>var</tt> attribute is given, the parsing result (of type
+<tt>java.lang.Number</tt>)
+is stored in the named JSP attribute.&nbsp; Otherwise, it is output to
+the current <tt>JspWriter</tt> object using <tt>java.lang.Number.toString()</tt>.
+<p>The <tt>value</tt> and <tt>pattern</tt> attributes accept both literals
+and EL values, whereas the <tt>type</tt> attribute accepts (case-insensitive)
+literals only, causing an error at translation-time validation if the specified
+literal is illegal.
+<p>The <tt>pattern</tt> attribute may be used only when parsing numbers
+(that is, if the <tt>type</tt> attribute is missing or equals "number").
+Using it with a <tt>type</tt> attribute equal to "currency" or "percent"
+causes a translation-time error.
+<h3>
+13. &lt;formatDate></h3>
+The <tt>&lt;formatDate</tt>> action allows the formatting of dates and
+times using predefined or customized formatting styles.
+<p>Depending on the value of the <tt>type</tt> attribute, which must be
+one of "time", "date", or "both" (default: "date"), only the time, the
+date, or both the time and date components of the date specified via the
+<tt>value</tt>
+attribute are formatted, using one of the predefined formatting styles
+for dates (specified via the <tt>dateStyle</tt> attribute) and times (specified
+via the <tt>timeStyle</tt> attribute) of the page's locale, which is determined
+according to Section 2 of this functional description.&nbsp; Legal values
+for the
+<tt>dateStyle</tt> and <tt>timeStyle</tt> attributes are "default",
+"short", "medium ", "long", and "full" (default: "default").
+<p>If the <tt>value</tt> attribute is missing, the current date and time
+are used.
+<p>Any time information is represented in the time zone given by the <tt>timeZone</tt>
+attribute.&nbsp; If this attribute is missing, and the <tt>&lt;formatDate>
+</tt>action
+is nested inside a <tt>&lt;timeZone></tt> tag, the time zone to use is
+taken from the enclosing <tt>&lt;timeZone></tt> tag. Otherwise, the default
+time zone given by the <tt>javax.servlet.jsp.jstl.i18n.timeZone</tt> attribute
+is used, which is searched in the page, request, session (if valid), and
+application scope(s) (in this order). If not found, the JSP container's
+time zone is used.
+<p>The action's result is output to the current <tt>JspWriter</tt> object,
+unless the <tt>var</tt> attribute is given, in which case it is stored
+(as a string) in the named JSP attribute.
+<p>Example: Assuming a current date of Oct 22, 2001 and a current time
+of 4:05:53 PM,
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate timeStyle="long" dateStyle="long"/></tt>
+<p>will output
+<p><tt>&nbsp;&nbsp;&nbsp; October 22, 2001 4:05:53 PM PDT</tt>
+<p>for the U.S. and
+<p><tt>&nbsp;&nbsp;&nbsp; 22 octobre 2001 16:05:53 GMT-07:0</tt>
+<p>for the French locale.
+<p>Page authors may also apply a customized formatting style for their
+times and dates by specifying the <tt>pattern</tt> attribute. The specified
+formatting pattern must use the <a href="http://java.sun.com/docs/books/tutorial/i18n/format/datepattern.html">Date
+Format Pattern Syntax</a> specified in the tutorial trail on internationalization
+at <tt>java.sun.com</tt>.
+<p>Example: Assuming the same current date and time as in the above example,
+the output of
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate pattern="EEE, MMM d, ''yy"/></tt>
+<p>will be
+<p><tt>&nbsp;&nbsp;&nbsp; Mon, Oct 22, '01</tt>
+<p>for the U.S. locale.
+<p>The <tt>value</tt> and <tt>pattern</tt> attributes accept both string
+literals and EL values (which must evaluate to objects of type<tt> java.util.Date
+</tt>in
+the case of the <tt>value</tt> attribute). If the input to the
+<tt>value</tt>
+attribute is a string literal, it is first parsed into an instance of <tt>java.util.Date</tt>
+according to the default pattern of the page's locale. If the date string
+uses a different pattern, the
+<tt>&lt;parseDate></tt> action must be used.
+<p>The <tt>type</tt>, <tt>timeStyle</tt>, and <tt>dateStyle</tt> attributes
+take (case-insensitive) literals only, causing an error at translation-time
+validation if the specified literal is illegal.
+<h3>
+14. &lt;parseDate></h3>
+The <tt>&lt;parseDate></tt> action is used for parsing date and time strings.
+<p>Depending on the value of the <tt>type</tt> attribute, which must be
+one of "time", "date", or "both" (default: "date"), the date string given
+via the
+<tt>value</tt> attribute is expected to contain only a time, a
+date, or both a time and date component, respectively. It is parsed according
+to the default formatting pattern for dates and times of the page's locale,
+which is determined according to Section 2 of this functional description.
+<p>If the given date string uses a different format, the pattern required
+to parse it may be specified via the <tt>pattern</tt> attribute.
+<p>If the <tt>var</tt> attribute is given, the parsing result (of type
+<tt>java.util.Date</tt>)
+is stored in the named JSP attribute. Otherwise, it is output to the current
+<tt>JspWriter</tt>
+object using <tt>java.util.Date.toString()</tt>.
+<p>The <tt>value</tt> and <tt>pattern</tt> attributes accept both literals
+and EL values. The <tt>type</tt> attribute takes (case-insensitive) literals
+only, causing an error at translation-time validation if the specified
+literal is illegal.
+<h3>
+15. &lt;exception></h3>
+The <tt>&lt;exception</tt>> action is used to display the exception given
+by the <tt>value</tt> attribute in its localized form:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:exception value="$exception" bundle="$errorMessages"/></tt>
+<p>If no <tt>value</tt> attribute is given, and this action is used in
+an error page, the exception of the error page is used.
+<p>Developers may designate an exception as localizable by having it implement
+the <tt>javax.servlet.jsp.jstl.i18n.LocalizableException</tt> interface,
+which is defined as follows:
+<p><tt>&nbsp;&nbsp;&nbsp; public interface LocalizableException {</tt>
+<p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Returns the
+exception's message key from which the exception's</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * localized message
+is derived via a resource bundle lookup.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getMessageKey();</tt>
+<p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Returns the
+arguments for parametric replacement on the exception's</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * localized message.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object[] getMessageArgs();</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; }</tt>
+<p>If the given exception is not an instance of this interface, the <tt>&lt;exception></tt>
+action uses its fully qualified class name as the key to look up in the
+resource bundle for exception messages.
+<p>Otherwise, the <tt>&lt;exception></tt> action uses the return value
+of the exception's
+<tt>getMessageKey</tt> method as the key . If <tt>getMessageKey</tt>
+returns null, the exception's fully qualified class name is used as the
+key.
+<p>The key is looked up in the resource bundle given by the <tt>bundle</tt>
+attribute. If this attribute is missing, and the
+<tt>&lt;exception> </tt>action
+is nested inside a <tt>&lt;bundle> </tt>tag, the resource bundle to use
+is taken from the enclosing <tt>&lt;bundle></tt> tag. Otherwise, the default
+resource bundle for exception messages, whose default base name is given
+by the <tt>javax.servlet.jsp.jstl.i18n.exception.basename</tt> scoped attribute,
+is used. This attribute is searched in the page, request, session (if valid),
+and application scope(s) (in this order).
+<p>The result of looking up the key in the resource bundle is used as the
+localized exception message. If the key is not found in the resource bundle,
+or the default resource bundle for exception messages does not exist, the
+return value of the exception's
+<tt>getLocalizedMessage</tt> method is
+used as the localized exception message. If the exception is an instance
+of the <tt>LocalizableException </tt>interface, the return value of the
+excpetion's <tt>getMessageArgs</tt> method is used for parametric replacement
+on the localized exception message.
+<p>The <tt>&lt;exception></tt> action outputs the localized exception message
+to the current
+<tt>JspWriter</tt> object.
+<p>If the <tt>stackTrace</tt> attribute is given with a value of <tt>true</tt>,
+the exception's stacktrace is printed out in addition to its localized
+exception message.
+<h3>
+16. Configuration parameters</h3>
+This section discusses I18N- and formatting-related initialization parameters
+in a web application's deployment descriptor (DD) file.
+<h4>
+16.1 javax.servlet.jsp.jstl.i18n.basename</h4>
+This parameter specifies the base name of the application's default resource
+bundle, which is used if a <tt>&lt;message></tt> action does not specify
+a <tt>bundle</tt> attribute and is not nested inside a
+<tt>&lt;bundle>
+</tt>action.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;web-app></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>javax.servlet.jsp.jstl.i18n.basename&lt;/param-name></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>com.acme.MyResources&lt;/param-value></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/web-app></tt>
+<h4>
+16.2 javax.servlet.jsp.jstl.i18n.exception.basename</h4>
+This parameter specifies the base name of the application's default resource
+bundle for exception messages, which is used by the <tt>&lt;exception></tt>
+action.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;web-app></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>javax.servlet.jsp.jstl.i18n.exception.basename&lt;/param-name></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>com.acme.MyExceptionResources&lt;/param-value></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/web-app></tt>
+<h4>
+16.3 javax.servlet.jsp.jstl.i18n.fallbackLocale</h4>
+This parameter specifies the application's default fallback locale, which
+is used if browser-sensing capabilities are enabled, but none of the available
+locales for the resource bundle in question match any of the client's preferred
+locales.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;web-app></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>javax.servlet.jsp.jstl.i18n.fallbackLocale&lt;/param-name></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>fr-CA&lt;/param-value></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/web-app></tt>
+<h4>
+16.4 javax.servlet.jsp.jstl.i18n.timeZone</h4>
+This parameter specifies the application's default time zone in which any
+times and dates formatted using the <tt>&lt;formatDate></tt> action are
+represented.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;web-app></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>javax.servlet.jsp.jstl.i18n.timeZone&lt;/param-name></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>"America/Los_Angeles"&lt;/param-value></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/web-app></tt>
+<h3>
+17. Developer support</h3>
+The locale-determination logic for resource bundles described in Section
+2.1.1 is exposed as a general convenience method so it may be used by any
+tag handler implementation that needs to produce localized messages. For
+example, a tag handler's exception messages may be intended directly for
+user consumption on an error page and therefore need to be localized.
+<p>The convenience method, named <tt>getLocalizedMessage</tt> and exposed
+by the <tt>org.apache.taglibs.jstl.extra.i18n.Locale</tt> class, looks
+up a given message key in the resource bundle with a given base name (or
+the default base name), whose locale is determined according to the locale-determination
+logic described in Section 2.1.1, and optionally performs parametric replacement
+on the result of the lookup before returning it.
+<p><tt>getLocalizedMessage</tt> comes in the following overloaded flavors:
+<p>&nbsp;<tt>&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves the localized message corresponding
+to the given key.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * The given key is looked up in the resource
+bundle whose base</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * name is retrieved from the javax.servlet.jsp.jstl.i18n.basename
+scoped</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * attribute and whose locale is determined
+according to the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * algorithm described in Section 2.1.1
+of the functional description.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * If the javax.servlet.jsp.jstl.i18n.basename
+attribute is not found</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * in any of the scopes, or no resource
+bundle with that base name exists,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * or the given key is undefined in the
+resource bundle that was loaded as</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * a result of this call, the string "???&lt;key>???"
+is returned,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * where "&lt;key>" is replaced with the
+given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param pageContext the page in which
+the given key must be localized</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param key the message key to be looked
+up</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @return the localized message corresponding
+to the given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; public static String getLocalizedMessage(PageContext
+pageContext,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String key);</tt>
+<p><tt>&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves the localized message corresponding
+to the given key.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * The given key is looked up in the resource
+bundle with the given</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * base name whose locale is determined
+according to the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * algorithm described in Section 2.1.1
+of the functional description.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * If no resource bundle with the given
+base name exists,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * or the given key is undefined in the
+resource bundle that was loaded as</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * a result of this call, the string "???&lt;key>???"
+is returned,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * where "&lt;key>" is replaced with the
+given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param pageContext the page in which
+the given key must be localized</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param key the message key to be looked
+up</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param basename the resource bundle
+base name</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @return the localized message corresponding
+to the given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; public static String getLocalizedMessage(PageContext
+pageContext,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String key,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String basename);</tt>
+<p><tt>&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves the localized message corresponding
+to the given key and</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * performs parametric replacement using
+the arguments specified in the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * &lt;tt>args&lt;/tt> parameter.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * The given key is looked up in the resource
+bundle whose base</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * name is retrieved from the javax.servlet.jsp.jstl.i18n.basename
+scoped</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * attribute and whose locale is determined
+according to the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * algorithm described in Section 2.1.1
+of the functional description.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Before being returned, the result of
+the lookup undergoes parametric</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * replacement, using the arguments specified
+in the &lt;tt>args&lt;/tt></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * parameter.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * If the javax.servlet.jsp.jstl.i18n.basename
+attribute is not found</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * in any of the scopes, or no resource
+bundle with that base name exists,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * or the given key is undefined in the
+resource bundle that was loaded as</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * a result of this call, the string "???&lt;key>???"
+is returned,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * where "&lt;key>" is replaced with the
+given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param pageContext the page in which
+the given key must be localized</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param key the message key to be looked
+up</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param args the arguments for parametric
+replacement</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @return the localized message corresponding
+to the given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; public static String getLocalizedMessage(PageContext
+pageContext,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String key,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Object[] args);</tt>
+<p><tt>&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves the localized message corresponding
+to the given key.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * The given key is looked up in the resource
+bundle with the given</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * base name whose locale is determined
+according to the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * algorithm described in Section 2.1.1
+of the functional description.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Before being returned, the result of
+the lookup undergoes parametric</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * replacement, using the arguments specified
+in the &lt;tt>args&lt;/tt></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * parameter.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * If no resource bundle with the given
+base name exists,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * or the given key is undefined in the
+resource bundle that was loaded as</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * a result of this call, the string "???&lt;key>???"
+is returned,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * where "&lt;key>" is replaced with the
+given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param pageContext the page in which
+the given key must be localized</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param key the message key to be looked
+up</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param args the arguments for parametric
+replacement</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param basename the resource bundle
+base name</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @return the localized message corresponding
+to the given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; public static String getLocalizedMessage(PageContext
+pageContext,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String key,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Object[] args,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String basename);</tt>
+<h3>
+18. Summary</h3>
+
+<table BORDER CELLPADDING=5 >
+<tr>
+<td COLSPAN="2" BGCOLOR="#000099"><b><font color="#FFFFFF"><font size=+1>I18N
+Tags</font></font></b></td>
+</tr>
+
+<tr BGCOLOR="#FFFF66">
+<td WIDTH="318"><b>Element</b></td>
+
+<td WIDTH="392"><b>Sample usage</b></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;locale></tt></b>
+<br><tt><font color="#000000"><b>value </b>variant scope</font></tt>
+<p>Establishes the locale specified by the <tt>value</tt> attribute for
+the variant given by the <tt>variant</tt> attribute.</td>
+
+<td WIDTH="392"><tt>&lt;fmt:locale value="en-US" variant="UNIX"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;timeZone></tt></b>
+<br><tt><font color="#000000"><b>value </b>var scope</font></tt>
+<p>Establishes the time zone given by the <tt>value</tt> attribute.</td>
+
+<td WIDTH="392"><tt>&lt;fmt:timeZone value="America/Los_Angeles"></tt>
+<br><tt>&nbsp; &lt;fmt:formatDate type="time"/></tt>
+<br><tt>&lt;/fmt:timeZone></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;bundle></tt></b>
+<br><tt><font color="#000000"><b>basename </b>prefix var scope</font></tt>
+<p>Loads the resource bundle whose base name is specified by the <tt>basename</tt>
+attribute, and optionally exposes it in the named scoped attribute.</td>
+
+<td WIDTH="392"><tt>&lt;fmt:bundle basename="Greetings" var="greetingBundle"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;message></tt></b>
+<br><tt><font color="#000000"><b>key </b>bundle var scope</font></tt>
+<p>Fetches the localized message corresponding to the key specified by
+the <tt>key</tt> attribute from the resource bundle given by the <tt>bundle</tt>
+attribute, and performs parametric replacement on the retrieved message
+using the argument values supplied via <tt>&lt;messageArg></tt> subtags</td>
+
+<td WIDTH="392"><tt>&lt;fmt:message key="Welcome" bundle="$greetingBundle"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;messageFormat></tt></b>
+<br><tt><font color="#000000"><b>value</b> var scope</font></tt>
+<p>Performs parametric replacement on the pattern specified by the <tt>value</tt>
+attribute using the argument values supplied via <tt>&lt;messageArg></tt>
+subtags</td>
+
+<td WIDTH="392"><tt>&lt;fmt:messageFormat value="$priceMsg"></tt>
+<br><tt>&nbsp; &lt;fmt:messageArg value="$priceArg"/></tt>
+<br><tt>&lt;/fmt:messageFormat></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;messageArg></tt></b>
+<br><tt><font color="#000000">value</font></tt>
+<p>Supplies the argument specified by the <tt>value</tt> attribute&nbsp;
+(if present) or the tag body to its parent <tt>&lt;message></tt> action
+for parametric replacement</td>
+
+<td WIDTH="392"><tt>&lt;fmt:message key="Welcome" bundle="$greetingBundle">&nbsp;</tt>
+<br><tt>&nbsp; &lt;fmt:messageArg value="$dateArg"/></tt>
+<br><tt>&lt;/fmt:message></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;formatNumber></tt></b>
+<br><tt><font color="#000000"><b>value </b>type pattern var scope</font></tt>
+<p><font color="#000000">Formats the given numeric value as a number, currency,
+or percentage using the locale's predefined or the specified (customized)
+formatting pattern&nbsp;</font></td>
+
+<td WIDTH="392"><tt>&lt;fmt:formatNumber value="9876543.21" type="currency"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;parseNumber></tt></b>
+<br><tt><font color="#000000"><b>value </b>type<b> </b>pattern var scope</font></tt>
+<p><font color="#000000">Parses the given numeric string using the locale's
+default or the specified (customized) formatting pattern</font></td>
+
+<td WIDTH="392"><tt>&lt;fmt:parseNumber value="$num" var="parsed"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;formatDate></tt></b>
+<br><tt><font color="#000000"><b>value </b>type dateStyle timeStyle pattern
+timeZone var scope</font></tt>
+<p><font color="#000000">Formats the given date using the locale's predefined
+or the specified (customized) formatting pattern&nbsp;</font></td>
+
+<td WIDTH="392"><tt>&lt;fmt:formatDate timeStyle="long" dateStyle="long"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;parseDate></tt></b>
+<br><tt><font color="#000000"><b>value</b> type pattern var scope</font></tt>
+<p><font color="#000000">Parses the given date string using the locale's
+default or the specified (customized) formatting pattern</font></td>
+
+<td WIDTH="392"><tt>&lt;fmt:parseDate value="May 22, 2001 4:05:53 PM PDT"
+var="parsed"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;exception></tt></b>
+<br><tt><font color="#000000">value bundle stackTrace</font></tt>
+<p><font color="#000000">Displays the exception given by the <tt>value</tt>
+attribute (or the error page's exception if no <tt>value</tt> attribute
+is given) in its localized form</font></td>
+
+<td WIDTH="392"><tt>&lt;fmt:exception bundle="$errorMessages"/></tt></td>
+</tr>
+</table>
+
+</body>
+</html>
diff --git a/doc/web/I18N_FunctionalDescription_6_EA3.html b/doc/web/I18N_FunctionalDescription_6_EA3.html
new file mode 100644
index 0000000..93e5f53
--- /dev/null
+++ b/doc/web/I18N_FunctionalDescription_6_EA3.html
@@ -0,0 +1,1195 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="GENERATOR" content="Mozilla/4.76C-CCK-MCD Netscape [en] (X11; U; SunOS 5.7 sun4u) [Netscape]">
+   <title>I18N -- Functional Description</title>
+<style media="screen" type="text/css"><!--
+.fixme { color: red }
+--></style>
+</head>
+<body bgcolor="#FFFFFF">
+
+<h3>
+
+<hr width="100%" noshade></h3>
+
+<h2>
+I18N-Capable Formatting Tags: Functional Description</h2>
+
+<h2>
+<tt>&lt;fmt:locale><br>
+&lt;fmt:timeZone><br>
+&lt;fmt:bundle><br>
+&lt;fmt:message><br>
+&lt;fmt:messageFormat><br>
+&lt;fmt:messageArg><br>
+&lt;fmt:formatNumber><br>
+&lt;fmt:parseNumber><br>
+&lt;fmt:formatDate><br>
+&lt;fmt:parseDate><br>
+&lt;fmt:exception><br>
+&lt;fmt:requestEncoding></tt></h2>
+
+<hr width="100%" noshade>
+<h3>
+1. Introduction</h3>
+With the explosion of application development based on web technologies,
+and the deployment of such applications on the Internet, applications must
+be able to adapt to the languages and formatting conventions of their clients.
+This means that page authors must be able to tailor any locale-specific
+page content according to the conventions of the client's language and
+cultural formatting conventions. For example, the number <tt>345987.246
+</tt>should
+be formatted as <tt>345 987,246 </tt>for French, <tt>345.987,246
+</tt>for
+German, and <tt>345,987.246</tt><i> </i>for clients<i> </i>in the U.S.
+<p>The process of designing an application (or page content) so that it
+can be adapted to various languages and regions without requiring any engineering
+changes is known as <i>internationalization</i>, or I18N for short. Once
+a web application has been internationalized, it can be adapted for a number
+of regions or languages by adding locale-specific components and translating
+text. This process is known as <i>localization</i>.
+<p>There are two approaches to internationalizing a web application:
+<ul>
+<li>
+Provide a version of the JSP in each of the target locales and have a controller
+servlet dispatch the request to the appropriate page (depending on the
+requested locale). This approach is useful if large amounts of data on
+a page or an entire web application need to be internationalized.</li>
+
+<li>
+Isolate any locale-sensitive data on a page (such as error messages, string
+literals, or button labels) into resource bundles, and access the data
+via I18N tags, so that the corresponding translated message is fetched
+automatically and inserted into the page.</li>
+</ul>
+This proposal supports both approaches. It defines two sets of<font size=+0>
+tags: I18N tags, whose purpose is to assist page authors with creating
+internationalized page content that can be localized into any locale available
+in the JSP container&nbsp; (this addresses the second approach), and formatting
+tags, which allow various data elements such as numbers, currencies, dates
+and times to be formatted and parsed in a locale-sensitive or customized
+manner (this may be used in either approach).</font>
+<h3>
+2. Locale selection</h3>
+JSTL supports both browser- and application-based locales, which are discussed
+in more detail.
+<h4>
+2.1 Browser-based locales</h4>
+By default, browser-sensing capabilities for locales are enabled. This
+means that the client determines (via its browser settings) which locale
+to use, and allows page authors to cater to the language preferences of
+their clients. For example, a shopping application may want to greet its
+customers in their language, and it may even want to label its GUI components
+in that language (for example, a cancel button would be labelled
+<tt>Cancel</tt>&nbsp;
+for English and <tt>Abbrechen</tt> for German speaking customers).
+<p>Any action that requires a locale first calls the <tt>getLocales()</tt>
+method on the incoming request, which provides a list, in order of preference,
+of the locales that the client wants to use. This list is processed differently
+depending on whether the action is an I18N or a formatting tag.
+<h5>
+2.1.1 Resource bundle locale</h5>
+Any I18N actions that acquire a resource bundle based on its base name
+(that is, the <tt>&lt;bundle></tt> action which (always) takes a <tt>basename</tt>
+attribute and the <tt>&lt;message></tt> action which may use the default
+resource bundle base name defined by the <tt>javax.servlet.jsp.jstl.i18n.basename
+</tt>attribute)
+determine the best matching locale by comparing the list of client locales
+against the list of available locales for the resource bundle in question,
+as follows:
+<p>For each of the client's preferred locales (in order of preference),
+the action checks if there is a matching locale for the resource bundle
+in question, by passing the resource bundle's base name and the client's
+requested locale to the <tt>java.util.ResourceBundle.getBundle()</tt> method.
+This method appends the name of the requested client locale to the given
+base name and searches for a resource bundle with that name. A resource
+bundle may be backed by a class or a properties file. If no resource bundle
+with that name exists (and the requested locale has both a language and
+a country component), the method appends just the requested locale's language
+name to the given base name and searches for a resource bundle with that
+name. If no resource bundle with that name exists, and the requested locale
+differs from the container's default locale, the method continues the search
+by appending the name of the container's default locale to the given base
+name. If no resource bundle with that name exists (and the container's
+default locale has both a language and a country component), the method
+appends just the language component of the container's default locale to
+the given base name. If there still is no match, the method searches for
+a resource bundle with just the given base name (without any locale name
+appended to it). If there still is no match, <tt>ResourceBundle.getBundle()
+</tt>raises
+a <tt>MissingResourceException</tt>, which is caught by the tag handler
+implementation and interpreted as if the resource bundle with the given
+base name does not exist for the requested client locale.
+<p>As a result of the search algorithm implemented by <tt>ResourceBundle.getBundle()</tt>,
+the locale of the resource bundle returned by <tt>ResourceBundle.getBundle()
+</tt>may
+either match both the country and language components of the requested
+locale ("exact match"), only its language ("language match"), or neither
+(depending on the container's default locale). Note that the locale of
+the returned resource bundle may not even have any language and country
+components. An exact match may exist only if the client's preferred locale
+specifies a country.
+<p>If there is an exact match, it is used, and no further client locales
+are checked. Otherwise, all remaining client locales are checked, and the
+first language match is used. If no such match exists, the fallback locale
+stored in the <tt>javax.servlet.jsp.jstl.i18n.fallbackLocale</tt> attribute,
+which is searched in the page, request, session (if valid), and application
+scope(s) (in this order), is used (see Section 16: Configuration parameters).
+If this attribute is not found, or there still is no match, an error message
+of the form <tt>"???&lt;key>???"</tt> (where
+<tt>&lt;key></tt> is the name
+of the message key to be looked up) is returned (see Section 8: &lt;message>).
+<p>The behavior is implementation-defined if the set of available resource
+bundles changes during execution of the page. Implementations may thus
+cache the best matching locale for a given resource bundle when one is
+found.
+<p>The following example assumes that a message key needs to be looked
+up in a resource bundle with base name "MyResources" which is available
+only in the US-English ("en-US") locale. Furthermore, it assumes that the
+client's only preferred locale is British-English ("en_UK"). Passing the
+requested base name ("MyResources") along with the preferred locale ("en-UK")
+to the <tt>ResourceBundle.getBundle()</tt> method will result in the following
+search order of resource bundles, assuming that the container's default
+locale is set to English ("en"):
+<p><tt>&nbsp;&nbsp;&nbsp; (class) MyResources_en_UK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(exact match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (file)&nbsp; MyResources_en_UK.properties&nbsp;&nbsp;
+(exact match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (class) MyResources_en&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(language match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (file)&nbsp; MyResources_en.properties&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(language match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (class) MyResources&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(no match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (file)&nbsp; MyResources.properties&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(no match)</tt>
+<p>Since <tt>MyResources_en_US </tt>is never searched in this example,
+an error message of the form <tt>"???&lt;key>???"</tt> (see above) is returned
+to the client.
+<p>With the container's default locale set to "en-US", the complete search
+order of <tt>ResourceBundle.getBundle()</tt> will be as follows:
+<p><tt>&nbsp;&nbsp;&nbsp; (class) MyResources_en_UK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(exact match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (file)&nbsp; MyResources_en_UK.properties&nbsp;&nbsp;
+(exact match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (class) MyResources_en&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(language match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (file)&nbsp; MyResources_en.properties&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(language match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (class) MyResources_en_US&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(language match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (file)&nbsp; MyResources_en_US.properties&nbsp;&nbsp;
+(language match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (class) MyResources_en&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(language match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (file)&nbsp; MyResources_en.properties&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(language match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (class) MyResources&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(no match)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; (file)&nbsp; MyResources.properties&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+(no match)</tt>
+<p>In this case, a language match with <tt>MyResources_en_US </tt>is found,
+which is returned. Since the client did not specify any additional preferred
+locales, the message key is looked up in this resource bundle.
+<p>If the client's preferred locales were "ja", "en-UK", "en-US", "en-CA",
+and "fr"<tt> </tt>(in this order), and the available ones (for the resource
+bundle in question) were "en" and "fr", the best match would be "en". Likewise,
+if the available ones were "en", "en-US", and "fr", then the best match
+would be "en-US".
+<h5>
+2.1.2 Formatting locale</h5>
+This is the locale used by the <tt>&lt;formatNumber></tt>, <tt>&lt;parseNumber></tt>,
+<tt>&lt;formatDate></tt>,
+and <tt>&lt;parseDate></tt> formatting actions.
+<p>If the formatting action is enclosed within a <tt>&lt;bundle> </tt>action,
+the locale of the parent bundle is used as the formatting locale.
+<p>Otherwise, if the <tt>javax.servlet.jsp.jstl.i18n.basenam</tt>e attribute
+is set, the best matching locale for that base name is determined (according
+to the algorithm described in Section 2.1.1) and used as the formatting
+locale.
+<p>Otherwise, the formatting action checks, for each of the client's preferred
+locales (in order of preference), if there is a matching locale available.
+The <tt>&lt;formatNumber>
+</tt>and<tt> &lt;parseNumber></tt>, and the <tt>&lt;formatDate>
+</tt>and
+<tt>&lt;parseDate>
+</tt>actions
+determine the available locales by calling <tt>java.text.NumberFormat.getAvailableLocales()</tt>
+and <tt>java.text.DateFormat.getAvailableLocales()</tt>, respectively.
+If there is an exact match (that is, a client's preferred locale specifies
+a country and matches both the language and country of an available locale),
+it is used, and no further client locales are checked. Otherwise, the first
+match on language is used. If no such match exists, the default locale
+of the JSP container's Java runtime is used. Once the best matching locale
+has been determined, it is cached, so that any subsequent formatting actions
+on the same page do not have to determine it again.
+<h4>
+2.2. Application-based locales</h4>
+The browser-sensing capabilities for locales can be disabled by setting
+the <tt>javax.servlet.jsp.jstl.i18n.locale</tt> (scoped) attribute. This
+attribute may be set directly by application code for any of the JSP scopes.
+For example, an application might let its users pick their preferred locale
+and then set the <tt>javax.servlet.jsp.jstl.i18n.locale
+</tt>attribute
+accordingly. Alternatively, the <tt>&lt;locale> </tt>action may be used
+to set the <tt>javax.servlet.jsp.jstl.i18n.locale </tt>attribute with page
+scope only. This may be useful in the case where a client's preferred locale
+is retrieved from a database (using the JSTL database tags)and installed
+on the page using the <tt>&lt;locale></tt> tag.
+<p>The <tt>javax.servlet.jsp.jstl.i18n.locale</tt> attribute is searched
+in the page, request, session (if valid), and application scope(s) (in
+this order).
+<h3>
+3. Response encoding</h3>
+Every action that is responsible for establishing a locale passes that
+locale to the <tt>setLocale()</tt> method of the <tt>javax.servlet.ServletResponse</tt>.
+(This assumes that the response is buffered with a big enough buffer size,
+since <tt>setLocale()</tt> and <tt>setContentType()</tt> must be called
+before <tt>ServletResponse.getWriter()</tt> in order for the charset to
+affect the construction of the writer.)
+<p>More specifically, the response's <tt>setLocale()</tt> method is always
+called by the <tt>&lt;locale></tt> action. In addition, it is called by
+the following actions if browser-sensing capabilities for locales are enabled
+(that is, in the absence of the <tt>javax.servlet.jsp.jstl.i18n.locale</tt>
+attribute):
+<br>&nbsp;
+<li>
+Any <tt>&lt;bundle></tt> action.</li>
+
+<li>
+A <tt>&lt;message></tt> action that uses the default resource bundle base
+name (defined by the <tt>javax.servlet.jsp.jstl.i18n.basename</tt> attribute).</li>
+
+<li>
+A <tt>&lt;formatNumber></tt> or <tt>&lt;formatDate></tt> action that is
+not enclosed within a <tt>&lt;bundle> </tt>action.</li>
+
+<br>&nbsp;
+<p>&nbsp;
+<p>After an action has called <tt>ServletResponse.setLocale()</tt>, it
+determines the character encoding associated with the locale (by calling
+<tt>ServletResponse.getCharacterEncoding()</tt>)
+and stores it in the <tt>javax.servlet.jsp.jstl.i18n.request.charset</tt>
+session attribute. This attribute may be used by the <tt>&lt;requestEncoding></tt>
+action (see Section 16) in a page invoked by a form included in the response
+to set the request charset to the same as the response charset. This makes
+it possible for the container to decode the form parameter values properly,
+since browsers typically encode form field values using the response's
+charset.
+<h3>
+4. Time zone</h3>
+The <tt>javax.servlet.jsp.jstl.i18n.timeZone </tt>JSP attribute specifies
+the time zone in which any time information formatted using the <tt>&lt;formatDate></tt>
+action is represented. This allows any time information on a page to be
+tailored to the preferred time zone of its clients, which is useful if
+the server hosting the page containing the time information and its clients
+reside in different time zones. Page authors could be advised to always
+use the "long" time format which includes the time zone, but that would
+still require clients to convert the formatted time into their own time
+zone.
+<p>The <tt>javax.servlet.jsp.jstl.i18n.timeZone</tt> attribute may be set
+directly by application code for any of the JSP scopes. For example, an
+application might let its users pick their preferred time zone and then
+set the <tt>javax.servlet.jsp.jstl.i18n.timeZone
+</tt>attribute accordingly.
+Alternatively, the <tt>&lt;timeZone></tt> action may be used to set the
+<tt>javax.servlet.jsp.jstl.i18n.timeZone</tt>
+attribute for the current page context. This may be useful in the case
+where a client's preferred time zone is retrieved from a database (using
+the JSTL database tags) and imported into the page using the <tt>&lt;timeZone></tt>
+tag.
+<p>The <tt>javax.servlet.jsp.jstl.i18n.timeZone </tt>attribute is searched
+in the page, request, session (if valid), and application scope(s) (in
+this order). If not found, the JSP container's time zone is used.
+<h3>
+5. &lt;locale></h3>
+The <tt>&lt;locale></tt> action may be used to set or override the JSP
+attribute
+<tt>javax.servlet.jsp.jstl.i18n.locale</tt> with the locale specified
+by the <tt>value</tt> attribute in the scope given by the <tt>scope</tt>
+attribute (default: "page").
+<p>The locale specified by the <tt>value</tt> attribute must contain a
+two-letter (lower-case) language code (as defined by ISO-639), and may
+contain a two-letter (upper-case) country code (as defined by ISO-3166)<tt>.
+</tt>Language
+and country codes must be separated by hyphen ('-') or underscore ('_').
+<p>Optionally, a (vendor- or browser-specific) variant may be specified
+using the <tt>variant</tt> attribute. See the <tt>java.util.Locale</tt>
+javadocs for more information on variants.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:locale value="en-US" variant="UNIX"/></tt>
+<p>By using this action, the browser-sensing capabilities for locales described
+in Section 2 of this functional description are disabled. This means that
+if this action is being used, it should be declared at the beginning of
+a page, before any other I18N-capable formatting tags. Otherwise, a different
+locale might be used up to the position in the page where the <tt>&lt;locale></tt>
+action is specified.
+<h3>
+6. &lt;timeZone></h3>
+The <tt>&lt;timeZone></tt> action establishes the time zone (specified
+via the <tt>value</tt> attribute) to be used by any nested <tt>&lt;formatDate></tt>
+actions:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:timeZone value="America/Los_Angeles"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate type="time"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:timeZone></tt>
+<p>The time zone may be specified as either an abbreviation (such as "PST"),
+a full name (such as "America/Los_Angeles"), or a custom format (such as
+"GMT-8:00). See
+<tt>java.util.TimeZone.getTimeZone()
+</tt>for more details
+on the supported time zone formats.
+<p>The <tt>var</tt> attribute may be used to expose the time zone as a
+JSP-scoped attribute of type <tt>java.util.TimeZone
+</tt>(with visibility
+<tt>AT_END</tt>),
+so that it can be referenced by any subsequent
+<tt>&lt;formatDate></tt>
+actions that are not nested inside a <tt>&lt;timeZone></tt> action and
+take a <tt>timeZone</tt> attribute:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:timeZone value="America/Los_Angeles"
+var="losAngelesTimeZone"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate type="time" timeZone="$losAngelesTimeZone"/></tt>
+<p>An empty <tt>&lt;timeZone></tt> action that is specified without the
+<tt>var</tt>
+attribute can be used to set or override the
+<tt>javax.servlet.jsp.jstl.i18n.timeZone</tt>
+attribute in the scope given by the <tt>scope</tt> attribute (default:
+"page"), thereby making its time zone the (new) default in that scope:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:timeZone value="America/Los_Angeles"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate type="time"/></tt>
+<h3>
+7. &lt;bundle></h3>
+The <tt>&lt;bundle> </tt>action loads the resource bundle whose base name
+is specified via the <tt>basename</tt> attribute:
+<p>&nbsp;<tt>&nbsp;&nbsp; &lt;fmt:bundle basename="com.acme.labels.ButtonLabels"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;user-of-bundle/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:bundle></tt>
+<p>The resource bundle's locale is determined according to Section 2 of
+this functional description.
+<p>The <tt>var</tt> attribute may be used to expose the resource bundle
+as a JSP-scoped attribute of type <tt>java.util.ResourceBundle
+</tt>(with
+visibility <tt>AT_END</tt>), so that it can be referenced by any subsequent
+<tt>&lt;message></tt>
+actions that take a <tt>bundle</tt> attribute:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="com.acme.labels.ButtonLabels"
+var="buttonLabels"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Submit" bundle="$buttonLabels"/></tt>
+<p>Exposing a resource bundle via the <tt>var</tt> attribute is useful
+if the bundle needs to be accessed multiple times.
+<p>An empty <tt>&lt;bundle></tt> action that is specified without the <tt>var</tt>
+attribute can be used to set or override the <tt>javax.servlet.jsp.jstl.i18n.basename</tt>
+attribute in the scope given by the <tt>scope</tt> attribute (default:
+"page"), thereby making its base name the (new) default in that scope:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="com.acme.labels.ButtonLabels"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Submit"/></tt>
+<p>The <tt>prefix</tt> attribute is provided as a convenience for very
+long key names: Its value is prepended to any message key (see the <tt>&lt;message></tt>
+action) that is to be looked up in the resource bundle that was loaded
+by this action.
+<h3>
+8. &lt;message></h3>
+The <tt>&lt;message></tt> action retrieves the localized message corresponding
+to a given message key.
+<p>The message key may be specified via the
+<tt>key</tt> attribute; if
+missing, it is read from the tag's body content.
+<p>The resource bundle in which to look up the message key may be given
+by the <tt>bundle</tt> attribute. If this attribute is missing, and the
+<tt>&lt;message>
+</tt>action
+is nested inside a <tt>&lt;bundle></tt> tag, the resource bundle to use
+is taken from the enclosing <tt>&lt;bundle></tt> tag. Otherwise, the resource
+bundle with the default base name given by the
+<tt>javax.servlet.jsp.jstl.i18n.basename
+</tt>attribute
+is used,&nbsp; which is searched in the page, request, session (if valid),
+and application scope(s) (in this order).
+<p>The <tt>&lt;message></tt> action outputs its result to the current
+<tt>JspWriter</tt>
+object, unless the <tt>var</tt> attribute is specified, in which case the
+result is stored in the named JSP attribute.
+<p>Example:
+<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <tt>&lt;fmt:message key="Welcome"/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;%-- Key is looked up in default bundle --%></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="Errors" var="errorBundle"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="Greetings"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Welcome"/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;%-- Key is looked up in parent &lt;bundle> tag --%></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="WrongPassword"
+bundle="$errorBundle"/>&nbsp; &lt;%-- Key is looked up in errorBundle --%></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:bundle></tt>
+<p>If the given key is not found in the resource bundle, or a resource
+bundle with the given base name does not exist, a message is logged to
+the servlet context, and an error message of the form <tt>"???&lt;key>???"</tt>
+(where
+<tt>&lt;key></tt> is the name of the undefined key) is output to
+the current <tt>JspWriter
+</tt>object.
+<p>If the message corresponding to the given key is <i>compound</i>, that
+is, contains one or more variables, it may be supplied with argument values
+for these variables via the <tt>messageArgs</tt> attribute or one or more
+<tt>&lt;messageArg></tt>
+subtags (one for each argument value). This procedure is referred to as
+<i>parametric
+replacement.</i> Parametric replacement takes place in the order of the
+argument values given via the <tt>messageArgs</tt> attribute or the <tt>&lt;messageArg></tt>
+subtags. If the message is compound, but neither a <tt>messageArgs</tt>
+attribute nor any <tt>&lt;messageArg></tt> subtags are specified, the message
+is left unmodified. Specifying a <tt>&lt;message></tt> tag with both a
+<tt>messageArgs</tt>
+attribute and one or more <tt>&lt;messageArg></tt> subtags causes a translation
+error.
+<p>If the parent <tt>&lt;bundle></tt> action specifies a <tt>prefix</tt>
+attribute, its value is prepended to any key names to be looked up in that
+bundle. For example, using the <tt>prefix</tt> attribute, the key names
+in:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="Labels"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="com.acme.labels.firstName"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="com.acme.labels.lastName"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:bundle></tt>
+<p>may be abbreviated to:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="Labels" prefix="com.acme.labels."></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="firstName"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="lastName"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:bundle></tt>
+<h3>
+9. &lt;messageFormat></h3>
+The <tt>&lt;messageFormat> </tt>action performs parametric replacement
+on a given pattern string , using the runtime's default locale.
+<p>The pattern string may be specified via the <tt>value</tt> attribute;
+if missing, it is read from the tag's body content.
+<p>The argument values for parametric replacement may be supplied via the
+<tt>messageArgs</tt>
+attribute or one or more
+<tt>&lt;messageArg></tt> subtags (one for each
+parameter in the pattern). Parametric replacement takes place in the order
+of the argument values given via the <tt>messageArgs</tt> attribute or
+the <tt>&lt;messageArg></tt> subtags. If neither a <tt>messageArgs</tt>
+attribute nor any <tt>&lt;messageArg></tt> subtags are specified, the given
+pattern is left unmodified. Specifying a <tt>&lt;messageFormat></tt> tag
+with both a <tt>messageArgs</tt> attribute and one or more <tt>&lt;messageArg></tt>
+subtags causes a translation error.
+<p>The result is output to the current <tt>JspWriter</tt> object, unless
+the <tt>var</tt> attribute is given, in which case it is stored in the
+named JSP attribute.
+<p>The <tt>&lt;messageFormat></tt> action is useful if a pattern needs
+to be supplied from sources other than resource bundles, or if a pattern
+extracted from a resource bundle needs to be used multiple times.
+<p>For example, when displaying a list of products, the same internationalized
+message (pattern) would be used to display the price, but rather than looking
+up the same pattern for every single product, the pattern could be looked
+up once (using the <tt>&lt;message></tt> action) and then passed in to
+the <tt>&lt;messageFormat></tt> action for each product, as follows:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="..." var="i18n"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="store.product.price" bundle="$i18n"
+var="priceMsg"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;c:forEach ...></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... &lt;fmt:messageFormat value="$priceMsg">...&lt;/fmt:messageFormat></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/c:forEach></tt>
+<p>instead of the less efficient alternative:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="..." var="i18n"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;c:forEach ...></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... &lt;fmt:message key="store.product.price"
+bundle="$i18n">...&lt;/fmt:message></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/c:forEach></tt>
+<h3>
+10. &lt;messageArg></h3>
+The <tt>&lt;messageArg></tt> action provides a single argument (for parametric
+replacement) to the compound message or pattern in its parent
+<tt>&lt;message></tt>
+or <tt>&lt;messageFormat></tt> action, respectively.
+<p>One <tt>&lt;messageArg> </tt>action must be specified for each variable
+in the compound message or pattern. Parametric replacement takes place
+in the order of the <tt>&lt;messageArg></tt> tags.
+<p>The argument value can be specified either via the <tt>value</tt> attribute:
+<pre>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Welcome">
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:messageArg value="$dateArg"/>
+&nbsp;&nbsp;&nbsp; &lt;/fmt:message></pre>
+or inline via the tag's body content:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Welcome"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:messageArg></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;acme:doIt .../></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/fmt:messageArg></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:message></tt>
+<h3>
+11. &lt;formatNumber></h3>
+The <tt>&lt;formatNumber></tt> action allows the formatting of numbers,
+currencies, and percentages, using predefined or customized formatting
+styles.
+<p>The numeric value to be formatted may be specified via the <tt>value</tt>
+attribute; if missing, it is read from the tag's body content.
+<p>Depending on the value of the <tt>type</tt> attribute, which must be
+one of "number", "currency", or "percent" (default: "number"), the given
+numeric value is formatted as a number, currency, or percentage, respectively,
+using the default formatting pattern for numbers (currencies, percentages)
+of the page's locale, which is determined according to Section 2 of this
+functional description.
+<p>The result is output to the current
+<tt>JspWriter</tt> object, unless
+the <tt>var</tt> attribute is given, in which case it is stored (as a string)
+in the named JSP attribute.
+<p>Example: The output of
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatNumber value="9876543.21" type="currency"/></tt>
+<p>varies with the page's locale (given in parentheses), as follows:
+<p><tt>&nbsp;&nbsp;&nbsp; 9 876 543,21 F&nbsp;&nbsp; (fr_FR)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; 9.876.543,21 DM&nbsp; (de_DE)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; $9,876,543.21&nbsp;&nbsp;&nbsp; (en_US)</tt>
+<p>When formatting the given value as a number, the predefined formatting
+pattern of the page's locale can be overridden by using the <tt>pattern</tt>
+attribute, allowing page authors to control the display of leading and
+trailing zeros, prefixes and suffixes, grouping (thousands) separators,
+and the decimal separator of the formatted number. The given pattern string
+must follow the <a href="http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html">Number
+Format Pattern Syntax&nbsp;</a> specified in the tutorial trail on internationalization
+at <tt>java.sun.com</tt>.
+<p>For example, a pattern of ".000" will cause any numeric value formatted
+with it to be represented with 3 fraction digits, adding trailing zeros
+if necessary, so that
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatNumber value="12.3" pattern=".000"/></tt>
+<p>will output "12.300".
+<p>Likewise, a pattern of "#,#00.0#" specifies that any numeric value formatted
+with it will be represented with a minimum of 2 integer digits, 1 fraction
+digit, and a maximum of 2 fraction digits, with every 3 integer digits
+grouped. Applied to "123456.7891", as in:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatNumber value="123456.7891" pattern="#,#00.0#"/></tt>
+<p>the formatted output will be "123,456.79" (note that rounding is handled
+automatically).
+<p>The <tt>value</tt> and <tt>pattern</tt> attributes accept both string
+literals and EL values.
+<p>If the numeric value to be formatted is given as a string literal, it
+is first parsed into an instance of <tt>java.lang.Number
+</tt>according
+to the default pattern of the locale specified by the <tt>parseLocale</tt>
+attribute. In the absence of this attribute, the English (<tt>en</tt>)
+locale is used. If the numeric string uses a pattern different from the
+parsing locale's default, it must be parsed using the
+<tt>&lt;parseNumber></tt>
+action.
+<p>The <tt>type</tt> attribute accepts (case-insensitive) literals only,
+causing an error at translation-time validation if the specified literal
+is illegal.
+<p>The <tt>pattern</tt> attribute may be used only when formatting numbers
+(that is, if the <tt>type</tt> attribute is missing or is equal to "number").
+Using it with a <tt>type</tt> attribute equal to "currency" or "percent"
+causes a translation-time error.
+<h3>
+12. &lt;parseNumber></h3>
+The <tt>&lt;parseNumber></tt> action may be used for parsing numbers, currencies,
+and percentages.
+<p>The numeric string to be parsed may be specified via the <tt>value</tt>
+attribute; if missing, it is read from the tag's body content.
+<p>Depending on the value of the <tt>type</tt> attribute, which must be
+one of "number", "currency", or "percent" (default: "number"), the given
+numeric string is parsed as a number, currency, or percentage, respectively,
+using the default formatting pattern for numbers (currencies, percentages)
+of the locale specified by the <tt>parseLocale</tt> attribute. If the <tt>parseLocale</tt>
+attribute is missing, the page's locale is used, which is determined according
+to Section 2 of this functional description.
+<p>If the number specified via the <tt>value</tt> attribute uses a format
+different from the page locale's default, the pattern required to parse
+it may be specified using the <tt>pattern</tt> attribute.
+<p>If the <tt>var</tt> attribute is given, the parsing result (of type
+<tt>java.lang.Number</tt>)
+is stored in the named JSP attribute.&nbsp; Otherwise, it is output to
+the current <tt>JspWriter</tt> object using <tt>java.lang.Number.toString()</tt>.
+<p>The <tt>value</tt> and <tt>pattern</tt> attributes accept both literals
+and EL values, whereas the <tt>type</tt> attribute accepts (case-insensitive)
+literals only, causing an error at translation-time validation if the specified
+literal is illegal.
+<p>The <tt>pattern</tt> attribute may be used only when parsing numbers
+(that is, if the <tt>type</tt> attribute is missing or equals "number").
+Using it with a <tt>type</tt> attribute equal to "currency" or "percent"
+causes a translation-time error.
+<h3>
+13. &lt;formatDate></h3>
+The <tt>&lt;formatDate</tt>> action allows the formatting of dates and
+times using predefined or customized formatting styles.
+<p>Depending on the value of the <tt>type</tt> attribute, which must be
+one of "time", "date", or "both" (default: "date"), only the time, the
+date, or both the time and date components of the date specified via the
+<tt>value</tt>
+attribute are formatted, using one of the predefined formatting styles
+for dates (specified via the <tt>dateStyle</tt> attribute) and times (specified
+via the <tt>timeStyle</tt> attribute) of the page's locale, which is determined
+according to Section 2 of this functional description.&nbsp; Legal values
+for the
+<tt>dateStyle</tt> and <tt>timeStyle</tt> attributes are "default",
+"short", "medium ", "long", and "full" (default: "default").
+<p>If the <tt>value</tt> attribute is missing, the current date and time
+are used.
+<p>Any time information is represented in the time zone given by the <tt>timeZone</tt>
+attribute.&nbsp; If this attribute is missing, and the <tt>&lt;formatDate>
+</tt>action
+is nested inside a <tt>&lt;timeZone></tt> tag, the time zone to use is
+taken from the enclosing <tt>&lt;timeZone></tt> tag. Otherwise, the default
+time zone given by the <tt>javax.servlet.jsp.jstl.i18n.timeZone</tt> attribute
+is used, which is searched in the page, request, session (if valid), and
+application scope(s) (in this order). If not found, the JSP container's
+time zone is used.
+<p>The action's result is output to the current <tt>JspWriter</tt> object,
+unless the <tt>var</tt> attribute is given, in which case it is stored
+(as a string) in the named JSP attribute.
+<p>Example: Assuming a current date of Oct 22, 2001 and a current time
+of 4:05:53 PM,
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate timeStyle="long" dateStyle="long"/></tt>
+<p>will output
+<p><tt>&nbsp;&nbsp;&nbsp; October 22, 2001 4:05:53 PM PDT</tt>
+<p>for the U.S. and
+<p><tt>&nbsp;&nbsp;&nbsp; 22 octobre 2001 16:05:53 GMT-07:0</tt>
+<p>for the French locale.
+<p>Page authors may also apply a customized formatting style for their
+times and dates by specifying the <tt>pattern</tt> attribute. The specified
+formatting pattern must use the <a href="http://java.sun.com/docs/books/tutorial/i18n/format/datepattern.html">Date
+Format Pattern Syntax</a> specified in the tutorial trail on internationalization
+at <tt>java.sun.com</tt>.
+<p>Example: Assuming the same current date and time as in the above example,
+the output of
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate pattern="EEE, MMM d, ''yy"/></tt>
+<p>will be
+<p><tt>&nbsp;&nbsp;&nbsp; Mon, Oct 22, '01</tt>
+<p>for the U.S. locale.
+<p>The <tt>value</tt> and <tt>pattern</tt> attributes accept both string
+literals and EL values (which must evaluate to objects of type<tt> java.util.Date
+</tt>in
+the case of the <tt>value</tt> attribute).
+<p>If the input to the
+<tt>value</tt> attribute is a string literal, it
+is first parsed into an instance of <tt>java.util.Date</tt> according to
+the default formatting style for dates of the parsing locale specified
+by the <tt>parseLocale</tt> attribute, that is, it is parsed in a fashion
+equivalent to using a <tt>&lt;parseDate></tt> action with <tt>type</tt>
+equal to "date" (its default value) and <tt>dateStyle</tt> equal to "default"
+(its default value). In the absence of the <tt>parseLocale</tt> attribute,
+the English (<tt>en</tt>) locale is used as the parsing locale. If the
+string in the <tt>value</tt> attribute uses a formatting style for dates
+different from the parsing locale's default, or includes a time component,
+it must first be parsed using a
+<tt>&lt;parseDate></tt> action whose parsing
+result can then be supplied to a <tt>&lt;formatDate></tt> action for formatting.
+<p>The <tt>type</tt>, <tt>timeStyle</tt>, and <tt>dateStyle</tt> attributes
+take (case-insensitive) literals only, causing an error at translation-time
+validation if the specified literal is illegal.
+<h3>
+14. &lt;parseDate></h3>
+The <tt>&lt;parseDate></tt> action may be used for parsing date and time
+strings.
+<p>The date string to be parsed may be specified via the <tt>value</tt>
+attribute; if missing, it is read from the tag's body content.
+<p>Depending on the value of the <tt>type</tt> attribute, which must be
+one of "time", "date", or "both" (default: "date"), the given date string
+is expected to contain only a time, a date, or both a time and date component,
+respectively. It is parsed according to one of the predefined formatting
+styles for dates (specified via the
+<tt>dateStyle</tt> attribute) and times
+(specified via the <tt>timeStyle</tt> attribute) of the locale specified
+by the <tt>parseLocale</tt> attribute. If the <tt>parseLocale</tt> attribute
+is missing, the page's locale is used, which is determined according to
+Section 2 of this functional description. Legal values for the
+<tt>dateStyle</tt>
+and <tt>timeStyle</tt> attributes are "default", "short", "medium ", "long",
+and "full" (default: "default").
+<p>If the given date string uses a different format, the pattern required
+to parse it may be specified via the <tt>pattern</tt> attribute.
+<p>If the given time information does not specify a time zone, it is interpreted
+in the time zone given by the <tt>timeZone</tt> attribute.&nbsp; If this
+attribute is missing, and the <tt>&lt;parseDate>
+</tt>action is nested
+inside a <tt>&lt;timeZone></tt> tag, the time zone is taken from the enclosing
+<tt>&lt;timeZone></tt>
+tag. Otherwise, the default time zone given by the
+<tt>javax.servlet.jsp.jstl.i18n.timeZone</tt>
+attribute is used, which is searched in the page, request, session (if
+valid), and application scope(s) (in this order). If not found, the JSP
+container's time zone is used.
+<p>If the <tt>var</tt> attribute is given, the parsing result (of type
+<tt>java.util.Date</tt>)
+is stored in the named JSP attribute. Otherwise, it is output to the current
+<tt>JspWriter</tt>
+object using <tt>java.util.Date.toString()</tt>.
+<p>The <tt>value</tt> and <tt>pattern</tt> attributes accept both literals
+and EL values. The <tt>type,timeStyle</tt>, and <tt>dateStyle</tt> attributes
+take (case-insensitive) literals only, causing an error at translation-time
+validation if the specified literal is illegal.
+<h3>
+15. &lt;exception></h3>
+The <tt>&lt;exception</tt>> action may be used to display the exception
+given by the <tt>value</tt> attribute in its localized form:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:exception value="$exception" bundle="$errorMessages"/></tt>
+<p>If no <tt>value</tt> attribute is given, and this action is used in
+an error page, the exception of the error page is used.
+<p>Developers may designate an exception as localizable by having it implement
+the <tt>javax.servlet.jsp.jstl.i18n.LocalizableException</tt> interface,
+which is defined as follows:
+<p><tt>&nbsp;&nbsp;&nbsp; public interface LocalizableException {</tt>
+<p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Returns the
+exception's message key from which the exception's</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * localized message
+is derived via a resource bundle lookup.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getMessageKey();</tt>
+<p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Returns the
+arguments for parametric replacement on the exception's</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * localized message.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object[] getMessageArgs();</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; }</tt>
+<p>If the given exception is not an instance of this interface, the <tt>&lt;exception></tt>
+action uses its fully qualified class name as the key to look up in the
+resource bundle for exception messages.
+<p>Otherwise, the <tt>&lt;exception></tt> action uses the return value
+of the exception's
+<tt>getMessageKey()</tt> method as the key . If <tt>getMessageKey</tt>
+returns null, the exception's fully qualified class name is used as the
+key.
+<p>The key is looked up in the resource bundle given by the <tt>bundle</tt>
+attribute. If this attribute is missing, and the
+<tt>&lt;exception> </tt>action
+is nested inside a <tt>&lt;bundle> </tt>tag, the resource bundle to use
+is taken from the enclosing <tt>&lt;bundle></tt> tag. Otherwise, the default
+resource bundle for exception messages, whose default base name is given
+by the <tt>javax.servlet.jsp.jstl.i18n.exception.basename</tt> scoped attribute,
+is used. This attribute is searched in the page, request, session (if valid),
+and application scope(s) (in this order).
+<p>The result of looking up the key in the resource bundle is used as the
+localized exception message. If the key is not found in the resource bundle,
+or the default resource bundle for exception messages does not exist, the
+return value of the exception's
+<tt>getLocalizedMessage()</tt> method is
+used as the localized exception message. If the exception is an instance
+of the <tt>LocalizableException </tt>interface, the return value of the
+excpetion's <tt>getMessageArgs()</tt> method is used for parametric replacement
+on the localized exception message.
+<p>The <tt>&lt;exception></tt> action outputs the localized exception message
+to the current
+<tt>JspWriter</tt> object.
+<p>If the <tt>stackTrace</tt> attribute is given with a value of <tt>true</tt>,
+the exception's stacktrace is printed out in addition to its localized
+exception message.
+<h3>
+16. &lt;requestEncoding></h3>
+The <tt>&lt;requestEncoding></tt> action may be used to set the request's
+character encoding, in order to be able to correctly decode request parameter
+values whose encoding&nbsp; is different from ISO-8859-1. This action is
+needed because browsers do not follow the HTTP spec by failing to include
+a <tt>Content-Type</tt> header in their requests.
+<p>More specifically, the purpose of the <tt>&lt;requestEncoding></tt>
+action is to set the request encoding to be the same as the response encoding
+in a page invoked by a form included in the response. Even when the encoding
+of the page that is generating the response containing the form is specified
+via the <tt>contentType</tt> attribute of a page directive, the response's
+locale (and thus character encoding) may differ from the value specified
+in the page directive if the page uses a <tt>&lt;locale> </tt>action or
+has enabled browser-sensing capabilities for locales, in which case the
+tag handler implementation of the I18N-capable formatting action calls
+<tt>ServletResponse.setLocale()</tt> (which also sets the response's encoding)
+with the specified or best-matching locale, respectively.
+<p>This assumes that the JSP&nbsp;container calls <tt>ServletResponse.setContentType()</tt>
+(with the value of the page directive's <tt>contentType</tt> attribute,
+if present) at the beginning of the page, and that any subsequent call
+to<tt> ServletResponse.setLocale() </tt>(by an I18N-capable formatting
+action in the page) overrides the page's existing encoding, so that the
+locale (and encoding) set by the last I18N-capable formatting action wins.
+(This assumes that the response is buffered with a big enough buffer size,
+since <tt>setLocale()</tt> and <tt>setContentType()</tt> must be called
+before <tt>ServletResponse.getWriter()</tt> in order for the charset to
+affect the construction of the writer.)
+<p>Example:
+<p>&nbsp;&nbsp;&nbsp; <tt>&lt;fmt:requestEncoding value="Shift_JIS" /></tt>
+<p>This action calls the <tt>setCharacterEncoding()</tt> method on the
+servlet request with the character encoding name specified in the <tt>value</tt>
+attribute. It must be used before any parameters are retrieved, either
+explicitly or through the use of an EL expression.
+<p>If the character encoding of the request parameters is not known in
+advance (since the locale and thus character encoding of the page that
+generated the form collecting the parameter values was determined dynamically),
+the <tt>value</tt> attribute must not be specified. In this case, the <tt>&lt;requestEncoding></tt>
+action first checks if there is a charset defined in the request <tt>Content-Type</tt>
+header. If not, it uses the character encoding from the <tt>javax.servlet.jsp.jstl.i18n.request.charset</tt>
+attribute, which is searched in the page, request, session (if valid),
+and application scope(s) (in this order). If this attribute is not found,
+the default character encoding (ISO-8859-1) is used.
+<h3>
+17. Configuration parameters</h3>
+This section discusses I18N- and formatting-related initialization parameters
+in a web application's deployment descriptor (DD) file.
+<h4>
+17.1 javax.servlet.jsp.jstl.i18n.basename</h4>
+This parameter specifies the base name of the application's default resource
+bundle, which is used if a <tt>&lt;message></tt> action does not specify
+a <tt>bundle</tt> attribute and is not nested inside a
+<tt>&lt;bundle>
+</tt>action.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;web-app></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>javax.servlet.jsp.jstl.i18n.basename&lt;/param-name></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>com.acme.MyResources&lt;/param-value></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/web-app></tt>
+<h4>
+17.2 javax.servlet.jsp.jstl.i18n.exception.basename</h4>
+This parameter specifies the base name of the application's default resource
+bundle for exception messages, which is used by the <tt>&lt;exception></tt>
+action.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;web-app></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>javax.servlet.jsp.jstl.i18n.exception.basename&lt;/param-name></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>com.acme.MyExceptionResources&lt;/param-value></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/web-app></tt>
+<h4>
+17.3 javax.servlet.jsp.jstl.i18n.fallbackLocale</h4>
+This parameter specifies the application's default fallback locale, which
+is used if browser-sensing capabilities are enabled, but none of the available
+locales for the resource bundle in question match any of the client's preferred
+locales.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;web-app></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>javax.servlet.jsp.jstl.i18n.fallbackLocale&lt;/param-name></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>fr-CA&lt;/param-value></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/web-app></tt>
+<h4>
+17.4 javax.servlet.jsp.jstl.i18n.timeZone</h4>
+This parameter specifies the application's default time zone in which any
+times and dates formatted using the <tt>&lt;formatDate></tt> action are
+represented.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;web-app></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>javax.servlet.jsp.jstl.i18n.timeZone&lt;/param-name></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>"America/Los_Angeles"&lt;/param-value></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/web-app></tt>
+<h3>
+18. Developer support</h3>
+The locale-determination logic for resource bundles described in Section
+2.1.1 is exposed as a general convenience method so it may be used by any
+tag handler implementation that needs to produce localized messages. For
+example, a tag handler's exception messages may be intended directly for
+user consumption on an error page and therefore need to be localized.
+<p>The convenience method, named <tt>getLocalizedMessage()</tt> and exposed
+by the <tt>org.apache.taglibs.jstl.extra.i18n.Locale</tt> class, looks
+up a given message key in the resource bundle with a given base name (or
+the default base name), whose locale is determined according to the locale-determination
+logic described in Section 2.1.1, and optionally performs parametric replacement
+on the result of the lookup before returning it.
+<p><tt>getLocalizedMessage()</tt> comes in the following overloaded flavors:
+<p>&nbsp;<tt>&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves the localized message corresponding
+to the given key.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * The given key is looked up in the resource
+bundle whose base</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * name is retrieved from the javax.servlet.jsp.jstl.i18n.basename
+scoped</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * attribute and whose locale is determined
+according to the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * algorithm described in Section 2.1.1
+of the functional description.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * If the javax.servlet.jsp.jstl.i18n.basename
+attribute is not found</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * in any of the scopes, or no resource
+bundle with that base name exists,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * or the given key is undefined in the
+resource bundle that was loaded as</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * a result of this call, the string "???&lt;key>???"
+is returned,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * where "&lt;key>" is replaced with the
+given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param pageContext the page in which
+the given key must be localized</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param key the message key to be looked
+up</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @return the localized message corresponding
+to the given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; public static String getLocalizedMessage(PageContext
+pageContext,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String key);</tt>
+<p><tt>&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves the localized message corresponding
+to the given key.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * The given key is looked up in the resource
+bundle with the given</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * base name whose locale is determined
+according to the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * algorithm described in Section 2.1.1
+of the functional description.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * If no resource bundle with the given
+base name exists,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * or the given key is undefined in the
+resource bundle that was loaded as</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * a result of this call, the string "???&lt;key>???"
+is returned,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * where "&lt;key>" is replaced with the
+given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param pageContext the page in which
+the given key must be localized</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param key the message key to be looked
+up</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param basename the resource bundle
+base name</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @return the localized message corresponding
+to the given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; public static String getLocalizedMessage(PageContext
+pageContext,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String key,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String basename);</tt>
+<p><tt>&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves the localized message corresponding
+to the given key and</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * performs parametric replacement using
+the arguments specified in the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * &lt;tt>args&lt;/tt> parameter.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * The given key is looked up in the resource
+bundle whose base</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * name is retrieved from the javax.servlet.jsp.jstl.i18n.basename
+scoped</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * attribute and whose locale is determined
+according to the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * algorithm described in Section 2.1.1
+of the functional description.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Before being returned, the result of
+the lookup undergoes parametric</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * replacement, using the arguments specified
+in the &lt;tt>args&lt;/tt></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * parameter.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * If the javax.servlet.jsp.jstl.i18n.basename
+attribute is not found</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * in any of the scopes, or no resource
+bundle with that base name exists,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * or the given key is undefined in the
+resource bundle that was loaded as</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * a result of this call, the string "???&lt;key>???"
+is returned,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * where "&lt;key>" is replaced with the
+given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param pageContext the page in which
+the given key must be localized</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param key the message key to be looked
+up</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param args the arguments for parametric
+replacement</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @return the localized message corresponding
+to the given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; public static String getLocalizedMessage(PageContext
+pageContext,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String key,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Object[] args);</tt>
+<p><tt>&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves the localized message corresponding
+to the given key.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * The given key is looked up in the resource
+bundle with the given</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * base name whose locale is determined
+according to the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * algorithm described in Section 2.1.1
+of the functional description.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Before being returned, the result of
+the lookup undergoes parametric</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * replacement, using the arguments specified
+in the &lt;tt>args&lt;/tt></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * parameter.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * If no resource bundle with the given
+base name exists,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * or the given key is undefined in the
+resource bundle that was loaded as</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * a result of this call, the string "???&lt;key>???"
+is returned,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * where "&lt;key>" is replaced with the
+given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param pageContext the page in which
+the given key must be localized</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param key the message key to be looked
+up</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param args the arguments for parametric
+replacement</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param basename the resource bundle
+base name</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @return the localized message corresponding
+to the given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; public static String getLocalizedMessage(PageContext
+pageContext,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String key,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Object[] args,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String basename);</tt>
+<h3>
+19. Summary</h3>
+
+<table BORDER CELLPADDING=5 >
+<tr>
+<td COLSPAN="2" BGCOLOR="#000099"><b><font color="#FFFFFF"><font size=+1>I18N
+Tags</font></font></b></td>
+</tr>
+
+<tr BGCOLOR="#FFFF66">
+<td WIDTH="318"><b>Element</b></td>
+
+<td WIDTH="420"><b>Sample usage</b></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;locale></tt></b>
+<br><tt><font color="#000000"><b>value </b>variant scope</font></tt>
+<p>Establishes the locale specified by the <tt>value</tt> attribute for
+the variant given by the <tt>variant</tt> attribute.</td>
+
+<td WIDTH="420"><tt>&lt;fmt:locale value="en-US" variant="UNIX"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;timeZone></tt></b>
+<br><tt><font color="#000000"><b>value </b>var scope</font></tt>
+<p>Establishes the time zone given by the <tt>value</tt> attribute.</td>
+
+<td WIDTH="420"><tt>&lt;fmt:timeZone value="America/Los_Angeles"></tt>
+<br><tt>&nbsp; &lt;fmt:formatDate type="time"/></tt>
+<br><tt>&lt;/fmt:timeZone></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;bundle></tt></b>
+<br><tt><font color="#000000"><b>basename </b>prefix var scope</font></tt>
+<p>Loads the resource bundle whose base name is specified by the <tt>basename</tt>
+attribute, and optionally exposes it in the named scoped attribute.</td>
+
+<td WIDTH="420"><tt>&lt;fmt:bundle basename="Greetings" var="greetingBundle"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;message></tt></b>
+<br><tt><font color="#000000"><b>key </b>bundle messageArgs var scope</font></tt>
+<p>Fetches the localized message corresponding to the key specified by
+the <tt>key</tt> attribute from the resource bundle given by the <tt>bundle</tt>
+attribute, and performs parametric replacement on the retrieved message
+using the argument values supplied via the <tt>messageArgs</tt> attribute
+or&nbsp; <tt>&lt;messageArg></tt> subtags.</td>
+
+<td WIDTH="420"><tt>&lt;fmt:message key="Welcome" bundle="$greetingBundle"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;messageFormat></tt></b>
+<br><tt><font color="#000000"><b>value</b> messageArgs var scope</font></tt>
+<p>Performs parametric replacement on the pattern specified by the <tt>value</tt>
+attribute using the argument values supplied via <tt>&lt;messageArg></tt>
+subtags.</td>
+
+<td WIDTH="420"><tt>&lt;fmt:messageFormat value="$priceMsg"></tt>
+<br><tt>&nbsp; &lt;fmt:messageArg value="$priceArg"/></tt>
+<br><tt>&lt;/fmt:messageFormat></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;messageArg></tt></b>
+<br><tt><font color="#000000">value</font></tt>
+<p>Supplies the argument specified by the <tt>value</tt> attribute&nbsp;
+(if present) or the tag body to its parent <tt>&lt;message></tt> action
+for parametric replacement.</td>
+
+<td WIDTH="420"><tt>&lt;fmt:message key="Welcome" bundle="$greetingBundle">&nbsp;</tt>
+<br><tt>&nbsp; &lt;fmt:messageArg value="$dateArg"/></tt>
+<br><tt>&lt;/fmt:message></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;formatNumber></tt></b>
+<br><tt><font color="#000000"><b>value </b>type pattern parseLocale var
+scope</font></tt>
+<p><font color="#000000">Formats the given numeric value as a number, currency,
+or percentage using the locale's predefined or the specified (customized)
+formatting pattern.</font></td>
+
+<td WIDTH="420"><tt>&lt;fmt:formatNumber value="12345.67" parseLocale="de"
+type="currency"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;parseNumber></tt></b>
+<br><tt><font color="#000000"><b>value </b>type<b> </b>pattern parseLocale
+var scope</font></tt>
+<p><font color="#000000">Parses the given numeric string using the locale's
+default or the specified (customized) formatting pattern.</font></td>
+
+<td WIDTH="420"><tt>&lt;fmt:parseNumber value="$num" var="parsed"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;formatDate></tt></b>
+<br><tt><font color="#000000">value<b> </b>type dateStyle timeStyle pattern
+timeZone parseLocale var scope</font></tt>
+<p><font color="#000000">Formats the given (or current) date using the
+locale's predefined or the specified (customized) formatting pattern.</font></td>
+
+<td WIDTH="420"><tt>&lt;fmt:formatDate timeStyle="long" dateStyle="long"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;parseDate></tt></b>
+<br><tt><font color="#000000"><b>value</b> type dateStyle timeStyle pattern
+timeZone parseLocale var scope</font></tt>
+<p><font color="#000000">Parses the given date string using the locale's
+default or the specified (customized) formatting pattern.</font></td>
+
+<td WIDTH="420"><tt>&lt;fmt:parseDate value="May 22, 2001 4:05:53 PM PDT"
+var="parsed"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;exception></tt></b>
+<br><tt><font color="#000000">value bundle stackTrace</font></tt>
+<p><font color="#000000">Displays the exception given by the <tt>value</tt>
+attribute (or the error page's exception if no <tt>value</tt> attribute
+is given) in its localized form.</font></td>
+
+<td WIDTH="420"><tt>&lt;fmt:exception bundle="$errorMessages"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;requestEncoding></tt></b>
+<br><tt><font color="#000000">value</font></tt>
+<p><font color="#000000">Sets the request character encoding to the charset
+specified by the <tt>value</tt> attribute.</font></td>
+
+<td WIDTH="420"><tt>&lt;fmt:requestEncoding value="Shift_JIS"/></tt></td>
+</tr>
+</table>
+
+</body>
+</html>
diff --git a/doc/web/IOT_Import_FunctionalDescription_5_EA2.html b/doc/web/IOT_Import_FunctionalDescription_5_EA2.html
index 3390663..caa823d 100644
--- a/doc/web/IOT_Import_FunctionalDescription_5_EA2.html
+++ b/doc/web/IOT_Import_FunctionalDescription_5_EA2.html
@@ -288,8 +288,8 @@ modifies the absolute URL as follows:
         <font color="#000000"><b>name</b></font><font color="#CC0000"> </font><font color="#000000">value 
         encode</font></code></p>
       <p>Sub-element to specify request parameters for the enclosing &lt;import&gt;. 
-        If importing a resource using an absolute URL, the value of the parameter 
-        is automatically encoded.</p>
+        The name and value of the parameter are url encoded (unless encode is 
+        false). </p>
     </td>
     <td width="61%"> 
       <p><code>&lt;c:import url=&quot;/exec/register&quot;><br>
@@ -300,7 +300,7 @@ modifies the absolute URL as follows:
   <tr> 
     <td width="39%"> 
       <p><code><b>&lt;urlEncode&gt;</b><br>
-        <font color="#FF0000">value</font><font color="#CC0000"> </font><font color="#0000FF">var</font></code></p>
+        <font color="#000000"><b>value</b></font><font color="#CC0000"> </font><font color="#000000">var</font></code></p>
       <p>URL encoding.</p>
     </td>
     <td width="61%"> 
@@ -309,16 +309,27 @@ modifies the absolute URL as follows:
     </td>
   </tr>
 </table>
-<h3>6. Notes</h3>
+<h3>6. Networking Properties</h3>
+<p>If the web container executes behind a firewall, some absolute URL resources 
+  may be inaccessible. To provide access to these resources, the JVM of the container 
+  should be started with the proper networking properties (e.g. proxyHost, proxyPort). 
+  More details can be found in the Java 2 SDK, Standard Edition Documentation 
+  (Networking Features &#151; Networking Properties).</p>
+<h3>7. Notes</h3>
 <ul>
   <li> 
     <p>&lt;c:import&gt; tags are all independent from one another; they do not 
-      create an implicit session among themselves using cookies. 
+      create an implicit session among themselves using cookies.<br>
+      [This refers to absolute HTTP URLs in particular. &lt;c:import&gt; acts 
+      like a &quot;cookie-less&quot; browser in that it ignores cookies it receives 
+      from HTTP URLs and never sends any back. A user of &lt;c:import&gt; can't 
+      assume that successive accesses against the same application will support 
+      a cookie-based session for that application.]
   </li>
   <li>There is no way using the &lt;import&gt; tag to authenticate to a URL that 
     requires HTTP basic authentication.</li>
 </ul>
-<h3>7. Design decisions of interest</h3>
+<h3>8. Design decisions of interest</h3>
 <p>We know you'd eventually ask these questions. Here are the answers...</p>
 <p><b><a name="map"></a>Transparently map absolute URLs to relative ones when 
   possible? No.</b></p>
diff --git a/doc/web/Overview.html b/doc/web/Overview.html
index 5748514..46f2a7a 100644
--- a/doc/web/Overview.html
+++ b/doc/web/Overview.html
@@ -1,13 +1,13 @@
 <html>
 <head>
-<title>JSTL: Overview</title>
+<title>JSPTL: Overview</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 </head>
 
 <body bgcolor="#FFFFFF" text="#000000">
 <h1>Overview</h1>
 <p>This document provides a high level overview of the JSP&#153; Standard Tag 
-  Library (JSTL) as it stands for EA2 (Early Access release 2). If you have a 
+  Library (JSTL) as it stands for EA3 (Early Access release 3). If you have a 
   strong opinion on the topic &#151; positive (you really like it), or constructive 
   (we messed up some parts and you have some constructive comments for improvements) 
   &#151; we'll be happy to hear from you at <a href="mailto:jsr052-comments@sun.com">jsr052-comments@sun.com</a>. 
@@ -29,7 +29,7 @@
   pages without having to resort to the scripting language associated with their 
   JSP pages (usually the Java programming language). </p>
 <p>The base design philosophy in JSTL is therefore to provide page authors with 
-  a script free environment. EA2 defines the foundation elements to make this 
+  a script free environment. EA1 defines the foundation elements to make this 
   possible.</p>
 <h3>Multiple TLDs</h3>
 <p>A Tag Library is a collection of actions that encapsulate functionality to 
@@ -73,12 +73,12 @@
       <td><font face="Courier New, Courier, mono">&lt;fmt:<i>tagname</i> ...&gt;</font></td>
     </tr>
     <tr> 
-      <td>Database access</td>
-      <td>http://java.sun.com/jstl/ea/db</td>
+      <td>Database access (SQL)</td>
+      <td>http://java.sun.com/jstl/ea/sql</td>
       <td> 
-        <div align="center"><font face="Courier New, Courier, mono">db</font></div>
+        <div align="center"><font face="Courier New, Courier, mono">sql</font></div>
       </td>
-      <td><font face="Courier New, Courier, mono">&lt;db:<i>tagname</i> ...&gt;</font></td>
+      <td><font face="Courier New, Courier, mono">&lt;sql:<i>tagname</i> ...&gt;</font></td>
     </tr>
   </table>
 </div>
@@ -112,7 +112,7 @@
   EL once the JSTL spec is ready for Community Review.</p>
 <p>Early Access contains several candidate Expression Languages. One of them is 
   an implementation subset of ECMAScript (JavaScript) and is the one used by default. 
-  You can read an <a href="@@@">overview of the ECMAScript subset of interest 
+  Please check <a href="EcmaScriptEL.html">EcmaScript as an Expression Language 
   for JSTL</a>.</p>
 <h3>Tag Collaboration</h3>
 <p>Tags usually collaborate with their environment in implicit and/or explicit 
@@ -152,12 +152,12 @@
   of a tag; i.e. tags with lots of attributes that can do just about anything. 
   Rather, we privilege a larger number of tags with well focused behavior.</p>
 <hr noshade>
-<h2>JSTL EA2&#151; Quick Reference</h2>
+<h2>JSTL EA3&#151; Quick Reference</h2>
 <h2>Core Actions</h2>
 <table width="100%" border="1" cellpadding="5">
   <tr bgcolor="#000099"> 
     <td colspan="2"><b><font color="#FFFFFF" size="+1">Expression Language Support 
-      Tags (Core)</font></b></td>
+      Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="31%"><b>Element</b></td>
@@ -172,7 +172,7 @@
       </p>
     </td>
     <td width="48%"> 
-      <p><code>&lt;c:set var=&quot;city&quot; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=&quot;$customer.address.city&quot;&gt;<br>
+      <p><code>&lt;c:set var=&quot;city&quot; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=&quot;$customer.address.city&quot;/&gt;<br>
         <br>
         &lt;c:set var=&quot;customerFmt&quot; scope=&quot;request&quot;&gt;<br>
         &nbsp;&nbsp;&lt;font color=red&gt;<br>
@@ -190,7 +190,7 @@
       <code><br>
       </code></td>
     <td width="48%"> 
-      <p><code>&lt;c:set var=&quot;city&quot; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=&quot;$customer.address.city&quot;&gt;<br>
+      <p><code>&lt;c:set var=&quot;city&quot; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=&quot;$customer.address.city&quot;/&gt;<br>
         <br>
         &lt;c:set var=&quot;customerFmt&quot; scope=&quot;request&quot;&gt;<br>
         &nbsp;&nbsp;&lt;font color=red&gt;<br>
@@ -216,7 +216,7 @@
 <table width="100%" border="1" cellpadding="5">
   <tr> 
     <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">Iterator 
-      Tags (core)</font></b></td>
+      Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="31%"><b>Element</b></td>
@@ -283,7 +283,7 @@
 <table width="100%" border="1" cellpadding="5">
   <tr> 
     <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">Conditional 
-      Tags (core)</font></b></td>
+      Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="31%"><b>Element</b></td>
@@ -343,7 +343,7 @@
 <table width="100%" border="1" cellpadding="5">
   <tr> 
     <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">Import 
-      Tags (core)</font></b></td>
+      Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="39%"><b>Element</b></td>
@@ -374,8 +374,8 @@
         <font color="#000000"><b>name</b></font><font color="#CC0000"> </font><font color="#000000">value 
         encode</font></code></p>
       <p>Sub-element to specify request parameters for the enclosing &lt;import&gt;. 
-        If importing a resource using an absolute URL, the value of the parameter 
-        is automatically encoded.</p>
+        The name and value of the parameter are url encoded (unless encode is 
+        false). </p>
     </td>
     <td width="61%"> 
       <p><code>&lt;c:import url=&quot;/exec/register&quot;><br>
@@ -386,7 +386,7 @@
   <tr> 
     <td width="39%"> 
       <p><code><b>&lt;urlEncode&gt;</b><br>
-        <font color="#FF0000">value</font><font color="#CC0000"> </font><font color="#0000FF">var</font></code></p>
+        <font color="#000000"><b>value</b></font><font color="#CC0000"> </font><font color="#000000">var</font></code></p>
       <p>URL encoding.</p>
     </td>
     <td width="61%"> 
@@ -400,7 +400,7 @@
 <table border="1" cellpadding="5">
   <tr> 
     <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">XML Core 
-      Tags (xml)</font></b></td>
+      Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="318"><b>Element</b></td>
@@ -408,11 +408,11 @@
   </tr>
   <tr> 
     <td width="318"><code><b>&lt;parse&gt;</b></code><br>
-      <code><font color="#FF0000"><b><font color="#000000">var</font></b></font> 
+      <code><font color="#FF0000"><font color="#000000">var</font></font> domVar 
       source filter</code><br>
       <br>
       Parses an XML and saves its internal representation into the JSP scoped 
-      attribute specified by &quot;var&quot;.</td>
+      attribute specified by &quot;var&quot; (or &quot;domVar&quot;).</td>
     <td width="392"> <code>&lt;c:import url=&quot;http://acme.com/athletes?country=ethiopia&quot; 
       var=&quot;xml&quot;/><br>
       &lt;x:parse source=&quot;$xml&quot; var=&quot;athletes&quot;/&gt; </code></td>
@@ -446,7 +446,7 @@
 <table border="1" cellpadding="5" width="100%">
   <tr> 
     <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">XML Control 
-      Flow Tags (xml)</font></b></td>
+      Flow Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="55%"><b>Element</b></td>
@@ -454,7 +454,7 @@
   </tr>
   <tr> 
     <td width="55%"><code><b>&lt;forEach&gt;</b></code><br>
-      <b>&nbsp;select</b> var<br>
+      <b><code>&nbsp;select</code></b><code> var</code><br>
       <br>
       Evaluates the given XPath expression and iterates over the result, setting 
       the context node to each element in the iteration.</td>
@@ -505,7 +505,7 @@
 <table width="100%" border="1" cellpadding="5">
   <tr> 
     <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">XML Transformation 
-      Tags (xml)</font></b></td>
+      Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="39%"><b>Element</b></td>
@@ -541,7 +541,7 @@
   <tr> 
     <td width="39%"> 
       <p><code><b>&lt;transformer&gt;</b><br>
-        <font color="#000000">xslt <b>var</b></font></code></p>
+        <font color="#000000"><b>var</b> xslt </font></code></p>
       <p>Creates a &quot;transformer&quot; object for more efficient transformations 
         that use the same XSLT stylesheet.</p>
     </td>
@@ -552,13 +552,256 @@
     </td>
   </tr>
 </table>
+<h2>I18N &amp; Formatting actions</h2>
+<table BORDER cellpadding=5 >
+  <tr> 
+    <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF"><font size=+1>I18N 
+      Tags</font></font></b></td>
+  </tr>
+  <tr bgcolor="#FFFF66"> 
+    <td width="318"><b>Element</b></td>
+    <td width="392"><b>Sample usage</b></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;locale></tt></b> <br>
+      <tt><font color="#000000"><b>value </b>variant scope</font></tt> 
+      <p>Establishes the locale specified by the <tt>value</tt> attribute for 
+        the variant given by the <tt>variant</tt> attribute.
+    </td>
+    <td width="392"><tt>&lt;fmt:locale value="en-US" variant="UNIX"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;timeZone></tt></b> <br>
+      <tt><font color="#000000"><b>value </b>var scope</font></tt> 
+      <p>Establishes the time zone given by the <tt>value</tt> attribute.
+    </td>
+    <td width="392"><tt>&lt;fmt:timeZone value="America/Los_Angeles"></tt> <br>
+      <tt>&nbsp; &lt;fmt:formatDate type="time"/></tt> <br>
+      <tt>&lt;/fmt:timeZone></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;bundle></tt></b> <br>
+      <tt><font color="#000000"><b>basename </b>prefix var scope</font></tt> 
+      <p>Loads the resource bundle whose base name is specified by the <tt>basename</tt> 
+        attribute, and optionally exposes it in the named scoped attribute.
+    </td>
+    <td width="392"><tt>&lt;fmt:bundle basename="Greetings" var="greetingBundle"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;message></tt></b> <br>
+      <tt><font color="#000000"><b>key </b>bundle var scope</font></tt> 
+      <p>Fetches the localized message corresponding to the key specified by the 
+        <tt>key</tt> attribute from the resource bundle given by the <tt>bundle</tt> 
+        attribute, and performs parametric replacement on the retrieved message 
+        using the argument values supplied via <tt>&lt;messageArg></tt> subtags
+    </td>
+    <td width="392"><tt>&lt;fmt:message key="Welcome" bundle="$greetingBundle"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;messageFormat></tt></b> <br>
+      <tt><font color="#000000"><b>value</b> var scope</font></tt> 
+      <p>Performs parametric replacement on the pattern specified by the <tt>value</tt> 
+        attribute using the argument values supplied via <tt>&lt;messageArg></tt> 
+        subtags
+    </td>
+    <td width="392"><tt>&lt;fmt:messageFormat value="$priceMsg"></tt> <br>
+      <tt>&nbsp; &lt;fmt:messageArg value="$priceArg"/></tt> <br>
+      <tt>&lt;/fmt:messageFormat></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;messageArg></tt></b> <br>
+      <tt><font color="#000000">value</font></tt> 
+      <p>Supplies the argument specified by the <tt>value</tt> attribute&nbsp; 
+        (if present) or the tag body to its parent <tt>&lt;message></tt> action 
+        for parametric replacement
+    </td>
+    <td width="392"><tt>&lt;fmt:message key="Welcome" bundle="$greetingBundle">&nbsp;</tt> 
+      <br>
+      <tt>&nbsp; &lt;fmt:messageArg value="$dateArg"/></tt> <br>
+      <tt>&lt;/fmt:message></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;formatNumber></tt></b> <br>
+      <tt><font color="#000000"><b>value </b>type pattern var scope</font></tt> 
+      <p><font color="#000000">Formats the given numeric value as a number, currency, 
+        or percentage using the locale's predefined or the specified (customized) 
+        formatting pattern&nbsp;</font>
+    </td>
+    <td width="392"><tt>&lt;fmt:formatNumber value="9876543.21" type="currency"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;parseNumber></tt></b> <br>
+      <tt><font color="#000000"><b>value </b>type<b> </b>pattern var scope</font></tt> 
+      <p><font color="#000000">Parses the given numeric string using the locale's 
+        default or the specified (customized) formatting pattern</font>
+    </td>
+    <td width="392"><tt>&lt;fmt:parseNumber value="$num" var="parsed"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;formatDate></tt></b> <br>
+      <tt><font color="#000000"><b>value </b>type dateStyle timeStyle pattern 
+      timeZone var scope</font></tt> 
+      <p><font color="#000000">Formats the given date using the locale's predefined 
+        or the specified (customized) formatting pattern&nbsp;</font>
+    </td>
+    <td width="392"><tt>&lt;fmt:formatDate timeStyle="long" dateStyle="long"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;parseDate></tt></b> <br>
+      <tt><font color="#000000"><b>value</b> type pattern var scope</font></tt> 
+      <p><font color="#000000">Parses the given date string using the locale's 
+        default or the specified (customized) formatting pattern</font>
+    </td>
+    <td width="392"><tt>&lt;fmt:parseDate value="May 22, 2001 4:05:53 PM PDT" 
+      var="parsed"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;exception></tt></b> <br>
+      <tt><font color="#000000">value bundle stackTrace</font></tt> 
+      <p><font color="#000000">Displays the exception given by the <tt>value</tt> 
+        attribute (or the error page's exception if no <tt>value</tt> attribute 
+        is given) in its localized form</font>
+    </td>
+    <td width="392"><tt>&lt;fmt:exception bundle="$errorMessages"/></tt></td>
+  </tr>
+</table>
+<h2>SQL actions</h2>
+<table border="1" cellpadding="5">
+  <tr> 
+    <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">SQL Actions</font></b></td>
+  </tr>
+  <tr bgcolor="#FFFF66"> 
+    <td><b>Action</b></td>
+    <td><b>Sample usage</b></td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>&lt;sql:query&gt;</b></code></p>
+      <p><code>&lt;sql:query var=<i>&quot;varName&quot;</i> <br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql=&quot;<i>sqlQuery</i>&quot;<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [dataSource=<i>dataSourceSpec</i>]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[maxRows=&quot;<i>maxRows</i>&quot;]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[startRow=&quot;<i>startRow</i>&quot;]/&gt;</code></p>
+      <p><code>&lt;sql:query var=<i>&quot;varName&quot;<br>
+        &nbsp;&nbsp;&nbsp; </i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[sql=&quot;<i>sqlQuery</i>&quot;]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [dataSource=<i>dataSourceSpec</i>]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[maxRows=&quot;<i>maxRows</i>&quot;]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[startRow=&quot;<i>startRow</i>&quot;]/&gt; 
+        </code><code><br>
+        &nbsp;&nbsp;... optional query statement ...<br>
+        &nbsp;&nbsp;... optional &lt;sql:param&gt; actions ...<br>
+        &lt;/sql:query&gt;</code></p>
+      <p>General purpose action for performing SQL queries on a database and gettting 
+        back a single result set containing rows of data.</p>
+    </td>
+    <td> 
+      <p><code>&lt;sql:query var=&quot;customers&quot;<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+        dataSource=&quot;$dataSource&quot;<i>&gt;<br>
+        </i>&nbsp;&nbsp; SELECT * FROM employees<br>
+        &nbsp; &nbsp;WHERE country = 'China'<br>
+        &nbsp;&nbsp;&nbsp;ORDER BY lastname<br>
+        &lt;/sql:query&gt;<i> </i></code></p>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>&lt;sql:update&gt;</b></code></p>
+      <p><code>&lt;sql:update var=<i>&quot;varName&quot;</i> <br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql=&quot;<i>sqlUpdate</i>&quot;<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [dataSource=<i>dataSourceSpec</i>]/&gt;</code></p>
+      <p><code>&lt;sql:update var=<i>&quot;varName&quot;<br>
+        &nbsp;&nbsp;&nbsp; </i></code><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[sql=&quot;<i>sqlUpdate</i>&quot;]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [dataSource=<i>dataSourceSpec</i>]&gt;<br>
+        &nbsp;&nbsp;... optional query statement ...<br>
+        &nbsp;&nbsp;... optional &lt;sql:param&gt; actions ...<br>
+        &lt;/sql:update&gt;</code></p>
+      <p>General purpose action for &quot;updates&quot;; i.e. statements that 
+        update the database (insert, update, delete) and return nothing or a single 
+        integer. </p>
+    </td>
+    <td> 
+      <p><code>&lt;sql:update&gt;<br>
+        &nbsp;&nbsp;UPDATE account <br>
+        &nbsp;&nbsp;SET BALANCE = ?<br>
+        &nbsp; WHERE accountNo = ?<br>
+        </code><code>&nbsp;&nbsp;&lt;sql:param<br>
+        &nbsp;&nbsp;&nbsp;&nbsp; value=&quot;$balance&quot;&gt;<br>
+        &nbsp;&nbsp;&lt;sql:param<br>
+        &nbsp;&nbsp;&nbsp; &nbsp;value=&quot;$accountNo&quot;&gt;<br>
+        &lt;/sql:update&gt;</code></p>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>&lt;sql:transaction&gt;<br>
+        </b></code><br>
+        <code>&lt;sql:transaction <br>
+        &nbsp;&nbsp; &nbsp;[dataSource=<i>dataSourceSpec</i>] <br>
+        &nbsp;&nbsp;&nbsp;&nbsp;[transactionIsolation=<i>&quot;transactionIsolationLevel&quot;</i>]&gt;<br>
+        &nbsp;&nbsp;... &lt;sql:query&gt; and &lt;sql:update&gt; statements ...<br>
+        &lt;/sql:transaction&gt; </code></p>
+    </td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>&lt;sql:driver&gt;<br>
+        </b></code><br>
+        <code>&lt;sql:driver var=<i>&quot;varName&quot;</i><br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[driver=&quot;<i>driverClassName</i>&quot;] 
+        <br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[jdbcUrl=&quot;<i>jdbcUrl</i>&quot;]<br>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[userName=&quot;<i>userName</i>&quot;] 
+        /&gt;</code><br>
+      </p>
+      <p>Facilitates the setup of a DataSource object around a JDBC driver for 
+        prototype/simple applications. </p>
+    </td>
+    <td>&nbsp; </td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>&lt;sql:param&gt;<br>
+        </b></code> </p>
+      <p><code>&lt;sql:param value=<i>&quot;parameterValue&quot;</i>/&gt;</code></p>
+      <p><code>&lt;sql:param&gt;<br>
+        &nbsp;&nbsp;... parameter value ...<br>
+        &lt;/sql:param&gt;</code><br>
+      </p>
+      <p>Subtag of SQLExecutionTag actions such as &lt;sql:query&gt; and &lt;sql:update&gt; 
+        to set the values of parameter markers ('?') specified in the SQL statement.</p>
+    </td>
+    <td>&nbsp; </td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>&lt;sql:query&gt; result related interfaces<br>
+        </b></code> </p>
+      <p><code>public interface Result<br>
+        </code><code> </code><code>public interface ResultMetaData<br>
+        </code><code>public interface Row</code><code><br>
+        public interface ColumnMetaData</code><code><br>
+        public </code><code>interface Column</code></p>
+    </td>
+    <td>&nbsp; </td>
+  </tr>
+  <tr> 
+    <td> 
+      <p><code><b>interface SQLExecutionTag</b></code> </p>
+      <p>Identifies a tag handler that can accept parameter values from nested 
+        tag handlers.</p>
+    </td>
+    <td>&nbsp; </td>
+  </tr>
+</table>
 <h2>Tag Library Validators</h2>
 <table width="100%" border="1" cellpadding="5">
   <tr bgcolor="#000099"> 
     <td colspan="2"><b><font color="#FFFFFF" size="+1">Tag Library Validators</font></b></td>
   </tr>
   <tr> 
-    <td colspan="2">EA2 comes with two TagLibraryValidators (TLVs), which are 
+    <td colspan="2">EA1 comes with two TagLibraryValidators (TLVs), which are 
       classes that ensure pages meet particular criteria before they can run.</td>
   <tr bgcolor="#FFFF66"> 
     <td width="31%"><b>Tag Library Validator</b></td>
@@ -610,7 +853,7 @@
         &nbsp;&nbsp;&nbsp; </code><code>javax.servlet.jstl.ExpressionEvaluatorClass<br>
         &nbsp;&nbsp;&lt;/param-name&gt;<br>
         &nbsp;&nbsp;&lt;param-value&gt;<br>
-        &nbsp;&nbsp;&nbsp; org.apache.taglibs.standard.lang.spel.Evaluator<br>
+        &nbsp;&nbsp;&nbsp; org.apache.taglibs.jstl.lang.spel.Evaluator<br>
         &nbsp;&nbsp;&lt;/param-value&gt;<br>
         &lt;/context-param&gt;</code></p>
     </td>
diff --git a/doc/web/ReleaseNotes.html b/doc/web/ReleaseNotes.html
index d567cd4..f5150ee 100644
--- a/doc/web/ReleaseNotes.html
+++ b/doc/web/ReleaseNotes.html
@@ -5,15 +5,30 @@
 </head>
 
 <body bgcolor="#FFFFFF">
-<h1>JSTL: Release Notes</h1>
+<h1>'Standard' taglib (JSTL RI): Release Notes</h1>
 
-<p><b>JSTL EA2 introduces a variety of new features, and it rounds out
-some of the support initially provided in EA1.  This document contains a
-running list of additions and changes.</b></p>
+<p><b>The JSTL EA3 RI builds on the EA2 release, which introduced a
+variety of new features and rounded out some of the support initially
+provided in EA1.  This document contains a running list of additions and
+changes.</b></p>
 
 <hr />
 
 <dl>
+<dt><b>12 Dec 2001</b></dt>
+<dd>JSTL EA3 RI, version 1.0, introduced.  Version includes the following
+changes and additions:
+<ul>
+ <li>Introduction of SQL tags ("sql:*" library).</li>
+ <li>A performance improvement to the XML "transform" tag.</li>
+ <li>Minor changes and bug fixes to the i18n and XML libraries.</li>
+ <li>Distribution JAR files are now 'standard.jar' (RI) and 'jstl.jar'
+     (API).</li>
+ <li>showSource.jsp no longer depends on raw file I/O (and so 
+     should work even when standard-examples is deployed as a WAR).</li> 
+</ul>
+</dd>
+
 <dt><b>21 Nov 2001</b></dt>
 <dd>JSTL EA2 RI, version 1.0, introduced.  Version includes the following
 major changes and additions:
diff --git a/doc/web/XML_ControlFlow_FunctionalDescription_1_EA2.html b/doc/web/XML_ControlFlow_FunctionalDescription_1_EA2.html
index d805eb2..3d2c559 100644
--- a/doc/web/XML_ControlFlow_FunctionalDescription_1_EA2.html
+++ b/doc/web/XML_ControlFlow_FunctionalDescription_1_EA2.html
@@ -36,8 +36,7 @@
 </blockquote>
 <p>Optional attribute &quot;var&quot; makes it possible to save the current context 
   node of the iteration in a JSP &quot;page&quot; attribute. The exported object 
-  has nested visibility. It is illegal to specify any scope other than &quot;page&quot; 
-  for &quot;var&quot;.</p>
+  has nested visibility.</p>
 <h3>3. <tt>&lt;if></tt></h3>
 <p>The <tt>&lt;if></tt> action has a &quot;select&quot; attribute that specifies 
   an XPath expression. The expression is evaluated and the resulting object is 
@@ -92,7 +91,7 @@
   </tr>
   <tr> 
     <td width="55%"><code><b>&lt;forEach&gt;</b></code><br>
-      <b>&nbsp;select</b> var<br>
+      <b><code>&nbsp;select</code></b><code> var</code><br>
       <br>
       Evaluates the given XPath expression and iterates over the result, setting 
       the context node to each element in the iteration.</td>
diff --git a/doc/web/XML_Core_FunctionalDescription_2_EA2.html b/doc/web/XML_Core_FunctionalDescription_2_EA2.html
index a5becfa..c2ab35a 100644
--- a/doc/web/XML_Core_FunctionalDescription_2_EA2.html
+++ b/doc/web/XML_Core_FunctionalDescription_2_EA2.html
@@ -27,13 +27,13 @@
   cooperate over the web, XML is the data format of choice for exchanging information.<br>
 </p>
 <p>XML is therefore becoming more and more important in a page author's life. 
-  The set of XML tags specified in JSTL is therefore meant to address the basic 
+  The set of XML tags specified in JSPTL is therefore meant to address the basic 
   XML needs a page author is likely to encounter.</p>
 <h4>XPath</h4>
 <p>A key aspect of dealing with XML documents is to be able to easily access their 
   content. <a href="http://www.w3.org/TR/xpath">XPath</a>, a W3C recommendation 
   since 1999, provides an easy notation for specifying and selecting parts of 
-  an XML document. The XML tagset in JSTL is therefore based on XPath.</p>
+  an XML document. The XML tagset in JSPTL is therefore based on XPath.</p>
 <p>For the <i>XPath challenged</i>, here are a few links to get you started quickly:</p>
 <ul>
   <li><a href="http://www.zvon.org/xxl/XPathTutorial/General/examples.html">Zvon 
@@ -42,7 +42,7 @@
     a Nutshell &#151; Chapter 9 &#151; XPath</a></li>
 </ul>
 <p>It is important to note that the Expert Group is still debating which <i>global</i> 
-  Expression Language(s) will be officially supported by JSTL. While this discussion 
+  Expression Language(s) will be officially supported by JSPTL. While this discussion 
   is still taking place, the approach we've taken here is to consider XPath as 
   a <i>local</i> Expression Language that applies to the XML tagset. How this 
   local XPath Expression Language integrates with the Global Expression Language 
@@ -55,9 +55,9 @@
 <h3>2. XPath as a <i>local</i> Expression Language for the XML set of tags</h3>
 <p>What we're doing with our set of XML tags is expanding our notion of Expression 
   Language so it can also apply &quot;locally&quot; to tags that want to support 
-  an EL that is not <i>the</i> global one(s) supported within JSTL.</p>
+  an EL that is not <i>the</i> global one(s) supported within JSPTL.</p>
 <p>Below are the rules of integration that XPath follows as a <i>local</i> EL, 
-  so we have the guarantees that it plays nicely within the JSP/JSTL environment.</p>
+  so we have the guarantees that it plays nicely within the JSP/JSPTL environment.</p>
 <h4>XPath Context</h4>
   In XPath, the context for evaluating an expression consists of:: 
 <ul>
@@ -65,21 +65,21 @@
   <li>variable bindings (see below)</li>
   <li>function library: the default function library comes with the XPath engine. 
     Some engines provide extension functions or allow customization to add new 
-    functions. The XPath function library in JSTL is limited to the core function 
+    functions. The XPath function library in JSPTL is limited to the core function 
     library of the XPath specification.</li>
   <li>namespace prefix definitions which allow namespace prefixes to be used within 
     the XPath expression<br>
     ( e.g. /SOAP-ENV:Envelope/SOAP-ENV:Body/m:foo)</li>
 </ul>
 <p><b>Attributes to specify XPath Expressions</b></p>
-<p>In the JSTL set of XML tags, XPath expressions are always specified using 
+<p>In the JSPTL set of XML tags, XPath expressions are always specified using 
   attribute &quot;select&quot;. This therefore means that only values specified 
   for &quot;select&quot; attributes are evaluated using the XPath expression language. 
   All other attributes are evaluated using the rules associated with the currently 
   active global Expression Language. This should help avoid confusion between 
   XPath and the global Expression Language.</p>
 <p><b>XPath Variable Bindings</b></p>
-<p>JSTL supports variables in XPath expressions. The mapping of XPath variable 
+<p>JSPTL supports variables in XPath expressions. The mapping of XPath variable 
   expressions is defined as follows:<p>
 <table border="1" cellpadding="2" cellspacing="1">
   <tr> 
@@ -147,7 +147,7 @@
 <p>As mentioned in the previous section, only the &quot;select&quot; attribute 
   of xml tags can take XPath expressions. Global EL expressions and XPath expressions 
   cannot be mixed in the &quot;select&quot; attributes. </p>
-<p>With JSTL 1.0, the xml tagset knows that the value of select attributes are 
+<p>With JSPTL 1.0, the xml tagset knows that the value of select attributes are 
   XPath expressions. However, things will be different in JSP.next when the evaluation 
   of 'elexprvalues' are handled directly by the container. If the metacharacter 
   used to identify an 'elexprvalue' is defined as '$', this means that XPath expressions 
@@ -179,9 +179,15 @@
 &lt;/x:parse&gt;
 </pre>
 </blockquote>
-<p> When used in conjunction with the &lt;parse&gt; tag, the JSTL core tag &lt;import&gt; 
+<p> When used in conjunction with the &lt;parse&gt; tag, the JSPTL core tag &lt;import&gt; 
   provides access to a wide variety of URL-based input resources representing 
   XML documents.</p>
+<p>It is also possible to force the &lt;parse&gt; action to expose an XML Document 
+  (org.w3c.dom.Document) by specifying &quot;domVar&quot; instead of &quot;var&quot; 
+  (mutually exclusive). This would be useful in situations where custom actions 
+  are developed to act on XML documents. Since it is not a requirement for the 
+  implementation to support its own internal data structures, it may therefore 
+  be the case that &quot;var&quot; exposes the same object as &quot;domVar&quot;.</p>
 <h4>Performance</h4>
 <p> If an implementation of the XML tagset is based on DOM-like structures (check 
   with the specific implementation you're using), there will be a significant 
@@ -208,7 +214,7 @@
   object. It is the equivalent of <tt>&lt;%= %></tt> and <code>&lt;jc:expr&gt;</code>, 
   with the difference that it is meant for the XPath Expression Language world 
   (as opposed to the scripting language world (<code>&lt;%= %&gt;</code>) and 
-  the Global Expression Language world of JSTL <code>&lt;jc:expr&gt;</code>). 
+  the Global Expression Language world of JSPTL <code>&lt;jc:expr&gt;</code>). 
 </p>
 <p>The expression to be evaluated is specified via the attribute &quot;select&quot; 
   and must be in the XPath syntax. The result of the evaluation is coerced to 
@@ -252,11 +258,11 @@
   </tr>
   <tr> 
     <td width="318"><code><b>&lt;parse&gt;</b></code><br>
-      <code><font color="#FF0000"><b><font color="#000000">var</font></b></font> 
+      <code><font color="#FF0000"><font color="#000000">var</font></font> domVar 
       source filter</code><br>
       <br>
       Parses an XML and saves its internal representation into the JSP scoped 
-      attribute specified by &quot;var&quot;.</td>
+      attribute specified by &quot;var&quot; (or &quot;domVar&quot;).</td>
     <td width="392"> <code>&lt;c:import url=&quot;http://acme.com/athletes?country=ethiopia&quot; 
       var=&quot;xml&quot;/><br>
       &lt;x:parse source=&quot;$xml&quot; var=&quot;athletes&quot;/&gt; </code></td>
diff --git a/doc/web/XML_Transformation_FunctionalDescription_3_EA2.html b/doc/web/XML_Transformation_FunctionalDescription_3_EA2.html
index 687fd3b..6d8e617 100644
--- a/doc/web/XML_Transformation_FunctionalDescription_3_EA2.html
+++ b/doc/web/XML_Transformation_FunctionalDescription_3_EA2.html
@@ -68,8 +68,9 @@
   with the transformer attribute of &lt;transform&gt; to efficiently reuse a transformation 
   stylesheet.</p>
 <pre>  &lt;c:import url=&quot;/xslt/style.xsl&quot; var=&quot;xslt&quot;/&gt;<br>  &lt;x:transformer xslt=&quot;$xslt&quot; var=&quot;transformer&quot;/&gt;<br>  &lt;c:forEach items=&quot;$xmlDocs&quot; var=&quot;xml&quot;&gt;<br>    ...<br>    &lt;x:transform source=&quot;$xml&quot; transformer=&quot;$transformer&quot; /&gt;<br>    ...<br>  &lt;/c:forEach&gt;</pre>
-The attribute xslt is optional. If not specified, the stylesheet is read from 
-the tag's body content. 
+The attribute xslt is optional and can be any of the following types: java.lang.String, 
+java.io.Reader, or javax.xml.transform.Source. If not specified, the stylesheet 
+is read from the tag's body content. 
 <h3>4. Summary</h3>
 <table width="100%" border="1" cellpadding="5">
   <tr> 
@@ -110,7 +111,7 @@ the tag's body content.
   <tr> 
     <td width="39%"> 
       <p><code><b>&lt;transformer&gt;</b><br>
-        <font color="#000000">xslt <b>var</b></font></code></p>
+        <font color="#000000"><b>var</b> xslt </font></code></p>
       <p>Creates a &quot;transformer&quot; object for more efficient transformations 
         that use the same XSLT stylesheet.</p>
     </td>
diff --git a/doc/web/index.html b/doc/web/index.html
index 39902e4..b5abce1 100644
--- a/doc/web/index.html
+++ b/doc/web/index.html
@@ -1,14 +1,15 @@
 <html>
 <head>
-<title>JSP Standard Tag Library</title>
+<title>standard - Reference Implementation of the JSP(tm) Standard Tag
+  Library</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 </head>
 
 <body bgcolor="#FFFFFF">
-<h1>The JSP&#153; Standard Tag Library (JSTL)</h1>
-<h2>Release: Early Access 1 (EA2)</h2>
+<h1>RI for the JSP&#153; Standard Tag Library (JSTL)</h1>
+<h2>Release: Early Access 3 (EA3)</h2>
 
-<p>Thanks for downloading the JSTL EA2 release. We hope you find the tags, documents, 
+<p>Thanks for downloading the JSTL EA3 release. We hope you find the tags, documents, 
   and examples here of interest. We're curious to hear your feedback on this release, 
   which represents work in progress toward a standard JSP Tag Library. Please 
   contact us at</p>
@@ -22,34 +23,33 @@
 
 <h3>Documentation ('doc/web' directory)</h3>
 
-    
 <ul>
   <li><a href="GettingStarted.html">Getting Started</a>: A quick roadmap to help 
     you get started with this release.</li>
   <li><a href="Overview.html">Overview</a>: An overview of JSTL's design philosophy 
     and current syntax.</li>
-  <li><a href="ReleaseNotes.html">Release Notes</a>: Changes since EA1, and
-    other historical information.</li>
+  <li><a href="ReleaseNotes.html">Release Notes</a>: Changes since EA1, and other 
+    historical information.</li>
   <li>Functional descriptions: Technical guides representing the design considerations 
     and functionality of JSTL's tag set. Note that these are not formal specifications, 
     just technical overviews of functionality and intent. 
     <ul>
       <li><a href="IteratorTag_FunctionalDescription_2_EAI.html"> Iteration</a></li>
-      <li><a href="Conditionals_FunctionalDescription_1_EA2.html"> Conditional 
+      <li><a href="Conditionals_FunctionalDescription_1_EA1.html"> Conditional 
         logic</a></li>
-      <li><a href="ExpressionLanguageSupport_FunctionalDescription_2_EA2.html"> 
+      <li><a href="ExpressionLanguageSupport_FunctionalDescription_2_EA1.html"> 
         Expression-language support</a></li>
-      <li><a href="ExpressionTags_FunctionalDescription_1_EA2.html"> Expression-language 
+      <li><a href="ExpressionTags_FunctionalDescription_1_EA1.html"> Expression-language 
         tags</a> 
         <ul>
-          <li>The <a href="spel"> Simplest Possible Expression Language (SPEL) 
-            </a> </li>
-          <li>EcmaScript examples: see the <a href="/jsptl-examples/ecmascript/index.html"> 
-            JSTL-examples/ecmascript</a> web application </li>
+          <li><a href="spel/index.html">The Simplest Possible Expression Language 
+            (SPEL) </a> </li>
+          <li><a href="EcmaScriptEL.html">EcmaScript as an Expression Language 
+            for JSTL</a></li>
         </ul>
       </li>
       <li><a href="IOT_Import_FunctionalDescription_5_EA2.html">Import tags</a></li>
-      <li>XML tags
+      <li>XML tags 
         <ul>
           <li><a href="XML_Core_FunctionalDescription_2_EA2.html">core</a></li>
           <li><a href="XML_ControlFlow_FunctionalDescription_1_EA2.html">control 
@@ -57,7 +57,10 @@
           <li><a href="XML_Transformation_FunctionalDescription_3_EA2.html">transformation</a></li>
         </ul>
       </li>
-      <li>I18N &amp; Formatting tags</li>
+      <li><a href="I18N_FunctionalDescription_6_EA3.html">I18N &amp; Formatting 
+        tags</a></li>
+      <li><a href="DB_FunctionalDescription_1_EA3.html">SQL (database access) 
+        tags</a></li>
     </ul>
   </li>
 </ul>
@@ -89,14 +92,17 @@
           .core    core library (common)
           .fmt     internationalization-capable formatting tags (common)
           .xml     XML manipulation library (common)
+	  .sql	   SQL library (common)
       .el          handlers specific to expression language (EL) evaluation
           .core    core library (EL)
           .fmt     internationalization-capable formatting tags (EL)
           .xml     XML manipulation library (EL)
+	  .sql	   SQL library (EL)
       .rt          handlers specific to rtexprvalue (rt) evaluation
           .core    core library (rt)
           .fmt     internationalization-capable formatting tags (rt)
           .xml     XML manipulation library (rt)
+	  .sql	   SQL library (rt)
    .tei         TagExtraInfo classes (common to both libraries)
    .tlv         TagLibraryValidator classes (and associated helpers)
    .lang        expression-language support and implementation
diff --git a/doc/web/spel/index.html b/doc/web/spel/index.html
index e60c3a1..b59c7d2 100644
--- a/doc/web/spel/index.html
+++ b/doc/web/spel/index.html
@@ -47,18 +47,17 @@ public Object evaluate(String attributeName,
 </pre></ul>
 
 <p>If this is not the package or definition of the ExpressionEvaluator
-interface, the appropriate changes should be made to the <a
-href="../src/org.apache.taglibs.standard/lang/spel/Evaluator.java">src/org/apache/taglibs/jsptl/lang/spel/Evaluator.java</a>
-source file.  In any case, the <a
-href="../src/javax/servlet/jsptl/ExpressionEvaluator.java">ExpressionEvaluator
-implementation</a> should be removed from the distribution, and the
+interface, the appropriate changes should be made to the <tt>
+src/org/apache/taglibs/jsptl/lang/spel/Evaluator.java</tt>
+source file.  In any case, the <tt>ExpressionEvaluator</tt>
+implementation should be removed from the distribution, and the
 distribution should be compiled against the "real" implementation of
 that class.
 
 <li>The parser was generated using <a
 href="http://www.webgain.com/products/metamata/java_doc.html">JavaCC</a>.
-The parser definition is found in <a
-href="../src/org.apache.taglibs.standard/lang/spel/SpelParser.jj">src/org/apache/taglibs/jsptl/lang/spel/SpelParser.jj</a>,
+The parser definition is found in
+<tt>src/org/apache/taglibs/jsptl/lang/spel/SpelParser.jj</tt>,
 and all files generated by JavaCC are placed into the
 org.apache.taglibs.standard.lang.spel.parser package.  Note that JavaCC is not
 required to compile the SPEL implementation - it is only needed if the
@@ -69,8 +68,8 @@ recent version of JavaCC can be used to regenerate the parser, but the
 <a href="#regressionTests">regression tests</a> should then be run to
 make sure the behavior hasn't changed.
 
-<li>All localizable error messages are stored in the <a
-href="../src/org.apache.taglibs.standard/lang/spel/Resources.properties">src/org/apache/taglibs/jsptl/lang/spel/Resources.properties</a>
+<li>All localizable error messages are stored in the 
+<tt>src/org/apache/taglibs/jsptl/lang/spel/Resources.properties</tt>
 file.  This file must be copied into the final distribution with the
 generated class files.
 
@@ -91,15 +90,14 @@ comments to appear in the output file, which can aid in debugging.
 
 <h4>Parser tests</h4>
 
-<p>The parser test input file is found at <a
-href="../src/org.apache.taglibs.standard/lang/spel/test/parserTests.txt">src/org/apache/taglibs/jsptl/lang/spel/test/parserTests.txt</a>.
+<p>The parser test input file is found at 
+<tt>src/org/apache/taglibs/jsptl/lang/spel/test/parserTests.txt</tt/>.
 Each line represents an expression to be parsed - the expression is
 parsed, and printed back out in the evaluator's "canonical form".  For
 example, in the canonical form, all Strings are enclosed by double
 quotes, all names are prefixed by a scope operator ":", etc.
 
-<p>The expected outputs are found at <a
-href="../src/org.apache.taglibs.standard/lang/spel/test/parserTestsExpectedOutput.txt">src/org/apache/taglibs/jsptl/lang/spel/test/parserTestsExpectedOutput.txt</a>
+<p>The expected outputs are found at <tt>src/org/apache/taglibs/jsptl/lang/spel/test/parserTestsExpectedOutput.txt</tt>.
 
 <p>The parser tests can be run like this:
 
@@ -115,17 +113,17 @@ the test passed or failed.
 
 <p>For the evaluation test, a "dummy" PageContext was created
 containing some beans with properties in various scopes.  That
-PageContext is created in the "createTestContext" method of <a
-href="../src/org.apache.taglibs.standard/lang/spel/test/EvaluationTest.java">src/org/apache/taglibs/jsptl/lang/spel/test/EvaluationTest.java</a>.
+PageContext is created in the "createTestContext" method of 
+<tt>src/org/apache/taglibs/jsptl/lang/spel/test/EvaluationTest.java</tt>.
 
-<p>The evaluation test input file is found at <a
-href="../src/org.apache.taglibs.standard/lang/spel/test/evaluationTests.txt">src/org/apache/taglibs/jsptl/lang/spel/test/evaluationTests.txt</a>.
+<p>The evaluation test input file is found at 
+<tt>src/org/apache/taglibs/jsptl/lang/spel/test/evaluationTests.txt</tt>.
 Each line represents an expression to be parsed, followed by a line
 specifying the expected type - the expression is parsed, and the
 resulting value is printed along with its class.
 
-<p>The expected outputs are found at <a
-href="../src/org.apache.taglibs.standard/lang/spel/test/evaluationTestsExpectedOutput.txt">src/org/apache/taglibs/jsptl/lang/spel/test/evaluationTestsExpectedOutput.txt</a>
+<p>The expected outputs are found at
+<tt>src/org/apache/taglibs/jsptl/lang/spel/test/evaluationTestsExpectedOutput.txt</tt>.
 
 <p>The evaluation tests can be run like this:
 
diff --git a/examples/conf/web.xml b/examples/conf/web.xml
index 2e95363..a719145 100644
--- a/examples/conf/web.xml
+++ b/examples/conf/web.xml
@@ -12,10 +12,12 @@
 
     <!-- Modify this context parameter to set a new class to be the default
          expression language for the application. -->
+    <!-- We use the default, which is now EcmaScript
     <context-param>
         <param-name>javax.servlet.jsp.jstl.temp.ExpressionEvaluatorClass</param-name>
         <param-value>org.apache.taglibs.standard.lang.spel.Evaluator</param-value>
     </context-param>
+    -->
 
     <listener>
       <listener-class>org.apache.taglibs.standard.examples.startup.Init</listener-class>
@@ -52,6 +54,16 @@
     </taglib>
 
     <taglib>
+        <taglib-uri>http://java.sun.com/jstl/ea/sql</taglib-uri>
+        <taglib-location>/WEB-INF/sql.tld</taglib-location>
+    </taglib>
+
+    <taglib>
+        <taglib-uri>http://java.sun.com/jstl/ea/sql-rt</taglib-uri>
+        <taglib-location>/WEB-INF/sql-rt.tld</taglib-location>
+    </taglib>
+
+    <taglib>
         <taglib-uri>/jstl-examples-taglib</taglib-uri>
         <taglib-location>/WEB-INF/jstl-examples.tld</taglib-location>
     </taglib>
diff --git a/examples/src/org/apache/taglibs/jsptl/examples/i18n/Resources_de.java b/examples/src/org/apache/taglibs/jsptl/examples/i18n/Resources_de.java
index c3d91aa..31d25d6 100644
--- a/examples/src/org/apache/taglibs/jsptl/examples/i18n/Resources_de.java
+++ b/examples/src/org/apache/taglibs/jsptl/examples/i18n/Resources_de.java
@@ -9,6 +9,7 @@ public class Resources_de extends ListResourceBundle {
 	contents = new Object[][] {
 	    { "greetingMorning", "Guten Morgen!" },
 	    { "greetingEvening", "Guten Abend!" },
+	    { "serverInfo", "Name und Version des Servlet Containers: {0}" },
 	    { "currentTime", "Heutiges Datum und Uhrzeit: {0}" },
 	    { "com.acme.labels.cancel", "Abbrechen" },
 	    { "java.lang.ArithmeticException", "/ durch 0" }
diff --git a/examples/src/org/apache/taglibs/jsptl/examples/startup/Init.java b/examples/src/org/apache/taglibs/jsptl/examples/startup/Init.java
index 115512f..ccbd5b3 100644
--- a/examples/src/org/apache/taglibs/jsptl/examples/startup/Init.java
+++ b/examples/src/org/apache/taglibs/jsptl/examples/startup/Init.java
@@ -143,7 +143,16 @@ public class Init implements ServletContextListener {
 	 * Enumeration
 	 */
 	Enumeration enum = numberMap.keys();
-        sce.getServletContext().setAttribute("enum", enum);
+	// don't use 'enum' for attribute name because it is a 
+	// reserved word in EcmaScript.
+        sce.getServletContext().setAttribute("enumeration", enum);
+
+	/**
+	 * Message arguments for parametric replacement
+	 */
+	Object[] messageArgs =
+	    new Object[] { sce.getServletContext().getServerInfo() };
+	sce.getServletContext().setAttribute("messageArgs", messageArgs);
     }
     
     //*********************************************************************
diff --git a/examples/web/ShowSource.jsp b/examples/web/ShowSource.jsp
index 18dc0ef..fc8923f 100644
--- a/examples/web/ShowSource.jsp
+++ b/examples/web/ShowSource.jsp
@@ -1,22 +1,35 @@
 <!--
   Displays the content of the file specified in request
   parameter "filename".
+  <%-- Warning!  Can be used to retrieve the source code for
+       any file in the 'standard-examples' application.
+       It is not advisable to insert any sensitive code
+       (even as an experiment) into this application --%>
 -->
 
 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
-<%@ taglib prefix="ex" uri="/jsptl-examples-taglib" %>
+<%@ taglib prefix="ex" uri="/jstl-examples-taglib" %>
+
+<%-- 
+  Let's get back the URL as a String so we can use it to
+  demonstrate "c:import"
+--%>
+<% pageContext.setAttribute("filepath",
+     application.
+       getResource(request.getParameter("filename")).toExternalForm()); %>
+<% pageContext.setAttribute("filename", request.getParameter("filename")); %>
+
 <html>
 <head>
-  <title>JSTL: Source code for <c:expr value="$param:filename"/></title>
+  <title>JSTL: Source code for <c:expr value="$filename"/></title>
 </head>
 <body bgcolor="#FFFFFF">
-<h3>Source code for:&nbsp; <c:expr value="$param:filename"/></h3>
+<h3>Source code for:&nbsp; <c:expr value="$filename"/></h3>
 
 <hr>
-<c:import varReader="reader" url="$param:filename">
-<%-- <ex:file id="reader" file="$param:filename"> --%>
+
+<c:import varReader="reader" url="$filepath">
   <ex:escapeHtml reader="$reader"/>
-<%-- </ex:file> --%>
 </c:import>
 <hr>
 </body>
diff --git a/examples/web/Templates/ExamplesTemplate.dwt b/examples/web/Templates/ExamplesTemplate.dwt
index c5a9297..61e6421 100644
--- a/examples/web/Templates/ExamplesTemplate.dwt
+++ b/examples/web/Templates/ExamplesTemplate.dwt
@@ -18,13 +18,12 @@
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.jsp">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../sql/index.jsp">SQL</a> 
+      &#149; <a href="../ecmascript/index.html">EcmaScript</a> &#149; <a href="../misc/index.html">Misc.</a></td>
   </tr>
 </table>
 <!-- #BeginEditable "body" -->{body}<!-- #EndEditable -->
diff --git a/examples/web/conditionals/If.jsp b/examples/web/conditionals/If.jsp
index c5b4605..96e41bc 100644
--- a/examples/web/conditionals/If.jsp
+++ b/examples/web/conditionals/If.jsp
@@ -14,6 +14,6 @@
   <c:if test="$customer.address.country == 'USA'">
     <c:expr value="$customer"/><br>
   </c:if>
-</c:forEach> 
+</c:forEach>
 </body>
 </html>
diff --git a/examples/web/conditionals/index.html b/examples/web/conditionals/index.html
index 95006cd..650956f 100644
--- a/examples/web/conditionals/index.html
+++ b/examples/web/conditionals/index.html
@@ -1,17 +1,11 @@
-<html><!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" -->
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: Conditional Tags Examples</title>
 <!-- #EndEditable -->
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
-<script language="JavaScript">
-<!--
-function MM_callJS(jsStr) { //v2.0
-  return eval(jsStr)
-}
-//-->
-</script></head>
+</head>
 
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
@@ -24,13 +18,12 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="index.html">Conditionals</a> 
+      &#149; <a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.jsp">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../sql/index.jsp">SQL</a> 
+      &#149; <a href="../ecmascript/index.html">EcmaScript</a> &#149; <a href="../misc/index.html">Misc.</a></td>
   </tr>
 </table>
 <!-- #BeginEditable "body" --> 
@@ -39,20 +32,19 @@ function MM_callJS(jsStr) { //v2.0
   <a href="If.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Only shows a customer from the customer list if the last name is &quot;Howe&quot;.<br>
-<h3> &lt;choose&gt;&nbsp;Mutually Exclusive Conditional Execution&nbsp;<a href="../ShowSource.jsp?filename=/conditionals/Choose.jsp"><img src="../images/code.gif" width="24" height="24" onMouseDown="MM_callJS('showJspCode(\&quot;Simple2.jsp\&quot;)')" border="0"></a> 
+<h3> &lt;choose&gt;&nbsp;Mutually Exclusive Conditional Execution&nbsp;<a href="../ShowSource.jsp?filename=/conditionals/Choose.jsp"><img src="../images/code.gif" width="24" height="24"" border="0"></a> 
   <a href="Choose.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 <p>Customers from the USA will be printed in blue, those from Canada in red, and 
   others in green.</p>
-<h3>Custom Logic Tag&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/conditionals/CustomLogicTag.jsp"><img src="../images/code.gif" width="24" height="24" onMouseDown="MM_callJS('showJspCode(\&quot;Simple2.jsp\&quot;)')" border="0"></a>&nbsp;<a href="CustomLogicTag.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
+<h3>Custom Logic Tag&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/conditionals/CustomLogicTag.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>&nbsp;<a href="CustomLogicTag.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
 <p>JSTL exposes in its API the abstract class ConditionalTagSupport to facilitate 
   the implementation of custom conditional tags that leverage the standard conditional 
-  behavior defined in JSTL. This example shows custom tag &lt;usCustomer&gt; that returns true if 
-its customer attribute value points to a US customer. 
-  It can be used both in the context of a simple conditional execution, as well 
-  as in the context of a mutually conditional execution by exposing the result 
-  of the conditional execution in a JSP page attribute via the tag attribute 'var'. 
-</p>
+  behavior defined in JSTL. This example shows custom tag &lt;usCustomer&gt; that 
+  returns true if its customer attribute value points to a US customer. It can 
+  be used both in the context of a simple conditional execution, as well as in 
+  the context of a mutually conditional execution by exposing the result of the 
+  conditional execution in a JSP page attribute via the tag attribute 'var'. </p>
 <!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
diff --git a/examples/web/ecmascript/ConditionalOperator.jsp b/examples/web/ecmascript/ConditionalOperator.jsp
index 7b9d3a9..6be5336 100644
--- a/examples/web/ecmascript/ConditionalOperator.jsp
+++ b/examples/web/ecmascript/ConditionalOperator.jsp
@@ -25,24 +25,24 @@
     <th>Result</th>
   </tr>
   <tr>
-    <td><code><c:expr value="$true"/> ? <jx:expr value="$ifResult"/> : <jx:expr value="$elseResult"/> </code></td>
+    <td><code><c:expr value="$true"/> ? <c:expr value="$ifResult"/> : <c:expr value="$elseResult"/> </code></td>
     <td><c:expr value="$true ? ifResult : elseResult"/></td>
   </tr>
   <tr>
-    <td><code><c:expr value="$false"/> ? <jx:expr value="$ifResult"/> : <jx:expr value="$elseResult"/> </code></td>
+    <td><code><c:expr value="$false"/> ? <c:expr value="$ifResult"/> : <c:expr value="$elseResult"/> </code></td>
     <td><c:expr value="$false ? ifResult : elseResult"/></td>
   </tr>
   <tr>
     <td><code>&lt;c:if test="$true == true"&gt; IF result &lt;/jx:if&gt; </code></td>
-    <td><c:if test="$true == true"> IF result</jx:if> </td>
+    <td><c:if test="$true == true"> IF result</c:if> </td>
   </tr>
   <tr>
     <td><code>&lt;c:if test="$false == true"&gt; IF result &lt;/jx:if&gt; </code></td>
-    <td><c:if test="$false == true"> IF result </jx:if> </td>
+    <td><c:if test="$false == true"> IF result </c:if> </td>
   </tr>
   <tr>
     <td><code>&lt;c:if test="$myDate.year == 101"&gt; 1900 + 101 = 2001 &lt;/jx:if&gt; </code></td>
-    <td><c:if test="$myDate.year == 101"> 1900 + 101 = 2001</jx:if> </td>
+    <td><c:if test="$myDate.year == 101"> 1900 + 101 = 2001</c:if> </td>
   </tr>
 </table>
 
diff --git a/examples/web/ecmascript/MapAccess.jsp b/examples/web/ecmascript/MapAccess.jsp
index c27cbb5..9462447 100644
--- a/examples/web/ecmascript/MapAccess.jsp
+++ b/examples/web/ecmascript/MapAccess.jsp
@@ -19,7 +19,7 @@
     <th>Value</th>
     <th>Key</th>
   </tr>
-<c:forEach var="prop" items="$systemProperties" begin="1" end="5">
+<c:forEach var="prop" items="$numberMap" begin="1" end="5">
   <tr>
     <td>prop</td>
     <td><c:expr value="$prop.value"/></td>
diff --git a/examples/web/ecmascript/PropertyAccess.jsp b/examples/web/ecmascript/PropertyAccess.jsp
index 3c54aef..a8c4c42 100644
--- a/examples/web/ecmascript/PropertyAccess.jsp
+++ b/examples/web/ecmascript/PropertyAccess.jsp
@@ -22,7 +22,7 @@
     <th>Property</th>
     <th>Value</th>
   </tr>
-<c:forEach var="prop" items="$systemProperties" begin="1" end="5">
+<c:forEach var="prop" items="$numberMap" begin="1" end="5">
   <tr>
     <td>prop</td>
     <td>prop.getKey()</td>
diff --git a/examples/web/ecmascript/index.html b/examples/web/ecmascript/index.html
index 4baff14..f29d491 100644
--- a/examples/web/ecmascript/index.html
+++ b/examples/web/ecmascript/index.html
@@ -1,22 +1,15 @@
-<html>
-<!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" --> 
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: EcmaScript Tags Examples</title>
-<!-- #EndEditable --> 
+<!-- #EndEditable -->
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
-<script language="JavaScript">
-<!--
-function MM_callJS(jsStr) { //v2.0
-  return eval(jsStr)
-}
-//-->
-</script>
 </head>
+
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
-  <tr> 
+  <tr>
     <td height="0"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
     <td align="center" height="0"><font size="-1" color="#000099"> <b>Beware &#151; 
       API and Tags may/will change</b></font></td>
@@ -25,89 +18,80 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.jsp">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../sql/index.jsp">SQL</a> 
+      &#149; <a href="index.html">EcmaScript</a> &#149; <a href="../misc/index.html">Misc.</a></td>
   </tr>
 </table>
-
 <!-- #BeginEditable "body" --> 
 <h2>EcmaScript Expression Language Examples</h2>
-<p>In order to use EcmaScript, make sure to set the context parameter to the EcmaScript expression language in your web.xml file as follows:<p>
-<pre>
+<p>In EA2, EcmaScript is the default Expression Language. Instructions below were 
+  necessary only with EA1 when there were no default EL (and one had to be explicitely 
+  defined).
+<blockquote>
+  <p>In order to use EcmaScript, make sure to set the context parameter to the 
+    EcmaScript expression language in your web.xml file as follows:</p>
+  <pre>
     &lt;context-param&gt;
         &lt;param-name&gt;javax.servlet.jsp.jstl.temp.ExpressionEvaluatorClass&lt;/param-name&gt;
         &lt;param-value&gt;org.apache.taglibs.standard.lang.javascript.JavascriptExpressionEvaluator&lt;/param-value&gt;
     &lt;/context-param&gt;
 </pre>
-
-
-
+</blockquote>
 <h3>Arithmetic Operators&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/ArithmeticOperators.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ArithmeticOperators.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Arithmetic Operators perform various operations on either numeric or string operands.<br>
-
 <h3>Comparison Operators&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/ComparisonOperators.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ComparisonOperators.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Comparison Operators compare values for equality and identity.<br>
-
 <h3>String Operators&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/StringOperators.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="StringOperators.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Comparison Operators produce special effects when used with Strings.<br>
-
 <h3>String Support&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/StringSupport.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="StringSupport.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-The EcmaScript String Object type has many useful methods for operating on string values.<br>
-
+The EcmaScript String Object type has many useful methods for operating on string 
+values.<br>
 <h3>Logical Operators&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/LogicalOperators.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="LogicalOperators.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Logical Operators are used to perform boolean algebra.<br>
-
 <h3>Bitwise Operators&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/BitwiseOperators.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="BitwiseOperators.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Bitwise Operators perform boolean algebra on individual bits or are used to shift bits.</br>
-
+Bitwise Operators perform boolean algebra on individual bits or are used to shift 
+bits. 
 <h3>Assignment Operators&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/AssignmentOperators.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="AssignmentOperators.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Assignment Operators are shortcuts for combining assignment with another operation.<br>
-
 <h3>Conditional Operator&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/ConditionalOperator.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ConditionalOperator.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Conditional Operator is a shortcut for an if/else statement.<br>
-
 <h3>Array Access&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/ArrayAccess.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ArrayAccess.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Individual elements of an array can be accessed using the [] notation.<br>
-
 <h3>Property Access&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/PropertyAccess.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="PropertyAccess.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Elements of an object can be accessed using the . notation.<br>
-
 <h3>Map Access&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/MapAccess.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="MapAccess.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 The key and value of a Map.Entry object can be accessed directly.<br>
-
 <h3>Function Call&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/FunctionCall.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="FunctionCall.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Functions can be invoked using the () operator.<br>
-<!-- #EndEditable --> 
-
+<!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
@@ -121,5 +105,4 @@ Functions can be invoked using the () operator.<br>
   </tr>
 </table>
 </body>
-<!-- #EndTemplate -->
-</html>
+<!-- #EndTemplate --></html>
diff --git a/examples/web/elsupport/index.html b/examples/web/elsupport/index.html
index 8180ac9..7fd9677 100644
--- a/examples/web/elsupport/index.html
+++ b/examples/web/elsupport/index.html
@@ -1,17 +1,11 @@
-<html><!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" -->
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: Expression Language Support Tags Examples</title>
 <!-- #EndEditable -->
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
-<script language="JavaScript">
-<!--
-function MM_callJS(jsStr) { //v2.0
-  return eval(jsStr)
-}
-//-->
-</script></head>
+</head>
 
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
@@ -24,13 +18,12 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.jsp">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../sql/index.jsp">SQL</a> 
+      &#149; <a href="../ecmascript/index.html">EcmaScript</a> &#149; <a href="../misc/index.html">Misc.</a></td>
   </tr>
 </table>
 <!-- #BeginEditable "body" --> 
@@ -40,11 +33,11 @@ function MM_callJS(jsStr) { //v2.0
 </h3>
 This example features &lt;expr&gt; used with default values using the default 
 attribute as well as the tag's body content. <br>
-<h3> &lt;set&gt;&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/elsupport/Set.jsp"><img src="../images/code.gif" width="24" height="24" onMouseDown="MM_callJS('showJspCode(\&quot;Simple2.jsp\&quot;)')" border="0"></a> 
+<h3> &lt;set&gt;&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/elsupport/Set.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="../elsupport/Set.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
 <p>We set the value of an application scope attribute from the &lt;set&gt; tag 
   body content. This application scope variable is then used in a second JSP page.</p>
-<h3>&lt;declare&gt;&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/elsupport/Declare.jsp"><img src="../images/code.gif" width="24" height="24" onMouseDown="MM_callJS('showJspCode(\&quot;Simple2.jsp\&quot;)')" border="0"></a> 
+<h3>&lt;declare&gt;&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/elsupport/Declare.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="../elsupport/Declare.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
 <p>In order for JSTL tags to collaborate with custom tags that only accept rtexprvalues, 
   the &lt;declare&gt; tag must be used to create a scripting variable. In this 
diff --git a/examples/web/format/Exception.jsp b/examples/web/format/Exception.jsp
index 94ffb49..7e345a5 100644
--- a/examples/web/format/Exception.jsp
+++ b/examples/web/format/Exception.jsp
@@ -2,9 +2,10 @@
 
 <html>
 <head>
-  <title>JSTL: I18N Support -- Exception Example</title>
+  <title>JSTL: Formatting/I18N Support -- Exception Example</title>
 </head>
 <body bgcolor="#FFFFFF">
+<h3>Localized Error Page Exception</h3>
 
 <%@ page isErrorPage="true" %>
 Looking up exception's fully qualified class name in resource bundle:<br>
diff --git a/examples/web/format/FormatDateTime.jsp b/examples/web/format/FormatDateTime.jsp
index 3c99d84..534dbb4 100644
--- a/examples/web/format/FormatDateTime.jsp
+++ b/examples/web/format/FormatDateTime.jsp
@@ -2,24 +2,39 @@
 
 <html>
 <head>
-  <title>JSTL: Formatting Support -- Date and Time Example</title>
+  <title>JSTL: Formatting/I18N Support -- Date and Time Example</title>
 </head>
 <body bgcolor="#FFFFFF">
 <h3>Formatting Dates and Times</h3>
 
 <ul>
- <li> Formatting current date as &quot;GMT&quot;: 
+ <li> Formatting current date as &quot;GMT&quot;:<br>
   <fmt:timeZone value="GMT">
-   <fmt:formatDate type="both"/>
+   <fmt:formatDate type="both" dateStyle="full" timeStyle="full"/>
   </fmt:timeZone>
 
- <li> Formatting current date as &quot;GMT+1:00&quot;, and parse
+ <li> Formatting current date as &quot;GMT+1:00&quot;, and parsing
       its date and time components:<br>
-  <fmt:timeZone value="GMT+1:00"/>
-  <fmt:formatDate type="both" dateStyle="long" timeStyle="long" var="formattedDate"/>
-  <fmt:parseDate value="$formattedDate" type="both" var="parsedDate"/>
-  Parsed date: <fmt:formatDate value="$parsedDate" type="date"/><br>
-  Parsed time: <fmt:formatDate value="$parsedDate" type="time"/>
+  <fmt:timeZone value="GMT+1:00">
+   <fmt:formatDate type="both" dateStyle="full" timeStyle="full" var="formattedDateTime"/>
+   <fmt:parseDate value="$formattedDateTime" type="both" dateStyle="full" timeStyle="full" timeZone="PST" var="parsedDateTime"/>
+   Parsed date: <fmt:formatDate value="$parsedDateTime" type="date" dateStyle="full"/><br>
+   Parsed time: <fmt:formatDate value="$parsedDateTime" type="time" timeStyle="full"/>
+  </fmt:timeZone>
+
+ <li> Parsing SHORT version of current time in different time zones:<br>
+  <fmt:formatDate type="both" timeStyle="short" var="formattedDateTime"/>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="short" timeZone="GMT"/> (parsed in &quot;GMT&quot;)<br>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="short" timeZone="GMT+1:00"/> (parsed in &quot;GMT+1:00&quot;)<br>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="short" timeZone="GMT+3:00"/> (parsed in &quot;GMT+3:00&quot;)<br>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="short" timeZone="PST"/> (parsed in &quot;PST&quot;)
+
+ <li> Parsing FULL version of current time in different time zones (should not be affected):<br>
+  <fmt:formatDate type="both" timeStyle="full" var="formattedDateTime"/>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="full" timeZone="GMT"/> (parsed in &quot;GMT&quot;)<br>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="full" timeZone="GMT+1:00"/> (parsed in &quot;GMT+1:00&quot;)<br>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="full" timeZone="GMT+3:00"/> (parsed in &quot;GMT+3:00&quot;)<br>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="full" timeZone="PST"/> (parsed in &quot;PST&quot;)
 </ul>
 
 </body>
diff --git a/examples/web/format/FormatNumber.jsp b/examples/web/format/FormatNumber.jsp
index 59b16a5..4008709 100644
--- a/examples/web/format/FormatNumber.jsp
+++ b/examples/web/format/FormatNumber.jsp
@@ -2,7 +2,7 @@
 
 <html>
 <head>
-  <title>JSTL: Formatting Support -- Number, Currency, and Percent Example</title>
+  <title>JSTL: Formatting/I18N Support -- Number, Currency, and Percent Example</title>
 </head>
 <body bgcolor="#FFFFFF">
 <h3>Formatting Numbers, Currencies, and Percentages</h3>
@@ -15,11 +15,23 @@
   <fmt:formatNumber value="123456789" type="currency"/>
 
  <li> Format as percentage: 
-  <fmt:formatNumber value="123456789" type="percent"/>
+  <fmt:formatNumber type="percent">
+   123456789
+  </fmt:formatNumber>
 
  <li> Format as currency, parse, and print parsed result: 
   <fmt:formatNumber value="123456789" type="currency" var="cur"/>
   <fmt:parseNumber value="$cur" type="currency"/>
+
+ <li> Parse numeric string (using default &quot;en&quot; locale) and format as currency:
+  <fmt:locale value="de"/>
+  <fmt:formatNumber value="12345.67" type="currency"/>
+
+ <li> Parse numeric string (using 'parseLocale' locale) and format as currency:
+  <fmt:locale value="de"/>
+  <fmt:formatNumber parseLocale="de" type="currency">
+   12345.67
+  </fmt:formatNumber>
 </ul>
 
 </body>
diff --git a/examples/web/format/GermanLocale.jsp b/examples/web/format/GermanLocale.jsp
index 00780ca..0c510eb 100644
--- a/examples/web/format/GermanLocale.jsp
+++ b/examples/web/format/GermanLocale.jsp
@@ -9,7 +9,9 @@
 
 <fmt:locale value="de"/>
 <fmt:bundle basename="org.apache.taglibs.standard.examples.i18n.Resources">
- <fmt:message key="greetingMorning"/>
+ <fmt:message>
+  greetingMorning
+ </fmt:message>
 </fmt:bundle>
 
 </body>
diff --git a/examples/web/format/MessageFormat.jsp b/examples/web/format/MessageFormat.jsp
index bb4274c..6c2db64 100644
--- a/examples/web/format/MessageFormat.jsp
+++ b/examples/web/format/MessageFormat.jsp
@@ -22,13 +22,18 @@
   </fmt:messageFormat>
 
  <li> Using &lt;messageArg&gt; body:<br>
-  <fmt:messageFormat value="Current time: {0{">
+  <fmt:messageFormat>
+   Current time: {0}
    <fmt:messageArg>
     <fmt:formatDate type="both"/>
    </fmt:messageArg>
   </fmt:messageFormat>
-</ul>
 
+ <li> Using 'messageArgs' attribute:<br>
+  <fmt:messageFormat messageArgs="$messageArgs">
+   Servlet container name/version: {0}
+  </fmt:messageFormat>
 </ul>
+
 </body>
 </html>
diff --git a/examples/web/format/ParametricReplacement.jsp b/examples/web/format/ParametricReplacement.jsp
index 97c383f..6f356b0 100644
--- a/examples/web/format/ParametricReplacement.jsp
+++ b/examples/web/format/ParametricReplacement.jsp
@@ -28,6 +28,9 @@
     <fmt:formatDate type="both"/>
    </fmt:messageArg>
   </fmt:message>
+
+ <li> Using 'messageArgs' attribute:<br>
+  <fmt:message key="serverInfo" bundle="$deBundle" messageArgs="$messageArgs"/>
 </ul>
 
 </body>
diff --git a/examples/web/format/index.html b/examples/web/format/index.html
index a5cb69a..ce4b81b 100644
--- a/examples/web/format/index.html
+++ b/examples/web/format/index.html
@@ -1,22 +1,15 @@
-<html>
-<!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" --> 
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
-<title>JSTL: EcmaScript Tags Examples</title>
-<!-- #EndEditable --> 
+<title>JSTL: I18N-Capable Formatting Tags Examples</title>
+<!-- #EndEditable -->
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
-<script language="JavaScript">
-<!--
-function MM_callJS(jsStr) { //v2.0
-  return eval(jsStr)
-}
-//-->
-</script>
 </head>
+
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
-  <tr> 
+  <tr>
     <td height="0"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
     <td align="center" height="0"><font size="-1" color="#000099"> <b>Beware &#151; 
       API and Tags may/will change</b></font></td>
@@ -25,81 +18,57 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.jsp">Import</a> &#149; <a href="index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../sql/index.jsp">SQL</a> 
+      &#149; <a href="../ecmascript/index.html">EcmaScript</a> &#149; <a href="../misc/index.html">Misc.</a></td>
   </tr>
 </table>
-
 <!-- #BeginEditable "body" --> 
-<h2>Formatting/I18N Tags Examples</h2>
-
+<h2>I18N-Capable Formatting Tags Examples</h2>
 <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>
-Using resource bundle for German locale.
-<br>
-
+Using resource bundle for German locale. <br>
 <h3>Italian&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/ItalianLocale.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ItalianLocale.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Using resource bundle for Italian locale.
-<br>
-
-<h3>Missing Resource Bundle&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/MissingResourceBundle.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>
+Using resource bundle for Italian locale. <br>
+<h3>Missing Resource Bundle&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/MissingResourceBundle.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="MissingResourceBundle.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Trying to access a resource bundle that does not exist.
-<br>
-
+Trying to access a resource bundle that does not exist. <br>
 <h3>Undefined Key&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/UndefinedKey.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="UndefinedKey.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Looking up an undefined key in a resource bundle.
-<br>
-
-<h3>Parametric Replacement&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/ParametricReplacement.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>
+Looking up an undefined key in a resource bundle. <br>
+<h3>Parametric Replacement&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/ParametricReplacement.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ParametricReplacement.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Parametric replacement examples.
-<br>
-
+Parametric replacement examples. <br>
 <h3>MessageFormat&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/MessageFormat.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="MessageFormat.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Message formatting examples.
-<br>
-
+Message formatting examples. <br>
 <h3>Prefix&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/PrefixAttribute.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="PrefixAttribute.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Prepending prefix to message key.
-<br>
-
+Prepending prefix to message key. <br>
 <h3>Date&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/FormatDateTime.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="FormatDateTime.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Formatting dates and times.
-<br>
-
+Formatting dates and times. <br>
 <h3>Number&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/FormatNumber.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="FormatNumber.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Formatting numbers.
-<br>
-
-<h3>Exception&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/ThrowException.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+Formatting numbers. <br>
+<h3>Localized Exception&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/ThrowException.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ThrowException.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Formatting error page exception.
-<br>
-
-<!-- #EndEditable --> 
-
+Displaying error page exception in localized format. <br>
+<!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
@@ -113,5 +82,4 @@ Formatting error page exception.
   </tr>
 </table>
 </body>
-<!-- #EndTemplate -->
-</html>
+<!-- #EndTemplate --></html>
diff --git a/examples/web/import/Absolute.jsp b/examples/web/import/Absolute.jsp
index 941e88c..10c9dce 100644
--- a/examples/web/import/Absolute.jsp
+++ b/examples/web/import/Absolute.jsp
@@ -1,4 +1,5 @@
 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
+<%@ taglib prefix="ex" uri="/jstl-examples-taglib" %>
 
 <html>
 <head>
@@ -9,9 +10,9 @@
 
 <h4>CNN's RSS XML feed:</h4>
 <blockquote>
- <pre>
+<ex:escapeHtml>
   <c:import url="http://www.cnn.com/cnn.rss"/>
- </pre>
+</ex:escapeHtml>
 </blockquote>
 
 </body>
diff --git a/examples/web/import/ContextRelative.jsp b/examples/web/import/ContextRelative.jsp
index 14eb49f..e979e16 100644
--- a/examples/web/import/ContextRelative.jsp
+++ b/examples/web/import/ContextRelative.jsp
@@ -9,7 +9,7 @@ Assuming you have the "examples" webapp installed, here's a file from it...
 
 <blockquote>
  <pre>
-  <c:import url="/jsp/simpletag/foo.jsp" context="/examples"/>
+  <c:import url="$_contextUrl" context="$_contextName"/>
  </pre>
 </blockquote>
 
diff --git a/examples/web/import/Encode.jsp b/examples/web/import/Encode.jsp
index d1d4ffb..6441973 100644
--- a/examples/web/import/Encode.jsp
+++ b/examples/web/import/Encode.jsp
@@ -28,6 +28,6 @@
  </tr>
  <tr>
   <td>a=b</td>
-  <td><c:urlEncode>a=b</jx:urlEncode></td>        <%-- bodies work too --%>
+  <td><c:urlEncode>a=b</c:urlEncode></td>        <%-- bodies work too --%>
  </tr>
 </table>
diff --git a/examples/web/import/EncodeContextRelative.jsp b/examples/web/import/EncodeContextRelative.jsp
index 0f88569..7a67038 100644
--- a/examples/web/import/EncodeContextRelative.jsp
+++ b/examples/web/import/EncodeContextRelative.jsp
@@ -9,15 +9,12 @@
 
 <h4>&lt;urlEncode&gt;</h4>
 
-<c:urlEncode var="name" value="horwat"/>
-<c:urlEncode var="email" value="horwatMail"/>
-<c:urlEncode var="action" value="Submit"/>
+<c:urlEncode var="param1" value="$_paramValue1"/>
+<c:urlEncode var="param2" value="$_paramValue2"/>
+<c:urlEncode var="param3" value="$_paramValue3"/>
 
-<c:import url="/jsp/cal/cal1.jsp" context="/examples">
-    <c:param name="name" value="$name"/>
-    <c:param name="email" value="$email"/>
-    <c:param name="action" value="$action"/>
+<c:import url="contextUrl" context="contextName>
+    <c:param name="$_paramName1" value="$param1"/>
+    <c:param name="$_paramName2" value="$param2"/>
+    <c:param name="$_paramName3" value="$param3"/>
 </c:import>
-
-<%--
---%>
diff --git a/examples/web/import/EncodeQueryString.jsp b/examples/web/import/EncodeQueryString.jsp
index 11f32c1..758616d 100644
--- a/examples/web/import/EncodeQueryString.jsp
+++ b/examples/web/import/EncodeQueryString.jsp
@@ -7,11 +7,9 @@
 <body bgcolor="#FFFFFF">
 <h3>URL Encoding with Query String</h3>
 
-<h4>&lt;urlEncode&gt;</h4>
+<h4>Encoding paramaters with import tag</h4>
 
 <c:urlEncode var="name" value="horwat"/>
-<c:urlEncode var="email" value="horwatMail"/>
-<c:urlEncode var="action" value="Submit"/>
-
-<c:import url="$'/jsp/cal/cal1.jsp?name=' + name + '&email=' + email + '&action=' + action" context="/examples"/>
+<c:urlEncode var="email" value="horwat@fakeaddress.com"/>
 
+<c:import url="$'LocalQueryString.jsp?name=' + name + '&email=' + email" />
diff --git a/examples/web/import/LocalQueryString.jsp b/examples/web/import/LocalQueryString.jsp
new file mode 100644
index 0000000..78ec312
--- /dev/null
+++ b/examples/web/import/LocalQueryString.jsp
@@ -0,0 +1,30 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
+
+<hr>
+<h3> This is the output of the imported file </h3>
+
+<c:expressionLanguage 
+  evaluator="org.apache.taglibs.standard.lang.spel.Evaluator"> 
+
+<table border="0">
+  <tr>
+    <td>Getting "name" query parameter:</td>
+    <td>
+      <div style="color: red">
+        <c:expr value="$param:name"/><br>
+      </div>
+    </td>
+  </tr>
+  <tr>
+    <td>Getting "email" query parameter:</td>
+    <td>
+      <div style="color: red">
+        <c:expr value="$param:email"/>
+      </div>
+    </td>
+  </tr>
+</table>
+
+</c:expressionLanguage>
+
+<hr>
diff --git a/examples/web/import/index.html b/examples/web/import/index.html
index d107ec4..e7f604c 100644
--- a/examples/web/import/index.html
+++ b/examples/web/import/index.html
@@ -1,22 +1,15 @@
-<html>
-<!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" --> 
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: Import Tags Examples</title>
-<!-- #EndEditable --> 
+<!-- #EndEditable -->
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
-<script language="JavaScript">
-<!--
-function MM_callJS(jsStr) { //v2.0
-  return eval(jsStr)
-}
-//-->
-</script>
 </head>
+
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
-  <tr> 
+  <tr>
     <td height="0"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
     <td align="center" height="0"><font size="-1" color="#000099"> <b>Beware &#151; 
       API and Tags may/will change</b></font></td>
@@ -25,19 +18,18 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="index.jsp">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../sql/index.jsp">SQL</a> 
+      &#149; <a href="../ecmascript/index.html">EcmaScript</a> &#149; <a href="../misc/index.html">Misc.</a></td>
   </tr>
 </table>
-
 <!-- #BeginEditable "body" --> 
 <h2>Import Tags Examples</h2>
-<p>If you are using a Proxy server, you will need to set the following System Properties when starting the VM:</p>
+<p>If you are using a Proxy server, you will need to set the following System 
+  Properties when starting the VM:</p>
 <pre>
     http.proxyHost
     http.proxyPort
@@ -45,76 +37,55 @@ function MM_callJS(jsStr) { //v2.0
     ftp.proxyPort
 </pre>
 <br>
-
-
 <h3>Absolute&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/Absolute.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="Absolute.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Using an Absolute URL to import a resource.
-<br>
-
+Using an Absolute URL to import a resource. <br>
 <h3>Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/Relative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="Relative.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Using a Relative URL to import a resource.
-<br>
-
-<h3>Context Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/ContextRelative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>
+Using a Relative URL to import a resource. <br>
+<h3>Context Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/ContextRelative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ContextRelative.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Importing a resource relative to a foreign context.
-<br>
-
-<h3>Absolute (FTP)&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/AbsoluteFtp.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>
+Importing a resource relative to a foreign context. <br>
+<h3>Absolute (FTP)&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/AbsoluteFtp.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="AbsoluteFtp.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Using an Absolute URL to import a resource using a different protocol other than HTTP.
-<br>
-
+Using an Absolute URL to import a resource using a different protocol other than 
+HTTP. <br>
 <h3>Encode&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/Encode.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="Encode.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-URL encoding examples.
-<br>
-
+URL encoding examples. <br>
 <h3>Encode Context Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/EncodeContextRelative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="EncodeContextRelative.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-URL encoding examples using a relative context and nested param tags.
-<br>
-
+URL encoding examples using a relative context and nested param tags. <br>
 <h3>Encode Query String&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/EncodeQueryString.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="EncodeQueryString.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-URL encoding examples using a relative context and query string.
-<br>
-
+URL encoding examples using a relative context and query string. <br>
 <h3>String Exposure Absolute&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/ExposeString.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ExposeString.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Exposing the content of the resource as a String Object.
-<br>
-
+Exposing the content of the resource as a String Object. <br>
 <h3>String Exposure Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/ExposeStringRelative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ExposeStringRelative.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Exposing the content of a relative URL's resource as a String Object.
-<br>
-
+Exposing the content of a relative URL's resource as a String Object. <br>
 <h3>Param&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/Param.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="Param.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Using <param> element to specify request parameters. Also demonstrating how request parameters can be URL encoded (default). (NOTE: Returns error page that shows how request parameters are encoded)
-<br>
-
+Using <param> element to specify request parameters. Also demonstrating how request 
+parameters can be URL encoded (default). (NOTE: Returns error page that shows 
+how request parameters are encoded) <br>
 <h3>Malformed URL&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/StartSlash.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="StartSlash.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-A relative URL must start with a "/" in a foreign context. (NOTE: This example will result in a ServletException describing the error condition).
-<br>
-
-<!-- #EndEditable --> 
-
+A relative URL must start with a "/" in a foreign context. (NOTE: This example 
+will result in a ServletException describing the error condition). <br>
+<!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
@@ -128,5 +99,4 @@ A relative URL must start with a "/" in a foreign context. (NOTE: This example w
   </tr>
 </table>
 </body>
-<!-- #EndTemplate -->
-</html>
+<!-- #EndTemplate --></html>
diff --git a/examples/web/import/index.jsp b/examples/web/import/index.jsp
new file mode 100644
index 0000000..e410823
--- /dev/null
+++ b/examples/web/import/index.jsp
@@ -0,0 +1,87 @@
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
+<head>
+<!-- #BeginEditable "doctitle" --> 
+<title>JSTL: Import Tags Examples</title>
+<!-- #EndEditable -->
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<link rel="stylesheet" href="../global.css" type="text/css">
+</head>
+
+<body bgcolor="#FFFFFF" text="#000000">
+<table width="100%" border="0" cellpadding="5">
+  <tr>
+    <td height="0"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
+    <td align="center" height="0"><font size="-1" color="#000099"> <b>Beware &#151; 
+      API and Tags may/will change</b></font></td>
+    <td align="right" height="0"><font size="-1" color="#003399"><a href="mailto:taglibs-user@jakarta.apache.org"><b>support</b></a> 
+      &nbsp;&nbsp;<b><a href="mailto:taglibs-dev@jakarta.apache.org">development</a>&nbsp;&nbsp; 
+      <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
+  </tr>
+  <tr> 
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="index.jsp">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../sql/index.jsp">SQL</a> 
+      &#149; <a href="../ecmascript/index.html">EcmaScript</a> &#149; <a href="../misc/index.html">Misc.</a></td>
+  </tr>
+</table>
+<!-- #BeginEditable "body" --> 
+<%@ include file="links.html" %>
+
+<h2>Context Relative Examples</h2>
+<p>For the context relative examples you will need to supply an available relative context name and url before executing the tags.</p>
+
+<form name="myform" action="session.jsp" method="get" >
+  <table width="90%" border="0" cellspacing="0" cellpadding="0">
+    <tr>
+      <td>Context</td>
+      <td>
+        <input type="text" size="40" name="contextName" value="/examples">
+      </td>
+    </tr>
+    <tr>
+      <td>Url</td>
+      <td>
+        <input type="text" size="40" name="contextUrl" value="/jsp/simpletag/foo.jsp">
+      </td>
+    </tr>
+    <tr>
+      <td>Param name:</td>
+      <td><input type="text" size="40" name="paramName1"></td>
+      <td>Param value:</td>
+      <td><input type="text" size="40" name="paramValue1"></td>
+    </tr>
+    <tr>
+      <td>Param name:</td>
+      <td><input type="text" size="40" name="paramName2"></td>
+      <td>Param value:</td>
+      <td><input type="text" size="40" name="paramValue2"></td>
+    </tr>
+    <tr>
+      <td>Param name:</td>
+      <td><input type="text" size="40" name="paramName3"></td>
+      <td>Param value:</td>
+      <td><input type="text" size="40" name="paramValue3"></td>
+    </tr>
+  </table>
+  <p>
+    <input type="submit" name="Submit" value="Submit">
+  </p>
+</form>
+
+<!-- #EndEditable -->
+<hr noshade color="#000099">
+<table width="100%" border="0" cellpadding="5">
+  <tr> 
+    <td height="24"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
+    <td align="center" height="24"><font size="-1" color="#000099"> <b>Beware 
+      &#151; API and Tags may/will change</b></font></td>
+    <td align="right" height="24"><font size="-1" color="#003399"><a href="mailto:taglibs-user@jakarta.apache.org"><b>support</b></a> 
+      <b>&nbsp;&nbsp; <a href="mailto:taglibs-dev@jakarta.apache.org">development</a> 
+      &nbsp;&nbsp;<a href="mailto:jsr052-comments@sun.com">comments to JSR052 
+      EG</a></b></font></td>
+  </tr>
+</table>
+</body>
+<!-- #EndTemplate --></html>
diff --git a/examples/web/import/links.html b/examples/web/import/links.html
new file mode 100644
index 0000000..3cfeeb8
--- /dev/null
+++ b/examples/web/import/links.html
@@ -0,0 +1,50 @@
+<h2>Import Tags Examples</h2>
+<p>If you are using a Proxy server, you will need to set the following System 
+  Properties when starting the VM:</p>
+<pre>
+    http.proxyHost
+    http.proxyPort
+    ftp.proxyHost
+    ftp.proxyPort
+</pre>
+<br>
+<h3>Absolute&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/Absolute.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="Absolute.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+Using an Absolute URL to import a resource. <br>
+<h3>Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/Relative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="Relative.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+Using a Relative URL to import a resource. <br>
+<h3>Absolute (FTP)&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/AbsoluteFtp.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="AbsoluteFtp.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+Using an Absolute URL to import a resource using a different protocol other than 
+HTTP. <br>
+<h3>Encode&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/Encode.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="Encode.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+URL encoding examples. <br>
+<h3>Encode Query String&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/EncodeQueryString.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="EncodeQueryString.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+URL encoding examples using a relative context and query string. <br>
+<h3>String Exposure Absolute&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/ExposeString.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="ExposeString.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+Exposing the content of the resource as a String Object. <br>
+<h3>String Exposure Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/ExposeStringRelative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="ExposeStringRelative.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+Exposing the content of a relative URL's resource as a String Object. <br>
+<h3>Param&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/Param.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="Param.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+Using <param> element to specify request parameters. Also demonstrating how request 
+parameters can be URL encoded (default). (NOTE: Returns error page that shows 
+how request parameters are encoded) <br>
+<h3>Malformed URL&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/StartSlash.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="StartSlash.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+A relative URL must start with a "/" in a foreign context. (NOTE: This example 
+will result in a ServletException describing the error condition). <br>
diff --git a/examples/web/import/relativeLinks.html b/examples/web/import/relativeLinks.html
new file mode 100644
index 0000000..0d6f53d
--- /dev/null
+++ b/examples/web/import/relativeLinks.html
@@ -0,0 +1,10 @@
+<h2>Import Tags Context Relative Examples</h2>
+
+<h3>Context Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/ContextRelative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="ContextRelative.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+Importing a resource relative to a foreign context. <br>
+<h3>Encode Context Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/EncodeContextRelative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="EncodeContextRelative.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+URL encoding examples using a relative context and nested param tags. <br>
diff --git a/examples/web/import/session.jsp b/examples/web/import/session.jsp
new file mode 100644
index 0000000..f35e04b
--- /dev/null
+++ b/examples/web/import/session.jsp
@@ -0,0 +1,33 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
+
+<html>
+<head>
+   <title>Jakarta DBTAGS Taglib Example</title>
+</head>
+<body bgcolor="white">
+
+<%
+  String _param = request.getParameter("contextName");
+  session.setAttribute("_contextName", _param);
+  _param = request.getParameter("contextUrl");
+  session.setAttribute("_contextUrl", _param);
+
+  _param = request.getParameter("paramValue1");
+  session.setAttribute("_paramValue1", _param);
+  _param = request.getParameter("paramValue2");
+  session.setAttribute("_paramValue2", _param);
+  _param = request.getParameter("paramValue3");
+  session.setAttribute("_paramValue3", _param);
+
+  _param = request.getParameter("paramName1");
+  session.setAttribute("_paramName1", _param);
+  _param = request.getParameter("paramName2");
+  session.setAttribute("_paramName2", _param);
+  _param = request.getParameter("paramName3");
+  session.setAttribute("_paramName3", _param);
+%>
+
+<%@ include file="relativeLinks.html" %>
+
+</body>
+</html>
diff --git a/examples/web/index.html b/examples/web/index.html
index 924a7d2..950e9a1 100644
--- a/examples/web/index.html
+++ b/examples/web/index.html
@@ -1,4 +1,4 @@
-<html><!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" -->
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: Examples Web Application</title>
@@ -18,21 +18,16 @@
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="index.html">Introduction</a> 
-      &#149; <a href="iterators/index.html">Iterators</a> &#149; <a href="conditionals/index.html">Conditionals</a> 
-      &#149; <a href="elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      <br />
-      &#149; </font><a href="ecmascript/index.html">EcmaScript</a></font></b></font>
-      <font color="#FFFFFF">&#149;</font> <a href="import/index.html"><b>Import</b></a><font>
-      <font color="#FFFFFF">&#149;</font> <a href="format/index.html"><b>i18n-capable formatting</b></a>
-      <font color="#FFFFFF">&#149;</font> <a href="xml/index.html"><b>XML</b></a>
-   </td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="index.html">Introduction</a> 
+      &#149; <a href="elsupport/index.html">EL Support </a> &#149; <a href="conditionals/index.html">Conditionals</a> 
+      &#149; <a href="iterators/index.html">Iterators</a> 
+      &#149; <a href="import/index.jsp">Import</a> &#149; <a href="format/index.html">I18N 
+      & Formatting</a> &#149; <a href="xml/index.html">XML</a> &#149; <a href="sql/index.jsp">SQL</a> 
+      &#149; <a href="ecmascript/index.html">EcmaScript</a> &#149; <a href="misc/index.html">Misc.</a></td>
   </tr>
 </table>
-<!-- #BeginEditable "body" -->
-<h1>Welcome to the jsptl-examples web application!</h1>
+<!-- #BeginEditable "body" --> 
+<h1>Welcome to the standard-examples web application!</h1>
 <p>This web application includes a variety of sample JSP pages that showcase the 
   JSTL tags currently being specified within the <a href="http://www.jcp.org/jsr/detail/52.jsp">JSR-052 
   Expert Group</a>. 
@@ -40,10 +35,10 @@
   the community informed of the EG's progress as well as to give the community 
   a chance to experiment with the standard tag library (JSTL) early in the specification 
   process so that valuable feedback can quickly be channelled back to the Expert 
-  Group.</b>
+  Group.</b> 
 <h3>Documentation</h3>
-<p>Documentation on the JSTL tags is available at <a href="http://jakarta.apache.org/taglibs/doc/jsptl-doc">http://jakarta.apache.org/taglibs/doc/jsptl-doc</a>. 
-  It is also available as the jsptl-docs web application of the jsptl EA2 release.
+<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>. 
+  It is also available as the standard-doc web application of the JSTL EA3 release. 
 <h3>Mailing Lists</h3>
 <p>There are three ways to obtain information from or send your comments to the 
   JSR052 Expert Group: 
@@ -61,14 +56,17 @@
     received.</li>
 </ol>
 <h3>Examples</h3>
-<p>The JSTL examples have been divided in the following category:</p>
+<p>The JSTL examples have been divided in the following categories:</p>
 <ul>
-  <li><a href="iterators/index.html">Iterator Tags</a> (&lt;forEach&gt;, &lt;forToken&gt;)</li>
-  <li><a href="conditionals/index.html">Conditional Tags</a> (&lt;if&gt;, &lt;choose&gt;)</li>
-  <li><a href="elsupport/index.html">Expression Language Support Tags</a> (&lt;expr&gt;, 
-    &lt;set&gt;, &lt;define&gt;)</li>
-  <li><a href="misc/index.html">Miscellaneous</a> (various tests)</li>
-  <li><a href="ecmascript/index.html">EcmaScript Examples</a> (examples showcasing some of EcmaScript's features)</li>
+  <li><a href="elsupport/index.html">Expression Language Support Tags</a></li>
+  <li><a href="conditionals/index.html">Conditional Tags</a></li>
+  <li><a href="iterators/index.html">Iterator Tags</a></li>
+  <li><a href="import/index.jsp">Import Tags</a> </li>
+  <li><a href="format/index.html">I18N &amp; Formatting Tags</a></li>
+  <li><a href="xml/index.html">XML Tags</a></li>
+  <li><a href="sql/index.jsp">SQL Tags</a></li>
+  <li><a href="ecmascript/index.html">EcmaScript Examples</a></li>
+  <li><a href="misc/index.html">Miscellaneous</a></li>
 </ul>
 <p>The navigation bar at the top of each index page provides quick navigation 
   to each set of example pages.</p>
@@ -102,7 +100,7 @@
     An array of Strings</li>
   <li><code>numberMap</code><br>
     A Map instance associating Integer objects with their Spanish names</li>
-  <li><code>enum</code><br>
+  <li><code>enumeration</code><br>
     An enumeration on numberMap from above.<br>
   </li>
 </ul>
diff --git a/examples/web/iterators/Collaboration.jsp b/examples/web/iterators/Collaboration.jsp
index 1ec0f3e..c9cd856 100644
--- a/examples/web/iterators/Collaboration.jsp
+++ b/examples/web/iterators/Collaboration.jsp
@@ -1,10 +1,10 @@
 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
-<%@ taglib prefix="jr" uri="http://java.sun.com/jstl/ea/jr" %>
+<%@ taglib prefix="jr" uri="http://java.sun.com/jstl/ea/core-rt" %>
 <%@ taglib prefix="ex" uri="/jstl-examples-taglib" %>
 
 <html>
 <head>
-  <title>JSTL: Iterator Support -- Collaboration Example</title>
+  <title>JSTL: Iterator Support 2-- Collaboration Example</title>
 </head>
 <body bgcolor="#FFFFFF">
 <h3>Collaboration</h3>
diff --git a/examples/web/iterators/DataTypes.jsp b/examples/web/iterators/DataTypes.jsp
index 2d641cc..87dc764 100644
--- a/examples/web/iterators/DataTypes.jsp
+++ b/examples/web/iterators/DataTypes.jsp
@@ -21,7 +21,7 @@
 
 <h4>Enumeration (warning: this only works until enumeration is exhausted!)</h4>
 
-<c:forEach var="item" items="$enum" begin="2" end="10" step="2">
+<c:forEach var="item" items="$enumeration" begin="2" end="10" step="2">
   <c:expr value="$item"/><br>
 </c:forEach>
 
diff --git a/examples/web/iterators/SimpleRange.jsp b/examples/web/iterators/SimpleRange.jsp
index 86f5a87..de14d9d 100644
--- a/examples/web/iterators/SimpleRange.jsp
+++ b/examples/web/iterators/SimpleRange.jsp
@@ -11,6 +11,6 @@
 
 <c:forEach var="i" begin="1" end="10">
   <c:expr value="$i"/> &#149;
-</c:forEach> 
+</c:forEach>
 </body>
 </html>
diff --git a/examples/web/iterators/Status.jsp b/examples/web/iterators/Status.jsp
index c362a1d..0b9a47a 100644
--- a/examples/web/iterators/Status.jsp
+++ b/examples/web/iterators/Status.jsp
@@ -26,8 +26,8 @@
       <td><c:expr value="$status.first"/></td>
       <td><c:expr value="$status.last"/></td>
     </tr>
-	<c:if test="$status.last">
-	  <c:set var="count" value="$status.count"/>
+    <c:if test="$status.last">
+      <c:set var="count" value="$status.count"/>
     </c:if>  
   </c:forEach>
 </table>
@@ -38,9 +38,9 @@
 <h4>Iteration using range attributes</h4>
 <c:forEach var="i" begin="100" end="200" step="5" status="status">
   <c:if test="$status.first">
-    begin:<c:expr value="$status.begin">begin</jx:expr> &nbsp; &nbsp; 
-      end:<c:expr value="$status.end">end</jx:expr> &nbsp; &nbsp; 
-     step:<c:expr value="$status.step">step</jx:expr><br>
+    begin:<c:expr value="$status.begin">begin</c:expr> &nbsp; &nbsp; 
+      end:<c:expr value="$status.end">end</c:expr> &nbsp; &nbsp; 
+     step:<c:expr value="$status.step">step</c:expr><br>
     sequence: 
   </c:if>  
   <c:expr value="$i"/> 
diff --git a/examples/web/iterators/index.html b/examples/web/iterators/index.html
index cbedfdb..c358d29 100644
--- a/examples/web/iterators/index.html
+++ b/examples/web/iterators/index.html
@@ -1,22 +1,15 @@
-<html>
-<!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" --> 
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: Iterator Tags Examples</title>
-<!-- #EndEditable --> 
+<!-- #EndEditable -->
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
-<script language="JavaScript">
-<!--
-function MM_callJS(jsStr) { //v2.0
-  return eval(jsStr)
-}
-//-->
-</script>
 </head>
+
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
-  <tr> 
+  <tr>
     <td height="0"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
     <td align="center" height="0"><font size="-1" color="#000099"> <b>Beware &#151; 
       API and Tags may/will change</b></font></td>
@@ -25,13 +18,12 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="index.html">Iterators</a> 
+      &#149; <a href="../import/index.jsp">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../sql/index.jsp">SQL</a> 
+      &#149; <a href="../ecmascript/index.html">EcmaScript</a> &#149; <a href="../misc/index.html">Misc.</a></td>
   </tr>
 </table>
 <!-- #BeginEditable "body" --> 
@@ -41,7 +33,7 @@ function MM_callJS(jsStr) { //v2.0
 </h3>
 Simply displays the default <code>toString()</code> value of the items in the 
 <code>Customers</code> collection.<br>
-<h3> Range &nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/iterators/SimpleRange.jsp"><img src="../images/code.gif" width="24" height="24" onMouseDown="MM_callJS('showJspCode(\&quot;Simple2.jsp\&quot;)')" border="0"></a> 
+<h3> Range &nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/iterators/SimpleRange.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="SimpleRange.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 <p>Another simple example. Similar to the previous one, except that in this case 
@@ -50,19 +42,19 @@ Simply displays the default <code>toString()</code> value of the items in the
   the range attributes must be used to iterate a specific number of times over 
   the tag's body. In this example, we simply iterate over the integer values specified 
   by the range attributes.</p>
-<h3>Data Types&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/iterators/DataTypes.jsp"><img src="../images/code.gif" width="24" height="24" onMouseDown="MM_callJS('showJspCode(\&quot;Simple2.jsp\&quot;)')" border="0"></a>&nbsp;<a href="DataTypes.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
+<h3>Data Types&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/iterators/DataTypes.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>&nbsp;<a href="DataTypes.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
 <p>The <code>&lt;forEach&gt;</code> tag supports a large number of data types 
   for the collection of objects to iterate over. In this example, we feature the 
   following data types: array of primitives, array of objects, Enumeration, Properties 
   (Map), String (Comma Separated Values).</p>
-<h3>Iteration Status&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/iterators/Status.jsp"><img src="../images/code.gif" width="24" height="24" onMouseDown="MM_callJS('showJspCode(\&quot;Simple2.jsp\&quot;)')" border="0"></a>&nbsp;<a href="Status.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
+<h3>Iteration Status&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/iterators/Status.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>&nbsp;<a href="Status.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
 <p>The iterator tag exposes a wealth of information relative to the iteration 
   taking place. This example features some of that status information.</p>
-<h3>Collaboration&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/iterators/Collaboration.jsp"><img src="../images/code.gif" width="24" height="24" onMouseDown="MM_callJS('showJspCode(\&quot;Simple2.jsp\&quot;)')" border="0"></a>&nbsp;<a href="Collaboration.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
+<h3>Collaboration&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/iterators/Collaboration.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>&nbsp;<a href="Collaboration.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
 <p>The iterator tags expose interface IteratorTag to allow custom tags to establish 
   implicit collaboration. This example shows two custom tags, &lt;even&gt; and 
   &lt;odd&gt; who take advantage of this implicit collaboration.</p>
-<h3>&lt;forTokens&gt;&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/iterators/ForTokens.jsp"><img src="../images/code.gif" width="24" height="24" onMouseDown="MM_callJS('showJspCode(\&quot;Simple2.jsp\&quot;)')" border="0"></a>&nbsp;<a href="ForTokens.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
+<h3>&lt;forTokens&gt;&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/iterators/ForTokens.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>&nbsp;<a href="ForTokens.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
 <p>The &lt;forEach&gt; tag provides the basic iteration capabilities. &lt;forTokens&gt; 
   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 
@@ -71,7 +63,7 @@ Simply displays the default <code>toString()</code> value of the items in the
 <p>JSTL exposes in its API the abstract class IteratorTagSupport 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 --> 
+<!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
@@ -85,5 +77,4 @@ Simply displays the default <code>toString()</code> value of the items in the
   </tr>
 </table>
 </body>
-<!-- #EndTemplate -->
-</html>
+<!-- #EndTemplate --></html>
diff --git a/examples/web/misc/index.html b/examples/web/misc/index.html
index 79b5533..5031926 100644
--- a/examples/web/misc/index.html
+++ b/examples/web/misc/index.html
@@ -1,4 +1,4 @@
-<html><!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" -->
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: Miscellaneous Examples</title>
@@ -18,13 +18,12 @@
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.jsp">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../sql/index.jsp">SQL</a> 
+      &#149; <a href="../ecmascript/index.html">EcmaScript</a> &#149; <a href="index.html">Misc.</a></td>
   </tr>
 </table>
 <!-- #BeginEditable "body" --> 
@@ -33,7 +32,7 @@
   <a href="../misc/IteratorTest.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Some tests on the iterator tags.<br>
-<!-- #EndEditable --> 
+<!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
diff --git a/examples/web/sql/DriverSetup.jsp b/examples/web/sql/DriverSetup.jsp
new file mode 100644
index 0000000..409ab2e
--- /dev/null
+++ b/examples/web/sql/DriverSetup.jsp
@@ -0,0 +1,22 @@
+<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/ea/sql" %>
+
+<html>
+<head>
+  <title>JSTL: SQL action examples</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<h1>SQL Driver Setup Example</h1>
+
+<code>
+<pre>
+&lt;sql:driver
+  var="example"
+  driver="RmiJdbc.RJDriver"
+  jdbcURL="jdbc:rmi://gibson:1099/jdbc:cloudscape:CloudscapeDB"
+/&gt;
+</pre>
+</code>
+
+</body>
+</html>
diff --git a/examples/web/sql/QueryDirect.jsp b/examples/web/sql/QueryDirect.jsp
new file mode 100644
index 0000000..460f5aa
--- /dev/null
+++ b/examples/web/sql/QueryDirect.jsp
@@ -0,0 +1,108 @@
+<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/ea/sql" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
+
+<html>
+<head>
+  <title>JSTL: SQL action examples</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<h1>SQL Direct Query Execution</h1>
+<p>This example demonstrates how the row and columns can be directly accessed using various direct mechanisms.<p>
+
+
+<!-- NOTE: the sql:driver tag is for prototyping and simple applications. You should really use a DataSource object instead --!>
+
+<sql:driver
+  var="example"
+  driver="$myDbDriver"
+  jdbcURL="$myDbUrl"
+/>
+
+<sql:transaction dataSource="$example">
+
+  <sql:update var="newTable" dataSource="$example">
+    create table mytable (
+      nameid int not null,
+      name varchar(80) null,
+      constraint pk_mytable primary key (nameid)
+    )
+  </sql:update>
+
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (1,'Paul Oakenfold')
+  </sql:update>
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (2,'Timo Maas')
+  </sql:update>
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (3,'Paul van Dyk')
+  </sql:update>
+
+  <sql:query var="deejays" dataSource="$example">
+    SELECT * FROM mytable
+  </sql:query>
+
+</sql:transaction>
+
+<hr>
+
+<h2>Using the Row index and Column name</h2>
+Row[0].get('nameid'): <c:expr value="$deejays.rows[0].get('nameid')" />
+<br>
+Row[0].get('name'): <c:expr value="$deejays.rows[0].get('name')" />
+<br>
+Row[1].get('nameid'): <c:expr value="$deejays.rows[1].get('nameid')" />
+<br>
+Row[1].get('name'): <c:expr value="$deejays.rows[1].get('name')" />
+<br>
+Row[2].get('nameid'): <c:expr value="$deejays.rows[2].get('nameid')" />
+<br>
+Row[2].get('name'): <c:expr value="$deejays.rows[2].get('name')" />
+<br>
+
+<hr>
+
+<h2>Using the Row index and Column object</h2>
+Row[0]Cols[0]: <c:expr value="$deejays.rows[0].columns[0]" />
+<br>
+Row[0]Cols[1]: <c:expr value="$deejays.rows[0].columns[1]" />
+<br>
+Row[1]Cols[0]: <c:expr value="$deejays.rows[1].columns[0]" />
+<br>
+Row[1]Cols[1]: <c:expr value="$deejays.rows[1].columns[1]" />
+<br>
+Row[2]Cols[0]: <c:expr value="$deejays.rows[2].columns[0]" />
+<br>
+Row[2]Cols[1]: <c:expr value="$deejays.rows[2].columns[1]" />
+<br>
+
+<hr>
+
+<h2>Using the Row and Column indexes</h2>
+Row[0].get(0): <c:expr value="$deejays.rows[0].get(0)" />
+<br>
+Row[0].get(1): <c:expr value="$deejays.rows[0].get(1)" />
+<br>
+Row[1].get(0): <c:expr value="$deejays.rows[1].get(0)" />
+<br>
+Row[1].get(1): <c:expr value="$deejays.rows[1].get(1)" />
+<br>
+Row[2].get(0): <c:expr value="$deejays.rows[2].get(0)" />
+<br>
+Row[2].get(1): <c:expr value="$deejays.rows[2].get(1)" />
+<br>
+
+<hr>
+
+<h2>Getting the MetaData from the Column Object</h2>
+Col[0]MetaData: <c:expr value="$deejays.metaData.columns[0].name" />
+<br>
+Col[1]MetaData: <c:expr value="$deejays.metaData.columns[1].name" />
+
+<sql:update var="newTable" dataSource="$example">
+  drop table mytable
+</sql:update>
+
+</body>
+</html>
diff --git a/examples/web/sql/QueryIterate.jsp b/examples/web/sql/QueryIterate.jsp
new file mode 100644
index 0000000..bc2e900
--- /dev/null
+++ b/examples/web/sql/QueryIterate.jsp
@@ -0,0 +1,123 @@
+<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/ea/sql" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
+
+<html>
+<head>
+  <title>JSTL: SQL action examples</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<h1>SQL Query Execution using an iterator</h1>
+
+
+<!-- NOTE: the sql:driver tag is for prototyping and simple applications. You should really use a DataSource object instead --!>
+
+<sql:driver
+  var="example"
+  driver="$myDbDriver"
+  jdbcURL="$myDbUrl"
+/>
+
+<sql:transaction dataSource="$example">
+
+  <sql:update var="newTable" dataSource="$example">
+    create table mytable (
+      nameid int not null,
+      name varchar(80) null,
+      constraint pk_mytable primary key (nameid)
+    )
+  </sql:update>
+
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (1,'Paul Oakenfold')
+  </sql:update>
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (2,'Timo Maas')
+  </sql:update>
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (3,'Paul van Dyk')
+  </sql:update>
+
+
+  <sql:query var="deejays" dataSource="$example">
+    SELECT * FROM mytable
+  </sql:query>
+
+</sql:transaction>
+
+<hr>
+
+<h2>Iterating on each Row using the MetaData</h2>
+
+<table border="1">
+  <c:forEach var="rows" items="$deejays.rows">
+    <tr>
+      <td> id: <c:expr value="$rows.get('nameid')"/> </td>
+      <td> name: <c:expr value="$rows.get('name')"/> </td>
+    </tr>
+  </c:forEach>
+</table>
+
+<hr>
+
+<h2>Iterating on each Column getting the MetaData</h2>
+
+<c:forEach var="metaData" items="$deejays.metaData.columns">
+  metaData: <c:expr value="$metaData.name"/> <br>
+</c:forEach>
+
+<hr>
+
+<h2>Iterating over each Row of the result</h2>
+
+<table border="1">
+  <c:forEach var="rows" items="$deejays.rows">
+    <tr>
+      <c:forEach var="column" items="$rows.columns">
+        <td><c:expr value="$column"/></td>
+      </c:forEach>
+    </tr>
+  </c:forEach>
+</table>
+
+<hr>
+
+<h2>Iterating over Columns without knowing the name or index</h2>
+
+<table border="1">
+  <c:forEach var="rows" items="$deejays.rows">
+      <c:forEach var="column" items="$rows.columns">
+  <tr>
+        <td>Name: <c:expr value="$column.name"/></td>
+        <td>Value: <c:expr value="$column"/></td>
+  </tr>
+      </c:forEach>
+  </c:forEach>
+</table>
+
+<hr>
+
+<h2>Putting it all together</h2>
+
+<table border="1">
+  <tr>
+    <c:forEach var="metaData" items="$deejays.metaData.columns">
+      <th><c:expr value="$metaData.name"/> </th>
+    </c:forEach>
+  </tr>
+  <c:forEach var="rows" items="$deejays.rows">
+    <tr>
+      <c:forEach var="column" items="$rows.columns">
+        <td><c:expr value="$column"/></td>
+      </c:forEach>
+    </tr>
+  </c:forEach>
+</table>
+
+<sql:update var="newTable" dataSource="$example">
+  drop table mytable
+</sql:update>
+
+
+</body>
+</html>
diff --git a/examples/web/sql/QueryParam.jsp b/examples/web/sql/QueryParam.jsp
new file mode 100644
index 0000000..778b3d0
--- /dev/null
+++ b/examples/web/sql/QueryParam.jsp
@@ -0,0 +1,71 @@
+<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/ea/sql" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
+
+<html>
+<head>
+  <title>JSTL: SQL action examples</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<% request.setAttribute("newName", new String("Paul van Dyk")); %>
+
+<h1>SQL Query Execution using parameters</h1>
+<p>Using parameter marker's to insert values in the SQL statements</p>
+
+
+
+<!-- NOTE: the sql:driver tag is for prototyping and simple applications. You should really use a DataSource object instead --!>
+
+<sql:driver
+  var="example"
+  driver="$myDbDriver"
+  jdbcURL="$myDbUrl"
+/>
+
+<sql:transaction dataSource="$example">
+
+  <sql:update var="newTable" dataSource="$example">
+    create table mytable (
+      nameid int not null,
+      name varchar(80) null,
+      constraint pk_mytable primary key (nameid)
+    )
+  </sql:update>
+
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (1,'Paul Oakenfold')
+  </sql:update>
+
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (?,'Timo Maas')
+      <sql:param value="2"/>
+  </sql:update>
+
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (?,?)
+      <sql:param value="3"/>
+      <sql:param value="$newName"/>
+  </sql:update>
+
+<sql:query var="deejay" dataSource="$example">
+  SELECT * FROM mytable
+</sql:query>
+
+</sql:transaction>
+
+<table border="1">
+  <c:forEach var="rows" items="$deejay.rows">
+    <tr>
+      <td><c:expr value="$rows.get('nameid')"/></td>
+      <td><c:expr value="$rows.get('name')"/></td>
+    </tr>
+    </c:forEach>
+</table>
+
+<sql:update var="newTable" dataSource="$example">
+  drop table mytable
+</sql:update>
+
+
+</body>
+</html>
diff --git a/examples/web/sql/Transaction.jsp b/examples/web/sql/Transaction.jsp
new file mode 100644
index 0000000..7785cc4
--- /dev/null
+++ b/examples/web/sql/Transaction.jsp
@@ -0,0 +1,59 @@
+<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/ea/sql" %>
+
+<html>
+<head>
+  <title>JSTL: SQL action examples</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<h1>SQL Transactions</h1>
+
+
+<!-- NOTE: the sql:driver tag is for prototyping and simple applications. You should really use a DataSource object instead --!>
+
+<sql:driver
+  var="example"
+  driver="$myDbDriver"
+  jdbcURL="$myDbUrl"
+/>
+
+<p>You can group transactions together using the &lt;sql:transaction&gt; tag.</p>
+
+<h2>Dropping table and creating table using a transaction</h2>
+
+<sql:transaction dataSource="$example">
+  <sql:update var="newTable" dataSource="$example">
+    create table mytable (
+      nameid int not null,
+      name varchar(80) null,
+      constraint pk_mytable primary key (nameid)
+    )
+  </sql:update>
+</sql:transaction>
+
+<p>DONE: Dropping table and creating table using a transaction</p>
+
+<hr>
+
+<h2>Populating table in one transaction</h2>
+
+<sql:transaction dataSource="$example">
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (1,'Paul Oakenfold')
+  </sql:update>
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (2,'Timo Maas')
+  </sql:update>
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (3,'Paul van Dyk')
+  </sql:update>
+</sql:transaction>
+
+<p>DONE: Populating table in one transaction</p>
+
+<sql:update var="newTable" dataSource="$example">
+  drop table mytable
+</sql:update>
+
+</body>
+</html>
diff --git a/examples/web/sql/Update.jsp b/examples/web/sql/Update.jsp
new file mode 100644
index 0000000..80c5fc3
--- /dev/null
+++ b/examples/web/sql/Update.jsp
@@ -0,0 +1,106 @@
+<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/ea/sql" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
+
+<html>
+<head>
+  <title>JSTL: SQL action examples</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<h1>SQL Update Execution</h1>
+
+
+<!-- NOTE: the sql:driver tag is for prototyping and simple applications. You should really use a DataSource object instead --!>
+
+<sql:driver
+  var="example"
+  driver="$myDbDriver"
+  jdbcURL="$myDbUrl"
+/>
+
+<hr>
+
+<sql:transaction dataSource="$example">
+
+  <sql:update var="newTable" dataSource="$example">
+    create table mytable (
+      nameid int not null,
+      name varchar(80) null,
+      constraint pk_mytable primary key (nameid)
+    )
+  </sql:update>
+
+<h2>Inserting three rows into table</h2>
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (1,'Paul Oakenfold')
+  </sql:update>
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (2,'Timo Maas')
+  </sql:update>
+  <sql:update var="updateCount" dataSource="$example">
+    INSERT INTO mytable VALUES (3,'Paul van Dyk')
+  </sql:update>
+
+<p>DONE: Inserting three rows into table</p>
+
+
+  <sql:query var="deejays" dataSource="$example">
+    SELECT * FROM mytable
+  </sql:query>
+
+</sql:transaction>
+
+
+<table border="1">
+  <tr>
+    <c:forEach var="metaData" items="$deejays.metaData.columns">
+      <th><c:expr value="$metaData.name"/> </th>
+    </c:forEach>
+  </tr>
+  <c:forEach var="rows" items="$deejays.rows">
+    <tr>
+      <c:forEach var="column" items="$rows.columns">
+        <td><c:expr value="$column"/></td>
+      </c:forEach>
+    </tr>
+  </c:forEach>
+</table>
+
+
+<h2>Deleting second row from table</h2>
+
+  <sql:update var="updateCount" dataSource="$example">
+    DELETE FROM mytable WHERE nameid=2
+  </sql:update>
+
+<p>DONE: Deleting second row from table</p>
+
+<sql:query var="deejays" dataSource="$example">
+  SELECT * FROM mytable
+</sql:query>
+
+
+<table border="1">
+  <tr>
+    <c:forEach var="metaData" items="$deejays.metaData.columns">
+      <th><c:expr value="$metaData.name"/> </th>
+    </c:forEach>
+  </tr>
+  <c:forEach var="rows" items="$deejays.rows">
+    <tr>
+      <c:forEach var="column" items="$rows.columns">
+        <td><c:expr value="$column"/></td>
+      </c:forEach>
+    </tr>
+  </c:forEach>
+</table>
+
+
+
+<sql:update var="newTable" dataSource="$example">
+  drop table mytable
+</sql:update>
+
+
+</body>
+</html>
diff --git a/examples/web/misc/index.html b/examples/web/sql/index.jsp
similarity index 51%
copy from examples/web/misc/index.html
copy to examples/web/sql/index.jsp
index 79b5533..e6c2410 100644
--- a/examples/web/misc/index.html
+++ b/examples/web/sql/index.jsp
@@ -1,15 +1,15 @@
-<html><!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" -->
+<html>
+<!-- #BeginTemplate "/Templates/ExamplesTemplate.dwt" --> 
 <head>
 <!-- #BeginEditable "doctitle" --> 
-<title>JSTL: Miscellaneous Examples</title>
-<!-- #EndEditable -->
+<title>Untitled Document</title>
+<!-- #EndEditable --> 
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
 </head>
-
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
-  <tr>
+  <tr> 
     <td height="0"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
     <td align="center" height="0"><font size="-1" color="#000099"> <b>Beware &#151; 
       API and Tags may/will change</b></font></td>
@@ -18,21 +18,39 @@
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../import/index.jsp">Import</a> 
+      &#149; <a href="../format/index.html">I18N & Formatting</a> &#149; <a href="../xml/index.html">XML</a> 
+      &#149; <a href="index.jsp">SQL</a> &#149; <a href="../ecmascript/index.html">EcmaScript</a> 
+      &#149; <a href="../misc/index.html">Misc.</a></td>
   </tr>
 </table>
 <!-- #BeginEditable "body" --> 
-<h2>Miscellaneous</h2>
-<h3>Iterator Tags Tests&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/misc/IteratorTest.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
-  <a href="../misc/IteratorTest.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
-</h3>
-Some tests on the iterator tags.<br>
+<h1>SQL Tags Examples</h1>
+<p>Enter your Driver Name and DataBase URL name to test Database Tag Library. 
+  NOTE: You can access the tags directly at the bottom of the page to look at 
+  the source, but they will NOT run properly without the correct database driver 
+  and url.</p>
+<form name="myform" action="session.jsp" method="get" >
+  <table width="90%" border="0" cellspacing="0" cellpadding="0">
+    <tr> 
+      <td>Driver</td>
+      <td> 
+        <input type="text" size="40" name="dbDriver" value="RmiJdbc.RJDriver">
+      </td>
+    </tr>
+    <tr> 
+      <td>URL</td>
+      <td> 
+        <input type="text" size="40" name="dbUrl" value="jdbc:rmi://gibson:1099/jdbc:cloudscape:CloudscapeDB">
+      </td>
+    </tr>
+  </table>
+  <p> 
+    <input type="submit" name="Submit" value="Submit">
+  </p>
+</form>
 <!-- #EndEditable --> 
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
@@ -47,4 +65,5 @@ Some tests on the iterator tags.<br>
   </tr>
 </table>
 </body>
-<!-- #EndTemplate --></html>
+<!-- #EndTemplate -->
+</html>
diff --git a/examples/web/sql/links.html b/examples/web/sql/links.html
new file mode 100644
index 0000000..7def9d7
--- /dev/null
+++ b/examples/web/sql/links.html
@@ -0,0 +1,32 @@
+<h2>DataBase Tags Examples</h2>
+
+<h3>Query Iterate&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/sql/QueryIterate.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="QueryIterate.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+Example showing how to iterate over the result of a query.<br>
+
+<h3>Update&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/sql/Update.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="Update.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+Example showing several database updates.<br>
+
+<h3>Direct Query&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/sql/QueryDirect.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="QueryDirect.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+Example showing how the the result of a query can be directly accessed.<br>
+
+<h3>Query Parameters&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/sql/QueryParam.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="QueryParam.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+Example showing how query parameters can be used to create an SQL query.<br>
+
+<h3>Transaction&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/sql/Transaction.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="Transaction.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+Example showing how to setup transactions.<br>
+
+<h3>Driver Setup&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/sql/DriverSetup.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+  <a href="DriverSetup.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
+</h3>
+A sample page showing how a driver can be configured. NOTE: this is meant for prototyping and simple applications.<br>
+
diff --git a/examples/web/sql/session.jsp b/examples/web/sql/session.jsp
new file mode 100644
index 0000000..b7ae536
--- /dev/null
+++ b/examples/web/sql/session.jsp
@@ -0,0 +1,19 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
+
+<html>
+<head>
+   <title>Jakarta DBTAGS Taglib Example</title>
+</head>
+<body bgcolor="white">
+
+<%
+  String _url = request.getParameter("dbUrl");
+  session.setAttribute("myDbUrl", _url);
+  String _driver = request.getParameter("dbDriver");
+  session.setAttribute("myDbDriver", _driver);
+%>
+
+<%@ include file="links.html" %>
+
+</body>
+</html>
diff --git a/examples/web/xml/index.html b/examples/web/xml/index.html
index 6846a11..6f4d01e 100644
--- a/examples/web/xml/index.html
+++ b/examples/web/xml/index.html
@@ -1,22 +1,15 @@
-<html>
-<!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" --> 
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: EcmaScript Tags Examples</title>
-<!-- #EndEditable --> 
+<!-- #EndEditable -->
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
-<script language="JavaScript">
-<!--
-function MM_callJS(jsStr) { //v2.0
-  return eval(jsStr)
-}
-//-->
-</script>
 </head>
+
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
-  <tr> 
+  <tr>
     <td height="0"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
     <td align="center" height="0"><font size="-1" color="#000099"> <b>Beware &#151; 
       API and Tags may/will change</b></font></td>
@@ -25,84 +18,41 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.jsp">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="index.html">XML</a> &#149; <a href="../sql/index.jsp">SQL</a> 
+      &#149; <a href="../ecmascript/index.html">EcmaScript</a> &#149; <a href="../misc/index.html">Misc.</a></td>
   </tr>
 </table>
-
 <!-- #BeginEditable "body" --> 
 <h2>XML Examples</h2>
-
 <h3>Expr &nbsp;&nbsp; 
- <a href="../ShowSource.jsp?filename=/xml/Expr.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="Expr.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<a href="../ShowSource.jsp?filename=/xml/Expr.jsp"> <img src="../images/code.gif" width="24" height="24" border="0"></a> 
+<a href="Expr.jsp"> <img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
 Retrieving a String from a parsed XML document <br />
-
-<h3>Filter  &nbsp;&nbsp; 
- <a href="../ShowSource.jsp?filename=/xml/Filter.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="Filter.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<h3>Filter &nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/xml/Filter.jsp"> 
+  <img src="../images/code.gif" width="24" height="24" border="0"></a> <a href="Filter.jsp"> 
+  <img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
 Applying a SAX XMLFilter object to a document before parsing <br />
-
-<h3>ForEach &nbsp;&nbsp; 
- <a href="../ShowSource.jsp?filename=/xml/ForEach.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="ForEach.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<h3>ForEach &nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/xml/ForEach.jsp"> 
+  <img src="../images/code.gif" width="24" height="24" border="0"></a> <a href="ForEach.jsp"> 
+  <img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
 Iterating over XML nodes <br />
-
-<h3>If &nbsp;&nbsp; 
- <a href="../ShowSource.jsp?filename=/xml/If.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="If.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<h3>If &nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/xml/If.jsp"> <img src="../images/code.gif" width="24" height="24" border="0"></a> 
+<a href="If.jsp"> <img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
 Basing a decision on the status of an XML document <br />
-
-<h3>Set &nbsp;&nbsp; 
- <a href="../ShowSource.jsp?filename=/xml/Set.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="Set.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<h3>Set &nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/xml/Set.jsp"> <img src="../images/code.gif" width="24" height="24" border="0"></a>
+<a href="Set.jsp"> <img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
 Storing an object resulting from an XPath expression <br />
-
-<h3>Transform &nbsp;&nbsp; 
- <a href="../ShowSource.jsp?filename=/xml/Transform.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="Transform.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<h3>Transform &nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/xml/Transform.jsp"> 
+  <img src="../images/code.gif" width="24" height="24" border="0"></a> <a href="Transform.jsp"> 
+  <img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
 Applying XSLT transformations <br />
-
-<h3>When &nbsp;&nbsp;
- <a href="../ShowSource.jsp?filename=/xml/When.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="When.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<h3>When &nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/xml/When.jsp"> <img src="../images/code.gif" width="24" height="24" border="0"></a> <a href="When.jsp"> <img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
 Mutually exclusive conditionals based on the status of an XML document <br />
-
-<!-- #EndEditable --> 
-
+<!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
@@ -116,5 +66,4 @@ Mutually exclusive conditionals based on the status of an XML document <br />
   </tr>
 </table>
 </body>
-<!-- #EndTemplate -->
-</html>
+<!-- #EndTemplate --></html>
diff --git a/lib/jdbc2_0-stdext.jar b/lib/jdbc2_0-stdext.jar
new file mode 100644
index 0000000..ddafa13
Binary files /dev/null and b/lib/jdbc2_0-stdext.jar differ
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java b/src/javax/servlet/jsp/jstl/core/ConditionalTagSupport.java
similarity index 57%
copy from src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java
copy to src/javax/servlet/jsp/jstl/core/ConditionalTagSupport.java
index d6d3143..c7d7c58 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java
+++ b/src/javax/servlet/jsp/jstl/core/ConditionalTagSupport.java
@@ -53,102 +53,116 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.common.fmt;
+package javax.servlet.jsp.jstl.core;
 
-import java.util.TimeZone;
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;
-import org.apache.taglibs.standard.tag.common.core.Util;
-import org.apache.taglibs.standard.resources.Resources;
 
 /**
- * Support for tag handlers for &lt;timezone&gt;, the timezone tag in
- * JSTL 1.0.
+ * <p>ConditionalTagSupport is an abstract class that facilitates
+ * implementation of conditional tags -- specifically, tags in the style
+ * of &lt;if&gt;.</p>
  *
- * @author Jan Luehe
+ * <p>In particular, this base class provides support for:</p>
+ * 
+ * <ul>
+ *  <li> conditional execution based on an overridable <tt>condition()</tt>
+ *       method </li>
+ *  <li> scoped attributes storing the result (as a Boolean) of the
+ *       logic executed by a subclass (optionally by attribute) </li>
+ * </ul>
+ *
+ * <p>Since this method implements the behavior anticipated to be
+ * recommended by the standard (with respect to tags that support
+ * boolean logic), it is expected that it will be part of the JSTL API.
+ * </p>
+ * 
+ * @author Shawn Bayern
  */
 
-public abstract class TimeZoneSupport extends BodyTagSupport {
-
+public abstract class ConditionalTagSupport
+    extends TagSupport
+{
     //*********************************************************************
-    // Package-scoped constants
+    // Abstract methods
 
-    static final String TIMEZONE_ATTRIBUTE =
-	"javax.servlet.jsp.jsptl.i18n.timeZone";
+    /**
+     * <p>Returns a <tt>boolean</tt> representing the condition that
+     * a particular subclass uses to drive its conditional logic.
+     *
+     * @return a boolean representing the result of arbitrary logic
+     *         that will be used to drive a tag's behavior
+     */
+    protected abstract boolean condition() throws JspException;
 
 
     //*********************************************************************
-    // Protected state
+    // Constructor
+
+    /**
+     * Base constructor to initialize local state.  As with TagSupport,
+     * subclasses should not provide other constructors and are expected
+     * to call the superclass constructor.
+     */
+    public ConditionalTagSupport() {
+        super();
+        init();
+    }
 
-    protected String value;                      // 'value' attribute
-  
 
     //*********************************************************************
-    // Private state
+    // Lifecycle management and implementation of conditional behavior
 
-    private int scope;                           // 'scope' attribute
-    private String var;                          // 'var' attribute
-    private TimeZone timeZone;
+    // Includes its body if condition() evalutes to true.
+    public int doStartTag() throws JspException {
 
+        // execute our condition() method once per invocation
+        result = condition();
 
-    //*********************************************************************
-    // Constructor and initialization
+        // expose variables if appropriate
+        exposeVariables();
 
-    public TimeZoneSupport() {
-	super();
-	init();
+        // handle conditional behavior
+        if (result)
+            return EVAL_BODY_INCLUDE;
+        else
+            return SKIP_BODY;
     }
 
-    private void init() {
-	value = var = null;
-	scope = PageContext.PAGE_SCOPE;
+    // Releases any resources we may have (or inherit)
+    public void release() {
+        super.release();
+        init();
     }
 
+    //*********************************************************************
+    // Private state
 
-   //*********************************************************************
-    // Tag attributes known at translation time
-
-    public void setVar(String var) {
-        this.var = var;
-    }
-
-    public void setScope(String scope) {
-	this.scope = Util.getScope(scope);
-    }
+    private boolean result;             // the saved result of condition()
+    private String var;			// scoped attribute name
 
 
     //*********************************************************************
-    // Collaboration with subtags
+    // Accessors
 
-    public TimeZone getTimeZone() {
-	return timeZone;
+    // for tag attribute
+    public void setVar(String var) {
+	this.var = var;
     }
 
 
     //*********************************************************************
-    // Tag logic
+    // Utility methods
 
-    public int doStartTag() throws JspException {
-	timeZone = TimeZone.getTimeZone(value);
-	return EVAL_BODY_INCLUDE;
+    // expose attributes if we have a non-null 'var'
+    private void exposeVariables() {
+        if (var != null)
+            pageContext.setAttribute(var, new Boolean(result));
     }
 
-    public int doEndTag() throws JspException {
-	if (var != null) {
-	    pageContext.setAttribute(var, timeZone, scope);	
-	} else if (getBodyContent() == null) {
-	    /*
-	     * If no 'var' attribute and no body, we store our time zone
-	     * in the javax.servlet.jsp.jsptl.i18n.timeZone scoped attribute
-	     */
-	    pageContext.setAttribute(TIMEZONE_ATTRIBUTE, timeZone, scope);
-	}
-
-	return EVAL_PAGE;
-    }
-
-    // Releases any resources we may have (or inherit)
-    public void release() {
-	init();
+    // initializes internal state
+    private void init() {
+        result = false;                 // not really necessary
+	var = null;
     }
 }
diff --git a/src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java b/src/javax/servlet/jsp/jstl/core/ExpressionException.java
similarity index 75%
copy from src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java
copy to src/javax/servlet/jsp/jstl/core/ExpressionException.java
index d312013..441a1c7 100644
--- a/src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java
+++ b/src/javax/servlet/jsp/jstl/core/ExpressionException.java
@@ -53,32 +53,35 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.rt.xml;
+package javax.servlet.jsp.jstl.core;
 
-import javax.servlet.jsp.*;
-import javax.servlet.jsp.tagext.*;
-import org.apache.taglibs.standard.tag.common.xml.*;
+import javax.servlet.jsp.JspException;
 
 /**
- * <p>A handler for &lt;param&gt; that supports rtexprvalue-based
- * attributes.</p>
+ * <p>ExpressionException indicates an error related to the evaluation of
+ * a specific expression.  An ExpressionException should not be thrown
+ * as the result of any general expression-processing error that might
+ * affect the evaluation of other exceptions in the future.  JSTL tags
+ * and other custom-action handlers may catch ExpressionExceptions if
+ * they wish to detect the failure of a specific expression to complete
+ * evaluation satisfactorily.</p>
  *
  * @author Shawn Bayern
  */
 
-public class ParamTag extends ParamSupport {
+public class ExpressionException extends JspException {
 
-    //*********************************************************************
-    // Accessor methods
-
-    // for tag attribute
-    public void setName(String name) throws JspTagException {
-        this.name = name;
+    /**
+     * Constructs an ExpressionException with no message.
+     */
+    public ExpressionException() {
+	super();
     }
 
-    // for tag attribute
-    public void setValue(String value) throws JspTagException {
-        this.value = value;
+    /**
+     * Constructs an ExpressionException with a String message.
+     */
+    public ExpressionException(String message) {
+	super(message);
     }
-
 }
diff --git a/src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java b/src/javax/servlet/jsp/jstl/core/IteratorTag.java
similarity index 67%
copy from src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java
copy to src/javax/servlet/jsp/jstl/core/IteratorTag.java
index d312013..254d321 100644
--- a/src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java
+++ b/src/javax/servlet/jsp/jstl/core/IteratorTag.java
@@ -53,32 +53,41 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.rt.xml;
+package javax.servlet.jsp.jstl.core;
 
-import javax.servlet.jsp.*;
-import javax.servlet.jsp.tagext.*;
-import org.apache.taglibs.standard.tag.common.xml.*;
+import javax.servlet.jsp.tagext.Tag;
 
 /**
- * <p>A handler for &lt;param&gt; that supports rtexprvalue-based
- * attributes.</p>
+ * <p>JSTL 1.0 allows developers to write custom iteration tags by
+ * implementing the IteratorTag interface.  (This is not to be confused
+ * with javax.servlet.jsp.tagext.IterationTag as defined in JSP 1.2.)
+ * IteratorTag establishes a mechanism for iteration tags to be recognized
+ * and for type-safe communication with custom subtags.
+ * 
+ * <p>In most cases, it will not be necessary to implement this interface
+ * manually, for a base support class (IteratorTagSupport) is provided
+ * to facilitate implementation.</p>
  *
  * @author Shawn Bayern
  */
 
-public class ParamTag extends ParamSupport {
+public interface IteratorTag extends Tag {
 
-    //*********************************************************************
-    // Accessor methods
-
-    // for tag attribute
-    public void setName(String name) throws JspTagException {
-        this.name = name;
-    }
-
-    // for tag attribute
-    public void setValue(String value) throws JspTagException {
-        this.value = value;
-    }
+    /**
+     * Retrieves the current item in the iteration.  Behaves
+     * idempotently; calling getCurrent() repeatedly should return the same
+     * Object until the iteration is advanced.  (Specifically, calling
+     * getCurrent() does <b>not</b> advance the iteration.)
+     *
+     * @return the current item as an object
+     */
+    public Object getCurrent();
 
+    /**
+     * Retrieves a 'status' object to provide information about the
+     * current round of the iteration.
+     *
+     * @return the IteratorTagStatus for the current IteratorTag
+     */
+    public IteratorTagStatus getIteratorStatus();
 }
diff --git a/src/javax/servlet/jsp/jstl/core/IteratorTagStatus.java b/src/javax/servlet/jsp/jstl/core/IteratorTagStatus.java
new file mode 100644
index 0000000..33b7e44
--- /dev/null
+++ b/src/javax/servlet/jsp/jstl/core/IteratorTagStatus.java
@@ -0,0 +1,204 @@
+/*
+ * 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 javax.servlet.jsp.jstl.core;
+
+/**
+ * <p>Provides an interface for objects representing the current status of
+ * an iteration.  JSTL 1.0 provides a mechanism for IteratorTags to
+ * return information about the current index of the iteration and
+ * convenience methods to determine whether or not the current round is
+ * either the first or last in the iteration.  It also lets authors
+ * use the status object to obtain information about the iteration range,
+ * step, label, and current object.</p>
+ *
+ * <p>Environments that require more status can extend this interface.</p>
+ *
+ * @author Shawn Bayern
+ */
+
+public interface IteratorTagStatus {
+
+    /**
+     * Retrieves the current item in the iteration.  Behaves
+     * idempotently; calling getCurrent() repeatedly should return the same
+     * Object until the iteration is advanced.  (Specifically, calling
+     * getCurrent() does <b>not</b> advance the iteration.)
+     *
+     * @return the current item as an object
+     */
+    public Object getCurrent();
+
+    /**
+     * Retrieves the index of the current round of the iteration.  If
+     * iteration is being performed over a subset of an underlying
+     * array, java.lang.Collection, or other type, the index returned
+     * is absolute with respect to the underlying collection.  Indices
+     * are 0-based.
+     *
+     * @return the 0-based index of the current round of the iteration
+     */
+    public int getIndex();
+
+    /**
+     * <p>Retrieves the "count" of the current round of the iteration.  The
+     * count is a relative, 1-based sequence number identifying the
+     * current "round" of iteration (in context with all rounds the
+     * current iteration will perform).</p>
+     *
+     * <p>As an example, an iteration with begin = 5, end = 15, and step =
+     * 5 produces the counts 1, 2, and 3 in that order.</p>
+     *
+     * @return the 1-based count of the current round of the iteration
+     */
+    public int getCount();
+
+    /**
+     * Returns information about whether the current round of the
+     * iteration is the first one.  This current round may be the 'first'
+     * even when getIndex() != 0, for 'index' refers to the absolute
+     * index of the current 'item' in the context of its underlying
+     * collection.  It is always that case that a true result from
+     * isFirst() implies getCount() == 1.
+     * 
+     * @return <tt>true</tt> if the current round is the first in the
+     * iteration, <tt>false</tt> otherwise.
+     */
+    public boolean isFirst();
+
+    /**
+     * Returns information about whether the current round of the
+     * iteration is the last one.  As with isFirst(), subsetting is
+     * taken into account.  isLast() doesn't necessarily refer to the
+     * status of the underlying Iterator; it refers to whether or not
+     * the current round will be the final round of iteration for the
+     * tag associated with this IteratorTagStatus.
+     * 
+     * @return <tt>true</tt> if the current round is the last in the
+     * iteration, <tt>false</tt> otherwise.
+     */
+    public boolean isLast();
+
+    /**
+     * Returns information about whether the 'begin' attribute was
+     * specified.
+     *
+     * @return <tt>true</tt> if 'begin' was specified, <tt>false</tt>
+     * otherwise.
+     */
+    public boolean isBeginSpecified();
+
+    /**
+     * Returns information about whether the 'end' attribute was
+     * specified.
+     *
+     * @return <tt>true</tt> if 'end' was specified, <tt>false</tt>
+     * otherwise.
+     */
+    public boolean isEndSpecified();
+
+    /**
+     * Returns information about whether the 'step' attribute was
+     * specified.
+     *
+     * @return <tt>true</tt> if 'step' was specified, <tt>false</tt>
+     * otherwise.
+     */
+    public boolean isStepSpecified();
+
+    /**
+     * Returns the value of the 'begin' attribute for the associated tag.  
+     * If this attribute was not specified, the result is undefined.
+     * (isBeginSpecified() should be called prior to this method to ensure
+     * that the result is sensible.)
+     *
+     * @return the 'begin' value for the associated tag, or an undefined
+     * value if this attribute was not specified.
+     */
+    public int getBegin();
+
+    /**
+     * Returns the value of the 'end' attribute for the associated tag.  
+     * If this attribute was not specified, the result is undefined.
+     * (isEndSpecified() should be called prior to this method to ensure
+     * that the result is sensible.)
+     *
+     * @return the 'end' value for the associated tag, or an undefined
+     * value if this attribute was not specified.
+     */
+    public int getEnd();
+
+    /**
+     * Returns the value of the 'step' attribute for the associated tag.  
+     * If this attribute was not specified, the result is undefined.
+     * (isStepSpecified() should be called prior to this method to ensure
+     * that the result is sensible.)
+     *
+     * @return the 'step' value for the associated tag, or an undefined
+     * value if this attribute was not specified.
+     */
+    public int getStep();
+
+/*-- No labels in EA2
+    **
+     * Returns the label of the associated tag.  This label identifies
+     * this tag (against other IteratorTags in a nested chain) primarily
+     * for the benefit of subtags.
+     *
+     * @return the label of the associated tag
+     *
+    public String getLabel();
+*/
+}
diff --git a/src/javax/servlet/jsp/jstl/core/IteratorTagSupport.java b/src/javax/servlet/jsp/jstl/core/IteratorTagSupport.java
new file mode 100644
index 0000000..5fe834d
--- /dev/null
+++ b/src/javax/servlet/jsp/jstl/core/IteratorTagSupport.java
@@ -0,0 +1,657 @@
+/*
+ * 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 javax.servlet.jsp.jstl.core;
+
+import javax.servlet.jsp.*;
+import javax.servlet.jsp.tagext.*;
+
+/**
+ * <p>JSTL 1.0 allows developers to write custom iteration tags by
+ * implementing the IteratorTag interface.  (This is not to be confused with
+ * javax.servlet.jsp.tagext.IterationTag as defined in JSP 1.2.) 
+ * IteratorTag establishes a mechanism for iteration tags to be recognized
+ * and for type-safe communication with custom subtags.
+ * </p>
+ * 
+ * <p>Since most iteration tags will behave identically with respect to
+ * actual iterative behavior, however, JSTL 1.0 provides this
+ * base support class to facilitate implementation.  Many iteration tags
+ * will extend this and merely implement the hasNext() and next() methods
+ * to provide contents for the handler to iterate over.</p>
+ *
+ * <p>In particular, this base class provides support for:</p>
+ * 
+ * <ul>
+ *  <li> iteration control, based on protected next() and hasNext() methods
+ *  <li> subsetting (begin, end, step functionality, including validation
+ *       of subset parameters for sensibility)
+ *  <li> item retrieval (getCurrent())
+ *  <li> status retrieval (IteratorTagStatus)
+ *  <li> exposing attributes (set by 'var' and 'status' attributes)
+ * </ul>
+ *
+ * <p>In providing support for these tasks, IteratorTagSupport contains
+ * certain control variables that act to modify the iteration.  Accessors
+ * are provided for these control variables when the variables represent
+ * information needed or wanted at translation time (e.g., var, status).  For
+ * other variables, accessors cannot be provided here since subclasses
+ * may differ on their implementations of how those accessors are received.
+ * For instance, one subclass might accept a String and convert it into
+ * an object of a specific type by using an expression evaluator; others
+ * might accept objects directly.  Still others might not want to expose
+ * such information to outside control.</p>
+ *
+ * @author Shawn Bayern
+ */
+
+public abstract class IteratorTagSupport
+    extends TagSupport
+    implements IteratorTag, IterationTag, TryCatchFinally
+{
+    //*********************************************************************
+    // 'Protected' state 
+
+    /*
+     * JavaBean-style properties and other state slaved to them.  These
+     * properties can be set directly by accessors; they will not be
+     * modified by the IteratorTagSupport implementation -- and should
+     * not be modified by subclasses outside accessors unless those
+     * subclasses are perfectly aware of what they're doing.
+     * (An example where such non-accessor modification might be sensible
+     * is in the doStartTag() method of an EL-aware subclass.)
+     */
+
+    /*-- No labels in EA2
+    ** 'label' attribute *
+    protected String label;
+    --*/
+
+    /** Starting index ('begin' attribute) */
+    protected int begin;
+
+    /**
+     * Ending index ('end' attribute).  -1 internally indicates 'no end
+     * specified', although accessors for the core JSTL tags do not
+     * allow this value to be supplied directly by the user.
+     */
+    protected int end;
+
+    /** Iteration step ('step' attribute) */
+    protected int step;
+
+    /** Boolean flag indicating whether 'begin' was specified. */
+    protected boolean beginSpecified;
+
+    /** Boolean flag indicating whether 'end' was specified. */
+    protected boolean endSpecified;
+
+    /** Boolean flag indicating whether 'step' was specified. */
+    protected boolean stepSpecified;
+
+    /** Attribute-exposing control */
+    protected String itemId, statusId /*, itemType */;
+
+
+    //*********************************************************************
+    // 'Private' state (implementation details)
+
+    /*
+     * State exclusively internal to the default, reference implementation.
+     * (While this state is kept private to ensure consistency, 'status'
+     * and 'item' happen to have one-for-one, read-only, accesor methods
+     * as part of the IteratorTag interface.)
+     *
+     * 'last' is kept separately for two reasons:  (a) to avoid
+     * running a computation every time it's requested, and (b) to
+     * let IteratorTagStatus.isLast() avoid throwing any exceptions,
+     * which would complicate subtag and scripting-variable use.
+     *
+     * Our 'internal index' begins at 0 and increases by 'step' each
+     * round; this is arbitrary, but it seemed a simple way of keeping
+     * track of the information we need.  To avoid computing
+     * getIteratorStatus().getCount() by dividing index / step, we keep
+     * a separate 'count' and increment it by 1 each round (as a minor
+     * performance improvement).
+     */
+    private IteratorTagStatus status;           // our IteratorTagStatus
+    private Object item;                        // the current item
+    private int index;                          // the current internal index
+    private int count;                          // the iteration count
+    private boolean last;                       // current round == last one?
+
+
+    //*********************************************************************
+    // Constructor
+
+    /**
+     * Constructs a new IteratorTagSupport.  As with TagSupport, subclasses
+     * should not provide other constructors and are expected to call
+     * the superclass constructor
+     */
+    public IteratorTagSupport() {
+        super();
+        init();
+    }
+
+
+    //*********************************************************************
+    // Abstract methods
+
+    /**
+     * <p>Returns the next object over which the tag should iterate.  This
+     * method must be provided by concrete subclasses of IteratorTagSupport
+     * to inform the base logic about what objects it should iterate over.</p>
+     *
+     * <p>It is expected that this method will generally be backed by an
+     * Iterator, but this will not always be the case.  In particular, if
+     * retrieving the next object raises the possibility of an exception
+     * being thrown, this method allows that exception to propagate back
+     * to the JSP container as a JspTagException; a standalone Iterator
+     * would not be able to do this.  (This explains why IteratorTagSupport
+     * does not simply call for an Iterator from its subtags.)</p>
+     * 
+     * @return the java.lang.Object to use in the next round of iteration
+     * @exception NoSuchElementException
+     *            if next() is called but no new elements are available
+     * @exception javax.servlet.jsp.JspTagException
+     *            for other, unexpected exceptions
+     */
+    protected abstract Object next() throws JspTagException;
+
+    /**
+     * <p>Returns information concerning the availability of more items
+     * over which to iterate.  This method must be provided by concrete
+     * subclasses of IteratorTagSupport to assist the iterative logic
+     * provided by the supporting base class.</p>
+     *  
+     * <p>See <a href="#next()">next</a> for more information about the
+     * purpose and expectations behind this tag.</p>
+     *
+     * @return <tt>true</tt> if there is at least one more item to iterate
+     *         over, <tt>false</tt> otherwise
+     * @exception javax.servlet.jspTagException
+     * @see #next
+     */
+    protected abstract boolean hasNext() throws JspTagException;
+
+
+    //*********************************************************************
+    // Lifecycle management and implementation of iterative behavior
+
+    // Releases any resources we may have (or inherit)
+    public void release() {
+        super.release();
+        init();
+    }
+
+    /* Begins iterating by processing the first item. */
+    public int doStartTag() throws JspException {
+
+        // make sure 'begin' isn't greater than 'end'
+        if (end != -1 && begin > end)
+            return SKIP_BODY;                   // nothing to do
+
+        // we're beginning a new iteration, so reset our counts (etc.)
+        index = 0;
+        count = 1;
+        last = false;
+
+        // throw away the first 'begin' items (if they exist)
+        discardIgnoreSubset(begin);
+
+        // get the item we're interested in
+        if (hasNext())
+            // index is 0-based, so we don't update it for the first item
+            item = next();
+        else
+            return SKIP_BODY;
+
+        /*
+         * now discard anything we have to "step" over.
+         * (we do this in advance to support IteratorTagStatus.isLast())
+         */
+        discard(step - 1);
+
+        // prepare to include our body...
+        exposeVariables();
+        calibrateLast();
+        return EVAL_BODY_INCLUDE;
+    }
+
+    /*
+     * Continues the iteration when appropriate -- that is, if we (a) have
+     * more items and (b) don't run over our 'end' (given our 'step').
+     */
+    public int doAfterBody() throws JspException {
+
+        // re-sync the index, given our prior behind-the-scenes 'step'
+        index += step - 1;
+
+        // increment the count by 1 for each round
+        count++;
+
+        // everything's been prepared for us, so just get the next item
+        if (hasNext() && !atEnd()) {
+            index++;
+            item = next();
+        } else
+            return SKIP_BODY;
+
+        /*
+         * now discard anything we have to "step" over.
+         * (we do this in advance to support IteratorTagStatus.isLast())
+         */
+        discard(step - 1);
+
+        // prepare to re-iterate...
+        exposeVariables();
+        calibrateLast();
+        return EVAL_BODY_AGAIN;
+    }
+
+    /*
+     * Removes attributes that our tag set; these attributes are intended
+     * to support scripting variables with NESTED scope, so we don't want
+     * to pollute attribute space by leaving them lying around.
+     */
+    public void doFinally() {
+	/*
+	 * This always gets called, which introduces a minor danger:
+	 * we might destroy attributes we *didn't* set if an exception
+	 * stops us before we set those attributes.  However, since our
+	 * setting of those attributes is destructive anyway (with respect
+	 * to attributes previously stored under the names we're directed
+	 * to use), this doesn't seem like a problem.
+         */
+	unExposeVariables();
+    }
+
+    /*
+     * Be transparent with respect to exceptions: rethrow anything we get.
+     */
+    public void doCatch(Throwable t) throws Throwable {
+	throw t;
+    }
+
+    //*********************************************************************
+    // Accessor methods
+
+    /*
+     * Overview:  The getXXX() methods we provide implement the Tag
+     * contract.  setXXX() accessors are provided only for those
+     * properties (attributes) that must be known at translation time,
+     * on the premise that these accessors will vary less than the
+     * others in terms of their interface with the page author.
+     */
+
+    /*
+     * (Purposely inherit JavaDoc and semantics from IteratorTag.
+     * Subclasses can override this if necessary, but such a need is
+     * expected to be rare.)
+     */
+    public Object getCurrent() {
+        return item;
+    }
+
+    /*
+     * (Purposely inherit JavaDoc and semantics from IteratorTag.
+     * Subclasses can override this method for more fine-grained control
+     * over IteratorTagStatus, but an effort has been made to simplify
+     * implementation of subclasses that are happy with reasonable default
+     * behavior.)
+     */
+    public IteratorTagStatus getIteratorStatus() {
+
+        // local implementation with reasonable default behavior
+        class Status implements IteratorTagStatus {
+
+            /*
+             * All our methods are straightforward.  We inherit
+             * our JavaDoc from IteratorTagSupport; see that class
+             * for more information.
+             */
+
+            public Object getCurrent() {
+                /*
+                 * Access the item through getCurrent() instead of just
+                 * returning the item our containing class stores.  This
+                 * should allow a subclass of IteratorTagSupport to override
+                 * getCurrent() without having to rewrite getIteratorStatus() too.
+                 */
+                return (IteratorTagSupport.this.getCurrent());
+            }
+            public int getIndex() {
+                return (index + begin);       // our 'index' isn't getIndex()
+            }
+            public int getCount() {
+                return (count);
+            }
+            public boolean isFirst() {
+                return (index == 0);          // our 'index' isn't getIndex()
+            }
+            public boolean isLast() {
+                return (last);                // use cached value
+            }
+            public boolean isBeginSpecified() {
+                return (beginSpecified);
+            }
+            public boolean isEndSpecified() {
+                return (endSpecified);
+            }
+            public boolean isStepSpecified() {
+                return (stepSpecified);
+            }
+            public int getBegin() {
+                return (begin);
+            }
+            public int getEnd() {
+                return (end);
+            }
+            public int getStep() {
+                return (step);
+            }
+	    /*-- No labels in EA2
+            public String getLabel() {
+                return (label);
+            }
+	    --*/
+        }
+
+        /*
+         * We just need one per invocation...  Actually, for the current
+         * implementation, we just need one per instance, but I'd rather
+         * not keep the reference around once release() has been called.
+         */
+        if (status == null)
+            status = new Status();
+
+        return status;
+    }
+
+    /*
+     * We only support setter methods for attributes that need to be
+     * offered as Strings or other literals; other attributes will be
+     * handled directly by implementing classes, since there might be
+     * both rtexprvalue- and EL-based varieties, which will have
+     * different signatures.  (We can't pollute child classes by having
+     * base implementations of those setters here; child classes that
+     * have attributes with different signatures would end up having
+     * two incompatible setters, which is illegal for a JavaBean.
+     */
+
+    /*-- No labels in EA2
+    // for tag attribute
+    public void setLabel(String label) {
+        this.label = label;
+    }
+    --*/
+ 
+    // for tag attribute
+    public void setVar(String id) {
+        this.itemId = id;
+    }
+
+    /* NO LONGER NEEDED
+    // for tag attribute
+    public void setItemType(String itemType) {
+        this.itemType = itemType;
+    }
+    */
+
+    // for tag attribute
+    public void setStatus(String statusId) {
+        this.statusId = statusId;
+    }
+
+    //*********************************************************************
+    // Public static (utility) methods
+
+    /*-- No labels in EA2
+    **
+     * Locates the nearest ancestor IteratorTag with the given label,
+     * starting at the Tag given as the 'base'.  If label is null, simply
+     * locates the nearest IteratorTag ancestor to 'base'.
+     *
+     * @param  base   the Tag at which to start the search (that is, the
+     *                Tag whose ancestors to search)
+     * @param  label  the label to search for, or 'null' if any IteratorTag
+     *                is suitable
+     *
+     * @return the IteratorTag found, or 'null' if no matching IteratorTag
+     * was found
+     *
+    public static IteratorTag findIteratorAncestorWithLabel(
+            Tag base, String label) {
+
+        // find the first IteratorTag ancestor
+        IteratorTag it =
+            (IteratorTag) findAncestorWithClass(base, IteratorTag.class);
+
+        // if we want a specific label, search for it up the tree
+        while (it != null && label != null
+                && !label.equals(it.getIteratorStatus().getLabel())) {
+            it = (IteratorTag) findAncestorWithClass(it, IteratorTag.class);
+        }
+
+        // return what we've got (which might be null)
+        return it;
+    }
+    --*/
+
+    //*********************************************************************
+    // Protected utility methods
+
+    /* 
+     * These methods validate attributes common to iteration tags.
+     * Call them if your own subclassing implementation modifies them
+     * -- e.g., if you set them through an expression language.
+     */
+
+    /*
+     * Ensures the "begin" property is sensible, throwing an exception
+     * expected to propagate up if it isn't
+     */
+    protected void validateBegin() throws JspTagException {
+        if (begin < 0)
+            throw new JspTagException("'begin' < 0");
+    }
+
+    /*
+     * Ensures the "end" property is sensible, throwing an exception
+     * expected to propagate up if it isn't
+     */
+    protected void validateEnd() throws JspTagException {
+        if (begin < 0)
+            throw new JspTagException("'end' < 0");
+    }
+
+    /*
+     * Ensures the "step" property is sensible, throwing an exception
+     * expected to propagate up if it isn't
+     */
+    protected void validateStep() throws JspTagException {
+        if (step < 1)
+            throw new JspTagException("'step' <= 0");
+    }
+
+
+    //*********************************************************************
+    // Private utility methods
+
+    // (re)initializes state (during release() or construction)
+    private void init() {
+        // defaults for internal bookkeeping
+        index = 0;              // internal index always starts at 0
+        count = 1;              // internal count always starts at 1
+        status = null;          // we clear status on release()
+        item = null;            // item will be retrieved for each round
+        last = false;           // last must be set explicitly
+        beginSpecified = false; // not specified until it's specified :-)
+        endSpecified = false;   // (as above)
+        stepSpecified = false;  // (as above)
+
+        // defaults for interface with page author
+        begin = 0;              // when not specified, 'begin' is 0 by spec.
+        end = -1;               // when not specified, 'end' is not used
+        step = 1;               // when not specified, 'step' is 1
+        itemId = null;          // when not specified, no variable exported
+        // itemType = null;        // when not specified, no variable exported
+        statusId = null;        // when not specified, no variable exported
+    }
+
+    // sets 'last' appropriately
+    private void calibrateLast() throws JspTagException {
+        /*
+         * the current round is the last one if (a) there are no remaining
+         * elements, or (b) the next one is beyond the 'end'.
+         */
+        last = !hasNext() || atEnd() ||
+            (end != -1 && (begin + index + step > end));
+    }
+
+    /*
+     * Exposes attributes (formerly scripting variables, but no longer!)
+     * if appropriate.  Note that we don't really care, here, whether they're
+     * scripting variables or not.
+     */
+    private void exposeVariables() throws JspTagException {
+
+        /*
+         * We need to support null items returned from next(); we
+         * do this simply by passing such non-items through to the
+         * scripting variable as 'null' (which we ensure by calling
+         * removeAttribute()).
+         *
+         * Also, just to be defensive, we handle the case of a null
+         * 'status' object as well.
+         *
+         * We call getCurrent() and getIteratorStatus() (instead of just using
+         * 'item' and 'status') to bridge to subclasses correctly.
+         * A subclass can override getCurrent() or getIteratorStatus() but still
+         * depend on our doStartTag() and doAfterBody(), which call this
+         * method (exposeVariables()), to expose 'item' and 'status'
+         * correctly.
+         */
+
+        if (itemId != null) {
+            if (getCurrent() == null)
+                pageContext.removeAttribute(itemId);
+            else
+                pageContext.setAttribute(itemId, getCurrent());
+        }
+        if (statusId != null) {
+            if (getIteratorStatus() == null)
+                pageContext.removeAttribute(statusId);
+            else
+                pageContext.setAttribute(statusId, getIteratorStatus());
+        }
+
+    }
+
+    // removes page attributes if appropriate
+    private void unExposeVariables() {
+	if (itemId != null)
+	    pageContext.removeAttribute(itemId, PageContext.PAGE_SCOPE);
+	if (statusId != null)
+	    pageContext.removeAttribute(statusId, PageContext.PAGE_SCOPE);
+    }
+
+    /*
+     * Cycles through and discards up to 'n' items from the iteration.
+     * We only know "up to 'n'", not "exactly n," since we stop cycling
+     * if hasNext() returns false or if we hit the 'end' of the iteration.
+     * Note: this does not update the iteration index, since this method
+     * is intended as a behind-the-scenes operation.  The index must be
+     * updated separately.  (I don't really like this, but it's the simplest
+     * way to support isLast() without storing two separate inconsistent
+     * indices.  We need to (a) make sure hasNext() refers to the next
+     * item we actually *want* and (b) make sure the index refers to the
+     * item associated with the *current* round, not the next one.
+     * C'est la vie.)
+     */
+    private void discard(int n) throws JspTagException {
+        /*
+         * copy index so we can restore it, but we need to update it
+         * as we work so that atEnd() works
+         */
+        int oldIndex = index;
+        while (n-- > 0 && !atEnd() && hasNext()) {
+            index++;
+            next();
+        }
+        index = oldIndex;
+    }
+
+    /*
+     * Discards items ignoring subsetting rules.  Useful for discarding
+     * items from the beginning (i.e., to implement 'begin') where we
+     * don't want factor in the 'begin' value already.
+     */
+    private void discardIgnoreSubset(int n) throws JspTagException {
+	while (n-- > 0 && hasNext())
+	    next();
+    }
+
+    /*
+     * Returns true if the iteration has past the 'end' index (with
+     * respect to subsetting), false otherwise.  ('end' must be set
+     * for atEnd() to return true; if 'end' is not set, atEnd()
+     * always returns false.)
+     */
+    private boolean atEnd() {
+        return ((end != -1) && (begin + index >= end));
+    }
+}
diff --git a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java b/src/javax/servlet/jsp/jstl/sql/Column.java
similarity index 81%
copy from src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
copy to src/javax/servlet/jsp/jstl/sql/Column.java
index c4ef188..20858e0 100644
--- a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
+++ b/src/javax/servlet/jsp/jstl/sql/Column.java
@@ -53,22 +53,27 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
-
-import javax.servlet.jsp.tagext.*;
+package javax.servlet.jsp.jstl.sql;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;messageFormat&gt; tag's attributes.
- *
- * @author Jan Luehe
+ * <p>A class implementing this interface encapsulates the value and all 
+ * meta data for a column in a database query result. Instances of such
+ * classes are returned as the result of the &lt;Query&gt; action.</p>
+ * 
  */
-public class MessageFormatTEI extends TagExtraInfo {
+
+public interface Column extends ColumnMetaData {
 
     /**
-     * Validates the <tt>scope</tt> attribute of the &lt;messageFormat&gt; tag.
+     * Returns the column value, or null.
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
-    }
+    public Object getValue();
+
+    /**
+     * Returns the default <code>String</code> representation of the
+     * column's value. If the value is null, an empty String is
+     * is returned.
+     */
+    public String toString();
+
 }
diff --git a/src/javax/servlet/jsp/jstl/sql/ColumnMetaData.java b/src/javax/servlet/jsp/jstl/sql/ColumnMetaData.java
new file mode 100644
index 0000000..cfd5f59
--- /dev/null
+++ b/src/javax/servlet/jsp/jstl/sql/ColumnMetaData.java
@@ -0,0 +1,185 @@
+/*
+ * 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 javax.servlet.jsp.jstl.sql;
+
+import java.sql.*;
+
+/**
+ * <p>A class implementing this interface encapsulates the meta data for 
+ * a column in a database query result. 
+ * 
+ * <p>Most methods may throw an SQLException. In this case, the exception 
+ * instance may be the same instance as thrown by the corresponding
+ * <code>java.sql.ResultSetMetaData</code> method when the Column instance
+ * was created.</p>
+ *
+ * <p>Note! Currently this class contains methods corresponding to all
+ * <code>ResultSetMetaData</code> methods. We may want to remove some of them
+ * that don't make much sense in the context where this class is used.</p>
+ *
+ */
+
+public interface ColumnMetaData {
+
+    /**
+     * Get the designated column's name.
+     */
+    public String getName() throws SQLException;
+
+    /**
+     * Retrieves the column's SQL type.
+     *
+     *<p>Fix: maybe this method should return a String instead, with
+     * the name of the type based on the java.sql.Types statics names.
+     */
+    public int getType() throws SQLException;
+
+    /**
+     * Retrieves the column's database-specific type name.
+     */
+    public String getTypeName() throws SQLException;
+
+    /**
+     * Indicates whether the column is automatically numbered, 
+     * thus read-only.
+     */
+    public boolean isAutoIncrement() throws SQLException;
+
+    /**
+     * Indicates whether a column's case matters.
+     */
+    public boolean isCaseSensitive() throws SQLException;
+
+    /**
+     * Indicates whether the column can be used in a where clause.
+     */
+    public boolean isSearchable() throws SQLException;
+
+    /**
+     * Indicates whether the column is a cash value.
+     */
+    public boolean isCurrency() throws SQLException;
+
+    /**
+     * Indicates the nullability of values in the column.
+     */
+    public int isNullable() throws SQLException;
+
+    /**
+     * Indicates whether values in the column are signed numbers.
+     */
+    public boolean isSigned() throws SQLException;
+
+    /**
+     * Indicates the column's normal maximum width in characters.
+     */
+    public int getDisplaySize() throws SQLException;
+
+    /**
+     * Gets the column's suggested title for use in printouts and displays.
+     */
+    public String getLabel() throws SQLException;
+
+    /**
+     * Get the column's table's schema.
+     */
+    public String getSchemaName() throws SQLException;
+
+    /**
+     * Get the column's number of decimal digits.
+     */
+    public int getPrecision() throws SQLException;
+
+    /**
+     * Gets the column's number of digits to right of the decimal point.
+     */
+    public int getScale() throws SQLException;
+
+    /**
+     * Gets the designated column's table name.
+     */
+    public String getTableName() throws SQLException;
+
+    /**
+     * Gets the column's table's catalog name.
+     */
+    public String getCatalogName() throws SQLException;
+
+    /**
+     * Indicates whether the column is definitely not writable.
+     */
+    public boolean isReadOnly() throws SQLException;
+
+    /**
+     * Indicates whether it is possible for a write on the column to succeed.
+     */
+    public boolean isWritable() throws SQLException;
+
+    /**
+     * Indicates whether a write on the column will definitely succeed.
+     */
+    public boolean isDefinitelyWritable() throws SQLException;
+
+    /**
+     * Returns the fully-qualified name of the Java class whose instances 
+     * are manufactured if the method <code>ResultSet.getObject</code> is 
+     * called to retrieve a value from the column. 
+     * <code>ResultSet.getObject</code> may return a subclass of the class 
+     * returned by this method.
+     */
+    public String getClassName() throws SQLException;
+
+}
diff --git a/src/org/apache/taglibs/standard/tei/BundleTEI.java b/src/javax/servlet/jsp/jstl/sql/Result.java
similarity index 76%
copy from src/org/apache/taglibs/standard/tei/BundleTEI.java
copy to src/javax/servlet/jsp/jstl/sql/Result.java
index 93403a8..1bff9d8 100644
--- a/src/org/apache/taglibs/standard/tei/BundleTEI.java
+++ b/src/javax/servlet/jsp/jstl/sql/Result.java
@@ -53,22 +53,38 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
-
-import javax.servlet.jsp.tagext.*;
+package javax.servlet.jsp.jstl.sql;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;bundle&gt; tag's attributes.
+ * <p>A class implementing this interface creates a cached version of 
+ * a <code>ResultSet</code>. It's represented as a <code>Result</code> 
+ * implementation, capable of returning an array of <code>Row</code> 
+ * objects containing a <code>Column</code> instance for each column 
+ * in the row.
  *
- * @author Jan Luehe
  */
-public class BundleTEI extends TagExtraInfo {
+public interface Result {
+
+    /**
+     * Returns an array of Row objects.
+     *
+     */
+    public Row[] getRows();
+
+    /**
+     * Returns the ResultMetaData object of the cached ResultSet
+     *
+     */
+    public ResultMetaData getMetaData();
+
+    /**
+     * Returns the number of rows in the cached ResultSet
+     */
+    public int getSize();
 
     /**
-     * Validates the <tt>scope</tt> attribute of the &lt;bundle&gt; tag.
+     * Returns true of the query was limited by a maximum row setting
+     *
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
-    }
+    public boolean isLimitedByMaxRows();
 }
diff --git a/src/org/apache/taglibs/standard/tei/BundleTEI.java b/src/javax/servlet/jsp/jstl/sql/ResultMetaData.java
similarity index 83%
copy from src/org/apache/taglibs/standard/tei/BundleTEI.java
copy to src/javax/servlet/jsp/jstl/sql/ResultMetaData.java
index 93403a8..0bd473b 100644
--- a/src/org/apache/taglibs/standard/tei/BundleTEI.java
+++ b/src/javax/servlet/jsp/jstl/sql/ResultMetaData.java
@@ -53,22 +53,31 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
-
-import javax.servlet.jsp.tagext.*;
+package javax.servlet.jsp.jstl.sql;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;bundle&gt; tag's attributes.
+ * <p>A class implementing this interface encapsulates all 
+ * the meta data for a result set. 
  *
- * @author Jan Luehe
  */
-public class BundleTEI extends TagExtraInfo {
+public interface ResultMetaData {
+
+    /**
+     * Returns the ColumnMetaData for the named column
+     *
+     */
+    public ColumnMetaData get(String name);
 
     /**
-     * Validates the <tt>scope</tt> attribute of the &lt;bundle&gt; tag.
+     * Returns the ColumnMetaData for the given column index
+     *
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
-    }
+    public ColumnMetaData get(int index);
+
+    /**
+     * Returns an array of ColumnMetaData objects
+     *
+     */
+    public ColumnMetaData[] getColumns();
+
 }
diff --git a/src/org/apache/taglibs/standard/tei/BundleTEI.java b/src/javax/servlet/jsp/jstl/sql/Row.java
similarity index 85%
copy from src/org/apache/taglibs/standard/tei/BundleTEI.java
copy to src/javax/servlet/jsp/jstl/sql/Row.java
index 93403a8..1ba370b 100644
--- a/src/org/apache/taglibs/standard/tei/BundleTEI.java
+++ b/src/javax/servlet/jsp/jstl/sql/Row.java
@@ -53,22 +53,31 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
-
-import javax.servlet.jsp.tagext.*;
+package javax.servlet.jsp.jstl.sql;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;bundle&gt; tag's attributes.
+ * 
+ * <p>An implementation of this class encapsulates the columns 
+ * for a given row. 
  *
- * @author Jan Luehe
  */
-public class BundleTEI extends TagExtraInfo {
+public interface Row {
+
+    /**
+     * Returns the Column object for the named column
+     *
+     */
+    public Column get(String name);
+
+    /**
+     * Returns the Column for the given column index
+     *
+     */
+    public Column get(int index);
 
     /**
-     * Validates the <tt>scope</tt> attribute of the &lt;bundle&gt; tag.
+     * Returns an array Column objects
+     *
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
-    }
+    public Column[] getColumns();
 }
diff --git a/src/org/apache/taglibs/standard/tei/BundleTEI.java b/src/javax/servlet/jsp/jstl/sql/SQLExecutionTag.java
similarity index 86%
rename from src/org/apache/taglibs/standard/tei/BundleTEI.java
rename to src/javax/servlet/jsp/jstl/sql/SQLExecutionTag.java
index 93403a8..5701565 100644
--- a/src/org/apache/taglibs/standard/tei/BundleTEI.java
+++ b/src/javax/servlet/jsp/jstl/sql/SQLExecutionTag.java
@@ -53,22 +53,18 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
-
-import javax.servlet.jsp.tagext.*;
+package javax.servlet.jsp.jstl.sql;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;bundle&gt; tag's attributes.
+ * <p>A class implementing this interface exposes one method that
+ * nested elements can use to add PreparedStatement parameters.
  *
- * @author Jan Luehe
  */
-public class BundleTEI extends TagExtraInfo {
+
+public interface SQLExecutionTag {
 
     /**
-     * Validates the <tt>scope</tt> attribute of the &lt;bundle&gt; tag.
+     * Adds a PreparedStatement parameter value
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
... 11145 lines suppressed ...


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