You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by si...@apache.org on 2002/03/12 12:36:50 UTC

cvs commit: jakarta-velocity-tools/struts/xdocs index.xml tool-ErrorsTool.xml tool-FormTool.xml tool-LinkTool.xml tool-MessageTool.xml

sidler      02/03/12 03:36:49

  Modified:    struts   README.txt build.xml
               struts/examples/struts build.xml index.html
               struts/examples/struts/WEB-INF struts-config.xml toolbox.xml
               struts/examples/struts/WEB-INF/classes
                        ApplicationResources.properties
               struts/examples/struts/WEB-INF/lib struts-config_1_0.dtd
                        struts.jar velocity-1.3-dev.jar
               struts/examples/struts/doc config.html
               struts/examples/struts/examples/struts_app1 edit-address.txt
                        edit-address.vm show-address.txt show-address.vm
               struts/examples/struts/examples/struts_app2 tool-demo.txt
                        tool-demo.vm
               struts/examples/struts/examples/struts_app3 index.vm
                        index_vm.txt logon.vm logon_vm.txt
               struts/src/java/org/apache/velocity/tools/struts
                        MathTool.java ToolLoaderTool.java
  Added:       struts/examples/struts/WEB-INF/lib struts-bean.tld
                        struts-form.tld struts-html.tld struts-logic.tld
                        struts-template.tld struts.tld
               struts/examples/struts/WEB-INF/src
                        ApplicationResources.properties
                        ApplicationResources_de.properties
               struts/examples/struts/WEB-INF/src/examples/app2
                        DemoAction.java DemoForm.java
               struts/examples/struts/doc examples.html
               struts/src/java/org/apache/velocity/tools/struts
                        ErrorsTool.java FormTool.java LinkTool.java
                        MessageTool.java ServletContextTool.java
                        StrutsUtils.java
               struts/xdocs index.xml tool-ErrorsTool.xml tool-FormTool.xml
                        tool-LinkTool.xml tool-MessageTool.xml
  Removed:     struts/examples/struts/WEB-INF resin-war.timestamp
                        struts-bean.tld struts-form.tld struts-html.tld
                        struts-logic.tld struts-template.tld struts.tld
               struts/examples/struts/WEB-INF/classes/examples/app1
                        AddressAction.class AddressBean.class
                        AddressForm.class
               struts/examples/struts/WEB-INF/classes/examples/app2
                        ToolDemoAction.class
               struts/examples/struts/WEB-INF/classes/examples/app3
                        ApplicationResources.properties Constants.class
                        ContinueAction.class LogoffAction.class
                        LogonAction.class LogonForm.class
               struts/examples/struts/WEB-INF/lib
                        velocity-tools-struts-0.1.jar
               struts/examples/struts/WEB-INF/src/examples/app2
                        ToolDemoAction.java
               struts/src/java/org/apache/velocity/tools/struts
                        ContextHelper.java StrutsBeanTool.java
                        StrutsHtmlTool.java ViewHelper.java
  Log:
  Checked in version 0.6 of velstruts tools. API was completely redesigned.
  Added reference documentation for the tools.
  
  Revision  Changes    Path
  1.3       +40 -26    jakarta-velocity-tools/struts/README.txt
  
  Index: README.txt
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/README.txt,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- README.txt	10 Jan 2002 10:53:40 -0000	1.2
  +++ README.txt	12 Mar 2002 11:36:47 -0000	1.3
  @@ -1,22 +1,32 @@
  -struts
  +Struts
   ======
   
   This part of jakarta-velocity-tools is focused on Struts-Velocity
   integration using the VelocityViewServlet and other tools found
  -in this project.
  +in this project. Struts support in Velocity is provided through 
  +several context tools. 
   
  -Struts support in Velocity is provided through several context
  -tools. 
  +This is an alpha version. We do not recommend that you build production
  +systems based on this software at this stage. The API may still
  +change. We will produce a beta version when we believe that the API
  +is reasonably stable. 
   
  -To build the Struts tools :
  +Prerequisites are:
   
  - $ant jar
  +o Ant 1.4.1 or higher 
  +o JDK 1.3.1 or higher
   
  -This generates a jar file in the same directory. 
  +To build the package:
   
  -More documentation will be added shortly. For now the best way
  -to get a feel for the Struts Velocity integration is to look at
  -the included examples.
  +> ant
  +
  +This compiles the package, generates a jar file in the same directory 
  +and sets up the examples.
  +
  +The directory docs contains reference documentation for the included
  +context tools. More documentation will be added shortly. For now the 
  +best way to get a feel for the Struts Velocity integration is to look 
  +at the included examples.
   
   
   
  @@ -26,24 +36,28 @@
   Several Struts application examples have been included to demonstrate
   the use of Velocity templates with Struts. 
   
  -
   To run the examples you need:
   
  -o ant to build the web application (war file)
  -o Tomcat 3.X, Tomcat 4.X or a comparable servlet runner.
  -
  -
  -To build and deploy the example follow these steps:
  -
  -o Go to subdirectory examples/struts
  -o Build the war file with:  
  -    $ant devwar 
  -  This generates a file velstruts.war in subdirectory examples. 
  -o Put the generated war file into the webapps directory of your Tomcat 
  -  installation (or the corresponding directory of other servlet runners). 
  -o Restart Tomcat to auto-deploy the application and point your browser at:
  -    http://your-server:your-port/velstruts/
  -  
  +o ant 1.4.1 or higher to build a deployable version of the example 
  +  applications (war file)
  +o JDK 1.3.1 or higher
  +o Tomcat 3.X, Tomcat 4.X or a comparable servlet runner to run the
  +  examples.
  +
  +To build a deployable version of the examples follow these steps:
  +
  +o Build the Struts package as outlined in the first section.
  +o Change to directory examples/struts
  +o Use ant to build a deployable version: > ant war
     
  +This will generate a velstruts.war file in directory examples.
  +Deploy this .war file to the webapps directory of your servlet
  +runner and restart. Now point a web browser at:
  +
  +http://<server>:<port>/velstruts/
  +
  +to access the examples.
  + 
  + 
     
   Please send your feedback to velocity-user@jakarta.apache.org. 
  
  
  
  1.3       +147 -9    jakarta-velocity-tools/struts/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/build.xml,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- build.xml	8 Jan 2002 10:38:33 -0000	1.2
  +++ build.xml	12 Mar 2002 11:36:47 -0000	1.3
  @@ -1,4 +1,4 @@
  -<project name="velocity-view" default="jar" basedir=".">
  +<project name="velocity-view" default="all" basedir=".">
   
   <!-- ========== Initialize Properties ===================================== -->
   
  @@ -22,26 +22,32 @@
     <property name="project.title"         value=""/>
   
     <!-- The current version number of this component -->
  -  <property name="project.version"       value="0.1"/>
  +  <property name="project.version"       value="0.6"/>
  +
  +  <!-- The current version number of this component -->
  +  <property name="project.date"          value="05-Mar-2002"/>
   
     <!-- The base directory for compilation targets -->
  -  <property name="build.home"              value="target"/>
  +  <property name="build.home"            value="target"/>
   
     <!-- The base directory for distribution targets -->
  -  <property name="dist.home"               value="dist"/>
  +  <property name="dist.home"             value="dist"/>
   
     <!-- The base directory for component sources -->
  -  <property name="source.home"             value="src"/>
  +  <property name="source.home"           value="src"/>
   
     <!-- The base directory for component sources -->
     <property name="conf.home"             value="src/conf"/>
   
     <!-- The docs source directory -->
  -  <property name="docs.src"             value="xdocs"/>
  +  <property name="docs.src"              value="xdocs"/>
   
     <!-- The docs destination directory  -->
     <property name="docs.dest"             value="docs"/>
   
  +  <!-- The docs destination directory  -->
  +  <property name="examples.home"         value="examples"/>
  +
   <!-- ========== Compiler Defaults ========================================= -->
   
   
  @@ -125,14 +131,30 @@
      description="Clean build and distribution directories">
       <delete    dir="${build.home}"/>
       <delete    dir="${dist.home}"/>
  +    <delete>
  +      <fileset dir="${basedir}" includes="*.jar"/>
  +    </delete>
  +    <delete>
  +      <fileset dir="${docs.dest}" includes="**/*.html"/>
  +    </delete>
  +    <delete    dir="${examples.home}/velstruts"/>
  +    <delete>
  +      <fileset dir="${examples.home}" includes="*.war"/>
  +    </delete>
  +    <delete>
  +      <fileset dir="${basedir}" includes="**/*.bak"/>
  +    </delete>
  +
     </target>
   
  +
     <!-- ================================================================== -->
     <!-- A L L                                                              -->
     <!-- ================================================================== -->
  -  <target name="all" depends="clean,jar,docs,javadocs"
  +  <target name="all" depends="clean,jar,docs,javadocs,examples"
      description="Clean and compile all components"/>
   
  +
     <!-- ================================================================== -->
     <!-- J A V A D O C S                                                    -->
     <!-- ================================================================== -->
  @@ -153,6 +175,7 @@
        </javadoc>
     </target>
   
  +
     <!-- ================================================================== -->
     <!-- J A R                                                              -->
     <!-- ================================================================== -->
  @@ -179,14 +202,109 @@
         <dvsl
              basedir="${docs.src}"
              destdir="${docs.dest}/"
  -    	   toolbox="../xdocs/toolbox.props"
  +    	   toolboxfile="../xdocs/toolbox.props"
              extension=".html"
              style="../xdocs/site.dvsl"
  -           excludes="**/project.xml"
  +           excludes="**/project.xml,**/tools.xml"
              includes="**/*.xml"
         />
  +
  +      <replace dir="${docs.dest}">
  +          <replacefilter token="@@@version@@@" value="${project.version}"/>
  +          <replacefilter token="@@@date@@@" value="${project.date}"/>
  +      </replace>
  +
  +
     </target>
   
  +
  +
  +  <!-- ================================================================== -->
  +  <!-- E X A M P L E S                                                    -->
  +  <!-- ================================================================== -->
  +  <target name="examples" depends="clean,jar,docs,javadocs" 
  +    description="Setup example application">
  +
  +      <!-- Setup example applications -->
  +
  +      <!-- Clean away old *.wars if any -->
  +      <delete>
  +        <fileset dir="${examples.home}" includes="*.war"/>
  +      </delete>
  +      
  +      <!-- Deploy jar -->
  +      <delete>
  +          <fileset dir="${examples.home}/struts/WEB-INF/lib" includes="${project.name}-*.jar"/>
  +      </delete>
  +      <copy todir="${examples.home}/struts/WEB-INF/lib" filtering="no">
  +        <fileset dir="${basedir}">
  +          <include name="${project.name}-*.jar"/>
  +        </fileset>
  +      </copy>
  +
  +      <!-- Copy javadoc -->
  +      <copy todir="${examples.home}/struts/doc/javadoc/">
  +        <fileset dir="${build.home}/javadoc"/>
  +      </copy>
  +
  +      <!-- Copy reference documentation -->
  +      <copy todir="${examples.home}/struts/doc/">
  +        <fileset dir="${docs.dest}" includes="tool-*"/>
  +      </copy>
  +      <copy todir="${examples.home}/struts/doc/">
  +        <fileset dir="${docs.dest}" includes="index.html"/>
  +      </copy>
  +
  +  </target>
  +
  +
  +
  +  <!-- ================================================================== -->
  +  <!-- D E M O  clean, compile, docs, javadocs                                                          -->
  +  <!-- ================================================================== -->
  +  <target name="demo" depends=""
  +      description="Generate demo package">
  +
  +      <!-- Generate demo package -->
  +      <!-- This is temporary and will be removed in the release versions -->
  +
  +      <!-- Clean away old demo if any 
  +      <delete dir="${examples.home}/velstruts"/> -->
  +      <delete>
  +        <fileset dir="${examples.home}" includes="*.war"/>
  +      </delete>
  +      
  +      <!-- Copy example application -->
  +      <copy todir="${examples.home}/velstruts">
  +        <fileset dir="${examples.home}/struts"/>
  +      </copy>
  +      
  +      <!-- Remove jakarta-velocity-struts-XX.jar -->
  +      <delete>
  +        <fileset dir="${examples.home}/velstruts/WEB-INF/lib" includes="velocity-tools-struts-*"/>
  +      </delete>
  +
  +      <!-- Copy source from src/java to WEB-INF/src -->
  +      <copy todir="${examples.home}/velstruts/WEB-INF/src">
  +        <fileset dir="${source.home}/java"/>
  +      </copy>
  +
  +      <!-- Copy javadoc -->
  +      <copy todir="${examples.home}/velstruts/doc/javadoc/">
  +        <fileset dir="${build.home}/javadoc"/>
  +      </copy>
  +
  +      <!-- Copy reference documentation -->
  +      <copy todir="${examples.home}/velstruts/doc/">
  +        <fileset dir="${docs.dest}" includes="tool-*"/>
  +      </copy>
  +      <copy todir="${examples.home}/velstruts/doc/">
  +        <fileset dir="${docs.dest}" includes="index.html"/>
  +      </copy>
  +
  +  </target>
  +
  +
     <!-- ================================================================== -->
     <!-- I N S T A L L  J A R                                               -->
     <!-- ================================================================== -->
  @@ -198,5 +316,25 @@
         </fileset>
       </copy>
     </target>
  +
  +
  +  <!-- ================================================================== -->
  +  <!--  D E P L O Y   J A R                                               -->
  +  <!-- ================================================================== -->
  +  <target name="deploy-jar" depends="compile, jar"
  +          description="Deploy jar to example applications">
  +    
  +    <delete>
  +        <fileset dir="${examples.home}/struts/WEB-INF/lib" includes="${project.name}-*.jar"/>
  +    </delete>
  +
  +    <copy todir="${examples.home}/struts/WEB-INF/lib" filtering="no">
  +      <fileset dir="${basedir}">
  +        <include name="${project.name}-*.jar"/>
  +      </fileset>
  +    </copy>
  +  </target>
  +
  +
   </project>
   
  
  
  
  1.5       +109 -86   jakarta-velocity-tools/struts/examples/struts/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/build.xml,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- build.xml	16 Jan 2002 12:03:48 -0000	1.4
  +++ build.xml	12 Mar 2002 11:36:47 -0000	1.5
  @@ -1,109 +1,123 @@
  -<project name="Velocity-Struts" default="compile" basedir=".">
  +<project name="velocity-view" default="jar" basedir=".">
   
  +<!-- ========== Initialize Properties ===================================== -->
   
  -<!--
  - * 
  - *      Build file for Struts Velocity examples.
  - *
  --->
  -
  -  <!-- *** ENVIRONMENT ******************************************************* -->
  -
  -  <property name="DEV"      value="${basedir}/"/>
  -  <property name="SRC"      value="${basedir}/WEB-INF/src"/>
  -  <property name="CLASSES"  value="${basedir}/WEB-INF/classes"/>
  -  <property name="JAVADOC"  value="${basedir}/doc/javadoc"/>
  -  <property name="LIB"      value="${basedir}/WEB-INF/lib"/>
  -  <property name="BUILDLIB" value="${basedir}/WEB-INF/build-lib"/>
  -  
  +  <property file="build/build.properties"/>          <!-- Component local   -->
  +  <property file="../build.properties"/>             <!-- Commons local     -->
  +  <property file="${user.home}/.build.properties"/>  <!-- User local        -->
   
  -  <!-- Construct compile and javadoc classpath -->
  +<!-- ========== External Dependencies ===================================== -->
  +
  + <!-- the local repository -->
  + <property name="local.repository"            value="WEB-INF/lib" />
  + <property name="project.repository"          value="WEB-INF/build-lib" />
  +
  +<!-- ========== Component Declarations ==================================== -->
  +
  +
  +  <!-- The name of this component -->
  +  <property name="project.name"          value="VelStruts Example" />
  +
  +  <!-- The title of this component -->
  +  <property name="project.title"         value="VelStruts Example"/>
  +
  +  <!-- The base directory for compilation targets -->
  +  <property name="build.home"            value="WEB-INF"/>
  +
  +  <!-- The base directory for distribution targets -->
  +  <property name="dist.home"             value="dist"/>
  +
  +  <!-- The base directory for component sources -->
  +  <property name="source.home"           value="WEB-INF/src"/>
  +
  +  <!-- The base directory for component sources -->
  +  <property name="conf.home"             value="src/conf"/>
  +
  +  <!-- The docs source directory -->
  +  <property name="docs.src"              value="xdocs"/>
  +
  +  <!-- The docs destination directory  -->
  +  <property name="docs.dest"             value="doc"/>
  +
  +
  +<!-- ========== Compiler Defaults ========================================= -->
  +
  +
  +  <!-- Should Java compilations set the 'debug' compiler option? -->
  +  <property name="compile.debug"           value="true"/>
  +
  +  <!-- Should Java compilations set the 'deprecation' compiler option? -->
  +  <property name="compile.deprecation"     value="true"/>
  +
  +  <!-- Should Java compilations set the 'optimize' compiler option? -->
  +  <property name="compile.optimize"        value="true"/>
  +
  +  <!-- Construct compile classpath -->
     <path id="classpath">
  -    <fileset dir="${LIB}">
  -      <include name="*.jar"/>
  +    <fileset dir="${local.repository}">
  +      <include name="**/*.jar"/>
       </fileset>
  -    <fileset dir="${BUILDLIB}">
  -      <include name="*.jar"/>
  +    <fileset dir="${project.repository}">
  +      <include name="**/*.jar"/>
       </fileset>
     </path>
   
  -  <!-- *** TARGETS ************************************************************* -->
  +<!-- ========== Executable Targets ======================================== -->
   
   
  -  <target name="init">
  -    <!-- Create the time stamp -->
  +  <!-- ================================================================== -->
  +  <!-- I N I T                                                            -->
  +  <!-- ================================================================== -->
  +  <target name="init"
  +   description="Initialize and evaluate conditionals">
  +    <echo message="-------- ${project.name} --------"/>
       <tstamp/>
     </target>
   
   
  -  <target name="help" depends="init">
  -    <!-- Print usage information -->
  -    <echo>WEBPROJEKTO BUILD TOOL</echo>
  -    <echo> </echo>
  -    <echo>Usage: ant &lt;target&gt;                                         </echo>
  -    <echo>                                                                  </echo>
  -    <echo>where the following targets are supported:                        </echo>
  -    <echo>                                                                  </echo>
  -    <echo>  compile  Compile all sources.                                   </echo>
  -    <echo>                                                                  </echo>
  -    <echo>  javadoc  Generate javadoc documentation.                        </echo>
  -    <echo>                                                                  </echo>
  -    <echo>  clean    Clean dev tree and previously generated distributions. </echo>
  -    <echo>                                                                  </echo>
  -    <echo>  devwar   Pack the entire application into a war file.           </echo>
  -    <echo>                                                                  </echo>
  -    <echo>  help     Print this help information.                           </echo>
  -    <echo>                                                                  </echo>
  -  </target>
  -
  -
  -  <target name="compile" depends="">
  -    <!-- Compile the java code from ${SRC} into ${CLASSES} -->
  -    <javac srcdir="${SRC}"
  -           includes="*/**"
  -           destdir="${CLASSES}">
  -       <classpath refid="classpath"/>
  +  <!-- ================================================================== -->
  +  <!-- C O M P I L E                                                      -->
  +  <!-- ================================================================== -->
  +  <target name="compile" depends="init" description="Compile">
  +
  +    <javac  srcdir="${source.home}/"
  +            destdir="${build.home}/classes"
  +            debug="${compile.debug}"
  +            deprecation="${compile.deprecation}"
  +            optimize="${compile.optimize}">
  +        <classpath refid="classpath"/>
       </javac>
   
  -    <!-- classpath="${LIB}/struts.jar;${LIB}/servlet.jar;${LIB}/velocity-1.1.jar;${LIB}/jdbc2_0-stdext.jar" -->
  -  </target>
  -
  +    <copy    todir="${build.home}/classes">
  +      <fileset dir="${source.home}" excludes="**/*.java"/>
  +    </copy>
   
  -  <target name="javadoc">
  -    <!-- Remove any old documentation -->
  -    <!-- <delete dir="${JAVADOC}"/> -->
  -
  -    <!-- (Re)Create javadoc directory -->
  -    <mkdir dir="${JAVADOC}"/>
  -
  -    <!-- Generate Javadoc -->
  -    <javadoc sourcepath="${SRC}"
  -           packagenames="org.*"
  -           destdir="${JAVADOC}"
  -           author="true"
  -           version="true"
  -           use="true"
  -           windowtitle="Velocity for Struts"
  -           doctitle="Velocity for Struts">
  -           <classpath refid="classpath"/>
  -           <link href="http://jakarta.apache.org/struts/api/"/>
  -           <link href="http://java.sun.com/products/servlet/2.3/javadoc/"/>
  -           <link href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api"/>
  -           <link href="http://jakarta.apache.org/velocity/api/"/>
  -    </javadoc>
     </target>
  -           
   
  -  <target name="devwar" depends="init, clean, compile">
  -    <!-- Generate .war file, name it velstruts.war -->
  -    <jar jarfile="${basedir}/../velstruts.war" basedir="${DEV}"/>
  -  </target>
   
  +  <!-- ================================================================== -->
  +  <!-- C L E A N                                                          -->
  +  <!-- ================================================================== -->
  +  <target name="clean" depends="init" 
  +   description="Clean build and distribution directories">
   
  -  <target name="clean">
       <!-- remove old class files -->
       <delete>
  -      <fileset dir="${CLASSES}" includes="**/*.class"/>
  +      <fileset dir="${build.home}/classes" includes="**/*.class"/>
  +    </delete>
  +
  +    <delete>
  +      <fileset dir="${build.home}/lib" includes="velocity-tools-struts-*"/>
  +    </delete>
  +
  +    <!-- remove jsp temporary cache -->
  +    <delete    dir="${build.home}/work"/>
  +
  +
  +    <!-- remove old docs -->
  +    <delete    dir="${docs.dest}/javadoc"/>
  +    <delete>
  +      <fileset dir="${docs.dest}" includes="tool*.html,index.html"/>
       </delete>
   
       <!-- remove *.bak backups -->
  @@ -111,10 +125,19 @@
         <fileset dir="${basedir}" includes="**/*.bak"/>
       </delete>
   
  -    <!-- remove old javadoc -->
  -    <delete dir="${JAVADOC}"/>
  +  </target>
  +
   
  +  <!-- ================================================================== -->
  +  <!-- W A R                                                              -->
  +  <!-- ================================================================== -->
  +  <target name="war" depends="clean, compile"
  +    description="Generate a *.war file of the example application">
  +    <!-- Generate .war file, name it velstruts.war -->
  +    <jar jarfile="${basedir}/../velstruts.war" basedir="${basedir}"/>
     </target>
  -  
  +
  +
   
   </project>
  +
  
  
  
  1.5       +59 -97    jakarta-velocity-tools/struts/examples/struts/index.html
  
  Index: index.html
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/index.html,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- index.html	16 Jan 2002 11:10:02 -0000	1.4
  +++ index.html	12 Mar 2002 11:36:47 -0000	1.5
  @@ -10,119 +10,81 @@
       <td> 
         <h2><font color="#FFFFFF"><img src="doc/img/spacer.gif" width="520" height="1"><br>
   				Velocity for Struts</font></h2>
  -      <font color="#FFFFFF">January 16. 2002</font></td>
  +      <font color="#FFFFFF">Version 0.6, March 5. 2002</font></td>
       <td align="right">&nbsp;</td>
     </tr>
   </table>
   
  -<p>This is a play ground for experimenting with the integration of Velocity and 
  -	Struts. Several applications examples are provided below. The goal is to grow 
  -	this into a full blown example application that demonstrates all aspects of 
  -	Struts applications based on Velocity views.</p>
  +<p>This is a web application to demonstrate the integration of Velocity with Struts.
  +   It contains basic documentation and serveral example applications.</p>
  +
  +<p>This includes version 0.6 of Velocity for Struts. The API has been completely
  +   redesigned and is now more complete and more systematic. Reference documentation
  +   for the included context tools has been added.</p>
  +
   <h5><b>Highlights</b></h5>
   <ul>
  -	<li>Five example applications demonstrate the use of Velocity templates with 
  -		Struts. Velocity templates have full access to the resources of the Struts 
  -		framework (once we are done). JSP versions of the same examples have been 
  -		provided, allowing a comparison of the two view technologies.</li>
  -	<li>Several examples demonstrate the mixed use of Velocity and JSP templates 
  -		in the same application example.</li>
  -	<li>All examples are based on the new ViewVelocityServlet, a generic Velocity 
  -		servlet with toolbox support. In fact, the Struts / Velocity integration has 
  -		be implemented as a set of Velocity context tools.</li>
  -	<li>The integration has been achieved without modification of the Struts framework. 
  -		The current release version 1.0 is supported. </li>
  +	<li>Velocity is now becoming an alternative view technology for Struts-based
  +	    Web applications.</li>
  +	<li>Velocity templates can be mixed with JSP templates in the same application.</li>
  +	<li>No changes are required to Struts. This works with Struts 1.0, 1.01, 1.02 
  +	    and the upcoming Struts 1.1.</li>
   </ul>
  -<h5><b>To Do</b></h5>
  +
  +
  +
  +<h5><b>Overview</b></h5>
   <ul>
  -	<li>extend the functionality of the Struts context tools</li>
  -	<li>documentation
  -		<ul>
  -			<li>of the context tools</li>
  -			<li>of how to configure a Struts application for Velocity support</li>
  -		</ul>
  -	</li>
  +	<li><b><a href="doc/examples.html">Example Applications</a></b><br>
  +		Five small example application have been included. Look at example 2 for a
  +		demonstration of the Velocity context tools for Struts. JSP versions of 
  +		some of the examples have been included to allow a direct comparison of 
  +		the two view technologies.</li>
   </ul>
  -<h5><b>Examples</b></h5>
  +
   <ul>
  -	<li><b>Struts App1: Address Editor</b><br>
  -		This application is a very simple address editor. It consists of two dynamic 
  -		pages, one ActionForm, one Action class and an AddressBean. Address information 
  -		is gathered through a form and associated with a HTTP session. This information 
  -		can be displayed and modified. It demonstrates how the Struts control framework 
  -		can be used independently of a specific view technology. JSP and Velocity 
  -		templates can be mixed and matched within the same application. The support 
  -		for multiple languages demonstrates how Struts resources may be accessed from 
  -		within templates. 
  -		<ul>
  -			<li><a href="address2.do">Velocity Version</a></li>
  -			<li><a href="address1.do">JSP Version</a></li>
  -		</ul>
  -		<p>&nbsp;</p>
  -	</li>
  -	<li><b>Struts App2: Struts Context Tool Demo</b><br>
  -		This application demonstrates how support for Struts is achived through context 
  -		tools. Two context tools provide access to Struts resources. Their functionality 
  -		is a subset of the custom tag libraries in JSP. 
  -		<ul>
  -			<li><a href="examples/struts_app2/tool-demo.vm">Struts Context Tool Demo</a> 
  -				(<a href="examples/struts_app2/tool-demo.txt">template</a>)</li>
  -		</ul>
  -		<p>&nbsp;</p>
  -	</li>
  -	<li><b><i><font color="#FF0000">New</font></i> Struts App3: Struts Logon Example</b><br>
  -		This is the well known Struts logon example application by Ted Husted. Here 
  -		it is implemented in both JSP and Velocity versions. 
  -		<ul>
  -			<li><a href="welcome_vm.do">Velocity Version</a></li>
  -			<li><a href="welcome_jsp.do">JSP Version</a></li>
  -		</ul>
  -		<p>&nbsp;</p>
  -	</li>
  -	<li> 
  -		<p><b>Context Tool Demo: MathTool</b><br>
  -			This example demonstrates how a context tool can be loaded from within a 
  -			template by the view designer. The tool used to load context tools is also 
  -			a context tool. It is defined in web.xml and pre-loaded during initialization. 
  -		<ul>
  -			<li><a href="examples/context_tools/mathtool-demo.vm">Math Tool Demo</a> 
  -				(<a href="examples/context_tools/mathtool-demo.txt">template</a>)</li>
  -		</ul>
  -		<p>&nbsp;</p>
  -	</li>
  -	<li><b>List HTTP Request Header</b><br>
  -		This application simply lists the HTTP request headers. It demonstrates how 
  -		to access functionality provided by the servlet API in Velocity and JSP templates. 
  -		The JSP implementation uses the Struts bean and logic custom tag libraries. 
  -		<ul>
  -			<li><a href="examples/request_headers/list.vm">Velocity Version</a></li>
  -			<li><a href="examples/request_headers/list.jsp">JSP Version</a><br>
  -			</li>
  -		</ul>
  -		<br>
  -	</li>
  +	<li><b><a href="doc/index.html">Reference Documentation</a></b><br>
  +	    This is the reference documentation of the context tools.
  +	    <ul>
  +	        <li><a href="doc/tool-MessageTool.html">MessageTool</a> - handles internationalized messages</li>
  +	        <li><a href="doc/tool-ErrorsTool.html">ErrorsTool</a> - handles error messages</li>
  +	        <li><a href="doc/tool-FormTool.html">FormTool</a> - provides support for form handling</li>
  +	        <li><a href="doc/tool-LinkTool.html">LinkTool</a> - works with URIs</li>
  +	    </ul>
  +    </li>
   </ul>
  -<h5>&nbsp;</h5>
  +
  +<ul>
  +    <li><b><a href="doc/javadoc/index.html">JavaDoc</a></b><br></li>
  +</ul>
  +        
  +
  +
  +<h5><b>To Do</b></h5>
  +<ul>
  +	<li>add documentation: overview, user guide, quick reference guide</li>
  +	<li>make documentation printable</li>
  +	<li>add ActionMessagesTool</li>
  +	<li>rework the current logging concept for context tools</li>
  +	<li>setup test cases</li>
  +	<li>add capability to config Velocity</li>
  +	<li>put together a binary distribution with examples and a blank application</li>
  +	<li>remove Velocity's [INFO] logging for each template<li>
  +</ul>
  +
  +
  +	    
   <h5>Tested Configuration</h5>
   <ul>
  -	<li>Tomcat 4.01, Tomcat 3.23</li>
  -	<li>Netscape 4.7, MS Explorer 5.0</li>
  -	<li>Java 2 Version 1.3.0, Standard Editon, with Java Hot Spot Client VM</li>
  -	<li>Ant 1.3</li>
  -	<li>Jakarta Struts 1.0.1 Binary Library Distribution </li>
  -	<li>Jakarta Velocity 1.2 with dependencies 
  -		<ul>
  -			<li>velocity-dep-1.2.jar</li>
  -		</ul>
  -	</li>
  +	<li>Tomcat 4.01, Resin 2.0.5</li>
  +	<li>Netscape 4.7, MS Explorer 5.5</li>
  +	<li>Java 2 Version 1.3.1, Standard Editon, with Java Hot Spot Client VM</li>
  +	<li>Ant 1.4</li>
  +	<li>Jakarta Struts 1.0.2 Binary Library Distribution </li>
  +	<li>Jakarta Velocity 1.3 dev with dependencies</li>
   	<li>Jakarta Servlet API 4 (same as distributed with Tomcat 4) 
  -		<ul>
  -			<li>jakarta-servlet-api-4.jar</li>
  -		</ul>
   	</li>
   </ul>
   
  -<h5>&nbsp;</h5>
   </BODY>
  -
   </HTML>
  
  
  
  1.3       +41 -4     jakarta-velocity-tools/struts/examples/struts/WEB-INF/struts-config.xml
  
  Index: struts-config.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/WEB-INF/struts-config.xml,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- struts-config.xml	9 Jan 2002 11:25:42 -0000	1.2
  +++ struts-config.xml	12 Mar 2002 11:36:47 -0000	1.3
  @@ -43,18 +43,40 @@
                  type="examples.app1.AddressForm"/>
   
   
  +    <!-- Struts Example Application 2 -->
  +
  +     <form-bean
  +        name="demoForm"
  +        type= "examples.app2.DemoForm"/>
  +
  +
       <!-- Struts Example Application 3 -->
   
        <form-bean
           name="logonForm"
           type= "examples.app3.LogonForm"/>
   
  +
  +    <!-- Struts Example Application 4 -->
  +    
  +    <form-bean name="addrForm"
  +               type="examples.app4.AddressForm"/>
  +
  +
     </form-beans>
   
   
     <!-- ========== Global Forward Definitions ============================== -->
     <global-forwards>
   
  +    <!-- Struts Example Application 2 -->
  +
  +    <!-- Forward to home -->
  +     <forward
  +        name="start"
  +        path="/home.do"/>
  +
  +
       <!-- Struts Example Application 3, JSP Version -->
   
       <!-- Forward to welcome -->
  @@ -119,10 +141,13 @@
   
   
       <!-- Struts Example Application 2, Velocity Version -->
  -    <action path="/tooldemo"
  -            type="examples.app2.ToolDemoAction">
  -        <forward name="gotoStart" path="/examples/struts_app2/tool-demo.vm"/>
  -        <forward name="gotoEnd" path="/examples/struts_app2/tool-demo.vm"/>
  +    <action path="/demo"
  +            type="examples.app2.DemoAction"
  +            name="demoForm"
  +            scope="request"
  +            validate="false">
  +        <forward name="home" path="/examples/struts_app2/tool-demo.vm"/>
  +        <forward name="exit" path="/examples/struts_app2/tool-demo.vm"/>
       </action>
   
   
  @@ -198,6 +223,18 @@
           type="examples.app3.LogoffAction">
         <forward name="continue" path="/examples/struts_app3/index.vm"/>
       </action>
  +
  +
  +    <!-- Struts Example Application 4, Velocity Version --> 
  +    <action path="/addressdb"
  +            type="examples.app4.AddressAction"
  +            name="addrForm"
  +            scope="request">
  +        <forward name="listAddresses" path="/examples/struts_app4/list-addresses.vm"/>
  +        <forward name="editAddress" path="/examples/struts_app4/edit-address.vm"/>
  +    </action>
  +
  +
   
   
   
  
  
  
  1.2       +14 -4     jakarta-velocity-tools/struts/examples/struts/WEB-INF/toolbox.xml
  
  Index: toolbox.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/WEB-INF/toolbox.xml,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- toolbox.xml	3 Jan 2002 20:21:08 -0000	1.1
  +++ toolbox.xml	12 Mar 2002 11:36:47 -0000	1.2
  @@ -10,13 +10,23 @@
      </object>
   
      <object>
  -     <contextkey>bean</contextkey>
  -     <class>org.apache.velocity.tools.struts.StrutsBeanTool</class>
  +     <contextkey>link</contextkey>
  +     <class>org.apache.velocity.tools.struts.LinkTool</class>
      </object>
   
      <object>
  -     <contextkey>html</contextkey>
  -     <class>org.apache.velocity.tools.struts.StrutsHtmlTool</class>
  +     <contextkey>msg</contextkey>
  +     <class>org.apache.velocity.tools.struts.MessageTool</class>
  +   </object>
  +
  +   <object>
  +     <contextkey>errors</contextkey>
  +     <class>org.apache.velocity.tools.struts.ErrorsTool</class>
  +   </object>
  +
  +   <object>
  +     <contextkey>form</contextkey>
  +     <class>org.apache.velocity.tools.struts.FormTool</class>
      </object>
   
   
  
  
  
  1.3       +8 -2      jakarta-velocity-tools/struts/examples/struts/WEB-INF/classes/ApplicationResources.properties
  
  Index: ApplicationResources.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/WEB-INF/classes/ApplicationResources.properties,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ApplicationResources.properties	9 Jan 2002 11:25:42 -0000	1.2
  +++ ApplicationResources.properties	12 Mar 2002 11:36:47 -0000	1.3
  @@ -16,9 +16,15 @@
   
   # Tags for Struts demo app 2
   title=Struts Example Application 2
  +test=This string has 5 replacement parameters: {0}, {1}, {2}, {3}, {4}
  +error01=<li>Error 01: A global error message</li>
  +error02=<li>Error 02: Another global error message</li>
  +error10=<li>Error 10: An error specific to "language"</li>
  +error11=<li>Error 11: Another error specific to "language"</li>
  +
   
   # Tags for Struts demo app 3
  -errors.footer=</ul><hr>
  -errors.header=<h3><font color="red">Validation Error</font></h3>You must correct the following error(s) before proceeding:<ul>
  +errors.footer=</ul>
  +errors.header=You must correct the following error(s) before proceeding:<ul>
   error.username.required=<li>Username is required</li>
   error.password.required=<li>Password is required</li>
  
  
  
  1.4       +0 -0      jakarta-velocity-tools/struts/examples/struts/WEB-INF/lib/struts-config_1_0.dtd
  
  Index: struts-config_1_0.dtd
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/WEB-INF/lib/struts-config_1_0.dtd,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- struts-config_1_0.dtd	16 Jan 2002 11:10:02 -0000	1.3
  +++ struts-config_1_0.dtd	12 Mar 2002 11:36:48 -0000	1.4
  @@ -11,7 +11,7 @@
          "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
   
  -     $Id: struts-config_1_0.dtd,v 1.3 2002/01/16 11:10:02 sidler Exp $
  +     $Id: struts-config_1_0.dtd,v 1.4 2002/03/12 11:36:48 sidler Exp $
   -->
   
   
  
  
  
  1.3       +254 -269  jakarta-velocity-tools/struts/examples/struts/WEB-INF/lib/struts.jar
  
  	<<Binary file>>
  
  
  1.2       +601 -631  jakarta-velocity-tools/struts/examples/struts/WEB-INF/lib/velocity-1.3-dev.jar
  
  	<<Binary file>>
  
  
  1.1                  jakarta-velocity-tools/struts/examples/struts/WEB-INF/lib/struts-bean.tld
  
  Index: struts-bean.tld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  
  
  
  
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  <taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>bean</shortname>
  <uri>http://jakarta.apache.org/struts/tags-bean-1.0.2</uri>
  <tag>
  <name>cookie</name>
  <tagclass>org.apache.struts.taglib.bean.CookieTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.CookieTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>multiple</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>define</name>
  <tagclass>org.apache.struts.taglib.bean.DefineTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.DefineTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>toScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>type</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>header</name>
  <tagclass>org.apache.struts.taglib.bean.HeaderTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.HeaderTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>multiple</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>include</name>
  <tagclass>org.apache.struts.taglib.bean.IncludeTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.IncludeTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>anchor</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>href</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>transaction</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>message</name>
  <tagclass>org.apache.struts.taglib.bean.MessageTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>arg0</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>arg1</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>arg2</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>arg3</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>arg4</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>key</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>page</name>
  <tagclass>org.apache.struts.taglib.bean.PageTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.PageTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>parameter</name>
  <tagclass>org.apache.struts.taglib.bean.ParameterTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.ParameterTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>multiple</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>resource</name>
  <tagclass>org.apache.struts.taglib.bean.ResourceTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.ResourceTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>input</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>size</name>
  <tagclass>org.apache.struts.taglib.bean.SizeTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.SizeTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>collection</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>struts</name>
  <tagclass>org.apache.struts.taglib.bean.StrutsTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.StrutsTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>formBean</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>mapping</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>write</name>
  <tagclass>org.apache.struts.taglib.bean.WriteTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>filter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ignore</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  </taglib>
  
  
  
  
  
  
  1.1                  jakarta-velocity-tools/struts/examples/struts/WEB-INF/lib/struts-form.tld
  
  Index: struts-form.tld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  
  
  
  
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  <taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>form</shortname>
  <tag>
  <name>base</name>
  <tagclass>org.apache.struts.taglib.html.BaseTag</tagclass>
  <bodycontent>empty</bodycontent>
  </tag>
  <tag>
  <name>button</name>
  <tagclass>org.apache.struts.taglib.html.ButtonTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>cancel</name>
  <tagclass>org.apache.struts.taglib.html.CancelTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>checkbox</name>
  <tagclass>org.apache.struts.taglib.html.CheckboxTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>errors</name>
  <tagclass>org.apache.struts.taglib.html.ErrorsTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>file</name>
  <tagclass>org.apache.struts.taglib.html.FileTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>accept</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>maxlength</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>form</name>
  <tagclass>org.apache.struts.taglib.html.FormTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>action</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>enctype</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>focus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>method</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onreset</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onsubmit</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>target</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>type</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>hidden</name>
  <tagclass>org.apache.struts.taglib.html.HiddenTag</tagclass>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>html</name>
  <tagclass>org.apache.struts.taglib.html.HtmlTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>xhtml</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>image</name>
  <tagclass>org.apache.struts.taglib.html.ImageTag</tagclass>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>src</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>path</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>isKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>link</name>
  <tagclass>org.apache.struts.taglib.html.LinkTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>href</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>linkName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>target</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>multibox</name>
  <tagclass>org.apache.struts.taglib.html.MultiboxTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>option</name>
  <tagclass>org.apache.struts.taglib.html.OptionTag</tagclass>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>options</name>
  <tagclass>org.apache.struts.taglib.html.OptionsTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>collection</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>labelName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>labelProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>password</name>
  <tagclass>org.apache.struts.taglib.html.PasswordTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>maxlength</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>radio</name>
  <tagclass>org.apache.struts.taglib.html.RadioTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>reset</name>
  <tagclass>org.apache.struts.taglib.html.ResetTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>rewrite</name>
  <tagclass>org.apache.struts.taglib.html.RewriteTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>href</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>select</name>
  <tagclass>org.apache.struts.taglib.html.SelectTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>multiple</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>submit</name>
  <tagclass>org.apache.struts.taglib.html.SubmitTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>text</name>
  <tagclass>org.apache.struts.taglib.html.TextTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>maxlength</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>textarea</name>
  <tagclass>org.apache.struts.taglib.html.TextareaTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>cols</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>rows</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  </taglib>
  
  
  
  
  1.1                  jakarta-velocity-tools/struts/examples/struts/WEB-INF/lib/struts-html.tld
  
  Index: struts-html.tld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  
  
  
  
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  <taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>html</shortname>
  <uri>http://jakarta.apache.org/struts/tags-html-1.0.2</uri>
  <tag>
  <name>base</name>
  <tagclass>org.apache.struts.taglib.html.BaseTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>target</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>button</name>
  <tagclass>org.apache.struts.taglib.html.ButtonTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>cancel</name>
  <tagclass>org.apache.struts.taglib.html.CancelTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>checkbox</name>
  <tagclass>org.apache.struts.taglib.html.CheckboxTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>errors</name>
  <tagclass>org.apache.struts.taglib.html.ErrorsTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>file</name>
  <tagclass>org.apache.struts.taglib.html.FileTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>accept</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>maxlength</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>form</name>
  <tagclass>org.apache.struts.taglib.html.FormTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>action</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>enctype</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>focus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>method</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onreset</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onsubmit</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>target</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>type</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>hidden</name>
  <tagclass>org.apache.struts.taglib.html.HiddenTag</tagclass>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>html</name>
  <tagclass>org.apache.struts.taglib.html.HtmlTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>xhtml</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>image</name>
  <tagclass>org.apache.struts.taglib.html.ImageTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>align</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>border</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>pageKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>src</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>srcKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>img</name>
  <tagclass>org.apache.struts.taglib.html.ImgTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>align</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>border</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>height</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>hspace</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>imageName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ismap</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>lowsrc</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>pageKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>src</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>srcKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>usemap</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>vspace</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>width</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>link</name>
  <tagclass>org.apache.struts.taglib.html.LinkTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>anchor</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>href</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>linkName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>target</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>transaction</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>multibox</name>
  <tagclass>org.apache.struts.taglib.html.MultiboxTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>option</name>
  <tagclass>org.apache.struts.taglib.html.OptionTag</tagclass>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>key</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>options</name>
  <tagclass>org.apache.struts.taglib.html.OptionsTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>collection</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>labelName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>labelProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>password</name>
  <tagclass>org.apache.struts.taglib.html.PasswordTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>maxlength</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>readonly</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>redisplay</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>radio</name>
  <tagclass>org.apache.struts.taglib.html.RadioTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>reset</name>
  <tagclass>org.apache.struts.taglib.html.ResetTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>rewrite</name>
  <tagclass>org.apache.struts.taglib.html.RewriteTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>anchor</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>href</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>transaction</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>select</name>
  <tagclass>org.apache.struts.taglib.html.SelectTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>multiple</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>submit</name>
  <tagclass>org.apache.struts.taglib.html.SubmitTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>text</name>
  <tagclass>org.apache.struts.taglib.html.TextTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>maxlength</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>readonly</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>textarea</name>
  <tagclass>org.apache.struts.taglib.html.TextareaTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>cols</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>readonly</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>rows</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  </taglib>
  
  
  
  
  1.1                  jakarta-velocity-tools/struts/examples/struts/WEB-INF/lib/struts-logic.tld
  
  Index: struts-logic.tld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  
  
  
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  <taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>logic</shortname>
  <uri>http://jakarta.apache.org/struts/tags-logic-1.0.2</uri>
  <tag>
  <name>equal</name>
  <tagclass>org.apache.struts.taglib.logic.EqualTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>forward</name>
  <tagclass>org.apache.struts.taglib.logic.ForwardTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>greaterEqual</name>
  <tagclass>org.apache.struts.taglib.logic.GreaterEqualTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>greaterThan</name>
  <tagclass>org.apache.struts.taglib.logic.GreaterThanTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>iterate</name>
  <tagclass>org.apache.struts.taglib.logic.IterateTag</tagclass>
  <teiclass>org.apache.struts.taglib.logic.IterateTei</teiclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>collection</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>length</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>offset</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>type</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>lessEqual</name>
  <tagclass>org.apache.struts.taglib.logic.LessEqualTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>lessThan</name>
  <tagclass>org.apache.struts.taglib.logic.LessThanTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>match</name>
  <tagclass>org.apache.struts.taglib.logic.MatchTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>location</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>notEqual</name>
  <tagclass>org.apache.struts.taglib.logic.NotEqualTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>notMatch</name>
  <tagclass>org.apache.struts.taglib.logic.NotMatchTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>location</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>notPresent</name>
  <tagclass>org.apache.struts.taglib.logic.NotPresentTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>user</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>present</name>
  <tagclass>org.apache.struts.taglib.logic.PresentTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>user</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>redirect</name>
  <tagclass>org.apache.struts.taglib.logic.RedirectTag</tagclass>
  <attribute>
  <name>anchor</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>href</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>transaction</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  </taglib>
  
  
  
  
  
  
  1.1                  jakarta-velocity-tools/struts/examples/struts/WEB-INF/lib/struts-template.tld
  
  Index: struts-template.tld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  
  
  
  
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  <taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>template</shortname>
  <uri>http://jakarta.apache.org/struts/tags-template-1.0.2</uri>
  <tag>
  <name>insert</name>
  <tagclass>org.apache.struts.taglib.template.InsertTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>template</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>put</name>
  <tagclass>org.apache.struts.taglib.template.PutTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>content</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>direct</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>get</name>
  <tagclass>org.apache.struts.taglib.template.GetTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>flush</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  </taglib>
  
  
  
  
  
  
  1.1                  jakarta-velocity-tools/struts/examples/struts/WEB-INF/lib/struts.tld
  
  Index: struts.tld
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" ?>
  <!DOCTYPE taglib
    PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
    "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  
  <taglib>
  
    <!-- ============== Tag Library Description Elements ============= -->
  
    <tlibversion>1.0</tlibversion>
    <jspversion>1.1</jspversion>
    <shortname>STRUTS Framework Tag Library</shortname>
    <uri>http://jakarta.apache.org/taglibs/struts-1.0</uri>
    <info>
      This tag library contains useful general-purpose tags supporting the
      development of JSP/servlet applications based on the "Model 2" (MVC
      based) design pattern.
  
      WARNING:  ALL OF THE TAGS IN THIS LIBRARY ARE DEPRECATED, AND
      ARE MAINTAINED ONLY FOR BACKWARDS COMPATIBILITY.  THEY WILL BE
      REMOVED IN A FUTURE VERSION OF STRUTS.
  
    </info>
  
    <!-- ===================== Control Flow Tags ====================== -->
  
  
    <tag>
      <name>enumerate</name>
      <tagclass>org.apache.struts.taglib.EnumerateTag</tagclass>
      <teiclass>org.apache.struts.taglib.EnumerateTei</teiclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>collection</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>id</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>length</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>offset</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>forward</name>
      <tagclass>org.apache.struts.taglib.ForwardTag</tagclass>
      <bodycontent>empty</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>iterate</name>
      <tagclass>org.apache.struts.taglib.IterateTag</tagclass>
      <teiclass>org.apache.struts.taglib.IterateTei</teiclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>collection</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>id</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>length</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>offset</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>ifAttributeExists</name>
      <tagclass>org.apache.struts.taglib.IfAttributeExistsTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>scope</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>ifAttributeMissing</name>
      <tagclass>org.apache.struts.taglib.IfAttributeMissingTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>scope</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>ifParameterEquals</name>
      <tagclass>org.apache.struts.taglib.IfParameterEqualsTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>ifParameterNotEquals</name>
      <tagclass>org.apache.struts.taglib.IfParameterNotEqualsTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>ifParameterNotNull</name>
      <tagclass>org.apache.struts.taglib.IfParameterNotNullTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>ifParameterNull</name>
      <tagclass>org.apache.struts.taglib.IfParameterNullTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>ifPropertyEquals</name>
      <tagclass>org.apache.struts.taglib.IfPropertyEqualsTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>scope</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>ifPropertyNotEquals</name>
      <tagclass>org.apache.struts.taglib.IfPropertyNotEqualsTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>scope</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>include</name>
      <tagclass>org.apache.struts.taglib.IncludeTag</tagclass>
      <bodycontent>empty</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>redirect</name>
      <tagclass>org.apache.struts.taglib.RedirectTag</tagclass>
      <bodycontent>empty</bodycontent>
      <attribute>
        <name>href</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
  
  
    <!-- =================== Form Management Tags ===================== -->
  
  
    <tag>
      <name>errors</name>
      <tagclass>org.apache.struts.taglib.ErrorsTag</tagclass>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>form</name>
      <tagclass>org.apache.struts.taglib.FormTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>action</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>enctype</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>focus</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>method</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onReset</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onSubmit</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>scope</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>target</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>type</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>button</name>
      <tagclass>org.apache.struts.taglib.ButtonTag</tagclass>
      <attribute>
        <name>accessKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onBlur</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onChange</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onDblClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onFocus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyPress</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseMove</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOut</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOver</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>tabIndex</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>cancel</name>
      <tagclass>org.apache.struts.taglib.CancelTag</tagclass>
      <attribute>
        <name>accessKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onBlur</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onChange</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onDblClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onFocus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyPress</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseMove</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOut</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOver</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>tabIndex</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>checkbox</name>
      <tagclass>org.apache.struts.taglib.CheckboxTag</tagclass>
      <attribute>
        <name>accessKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onBlur</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onChange</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onDblClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onFocus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyPress</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseMove</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOut</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOver</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>tabIndex</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>file</name>
      <tagclass>org.apache.struts.taglib.FileTag</tagclass>
      <attribute>
        <name>accessKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>accept</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>maxlength</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onBlur</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onChange</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onDblClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onFocus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyPress</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseMove</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOut</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOver</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onSelect</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>size</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>tabIndex</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>hidden</name>
      <tagclass>org.apache.struts.taglib.HiddenTag</tagclass>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>multibox</name>
      <tagclass>org.apache.struts.taglib.MultiboxTag</tagclass>
      <attribute>
        <name>accessKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onBlur</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onChange</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onDblClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onFocus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyPress</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseMove</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOut</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOver</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>tabIndex</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>option</name>
      <tagclass>org.apache.struts.taglib.OptionTag</tagclass>
      <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>options</name>
      <tagclass>org.apache.struts.taglib.OptionsTag</tagclass>
      <bodycontent>empty</bodycontent>
      <attribute>
        <name>labelName</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>labelProperty</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <!-- NOTE:  Either "name" or "property" (or both) is required -->
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>options1</name>
      <tagclass>org.apache.struts.taglib.Options1Tag</tagclass>
      <bodycontent>empty</bodycontent>
      <attribute>
        <name>labelName</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>labelProperty</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <!-- NOTE:  Either "name" or "property" (or both) is required -->
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>password</name>
      <tagclass>org.apache.struts.taglib.PasswordTag</tagclass>
      <attribute>
        <name>accessKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>maxlength</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onBlur</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onChange</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onDblClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onFocus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyPress</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseMove</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOut</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOver</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onSelect</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>size</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>tabIndex</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>property</name>
      <tagclass>org.apache.struts.taglib.PropertyTag</tagclass>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>radio</name>
      <tagclass>org.apache.struts.taglib.RadioTag</tagclass>
      <attribute>
        <name>accessKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onBlur</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onChange</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onDblClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onFocus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyPress</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseMove</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOut</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOver</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>tabIndex</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>reset</name>
      <tagclass>org.apache.struts.taglib.ResetTag</tagclass>
      <attribute>
        <name>accessKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onBlur</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onChange</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onDblClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onFocus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyPress</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseMove</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOut</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOver</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>tabIndex</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>select</name>
      <tagclass>org.apache.struts.taglib.SelectTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>accessKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>multiple</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onBlur</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onChange</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onDblClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onFocus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyPress</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseMove</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOut</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOver</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>size</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>tabIndex</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>submit</name>
      <tagclass>org.apache.struts.taglib.SubmitTag</tagclass>
      <attribute>
        <name>accessKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onBlur</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onChange</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onDblClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onFocus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyPress</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseMove</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOut</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOver</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>tabIndex</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>text</name>
      <tagclass>org.apache.struts.taglib.TextTag</tagclass>
      <attribute>
        <name>accessKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>maxlength</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onBlur</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onChange</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onDblClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onFocus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyPress</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseMove</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOut</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOver</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onSelect</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>size</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>tabIndex</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>textarea</name>
      <tagclass>org.apache.struts.taglib.TextareaTag</tagclass>
      <attribute>
        <name>accessKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>cols</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onBlur</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onChange</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onDblClick</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onFocus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyPress</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onKeyUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseDown</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseMove</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOut</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseOver</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onMouseUp</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>onSelect</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>rows</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>style</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>styleClass</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>tabIndex</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <!-- ===================== Presentation Tags ====================== -->
  
  
    <tag>
      <name>base</name>
      <tagclass>org.apache.struts.taglib.BaseTag</tagclass>
    </tag>
  
    <tag>
      <name>encodeRedirectURL</name>
      <tagclass>org.apache.struts.taglib.EncodeRedirectURLTag</tagclass>
      <attribute>
        <name>url</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>encodeURL</name>
      <tagclass>org.apache.struts.taglib.EncodeURLTag</tagclass>
      <attribute>
        <name>url</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>getProperty</name>
      <tagclass>org.apache.struts.taglib.GetPropertyTag</tagclass>
      <attribute>
        <name>id</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>htmlProperty</name>
      <tagclass>org.apache.struts.taglib.HtmlPropertyTag</tagclass>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>link</name>
      <tagclass>org.apache.struts.taglib.LinkTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>forward</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>href</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>target</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>link1</name>
      <tagclass>org.apache.struts.taglib.Link1Tag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>forward</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>href</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>property</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>target</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <tag>
      <name>parameter</name>
      <tagclass>org.apache.struts.taglib.ParameterTag</tagclass>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
  
  
    <!-- ===================== Resource Access Tags =================== -->
  
  
    <tag>
      <name>message</name>
      <tagclass>org.apache.struts.taglib.MessageTag</tagclass>
      <bodycontent>empty</bodycontent>
      <attribute>
        <name>bundle</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>key</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>locale</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>arg0</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>arg1</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>arg2</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>arg3</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>arg4</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
  
  
  </taglib>
  
  
  
  1.1                  jakarta-velocity-tools/struts/examples/struts/WEB-INF/src/ApplicationResources.properties
  
  Index: ApplicationResources.properties
  ===================================================================
  # Tags for Struts demo application 1
  title=Struts Example Application 1
  intro=A simple Struts application to demonstrate the use of mixed Velocity and JSP templates.
  header=The currently registered address is:
  language=Select language:
  firstname=First Name
  lastname=Last Name
  street=Street
  zip=ZIP Code
  city=City
  country=Country
  edit=Edit Address
  version=Version
  save=Save
  cancel=cancel
  
  # Tags for Struts demo app 2
  title=Struts Example Application 2
  test=This string has 5 replacement parameters: {0}, {1}, {2}, {3}, {4}
  error01=<li>Error 01: A global error message</li>
  error02=<li>Error 02: Another global error message</li>
  error10=<li>Error 10: An error specific to "language"</li>
  error11=<li>Error 11: Another error specific to "language"</li>
  
  
  # Tags for Struts demo app 3
  errors.footer=</ul>
  errors.header=You must correct the following error(s) before proceeding:<ul>
  error.username.required=<li>Username is required</li>
  error.password.required=<li>Password is required</li>
  
  
  1.1                  jakarta-velocity-tools/struts/examples/struts/WEB-INF/src/ApplicationResources_de.properties
  
  Index: ApplicationResources_de.properties
  ===================================================================
  # Tags for Struts demo application 1
  title=Struts Anwendungsbeispiel 1
  intro=Eine einfache Struts Anwendung, die die gemischte Verwendung von Velocity und JSP Templates demonstriert.
  header=Die registrierte Adresse lautet:
  language=Sprache ausw&auml;hlen:
  firstname=Vorname
  lastname=Nachname
  street=Strasse
  zip=PLZ
  city=Stadt
  country=Land
  edit=Adresse mutieren
  version=Version
  save=Speichern
  cancel=Abbrechen
  
  
  1.1                  jakarta-velocity-tools/struts/examples/struts/WEB-INF/src/examples/app2/DemoAction.java
  
  Index: DemoAction.java
  ===================================================================
  /*
   * Struts Example Application 1
   *  
   * This demonstrates the use of Velocity templates with the Struts framework.
   */
  
  
  package examples.app2;
  
  
  import java.io.IOException;
  import java.util.Hashtable;
  import java.util.Locale;
  import javax.servlet.RequestDispatcher;
  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpSession;
  import javax.servlet.http.HttpServletResponse;
  import org.apache.struts.action.Action;
  import org.apache.struts.action.ActionError;
  import org.apache.struts.action.ActionErrors;
  import org.apache.struts.action.ActionForm;
  import org.apache.struts.action.ActionForward;
  import org.apache.struts.action.ActionMapping;
  import org.apache.struts.action.ActionServlet;
  import org.apache.struts.util.MessageResources;
  
  
  /**
   * <p>A simple action used to demonstrate the context tools.</p>
   *
   * @author <a href="mailto:sidler@teamup.com"/>Gabe Sidler</a>
   * @version $Id: DemoAction.java,v 1.1 2002/03/12 11:36:48 sidler Exp $
   */
  public class DemoAction extends Action 
  {
  
  
      // --------------------------------------------------------- Public Methods
  
  	/**
  	 * Handle server requests.
       *
       * @param mapping The ActionMapping used to select this instance
       * @param actionForm The optional ActionForm bean for this request (if any)
       * @param request The HTTP request we are processing
       * @param response The HTTP response we are creating
       *
       * @exception IOException if an input/output error occurs
       * @exception ServletException if a servlet exception occurs
  	 */
      public ActionForward perform(ActionMapping mapping,
                                   ActionForm form,
                                   HttpServletRequest request,
                                   HttpServletResponse response)
                                   throws IOException, ServletException
      {
          String action;
  	    HttpSession session;
  
          // Create serveral error messages to demontrate the output in a template
          ActionErrors errors = new ActionErrors();
          
          // Add some global errors
          errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error01"));
          errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error02"));
  
          // Add some specific errors
          errors.add("language", new ActionError("error10"));
          errors.add("language", new ActionError("error11"));
          
          // Save error messages to request attributes
          saveErrors(request, errors);
  
          // Create and save a new transaction token
          saveToken(request);
  
          // forward to edit formular
          return (mapping.findForward("home"));
  
      }
  }
  
  
  
  
  1.1                  jakarta-velocity-tools/struts/examples/struts/WEB-INF/src/examples/app2/DemoForm.java
  
  Index: DemoForm.java
  ===================================================================
  /*
   * Struts Example Application 2
   *  
   * This demonstrates the use of Velocity templates with the Struts framework.
   */
  
  
  package examples.app2;
  
  
  import javax.servlet.http.HttpServletRequest;
  import org.apache.struts.action.ActionError;
  import org.apache.struts.action.ActionErrors;
  import org.apache.struts.action.ActionForm;
  import org.apache.struts.action.ActionMapping;
  
  
  /**
   * <p>A simple form for demo purposes.</p>
   *
   * @author <a href="mailto:sidler@teamup.com"/>Gabe Sidler</a>
   * @version $Id: DemoForm.java,v 1.1 2002/03/12 11:36:48 sidler Exp $
   */
  
  public final class DemoForm extends ActionForm 
  {
  
      // ---- Form fields -------------------------------------------------
   
      private String language = "";
      
  
      // ---- Accessor Methods --------------------------------------------
      
      public String getLanguage()
      {
          return language;
      }
      
      public void setLanguage(String s)
      {
          language = s;
      }
  
  
  
  
      /**
       * Reset all properties to their default values.
       *
       * @param mapping The mapping used to select this instance
       * @param request The servlet request we are processing
       */
      public void reset(ActionMapping mapping, HttpServletRequest request) 
      {
  
          language = "";
  
      }
  
  }
  
  
  
  
  
  1.3       +1 -1      jakarta-velocity-tools/struts/examples/struts/doc/config.html
  
  Index: config.html
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/doc/config.html,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- config.html	9 Jan 2002 11:25:43 -0000	1.2
  +++ config.html	12 Mar 2002 11:36:48 -0000	1.3
  @@ -15,7 +15,7 @@
     </tr>
   </table>
   	
  -<div><a href="../index.html"><font color="#000000">Home</font></a> <font color="#000000">&gt; To Do</font></div>
  +<div><a href="../index.html"><font color="#000000">Home</font></a> <font color="#000000">&gt; Configuration</font></div>
   
   
   			
  
  
  
  1.1                  jakarta-velocity-tools/struts/examples/struts/doc/examples.html
  
  Index: examples.html
  ===================================================================
  <HTML>
  <HEAD>
    <TITLE>Velocity for Struts</TITLE>
    <link rel="stylesheet" href="styles.css" type="text/css">
  </HEAD>
  
  <BODY>
  <table width="100%" border="0" cellspacing="0" cellpadding="5">
    <tr bgcolor="#000066"> 
      <td> 
        <h2><font color="#FFFFFF"><img src="img/spacer.gif" width="520" height="1"><br>
  				Velocity for Struts</font></h2>
        <font color="#FFFFFF">March 5. 2002</font></td>
      <td align="right">&nbsp;</td>
    </tr>
  </table>
  
  <div><a href="../index.html"><font color="#000000">Home</font></a> <font color="#000000">&gt; Examples</font></div>
  
  
  <h5><b>Examples</b></h5>
  <ul>
  	<li><b>Struts App1: Address Editor</b><br>
  		This application is a very simple address editor. It consists of two dynamic 
  		pages, one ActionForm, one Action class and an AddressBean. Address information 
  		is gathered through a form and associated with a HTTP session. This information 
  		can be displayed and modified. It demonstrates how the Struts control framework 
  		can be used independently of a specific view technology. JSP and Velocity 
  		templates can be mixed and matched within the same application. The support 
  		for multiple languages demonstrates how Struts resources may be accessed from 
  		within templates. 
  		<ul>
  			<li><a href="../address2.do" target="demo">Velocity Version</a></li>
  			<li><a href="../address1.do" target="demo">JSP Version</a></li>
  		</ul>
  		<p>&nbsp;</p>
  	</li>
  	<li><b>Struts App2: Struts Context Tool Demo</b><br>
  		This application demonstrates the Velocity context tools for Struts. These context
  		tool enable view designers to access the resources of the Struts framework. Their
  		functionality is a subset of the functionality provided by the Struts custom tag
  		libraries for JSP. 
  		<ul>
  			<li><a href="../demo.do" target="demo">Struts Context Tool Demo</a> 
  				(<a href="../examples/struts_app2/tool-demo.txt">template</a>)</li>
  		</ul>
  		<p>&nbsp;</p>
  	</li>
  	<li><b><i></i> Struts App3: Struts Logon Example</b><br>
  		This is the well known Struts logon example application by Ted Husted. Here 
  		it is implemented in both JSP and Velocity versions. 
  		<ul>
  			<li><a href="../welcome_vm.do" target="demo">Velocity Version</a></li>
  			<li><a href="../welcome_jsp.do" target="demo">JSP Version</a></li>
  		</ul>
  		<p>&nbsp;</p>
  	</li>
  	<li> 
  		<p><b>Context Tool Demo: MathTool</b><br>
  			This example demonstrates how a context tool can be loaded from within a 
  			template by the view designer. The tool used to load context tools is  
  			a context tool itself. It is defined in toolbox.xml and pre-loaded during initialization. 
  		<ul>
  			<li><a href="../examples/context_tools/mathtool-demo.vm" target="demo">Math Tool Demo</a> 
  				(<a href="../examples/context_tools/mathtool-demo.txt">template</a>)</li>
  		</ul>
  		<p>&nbsp;</p>
  	</li>
  	<li><b>List HTTP Request Header</b><br>
  		This application simply lists the HTTP request headers. It demonstrates how 
  		to access functionality provided by the servlet API in Velocity and JSP templates. 
  		The JSP implementation uses the Struts bean and logic custom tag libraries. 
  		<ul>
  			<li><a href="../examples/request_headers/list.vm" target="demo">Velocity Version</a></li>
  			<li><a href="../examples/request_headers/list.jsp" target="demo">JSP Version</a><br>
  			</li>
  		</ul>
  		<br>
  	</li>
  </ul>
  
  </BODY>
  </HTML>
  
  
  
  1.3       +10 -10    jakarta-velocity-tools/struts/examples/struts/examples/struts_app1/edit-address.txt
  
  Index: edit-address.txt
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/examples/struts_app1/edit-address.txt,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- edit-address.txt	9 Jan 2002 11:12:40 -0000	1.2
  +++ edit-address.txt	12 Mar 2002 11:36:48 -0000	1.3
  @@ -1,45 +1,45 @@
   <html>
       <head>
  -    	<title>$bean.message("title")</title>
  +    	<title>$msg.get("title")</title>
       	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
       </head>
       
       <body>    
  -        <p><b>$bean.message("edit") (Velocity $bean.message("version"))</b></p>
  +        <p><b>$msg.get("edit") (Velocity $msg.get("version"))</b></p>
           
           <form name="address" method="POST" action="address2.do">
           <input type="hidden" name="action" value="list">
           
           <table width="300" border="1" cellspacing="" cellpadding="5">
           	<tr> 
  -        		<td>$bean.message("firstname")</td>
  +        		<td>$msg.get("firstname")</td>
           		<td><input type="text" name="firstname" value="$!address.firstname"></td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("lastname")</td>
  +        		<td>$msg.get("lastname")</td>
           		<td><input type="text" name="lastname" value="$!address.lastname"></td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("street")</td>
  +        		<td>$msg.get("street")</td>
           		<td><input type="text" name="street" value="$!address.street"></td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("zip")</td>
  +        		<td>$msg.get("zip")</td>
           		<td><input type="text" name="zip" value="$!address.zip"></td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("city")</td>
  +        		<td>$msg.get("city")</td>
           		<td><input type="text" name="city" value="$!address.city"></td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("country")</td>
  +        		<td>$msg.get("country")</td>
           		<td><input type="text" name="country" value="$!address.country"></td>
           	</tr>
           </table>
           <br>
           
  -        <input type="submit" name="Submit" value="  $bean.message("save")  " onclick="address.action.value='save'; document.address.submit(); return false;">
  -        <input type="submit" name="Submit2" value="$bean.message("cancel")"  onclick="address.action.value='list'; document.address.submit(); return false;">
  +        <input type="submit" name="Submit" value="  $msg.get("save")  " onclick="address.action.value='save'; document.address.submit(); return false;">
  +        <input type="submit" name="Submit2" value="$msg.get("cancel")"  onclick="address.action.value='list'; document.address.submit(); return false;">
           </form>
   
           <br>
  
  
  
  1.3       +10 -10    jakarta-velocity-tools/struts/examples/struts/examples/struts_app1/edit-address.vm
  
  Index: edit-address.vm
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/examples/struts_app1/edit-address.vm,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- edit-address.vm	9 Jan 2002 11:12:40 -0000	1.2
  +++ edit-address.vm	12 Mar 2002 11:36:48 -0000	1.3
  @@ -1,45 +1,45 @@
   <html>
       <head>
  -    	<title>$bean.message("title")</title>
  +    	<title>$msg.get("title")</title>
       	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
       </head>
       
       <body>    
  -        <p><b>$bean.message("edit") (Velocity $bean.message("version"))</b></p>
  +        <p><b>$msg.get("edit") (Velocity $msg.get("version"))</b></p>
           
           <form name="address" method="POST" action="address2.do">
           <input type="hidden" name="action" value="list">
           
           <table width="300" border="1" cellspacing="" cellpadding="5">
           	<tr> 
  -        		<td>$bean.message("firstname")</td>
  +        		<td>$msg.get("firstname")</td>
           		<td><input type="text" name="firstname" value="$!address.firstname"></td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("lastname")</td>
  +        		<td>$msg.get("lastname")</td>
           		<td><input type="text" name="lastname" value="$!address.lastname"></td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("street")</td>
  +        		<td>$msg.get("street")</td>
           		<td><input type="text" name="street" value="$!address.street"></td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("zip")</td>
  +        		<td>$msg.get("zip")</td>
           		<td><input type="text" name="zip" value="$!address.zip"></td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("city")</td>
  +        		<td>$msg.get("city")</td>
           		<td><input type="text" name="city" value="$!address.city"></td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("country")</td>
  +        		<td>$msg.get("country")</td>
           		<td><input type="text" name="country" value="$!address.country"></td>
           	</tr>
           </table>
           <br>
           
  -        <input type="submit" name="Submit" value="  $bean.message("save")  " onclick="address.action.value='save'; document.address.submit(); return false;">
  -        <input type="submit" name="Submit2" value="$bean.message("cancel")"  onclick="address.action.value='list'; document.address.submit(); return false;">
  +        <input type="submit" name="Submit" value="  $msg.get("save")  " onclick="address.action.value='save'; document.address.submit(); return false;">
  +        <input type="submit" name="Submit2" value="$msg.get("cancel")"  onclick="address.action.value='list'; document.address.submit(); return false;">
           </form>
   
           <br>
  
  
  
  1.3       +14 -14    jakarta-velocity-tools/struts/examples/struts/examples/struts_app1/show-address.txt
  
  Index: show-address.txt
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/examples/struts_app1/show-address.txt,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- show-address.txt	9 Jan 2002 11:12:40 -0000	1.2
  +++ show-address.txt	12 Mar 2002 11:36:48 -0000	1.3
  @@ -1,16 +1,16 @@
   <html>
       <head>
  -	    <title>$bean.message("title")</title>
  +	    <title>$msg.get("title")</title>
       	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">    
       </head>
   
       <body>
  -        <p><b>$bean.message("title") (Velocity $bean.message("version"))</b></p>
  +        <p><b>$msg.get("title") (Velocity $msg.get("version"))</b></p>
           
  -        <p>$bean.message("intro")</p>
  +        <p>$msg.get("intro")</p>
           
           <form name="form1" action="address2.do">
  -        <p>$bean.message("language")
  +        <p>$msg.get("language")
           <select name="language" size="1" onchange="form1.submit(); return false;">
               <option value="" SELECTED></option>
               <option value="English">English</option>             
  @@ -18,40 +18,40 @@
           </select>
           </p></form>
           	
  -        <p>$bean.message("header")</p>
  +        <p>$msg.get("header")</p>
           <table width="300" border="1" cellspacing="" cellpadding="5">
           	<tr> 
  -        		<td>$bean.message("firstname")</td>
  +        		<td>$msg.get("firstname")</td>
           		<td>&nbsp; $!address.firstname </td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("lastname")</td>
  +        		<td>$msg.get("lastname")</td>
           		<td>&nbsp; $!address.lastname </td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("street")</td>
  +        		<td>$msg.get("street")</td>
           		<td>&nbsp; $!address.street </td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("zip")</td>
  +        		<td>$msg.get("zip")</td>
           		<td>&nbsp; $!address.zip </td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("city")</td>
  +        		<td>$msg.get("city")</td>
           		<td>&nbsp; $!address.city </td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("country")</td>
  +        		<td>$msg.get("country")</td>
           		<td>&nbsp; $!address.country </td>
           	</tr>
           </table>
           
           <br>
  -        <a href="address1.do?action=edit">$bean.message("edit")</a> (JSP)<br><br>
  -        <a href="address2.do?action=edit">$bean.message("edit")</a> (Velocity)
  +        <a href="address1.do?action=edit">$msg.get("edit")</a> (JSP)<br><br>
  +        <a href="address2.do?action=edit">$msg.get("edit")</a> (Velocity)
   
           <br><br>
  -        <a href="examples/struts-app1/show-address.txt">Template</a>
  +        <a href="examples/struts_app1/show-address.txt">Template</a>
           
       </body>
   </html>
  
  
  
  1.3       +13 -13    jakarta-velocity-tools/struts/examples/struts/examples/struts_app1/show-address.vm
  
  Index: show-address.vm
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/examples/struts_app1/show-address.vm,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- show-address.vm	9 Jan 2002 11:12:40 -0000	1.2
  +++ show-address.vm	12 Mar 2002 11:36:48 -0000	1.3
  @@ -1,16 +1,16 @@
   <html>
       <head>
  -	    <title>$bean.message("title")</title>
  +	    <title>$msg.get("title")</title>
       	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">    
       </head>
   
       <body>
  -        <p><b>$bean.message("title") (Velocity $bean.message("version"))</b></p>
  +        <p><b>$msg.get("title") (Velocity $msg.get("version"))</b></p>
           
  -        <p>$bean.message("intro")</p>
  +        <p>$msg.get("intro")</p>
           
           <form name="form1" action="address2.do">
  -        <p>$bean.message("language")
  +        <p>$msg.get("language")
           <select name="language" size="1" onchange="form1.submit(); return false;">
               <option value="" SELECTED></option>
               <option value="English">English</option>             
  @@ -18,37 +18,37 @@
           </select>
           </p></form>
           	
  -        <p>$bean.message("header")</p>
  +        <p>$msg.get("header")</p>
           <table width="300" border="1" cellspacing="" cellpadding="5">
           	<tr> 
  -        		<td>$bean.message("firstname")</td>
  +        		<td>$msg.get("firstname")</td>
           		<td>&nbsp; $!address.firstname </td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("lastname")</td>
  +        		<td>$msg.get("lastname")</td>
           		<td>&nbsp; $!address.lastname </td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("street")</td>
  +        		<td>$msg.get("street")</td>
           		<td>&nbsp; $!address.street </td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("zip")</td>
  +        		<td>$msg.get("zip")</td>
           		<td>&nbsp; $!address.zip </td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("city")</td>
  +        		<td>$msg.get("city")</td>
           		<td>&nbsp; $!address.city </td>
           	</tr>
           	<tr> 
  -        		<td>$bean.message("country")</td>
  +        		<td>$msg.get("country")</td>
           		<td>&nbsp; $!address.country </td>
           	</tr>
           </table>
           
           <br>
  -        <a href="address1.do?action=edit">$bean.message("edit")</a> (JSP)<br><br>
  -        <a href="address2.do?action=edit">$bean.message("edit")</a> (Velocity)
  +        <a href="address1.do?action=edit">$msg.get("edit")</a> (JSP)<br><br>
  +        <a href="address2.do?action=edit">$msg.get("edit")</a> (Velocity)
   
           <br><br>
           <a href="examples/struts_app1/show-address.txt">Template</a>
  
  
  
  1.3       +174 -15   jakarta-velocity-tools/struts/examples/struts/examples/struts_app2/tool-demo.txt
  
  Index: tool-demo.txt
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/examples/struts_app2/tool-demo.txt,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- tool-demo.txt	9 Jan 2002 11:12:41 -0000	1.2
  +++ tool-demo.txt	12 Mar 2002 11:36:49 -0000	1.3
  @@ -1,47 +1,206 @@
   <html>
       <head>
  -	    <title>$bean.message("title")</title>
  +	    <title>$msg.title</title>
   	    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  -	    <base href=" $html.getBaseRef() $html.errorSize ">
  +	    <base href="$link.baseRef">
       </head>
   
       <body>
  -        <h2>$bean.message("title") (Velocity)</h2>
  -        <p>A demonstration of Struts context tools.</p>
  +        <h2>$msg.title (Velocity)</h2>
  +        <p>A demonstration of Struts context tools. Where available, the Velocity 
  +        shorthand notation to method calls is shown as well.</p>
   
  -        A sample of functions provided by StrutsHtmlTool: (covers partially the Struts html tag lib for JSP)<br>
  +
  +        <h3>MessageTool</h3>
           <table border="1" cellspacing="0" cellpadding="4">
               <tr>
  -                <td>\$html.baseRef()</td><td>$html.baseRef()</td>
  +                <td>\$msg.get("title")<br>
  +                    \$msg.title</td>
  +                <td>$msg.get("title")</td>
  +            </tr>
  +            <tr>
  +                <td>\$msg.get("test", ["bear", "dog", "cat"])</td>
  +                <td>$msg.get("test", ["bear", "dog", "cat"])</td>
               </tr>
               <tr>
  -                <td>\$html.errorSize()</td><td>$html.errorSize()</td>
  +                <td>\$msg.exists("tutle")</td>
  +                <td>$msg.exists("tutle")</td>
               </tr>
               <tr>
  -                <td>\$html.errorsEmpty()</td><td>$html.errorsEmpty()</td>
  +            <tr>
  +                <td>\$msg.getLocale()<br>
  +                    \$msg.locale</td>
  +                <td>$msg.getLocale()</td>
               </tr>
  +        </table>
  +
  +
  +        <h3>ErrorsTool</h3>
  +        <table border="1" cellspacing="0" cellpadding="4">
               <tr>
  -                <td>\$html.actionMappingURL("tooldemo")</td><td>$html.actionMappingURL("tooldemo")</td>
  +                <td>\$errors.exist()</td>
  +                <td>$errors.exist()</td>
               </tr>
               <tr>
  -                <td>\$html.link("logon_vm")</td><td>$html.link("logon_vm")</td>
  +                <td>\$errors.getSize()<br>
  +                    \$errors.size</td>
  +                <td>$errors.getSize()</td>
  +            </tr>
  +            <tr>
  +                <td>\$errors.getSize("language")</td>
  +                <td>$errors.getSize("language")</td>
  +            </tr>
  +            <tr>
  +                <td>\$errors.getAll()<br>
  +                    \$errors.all</td>
  +                <td>$errors.getAll()</td>
  +            </tr>
  +            <tr>
  +                <td>\$errors.get("language")<br>
  +                    \$errors.language</td>
  +                <td>$errors.get("language")</td>
  +            </tr>
  +            <tr>
  +                <td>A Velocity macro to render all error messages:<br>
  +<pre><code>&#35;macro (errorMarkup)
  +    &#35;if (&#36;errors.exist)
  +        &lt;ul&gt;
  +        &#35;foreach (&#36;e in &#36;errors.all )
  +            &lt;li&gt;&#36;e&lt;/li&gt;
  +        &#35;end
  +        &lt;/ul&gt;
  +    &#35;end
  +&#35;end</code></pre>
  +                </td>
  +                <td>
  +                    #macro (errorMarkup)
  +                        #if ($errors.exist )
  +                            <ul>
  +                            #foreach ($e in $errors.all )
  +                                <li>$e</li>
  +                            #end
  +                            </ul>
  +                        #end
  +                    #end                    
  +                    #errorMarkup()
  +                </td>
  +            </tr>
  +            <tr>
  +                <td>A Velocity macro to render error messages specific to a property:<br>
  +<pre><code>&#35;macro (errorMarkup &#36;property)
  +    &#35;if (&#36;errors.exist(&#36;property))
  +        &lt;ul&gt;
  +        &#35;foreach (&#36;er in &#36;errors.get(&#36;property) )
  +            &lt;li&gt;&#36;er&lt;/li&gt;
  +        &#35;end
  +        &lt;/ul&gt;
  +    &#35;end
  +&#35;end</code></pre>
  +                </td>
  +                <td>
  +                    #macro (errorMarkup1 $property)
  +                        #if ($errors.exist($property) )
  +                            <ul>
  +                            #foreach ($er in $errors.get($property) )
  +                                <li>$er</li>
  +                            #end
  +                            </ul>
  +                        #end
  +                    #end                    
  +                    #errorMarkup1("language")
  +                </td>
               </tr>
  +
           </table>
   
  -        <br><br>
   
  -        A sample of functions provided by StrutsBeanTool: (covers partially the Struts bean tag lib for JSP)<br>
  +        <h3>FormTool</h3>
           <table border="1" cellspacing="0" cellpadding="4">
               <tr>
  -                <td>\$bean.message("title")</td><td>$bean.message("title")</td>
  +                <td>\$form.getBean()<br>
  +                    \$form.bean</td>
  +                <td>$form.getBean()</td>
               </tr>
               <tr>
  -                <td>\$bean.isMessage("title")</td><td>$bean.isMessage("title")</td>
  +                <td>\$form.getCancelName()<br>
  +                    \$form.cancelName</td>
  +                <td>$form.getCancelName()</td>
               </tr>
               <tr>
  -                <td>\$bean.isMessage("tutle")</td><td>$bean.isMessage("tutle")</td>
  +                <td>\$form.getTokenName()<br>
  +                    \$form.tokenName</td>
  +                <td>$form.getTokenName()</td>
  +            </tr>
  +            <tr>
  +                <td>\$form.getToken()<br>
  +                    \$form.token</td>
  +                <td>$form.getToken()</td>
               </tr>
           </table>
  +
  +
  +        <h3>LinkTool</h3>
  +        <table border="1" cellspacing="0" cellpadding="4">
  +            <tr>
  +                <td>\$link.setHref("template/login.vm")</td>
  +                <td>$link.setHref("template/login.vm")</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setAction("demo")</td>
  +                <td>$link.setAction("demo") &nbsp;</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setForward("start")</td>
  +                <td>$link.setForward("start") &nbsp;</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setAbsolute("examples/index.html")</td>
  +                <td>$link.setAbsolute("examples/index.html")</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setHref("index.html").addQueryData("key1", "val 1")</td>             
  +                <td>$link.setHref("index.html").addQueryData("key1", "val 1")</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setHref("index.html").addQueryData("key1", "val 1").getHref()<br>
  +                    \$link.setHref("index.html").addQueryData("key1", "val 1").href</td>             
  +                <td>$link.setHref("index.html").addQueryData("key1", "val 1").getHref()</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setHref("/index.html").addQueryData("key1", "val 1").getQueryData()<br>
  +                    \$link.setHref("/index.html").addQueryData("key1", "val 1").queryData</td>             
  +                <td>$link.setHref("/index.html").addQueryData("key1", "val 1").getQueryData()</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.getContextURL()<br>
  +                    \$link.contextURL</td>
  +                <td>$link.getContextURL()</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.getContextPath()<br>
  +                    \$link.contextPath</td>
  +                <td>$link.getContextPath()</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.getBaseRef()<br>
  +                    \$link.baseRef</td>
  +                <td>$link.getBaseRef()</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setHref("index.vm").toString()</td>
  +                <td>$link.setHref("index.vm").toString()</td>
  +            </tr>
  +        </table>
  +
  +
  +        <h3>ActionMessagesTool</h3>
  +        <table border="1" cellspacing="0" cellpadding="4">
  +            <tr>
  +                <td>Pending. Depends on upcoming Struts 1.1 release.</td><td>&nbsp;</td>
  +            </tr>
  +        </table>
  +
  +
   
       </body>
   </html>
  
  
  
  1.3       +191 -15   jakarta-velocity-tools/struts/examples/struts/examples/struts_app2/tool-demo.vm
  
  Index: tool-demo.vm
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/examples/struts_app2/tool-demo.vm,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- tool-demo.vm	9 Jan 2002 11:12:41 -0000	1.2
  +++ tool-demo.vm	12 Mar 2002 11:36:49 -0000	1.3
  @@ -1,47 +1,223 @@
   <html>
       <head>
  -	    <title>$bean.message("title")</title>
  +	    <title>Struts App2: Struts Context Tool Demo</title>
   	    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  -	    <base href=" $html.getBaseRef() $html.errorSize ">
  +	    <base href="$link.baseRef">
       </head>
   
       <body>
  -        <h2>$bean.message("title") (Velocity)</h2>
  -        <p>A demonstration of Struts context tools.</p>
  +        <h2>Struts App2: Struts Context Tool Demo</h2>
  +        <p>A demonstration of the Velocity context tools provided for Struts support. 
  +        Where available, the Velocity shorthand notation to method calls is shown 
  +        as well.</p>
   
  -        A sample of functions provided by StrutsHtmlTool: (covers partially the Struts html tag lib for JSP)<br>
  +
  +        <h3>MessageTool</h3>
           <table border="1" cellspacing="0" cellpadding="4">
               <tr>
  -                <td>\$html.baseRef()</td><td>$html.baseRef()</td>
  +                <td>\$msg.get("title")<br>
  +                    \$msg.title</td>
  +                <td>$msg.get("title")</td>
  +            </tr>
  +            <tr>
  +                <td>\$msg.get("test", ["bear", "dog", "cat"])</td>
  +                <td>$msg.get("test", ["bear", "dog", "cat"])</td>
               </tr>
               <tr>
  -                <td>\$html.errorSize()</td><td>$html.errorSize()</td>
  +                <td>\$msg.exists("tutle")</td>
  +                <td>$msg.exists("tutle")</td>
  +            </tr>
  +            <tr>
  +            <tr>
  +                <td>\$msg.getLocale()<br>
  +                    \$msg.locale</td>
  +                <td>$msg.getLocale()</td>
               </tr>
  +        </table>
  +
  +
  +        <h3>ErrorsTool</h3>
  +        <table border="1" cellspacing="0" cellpadding="4">
               <tr>
  -                <td>\$html.errorsEmpty()</td><td>$html.errorsEmpty()</td>
  +                <td>\$errors.exist()</td>
  +                <td>$errors.exist()</td>
               </tr>
               <tr>
  -                <td>\$html.actionMappingURL("tooldemo")</td><td>$html.actionMappingURL("tooldemo")</td>
  +                <td>\$errors.exist("language")</td>
  +                <td>$errors.exist("language")</td>
               </tr>
               <tr>
  -                <td>\$html.link("logon_vm")</td><td>$html.link("logon_vm")</td>
  +                <td>\$errors.getSize()<br>
  +                    \$errors.size</td>
  +                <td>$errors.getSize()</td>
  +            </tr>
  +            <tr>
  +                <td>\$errors.getSize("language")</td>
  +                <td>$errors.getSize("language")</td>
  +            </tr>
  +            <tr>
  +                <td>\$errors.getAll()<br>
  +                    \$errors.all</td>
  +                <td>[This is a String representation of the ArrayList that is returned]<br>
  +                    $errors.getAll()</td>
  +            </tr>
  +            <tr>
  +                <td>\$errors.get("language")<br>
  +                    \$errors.language</td>
  +                <td>[This is a String representation of the ArrayList that is returned]<br>
  +                    $errors.get("language")</td>
  +            </tr>
  +            <tr>
  +                <td>\$errors.getMsgs()<br>
  +                    \$errors.msgs</td>
  +                <td>$errors.getMsgs()</td>
  +            </tr>
  +            <tr>
  +                <td>\$errors.getMsgs("language")</td>
  +                <td>$errors.getMsgs("language")</td>
  +            </tr>
  +            <tr>
  +                <td>A Velocity macro to render all error messages:<br>
  +<pre><code>&#35;macro (errorMarkup)
  +  &#35;if (&#36;errors.exist() )
  +    &lt;ul&gt;
  +    &#35;foreach (&#36;e in &#36;errors.all )
  +      &#36;e
  +    &#35;end
  +    &lt;/ul&gt;
  +  &#35;end
  +&#35;end</code></pre>
  +                </td>
  +                <td>
  +                    #macro (errorMarkup)
  +                        #if ($errors.exist() )
  +                            <ul>
  +                            #foreach ($e in $errors.all )
  +                                $e
  +                            #end
  +                            </ul>
  +                        #end
  +                    #end                    
  +                    #errorMarkup()
  +                </td>
  +            </tr>
  +            <tr>
  +                <td>A Velocity macro to render error messages specific<br>
  +                    to a property:<br>
  +<pre><code>&#35;macro (errorMarkup &#36;property)
  +  &#35;if (&#36;errors.exist(&#36;property))
  +    &lt;ul&gt;
  +    &#35;foreach (&#36;er in &#36;errors.get(&#36;property))
  +      &#36;er
  +    &#35;end
  +    &lt;/ul&gt;
  +  &#35;end
  +&#35;end</code></pre>
  +                </td>
  +                <td>
  +                    #macro (errorMarkup1 $property)
  +                        #if ($errors.exist($property) )
  +                            <ul>
  +                            #foreach ($er in $errors.get($property))
  +                                $er
  +                            #end
  +                            </ul>
  +                        #end
  +                    #end                    
  +                    #errorMarkup1("language")
  +                </td>
               </tr>
  +
           </table>
   
  -        <br><br>
   
  -        A sample of functions provided by StrutsBeanTool: (covers partially the Struts bean tag lib for JSP)<br>
  +        <h3>FormTool</h3>
           <table border="1" cellspacing="0" cellpadding="4">
               <tr>
  -                <td>\$bean.message("title")</td><td>$bean.message("title")</td>
  +                <td>\$form.getBean()<br>
  +                    \$form.bean</td>
  +                <td>$form.getBean()</td>
  +            </tr>
  +            <tr>
  +                <td>\$form.getCancelName()<br>
  +                    \$form.cancelName</td>
  +                <td>$form.getCancelName()</td>
               </tr>
               <tr>
  -                <td>\$bean.isMessage("title")</td><td>$bean.isMessage("title")</td>
  +                <td>\$form.getTokenName()<br>
  +                    \$form.tokenName</td>
  +                <td>$form.getTokenName()</td>
               </tr>
               <tr>
  -                <td>\$bean.isMessage("tutle")</td><td>$bean.isMessage("tutle")</td>
  +                <td>\$form.getToken()<br>
  +                    \$form.token</td>
  +                <td>$form.getToken()</td>
               </tr>
           </table>
  +
  +
  +        <h3>LinkTool</h3>
  +        <table border="1" cellspacing="0" cellpadding="4">
  +            <tr>
  +                <td>\$link.setURI("template/login.vm")</td>
  +                <td>$link.setURI("template/login.vm")</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setAction("demo")</td>
  +                <td>$link.setAction("demo") &nbsp;</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setForward("start")</td>
  +                <td>$link.setForward("start") &nbsp;</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setAbsolute("examples/index.html")</td>
  +                <td>$link.setAbsolute("examples/index.html")</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setURI("index.html").addQueryData("key1", "val 1")</td>             
  +                <td>$link.setURI("index.html").addQueryData("key1", "val 1")</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setURI("index.html").addQueryData("key1", "val 1").getURI()<br>
  +                    \$link.setURI("index.html").addQueryData("key1", "val 1").URI</td>             
  +                <td>$link.setURI("index.html").addQueryData("key1", "val 1").getURI()</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setURI("/index.html").addQueryData("key1", "val 1").getQueryData()<br>
  +                    \$link.setURI("/index.html").addQueryData("key1", "val 1").queryData</td>             
  +                <td>$link.setURI("/index.html").addQueryData("key1", "val 1").getQueryData()</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.getContextURL()<br>
  +                    \$link.contextURL</td>
  +                <td>$link.getContextURL()</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.getContextPath()<br>
  +                    \$link.contextPath</td>
  +                <td>$link.getContextPath()</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.getBaseRef()<br>
  +                    \$link.baseRef</td>
  +                <td>$link.getBaseRef()</td>
  +            </tr>
  +            <tr>
  +                <td>\$link.setURI("index.vm").toString()</td>
  +                <td>$link.setURI("index.vm").toString()</td>
  +            </tr>
  +        </table>
  +
  +
  +        <h3>ActionMessagesTool</h3>
  +        <table border="1" cellspacing="0" cellpadding="4">
  +            <tr>
  +                <td>Pending. Depends on upcoming Struts 1.1 release.</td><td>&nbsp;</td>
  +            </tr>
  +        </table>
  +
  +
   
       </body>
   </html>
  
  
  
  1.2       +14 -5     jakarta-velocity-tools/struts/examples/struts/examples/struts_app3/index.vm
  
  Index: index.vm
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/examples/struts_app3/index.vm,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- index.vm	3 Jan 2002 20:21:06 -0000	1.1
  +++ index.vm	12 Mar 2002 11:36:49 -0000	1.2
  @@ -13,7 +13,7 @@
   <html>
       <head>
           <title>Welcome World!</title>
  -        <base href="$html.baseRef()">
  +        <base href="$link.baseRef">
       </head>
   
       <body>
  @@ -23,16 +23,25 @@
           <h3>Welcome World! (Velocity Version)</h3>
           #end
   
  -        $!html.errorMarkup
  +        #macro (errorMarkup)
  +            #if ($errors.exist )
  +                <ul>
  +                #foreach ($e in $errors.all )
  +                    $e
  +                #end
  +                </ul>
  +            #end
  +        #end                    
  +        #errorMarkup()
           
           <ul>
  -            <li><a href="$html.link('logon_vm')">Sign in</a></li>
  +            <li><a href="$link.setForward('logon_vm')">Sign in</a></li>
               #if( $user )
  -            <li><a href="$html.link('logoff_vm')">Sign out</a></li>
  +            <li><a href="$link.setForward('logoff_vm')">Sign out</a></li>
               #end
           </ul>
   
  -        <a href="$html.actionMappingURL('/welcome_jsp')">Switch to JSP</a><br>
  +        <a href="$link.setAction('/welcome_jsp')">Switch to JSP</a><br>
           <a href="index_vm.txt">View Template</a><br>
           
       </body>
  
  
  
  1.2       +14 -5     jakarta-velocity-tools/struts/examples/struts/examples/struts_app3/index_vm.txt
  
  Index: index_vm.txt
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/examples/struts_app3/index_vm.txt,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- index_vm.txt	3 Jan 2002 20:21:06 -0000	1.1
  +++ index_vm.txt	12 Mar 2002 11:36:49 -0000	1.2
  @@ -13,7 +13,7 @@
   <html>
       <head>
           <title>Welcome World!</title>
  -        <base href="$html.baseRef()">
  +        <base href="$link.baseRef">
       </head>
   
       <body>
  @@ -23,16 +23,25 @@
           <h3>Welcome World! (Velocity Version)</h3>
           #end
   
  -        $!html.errorMarkup
  +        #macro (errorMarkup)
  +            #if ($errors.exist )
  +                <ul>
  +                #foreach ($e in $errors.all )
  +                    $e
  +                #end
  +                </ul>
  +            #end
  +        #end                    
  +        #errorMarkup()
           
           <ul>
  -            <li><a href="$html.link('logon_vm')">Sign in</a></li>
  +            <li><a href="$link.setForward('logon_vm')">Sign in</a></li>
               #if( $user )
  -            <li><a href="$html.link('logoff_vm')">Sign out</a></li>
  +            <li><a href="$link.setForward('logoff_vm')">Sign out</a></li>
               #end
           </ul>
   
  -        <a href="$html.actionMappingURL('/welcome_jsp')">Switch to JSP</a><br>
  +        <a href="$link.setAction('/welcome_jsp')">Switch to JSP</a><br>
           <a href="index_vm.txt">View Template</a><br>
           
       </body>
  
  
  
  1.2       +12 -3     jakarta-velocity-tools/struts/examples/struts/examples/struts_app3/logon.vm
  
  Index: logon.vm
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/examples/struts_app3/logon.vm,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- logon.vm	3 Jan 2002 20:21:06 -0000	1.1
  +++ logon.vm	12 Mar 2002 11:36:49 -0000	1.2
  @@ -1,16 +1,25 @@
   <html>
       <head>
           <title>Sign in, Please!</title>
  -        <base href="$html.baseRef()">
  +        <base href="$link.baseRef">
       </head>
   
       <body>
       
  -        $!html.errorMarkup()
  +        #macro (errorMarkup)
  +            #if ($errors.exist )
  +                <ul>
  +                #foreach ($e in $errors.all )
  +                    $e
  +                #end
  +                </ul>
  +            #end
  +        #end                    
  +        #errorMarkup()
           
           <h3>Sign in, Please! (Velocity Version)</h3>
   
  -        <form method="POST" action="$html.actionMappingURL('/logonSubmit_vm')">
  +        <form method="POST" action="$link.setAction('/logonSubmit_vm')">
   
           <table border="0">
               <tr>
  
  
  
  1.2       +12 -3     jakarta-velocity-tools/struts/examples/struts/examples/struts_app3/logon_vm.txt
  
  Index: logon_vm.txt
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/examples/struts/examples/struts_app3/logon_vm.txt,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- logon_vm.txt	3 Jan 2002 20:21:06 -0000	1.1
  +++ logon_vm.txt	12 Mar 2002 11:36:49 -0000	1.2
  @@ -1,16 +1,25 @@
   <html>
       <head>
           <title>Sign in, Please!</title>
  -        <base href="$html.baseRef()">
  +        <base href="$link.baseRef">
       </head>
   
       <body>
       
  -        $!html.errorMarkup()
  +        #macro (errorMarkup)
  +            #if ($errors.exist )
  +                <ul>
  +                #foreach ($e in $errors.all )
  +                    $e
  +                #end
  +                </ul>
  +            #end
  +        #end                    
  +        #errorMarkup()
           
           <h3>Sign in, Please! (Velocity Version)</h3>
   
  -        <form method="POST" action="$html.actionMappingURL('/logonSubmit_vm')">
  +        <form method="POST" action="$link.setAction('/logonSubmit_vm')">
   
           <table border="0">
               <tr>
  
  
  
  1.5       +6 -3      jakarta-velocity-tools/struts/src/java/org/apache/velocity/tools/struts/MathTool.java
  
  Index: MathTool.java
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/src/java/org/apache/velocity/tools/struts/MathTool.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- MathTool.java	12 Jan 2002 07:28:30 -0000	1.4
  +++ MathTool.java	12 Mar 2002 11:36:49 -0000	1.5
  @@ -60,13 +60,16 @@
   import org.apache.velocity.tools.view.tools.ContextTool;
   
   /**
  - * A context tool for performing the more useful methods from 
  - * <code>java.lang.Math</code>.
  + * <p>A context tool for performing the more useful methods from 
  + * <code>java.lang.Math</code> .</p>
  + *
  + * <p>THIS CLASS IS HERE AS A PROOF OF CONCEPT ONLY. IT NEEDS TO BE
  + * REFACTORED AND MOVED TO THE PROPER PACKAGE.</p>
    *
    * @author <a href="mailto:sidler@teamup.com">Gabriel Sidler</a>, based on
    *   code from <a href="mailto:ebr@tcdi.com">Eric B. Ridge</a>.
    *
  - * @version $Revision: 1.4 $ $Date: 2002/01/12 07:28:30 $
  + * @version $Revision: 1.5 $ $Date: 2002/03/12 11:36:49 $
    */
   
   public class MathTool implements ContextTool 
  
  
  
  1.3       +11 -7     jakarta-velocity-tools/struts/src/java/org/apache/velocity/tools/struts/ToolLoaderTool.java
  
  Index: ToolLoaderTool.java
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity-tools/struts/src/java/org/apache/velocity/tools/struts/ToolLoaderTool.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ToolLoaderTool.java	9 Jan 2002 11:25:44 -0000	1.2
  +++ ToolLoaderTool.java	12 Mar 2002 11:36:49 -0000	1.3
  @@ -72,15 +72,18 @@
    * <code>$toolloader.load("math", "xxx.yyy.zzz.MathTool")</code><br>
    * <br>
    * to load a math tool into the context under key "math". This tool
  - * is then accessible as:<br>
  + * is then available for use within the template, for example:<br>
    * <br>
    * <code>$math.random(1, 100)</code><br>
    * </p>
    *
  + * <p>THIS CLASS IS HERE AS A PROOF OF CONCEPT ONLY. IT NEEDS TO BE
  + * REFACTORED AND MOVED TO THE PROPER PACKAGE.</p>
  + * 
    * @author <a href="mailto:sidler@teamup.com">Gabe Sidler</a>
    * @author <a href="mailto:geirm@apache.org">Geir Magnusson Jr.</a>
    *
  - * @version $Id: ToolLoaderTool.java,v 1.2 2002/01/09 11:25:44 sidler Exp $
  + * @version $Id: ToolLoaderTool.java,v 1.3 2002/03/12 11:36:49 sidler Exp $
    * 
    */
   
  @@ -100,9 +103,9 @@
   
       /**
        * <p>Loads a context tool of class <i>clazz</i> and inserts it
  -     * into the Velocity context with key <i>key</i>. Context tools
  -     * must implement the interface {@link ContextTool} and provide
  -     * a constructor with no parameters.
  +     * into the Velocity context with key <i>key</i>. On order to be
  +     * loadable, context tools must implement the interface 
  +     * {@link ContextTool} and provide a constructor with no parameters.
        */
       public void load(String key, String clazz)
       {
  @@ -135,8 +138,9 @@
       
       /**
        * <p>Instantiate a factory of tool loaders. Use this contructor to obtain an 
  -     * instance of a tool loader factory and then call method {@link #init(ChainedContext context)}
  -     * to obtain actual instances of tool loaders.</p>
  +     * instance of a tool loader factory and then call method 
  +     * {@link #init(ChainedContext context)} to obtain actual instances of tool 
  +     * loaders.</p>
        */
       public ToolLoaderTool()
       {
  
  
  
  1.1                  jakarta-velocity-tools/struts/src/java/org/apache/velocity/tools/struts/ErrorsTool.java
  
  Index: ErrorsTool.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 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", "Velocity", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.velocity.tools.struts;
  
  import java.util.Locale;
  import java.util.ArrayList;
  
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpSession;
  import javax.servlet.ServletContext;
  
  import org.apache.struts.util.MessageResources;
  import org.apache.struts.action.*;
  import org.apache.velocity.tools.view.context.ViewContext;
  import org.apache.velocity.tools.view.tools.ContextTool;
  
  import java.util.Iterator;
  
  /**
   * <p>Context tool to work with the Struts error messages.
   * Extends ServletContextTool to profit from the logging
   * facilities of that class.</p>
   *
   * @author <a href="mailto:sidler@teamup.com">Gabe Sidler</a>
   *
   * @version $Id: ErrorsTool.java,v 1.1 2002/03/12 11:36:49 sidler Exp $
   * 
   */
  public class ErrorsTool extends ServletContextTool 
  {
  
      // --------------------------------------------- Properties ---------------
  
      /**
       * A reference to the HtttpServletRequest.
       */ 
      protected HttpServletRequest request;
      
  
      /**
       * A reference to the HtttpSession.
       */ 
      protected HttpSession session;
  
  
      /**
       * A reference to the Struts message resources.
       */
      protected MessageResources resources;
  
  
      /**
       * A reference to the user's locale.
       */
      protected Locale locale;
  
  
      /**
       * A reference to the queued action messages.
       */
      protected ActionErrors errors;
  
  
  
      // --------------------------------------------- Constructors -------------
  
      /**
       * Returns a factory. Use method {@link #init(ViewContext context)} to 
       * obtain instances of this class.
       */
      public ErrorsTool()
      {
      }
      
      
      /**
       * For internal use only! Use method {@link #init(ViewContext context)} 
       * to obtain instances of the tool.
       */
      private ErrorsTool(ViewContext context)
      {
          this.request = context.getRequest();
          this.session = request.getSession(false);
          this.application = context.getServletContext();    
  
          resources = StrutsUtils.getMessageResources(application);
          locale = StrutsUtils.getLocale(request, session);
          errors = StrutsUtils.getActionErrors(request);
      }
      
  
  
      // --------------------------------------------- ContextTool Interface ----
  
      /**
       * A new tool object will be instantiated per-request by calling 
       * this method. A ContextTool is effectively a factory used to 
       * create objects for use in templates. Some tools may simply return
       * themselves from this method others may instantiate new objects
       * to hold the per-request state.
       */
      public Object init(ViewContext context)
      {
          return new ErrorsTool(context);
      }
      
      
      /**
       * Perform any cleanup needed. This method is called after the template
       * has been processed.
       */
      public void destroy(Object o)
      {
      }
  
  
      // --------------------------------------------- View Helpers -------------
  
      /**
       * <p>Returns <code>true</code> if there are action errors queued, 
       * otherwise <code>false</code>.</p>
       */
      public boolean exist() 
      {
          if (errors == null)
          {
              return false;
          }
  
          return !errors.empty();
      }
  
  
      /**
       * <p>Returns true if there are action errors queued for the specified 
       * property, otherwise <code>false</code>.</p>
       *
       * @param property The category of errors to check for.
       */
      public boolean exist(String property) 
      {
          if (errors == null)
          {
              return false;
          }
  
          if (errors.size(property) > 0)
          {
              return true;
          }
          else
          {
              return false;
          }
      }
  
  
      /**
       * Returns the number of action errors queued.
       */
      public int getSize() 
      {
          if (errors == null)
          {
              return 0;
          }
          
          return errors.size();
      }
  
  
      /**
       * Returns the number of action errors queued for a particular property.
       *
       * @param property the category of errors to check for
       */
      public int getSize(String property) 
      {
          if (errors == null)
          {
              return 0;
          }
  
          return errors.size(property);
      }
  
  
      /**
       * Returns the set of localized error messages as an 
       * <code>java.util.ArrayList</code> of <code> java.lang.String</code> 
       * for all errors queued or <code>null</code> if no errors are queued.
       * If the message resources don't contain an error message for a 
       * particular error key, the key itself is used as error message.
       */
      public ArrayList getAll() 
      {
          return get(null);
      }
  
  
      /**
       * Returns the set of localized error messages as an 
       * <code>java.util.ArrayList</code> of <code> java.lang.String</code> 
       * for all errors queued of the specified property or <code>null</code> 
       * if no error are queued for the specified property. If the message 
       * resources don't contain an error message for a particular error key, 
       * the key itself is used as error message.
       */
      public ArrayList get(String property) 
      {
          if ( errors == null || errors.empty())
          {
              return null;
          }
          
          Iterator errormsgs;
          if (property == null)
          {
              errormsgs = errors.get();
              if ( !(errormsgs.hasNext()) ) 
              {
                  return null;
              }       
          }
          else
          {
              errormsgs = errors.get(property);
              if ( !(errormsgs.hasNext()) ) 
              {
                  return null;
              }       
          }
  
          ArrayList list = new ArrayList();
  
          if (resources == null) 
          {
              log(ERROR, "Message resources are not available.");
              return null;
          }
          
          while (errormsgs.hasNext())
          {
              ActionError errormsg = (ActionError)errormsgs.next();
              String message = resources.getMessage(locale,
                                                    errormsg.getKey(), 
                                                    errormsg.getValues());
              if (message != null)
              {
                  list.add(message);
              }
              else
              {
                  // if error message cannot be found for a key, return key instead
                  log(WARNING, "Message for key " + errormsg.getKey() + " could not be found in message resources.");
                  list.add(errormsg.getKey());
              }
          }
          return list;
      }
  
  
      /**
       * <p>Renders the queued error messages as a list. This method expects
       * the message keys <code>errors.header</code> and <code>errors.footer</code>
       * in the message resources. The value of the former is rendered before
       * the list of error messages and the value of the latter is rendered
       * after the error messages.</p>
       * 
       * @return The formatted error messages. If no error messages are queued, 
       * an empty string is returned.
       */
      public String getMsgs()
      {
          return StrutsUtils.errorMarkup(null, request, session, application);    
      }
       
  
      /**
       * <p>Renders the queued error messages of a particual property as a list. 
       * This method expects the message keys <code>errors.header</code> and 
       * <code>errors.footer</code> in the message resources. The value of the 
       * former is rendered before the list of error messages and the value of 
       * the latter is rendered after the error messages.</p>
       * 
       * @param property the category of errors to render
       * @return The formatted error messages. If no error messages are queued, 
       * an empty string is returned. 
       */
      public String getMsgs(String property)
      {
          return StrutsUtils.errorMarkup(property, request, session, application);    
      }
  
  }
  
  
  
  1.1                  jakarta-velocity-tools/struts/src/java/org/apache/velocity/tools/struts/FormTool.java
  
  Index: FormTool.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 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", "Velocity", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.velocity.tools.struts;
  
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpSession;
  import javax.servlet.ServletContext;
  
  import org.apache.struts.util.MessageResources;
  import org.apache.struts.action.*;
  
  import org.apache.velocity.tools.view.context.ViewContext;
  import org.apache.velocity.tools.view.tools.ContextTool;
  
  
  /**
   * <p>Context tool to work with forms in Struts. Extends ServletContextTool 
   * to profit from the logging facilities of that class.</p>
   *
   * @author <a href="mailto:sidler@teamup.com">Gabe Sidler</a>
   *
   * @version $Id: FormTool.java,v 1.1 2002/03/12 11:36:49 sidler Exp $
   * 
   */
  public class FormTool extends ServletContextTool
  {
  
      // --------------------------------------------- Private Properties -------
  
      /**
       * A reference to the HtttpServletRequest.
       */ 
      protected HttpServletRequest request;
      
  
      /**
       * A reference to the HtttpSession.
       */ 
      protected HttpSession session;
  
  
      
      // --------------------------------------------- Constructors -------------
  
      /**
       * Returns a factory. Use method {@link #init(ViewContext context)} to 
       * obtain instances of this class.
       */
      public FormTool()
      {
      }
      
      
      /**
       * For internal use only! Use method {@link #init(ViewContext context)} 
       * to obtain instances of the tool.
       */
      private FormTool(ViewContext context)
      {
          this.request = context.getRequest();
          this.session = request.getSession(false);
          this.application = context.getServletContext();    
      }
      
  
  
      // --------------------------------------------- ContextTool Interface ----
  
      /**
       * A new tool object will be instantiated per-request by calling 
       * this method. A context tool is effectively a factory used to 
       * create objects for use in templates. Some tools may simply return
       * themselves from this method others may instantiate new objects
       * to hold the per-request state.
       */
      public Object init(ViewContext context)
      {
          return new FormTool(context);
      }
  
  
      /**
       * Perform any cleanup needed. This method is called after the template
       * has been processed.
       */
      public void destroy(Object o)
      {
      }
  
  
  
      // --------------------------------------------- View Helpers -------------
  
      /**
       * <p>Returns the form bean associated with this action mapping.</p>
       *
       * <p>This is a convenience method. The form bean is automatically 
       * available in the Velocity context under the name defined in the 
       * Struts configuration.</p> 
       * 
       * <p>If the form bean is used repeatedly, it is recommended to create a 
       * local variable referencing the bean rather than calling getBean()
       * multiple times.</p>
       * 
       * <pre>   
       * Example:
       * #set ($defaults = $form.bean) 
       * &lt;input type="text" name="username" value="$form.username"&gt;
       * </pre>
       *
       * @return the {@link ActionForm} associated with this request or 
       * <code>null</code> if there is no form bean associated with this mapping
       */
      public ActionForm getBean()
      {
          return StrutsUtils.getActionForm(request, session);    
      }
      
  
      /**
       * <p>Returns the query parameter name under which a cancel button press 
       * must be reported if form validation is to be skipped. This is the value
       * of <code>org.apache.struts.taglib.html.Constants.CANCEL_PROPERTY</code></p>
       */
      public String getCancelName()
      {
          return StrutsUtils.getCancelName();
      }
      
  
      /**
       * Returns the transaction control token for this session or 
       * <code>null</code> if no token exists.
       */
      public String getToken()
      {
          return StrutsUtils.getToken(session);
      }
  
  
      /**
       * <p>Returns the query parameter name under which a transaction token
       * must be reported. This is the value of 
       * <code>org.apache.struts.taglib.html.Constants.TOKEN_KEY</code></p>
       */
      public String getTokenName()
      {
          return StrutsUtils.getTokenName();
      }
  
  }
  
  
  
  1.1                  jakarta-velocity-tools/struts/src/java/org/apache/velocity/tools/struts/LinkTool.java
  
  Index: LinkTool.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 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", "Velocity", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.velocity.tools.struts;
  
  import java.util.ArrayList;
  
  import java.net.URLEncoder;
  
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpSession;
  import javax.servlet.ServletContext;
  
  import org.apache.struts.util.MessageResources;
  import org.apache.struts.action.*;
  
  import org.apache.velocity.tools.view.context.ViewContext;
  import org.apache.velocity.tools.view.tools.ContextTool;
  
  
  /**
   * <p>Context tool to work with URI links in Struts. Extends 
   * ServletContextTool to profit from the logging facilities of 
   * that class.</p>
   *
   * @author <a href="mailto:sidler@teamup.com">Gabe Sidler</a>
   * @author <a href="mailto:nathan@esh.com">Nathan Bubna</a>
   *
   * @version $Id: LinkTool.java,v 1.1 2002/03/12 11:36:49 sidler Exp $
   * 
   */
  public class LinkTool extends ServletContextTool
  {
  
      // --------------------------------------------- Private Properties -------
  
      /**
       * A reference to the HtttpServletRequest.
       */ 
      protected HttpServletRequest request;
      
  
      /**
       * A reference to the HtttpSession.
       */ 
      protected HttpSession session;
  
  
      /**
       * The URI reference set for this link.
       */ 
      protected final String uri;
  
  
      /**
       * A list of query string parameters.
       */ 
      protected final ArrayList queryData;
  
      
      // --------------------------------------------- Constructors -------------
  
      /**
       * Returns a factory. Use method {@link #init(ViewContext context)} to 
       * obtain instances of this class.
       */
      public LinkTool()
      {
          request = null;
          session = null;
          application = null;
          
          uri = null;
          queryData = null;
      }
      
      
      /**
       * For internal use only! Use method {@link #init(ViewContext context)} 
       * to obtain instances of the tool.
       */
      private LinkTool(ViewContext context)
      {
          this.request = context.getRequest();
          this.application = context.getServletContext();    
  
          this.uri = null;
          this.queryData = null;
      }
      
  
      /**
       * For internal use.
       *
       * Copies 'that' LinkTool into this one and adds the new query data
       */
      private LinkTool(LinkTool that, QueryPair pair)
      {
          this.request = that.request;
          this.application = that.application;    
          this.uri = that.uri;
          if (that.queryData != null)
          {
              //set this query data to a shallow clone of that query data
              this.queryData = (ArrayList)that.queryData.clone();
          }
          else
          {
              this.queryData = new ArrayList();
          }
          //add new pair to this LinkTool's query data
          this.queryData.add(pair);
      }
  
  
      /**
       * For internal use.
       *
       * Copies 'that' LinkTool into this one and sets the new URI
       */
      private LinkTool(LinkTool that, String uri)
      {
          this.request = that.request;
          this.application = that.application;    
          //set to new uri
          this.uri = uri;
          //we don't need to clone here, this was not changed
          this.queryData = that.queryData;
      }
  
  
  
  
      // --------------------------------------------- ContextTool Interface ----
  
      /**
       * A new tool object will be instantiated per-request by calling 
       * this method. A ContextTool is effectively a factory used to 
       * create objects for use in templates. Some tools may simply return
       * themselves from this method others may instantiate new objects
       * to hold the per-request state.
       */
      public Object init(ViewContext context)
      {
          return new LinkTool(context);
      }
      
      
      /**
       * Perform any cleanup needed. This method is called after the template
       * has been processed.
       */
      public void destroy(Object o)
      {
      }
  
  
  
      // --------------------------------------------- View Helpers -------------
  
  
      /**
       * <p>Returns a copy of this link with the given URI reference. 
       * No conversions are applied to the given URI reference. The URI 
       * reference can be absolute, server-relative, relative and may
       * contain query parameters. This method will overwrite any 
       * previous URI reference settings but will copy the query 
       * string.</p>
       *
       * <p>Note: It is Struts' recommended practice to forward to
       * actions or forwards, but not directly to templates as this
       * bypasses the Struts controller. Consider using setAction() 
       * or setForward() instead.</p>
       * 
       * @param uri URI reference to set
       * @return a new instance of LinkTool
       */
      public LinkTool setURI(String uri)
      {
          return new LinkTool(this, uri);
      }
  
  
      /**
       * <p>Returns a copy of this link with the given action name
       * converted into a server-relative URI reference. This method 
       * does not check if the specified action really is defined. 
       * This method will overwrite any previous URI reference settings 
       * but will copy the query string.</p>
       *
       * @param action an action path as defined in struts-config.xml
       * @return a new instance of LinkTool
       */
      public LinkTool setAction(String action)
      {
          return new LinkTool (this, StrutsUtils.getActionMappingURL(application, request, action));
      }
      
      
      /**
       * <p>Returns a copy of this link with the given global forward name
       * converted into a server-relative URI reference. If the parameter 
       * does not map to an existing global forward name, <code>null</code> 
       * is returned. This method will overwrite any previous URI reference 
       * settings but will copy the query string.</p>
       *
       * @param forward a global forward name as defined in struts-config.xml
       * @return a new instance of LinkTool
       */
      public LinkTool setForward(String forward)
      {
          ActionForward mapping = StrutsUtils.getActionForward(forward, application);
          
          if (mapping == null)
          {
              log(WARNING, "In method setForward(" + forward + "): Parameter does not map to a valid forward.");
              return null;
          }
  
          String relPath = mapping.getPath();
          if (relPath.startsWith("/"))
          {
              return new LinkTool(this, request.getContextPath() + relPath);
          }
          else
          {
              return new LinkTool(this, request.getContextPath() + "/" + relPath);
          }        
          
      }
          
  
      /**
       * <p>Returns a copy of this link with the specified context-relative
       * URI reference converted to a server-relative URI reference. This 
       * method will overwrite any previous URI reference settings but will 
       * copy the query string.</p> 
       *
       * Example:<br>
       * <code>&lt;a href='$link.setAbsolute("/templates/login/index.vm")'&gt;Login Page&lt;/a&gt;</code><br>
       * produces something like</br>
       * <code>&lt;a href="/myapp/templates/login/index.vm"&gt;Login Page&lt;/a&gt;</code><br>
       *
       * @param uri A context-relative URI reference. A context-relative URI 
       * is a URI that is relative to the root of this web application.
       * @return a new instance of LinkTool
       */
      public LinkTool setAbsolute(String uri)
      {
          if (uri.startsWith("/"))
          {
              return new LinkTool(this, request.getContextPath() + uri);
          }
          else
          {
              return new LinkTool(this, request.getContextPath() + "/" + uri);
          }        
      }
  
      
      /**
       * <p>Adds a key=value pair to the query data. This returns a new LinkTool 
       * containing both a copy of this LinkTool's query data and the new data.
       * Query data is URL encoded before it is appended.</p>
       *
       * @param key key of new query parameter
       * @param value value of new query parameter
       * @return a new instance of LinkTool
       */
      public LinkTool addQueryData(String key, Object value)
      {
          return new LinkTool(this, new QueryPair(key, value));
      }
  
  
      /**
       * <p>Returns the current URI of this link as set by one of the methods 
       * setURI(), setAction(), setForward() or setAbsolute(). Any conversions 
       * have been applied. The returned URI reference does not include query 
       * data that was added with method addQueryData().</p>
       */
      public String getURI()
      {
          return uri;
      }
  
      
      /**
       * <p>Returns this link's query data as a url-encoded string e.g. 
       * <cpde>key=value&foo=this+is+encoded</code>.</p>
       */
      public String getQueryData()
      {
          if (queryData != null && !queryData.isEmpty())
          {
  
              StringBuffer out = new StringBuffer();
              for(int i=0; i < queryData.size(); i++)
              {
                  out.append(queryData.get(i));
                  if (i+1 < queryData.size())
                  {
                      out.append('&');
                  }
              }
              return out.toString();
          }
          return null;
      }
  
  
      /**
       * <p>Returns the URI that addresses this web application, e.g. 
       * <code>http://myserver.net/myapp</code>. This string does not end 
       * with a "/".  Note! This will not represent any URI reference or 
       * query data set for this LinkTool.</p>
       */
      public String getContextURL()
      {
          String scheme = request.getScheme();
          int port = request.getServerPort();
  
          StringBuffer out = new StringBuffer();
          out.append(request.getScheme());
          out.append("://");
          out.append(request.getServerName());
          if ((scheme.equals("http") && port != 80) ||
              (scheme.equals("https") && port != 443))
          {
              out.append(":");
              out.append(port);
          }
          out.append(request.getContextPath());
          return out.toString();
      }
  
  
      /**
       * <p>Returns the context path that addresses this web 
       * application, e.g. <code>/myapp</code>. This string starts 
       * with a "/" but does not end with a "/" Note! This will not 
       * represent any URI reference or query data set for this 
       * LinkTool.</p>
       */
      public String getContextPath()
      {
          return request.getContextPath();
      }
  
  
      /**
       * Returns the full URI of this template without any query data.
       * e.g. <code>http://myserver.net/myapp/stuff/View.vm</code>
       * Note! The returned String will not represent any URI reference 
       * or query data set for this LinkTool. A typical application of 
       * this method is with the HTML base tag. For example:  
       * <code>&lt;base href="$link.baseRef"&gt;</code>
       */
      public String getBaseRef()
      {
          StringBuffer out = new StringBuffer();
          out.append(getContextURL());
          out.append(request.getServletPath());
          return out.toString();
      }
  
  
      /** 
       * Returns the full URI reference that's been built with this tool, 
       * including the query string, e.g. 
       * <code>http://myserver.net/myapp/stuff/View.vm?id=42&type=blue</code>.
       * Typically, it is not necessary to call this method explicitely.
       * Velocity will call the toString() method automatically to obtain 
       * a representable version of an object.
       */
      public String toString()
      {
          StringBuffer out = new StringBuffer();
  
          if (uri != null)
          {
              out.append(uri);
          } 
  
          String query = getQueryData();
          if (query != null)
          {
              // Check if URI already contains query data
              if ( uri == null || uri.indexOf('?') < 0)
              {
                  // no query data yet, start query data with '?'    
                  out.append("?");
              }
              else
              {
                  // there is already query data, delimiter is '&'
                  out.append("&");
              }
              out.append(query);
          }
  
          return out.toString();
      }
  
  
    
      // --------------------------------------------- Internal Class -----------
   
       /**
       * Internal util class to handle representation and
       * encoding of key/value pairs in the query string
       */
      final class QueryPair
      {
  
          private final String key;
          private final Object value;
  
          public QueryPair(String key, Object value) 
          {
              this.key = key;
              this.value = value;
          }
  
  
          public String toString()
          {
              StringBuffer out = new StringBuffer();
              out.append(URLEncoder.encode(key));
              out.append('=');
              out.append(URLEncoder.encode(String.valueOf(value)));
              return out.toString();
          }
      }
  
   
   
   
  }
  
  
  
  1.1                  jakarta-velocity-tools/struts/src/java/org/apache/velocity/tools/struts/MessageTool.java
  
  Index: MessageTool.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 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", "Velocity", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.velocity.tools.struts;
  
  import java.util.Locale;
  import java.util.ArrayList;
  
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpSession;
  import javax.servlet.ServletContext;
  
  import org.apache.struts.util.MessageResources;
  import org.apache.struts.action.*;
  
  import org.apache.velocity.tools.view.context.ViewContext;
  import org.apache.velocity.tools.view.tools.ContextTool;
  
  
  /**
   * <p>Context tool to work with the Struts message resources.
   * Extends ServletContextTool to profit from the logging
   * facilities of that class.</p>
   *
   * @author <a href="mailto:sidler@teamup.com">Gabe Sidler</a>
   *
   * @version $Id: MessageTool.java,v 1.1 2002/03/12 11:36:49 sidler Exp $
   * 
   */
  public class MessageTool extends ServletContextTool
  {
  
      // --------------------------------------------- Private Properties -------
  
      /**
       * A reference to the HttpServletRequest.
       */ 
      protected HttpServletRequest request;
      
  
      /**
       * A reference to the HtttpSession.
       */ 
      protected HttpSession session;
  
  
      /**
       * A reference to the Struts message resources.
       */
      protected MessageResources resources;
  
  
      /**
       * A reference to the user's locale.
       */
      protected Locale locale;
  
  
      
      // --------------------------------------------- Constructors -------------
  
      /**
       * Returns a factory. Use method {@link #init(ViewContext context)} to 
       * obtain instances of this class.
       */
      public MessageTool()
      {
      }
      
      
      /**
       * For internal use only! Use method {@link #init(ViewContext context)} 
       * to obtain instances of the tool.
       */
      private MessageTool(ViewContext context)
      {
          this.request = context.getRequest();
          this.session = request.getSession(false);
          this.application = context.getServletContext();    
          
          resources = StrutsUtils.getMessageResources(application);
          locale = StrutsUtils.getLocale(request, session);
      }
      
  
  
      // --------------------------------------------- ContextTool Interface ----
  
      /**
       * A new tool object will be instantiated per-request by calling 
       * this method. A context tool is effectively a factory used to 
       * create objects for use in templates. Some tools may simply return
       * themselves from this method others may instantiate new objects
       * to hold the per-request state.
       */
      public Object init(ViewContext context)
      {
          return new MessageTool(context);
      }
  
  
      /**
       * Perform any cleanup needed. This method is called after the template
       * has been processed.
       */
      public void destroy(Object o)
      {
      }
  
  
  
      // --------------------------------------------- View Helpers -------------
  
      /**
       * Looks up and returns the localized message for the specified key.
       * The user's locale is consulted to determine the language of the 
       * message.
       *
       * @param key message key
       * @return the localized message for the specified key or 
       * <code>null</code> if no such message exists
       */
      public String get(String key)
      {
          if (resources == null)
          {
              log(ERROR, "Message resources are not available.");
              return null;
          }
          return resources.getMessage(locale, key);
      }
  
  
      /**
       * Looks up and returns the localized message for the specified key.
       * Replacement parameters passed with <code>args</code> are 
       * inserted into the message. The user's locale is consulted to 
       * determine the language of the message.
       *
       * @param key message key
       * @param args replacement parameters for this message
       * @return the localized message for the specified key or 
       * <code>null</code> if no such message exists
       */
      public String get(String key, Object args[])
      {
          if (resources == null)
          {
              log(ERROR, "Message resources are not available.");
              return null;
          }
          
          // return the requested message
          if (args == null)
          {
              return resources.getMessage(locale, key);
          }
          else
          {
              return resources.getMessage(locale, key, args);
          }
      }
  
  
      /**
       * Same as {@link #get(String key, Object[] args)}, but takes a
       * <code>java.util.ArrayList</code> instead of an array. This is 
       * more Velocity compatible. 
       */
      public String get(String key, ArrayList args)
      {
          return get(key, args.toArray());        
      }
  
  
      /**
       * Checks if a message string for a specified message key exists
       * for the user's locale.
       *
       * @param key message key
       * @return <code>true</code> if a message strings exists, 
       * <code>false</code> otherwise
       */
      public boolean exists(String key)
      {
          if (resources == null)
          {
              log(ERROR, "Message resources are not available.");
              return false;
          }
  
          // Return the requested message presence indicator
          return (resources.isPresent(locale, key));
      }
  
  
      /**
       * Returns the user's locale. If a locale is not found, the default 
       * locale is returned.
       */
      public Locale getLocale()
      {
          return locale;
      }
      
  }
  
  
  
  1.1                  jakarta-velocity-tools/struts/src/java/org/apache/velocity/tools/struts/ServletContextTool.java
  
  Index: ServletContextTool.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 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", "Velocity", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.velocity.tools.struts;
  
  import javax.servlet.ServletContext;
  
  import org.apache.velocity.tools.view.context.ViewContext;
  import org.apache.velocity.tools.view.tools.ContextTool;
  
  /**
   * <p>A basic context tool for use in Servlet-based applications. 
   * It implements logging to the logging facility provided by the
   * Servlet API. This is an abstract class that needs to be extended.</p>
   *
   * <p>This needs to be moved to the proper package.</p>
   *
   * @author <a href="mailto:sidler@teamup.com">Gabe Sidler</a>
   *
   * @version $Id: ServletContextTool.java,v 1.1 2002/03/12 11:36:49 sidler Exp $
   * 
   */
  public abstract class ServletContextTool implements ContextTool 
  {
  
      // --------------------------------------------- Properties --------------
  
      /**
       * A reference to the servlet context. A class that 
       * extends this class must initialize this field with a reference to 
       * the servlet context.
       */ 
      protected ServletContext application;
      
      
      /**
       * A constant for informative log messages. No action is necessary.
       */ 
      public static final int INFO = 10;
      
  
      /**
       * A constant for warning log messages. Use WARNING log messages to
       * report non-critical errors while processing the template.
       */ 
      public static final int WARNING = 20;
  
  
      /**
       * A constant for error log messages. Use ERROR log messages to 
       * report severe errors during template processing.
       */ 
      public static final int ERROR = 30;
  
  
      // --------------------------------------------- Constructors -------------
  
  
      // --------------------------------------------- ContextTool Interface ----
  
      /**
       * A new tool object will be instantiated per-request by calling 
       * this method. A ContextTool is effectively a factory used to 
       * create objects for use in templates. Some tools may simply return
       * themselves from this method others may instantiate new objects
       * to hold the per-request state.
       */
      public abstract Object init(ViewContext context);
      
      
      /**
       * Perform any cleanup needed. This method is called after the template
       * has been processed.
       */
      public abstract void destroy(Object o);
  
  
      // --------------------------------------------- View Helpers -------------
  
  
      // --------------------------------------------- Logging Utils ------------
  
      /**
       * <p>Logs to the Servlet API's logging facility.</p>
       * 
       * @param level A log level. See properties {@link #INFO}, {@link #WARNING}
       * and {@link #ERROR}.
       * @param msg A message to log. The message should indicate where, why and
       *     what error occured.
       */
      public void log(int level, String msg)
      {
          // If we have no reference to the servlet context, logging cannot occur.
          if (application != null)
          {
              String lev;
              if (level == ERROR)
              {
                  lev = "ERROR";
              }
              else if (level == WARNING)
              {
                  lev = "WARNING";
              }
              else
              {
                  lev = "INFO";
              }
              application.log( this.getClass().toString() + " [" + lev + "] " + msg);
          }        
      }
  
  
  }
  
  
  
  1.1                  jakarta-velocity-tools/struts/src/java/org/apache/velocity/tools/struts/StrutsUtils.java
  
  Index: StrutsUtils.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2001 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", "Struts", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  
  package org.apache.velocity.tools.struts;
  
  
  import java.util.Locale;
  import java.util.Iterator;
  import javax.servlet.ServletContext;
  import javax.servlet.http.HttpServlet;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpSession;
  import javax.sql.DataSource;
  
  import org.apache.struts.upload.MultipartRequestWrapper;
  import org.apache.struts.util.MessageResources;
  
  
  import org.apache.struts.action.*; // expediancy
  
  
  /**
   * <p>A utility class to expose the Struts shared resources,
   * which are be stored in the application, session, or
   * request contexts, as appropriate. All methods are static.</p>
   *
   * <p>This class is provided for use by Velocity context tools
   * that need access to Struts resources. By having all Struts-
   * specific code in this utility class, maintenance is simplified
   * and reuse fostered.</p>
   *
   * <p>It is the aim, that sooner or later the functionality in
   * this class is integrated into Struts itself.</p>
   *
   * @author <a href="mailto:sidler@teamup.com">Gabe Sidler</a>, based
   * on code by <a href="mailto:ted@husted.org">Ted Husted</a>
   *
   * @version $Revision: 1.1 $
   */
  public class StrutsUtils
  {
  
  // ------------------------------------------------ Application Context
  
      /**
       * Returns the <strong>default</strong> configured data source 
       * (which must implement <code>javax.sql.DataSource</code>) or 
       * <code>null</code> if not found.
       */
      public static DataSource getDataSource(ServletContext application)
      {
          if (application==null)
          {
             return null;
          }
  
          return (DataSource)
              application.getAttribute(Action.DATA_SOURCE_KEY);
      }
  
  
      /* This method depends of features that are available in Struts 1.1+ only
      public static ActionMessages getActionMessages(ServletContext application) 
      {
          if (application==null)
              return null;
          return (ActionMessages)
              application.getAttribute(Action.MESSAGE_KEY);
      }
      */
  
  
      /**
       * Returns the <code>org.apache.struts.action.ActionFormBeans</code> 
       * collection for this application or <code>null</code> if not found.
       */
      public static ActionFormBeans getActionFormBeans(ServletContext application)
      {
          if (application==null)
          {
              return null;
          }
  
          return (ActionFormBeans)
              application.getAttribute(Action.FORM_BEANS_KEY);
      }
  
  
      /**
       * Returns the form bean definition associated with the specified
       * logical name or <code>null</code> if not found.
       *
       * @param name logical name of the requested form bean definition
       */
      public static ActionFormBean getFormBean(String name, ServletContext application)
      {
          ActionFormBeans formBeans = getActionFormBeans(application);
  
          if (formBeans==null)
          {
              return null;
          }
  
          return formBeans.findFormBean(name);
      }
  
  
      /**
       * Returns the <code>org.apache.struts.action.ActionForwards</code> 
       * collection for this application or <code>null</code> if not found.
       */
      public static ActionForwards getActionForwards(ServletContext application)
      {
          if (application==null)
          {
              return null;
          }
  
          return (ActionForwards)
              application.getAttribute(Action.FORWARDS_KEY);
      }
  
  
      /**
       * Returns the forwarding associated with the specified logical name
       * or <code>null</code> if not found.
       *
       * @param name Logical name of the requested forwarding
       */
      public static ActionForward getActionForward(String name, 
                                                   ServletContext application)
      {
          ActionForwards forwards = getActionForwards(application);
  
          if (forwards==null)
          {
              return null;
          }
  
          return forwards.findForward(name);
      }
  
  
      /**
       * Returns the <code>org.apache.struts.action.ActionMappings</code> 
       * collection for this application or <code>null</code> if not found.
       */
      public static ActionMappings getActionMappings(ServletContext application)
      {
          if (application==null)
          {
              return null;
          }
  
          return (ActionMappings)
              application.getAttribute(Action.MAPPINGS_KEY);
      }
  
  
      /**
       * Returns the mapping associated with the specified request path, 
       * or <code>null</code> if not found.
       *
       * @param path Request path for which a mapping is requested
       */
      public static ActionMapping getActionMapping(String path, 
                                                   ServletContext application)
      {
          ActionMappings mappings = getActionMappings(application);
  
          if (mappings==null)
          {
              return null;
          }
  
          return mappings.findMapping(path);
      }
  
  
      /**
       * Returns the message resources for this application or <code>null</code>
       * if not found.
       */
      public static MessageResources getMessageResources(ServletContext application)
      {
          if (application==null)
          {
              return null;
          }
  
          return (MessageResources)
              application.getAttribute(Action.MESSAGES_KEY);
      }
  
  
      /**
       * Returns the servlet mapping used for this application or
       * <code>null</code> if not found. The servlet mapping is
       * either a path-mapped pattern (<code>/action/*</code>) or an
       * extension mapped pattern (<code>*.do</code>).
       */
      public static String getServletMapping(ServletContext application)
      {
          if (application==null)
          {
              return null;
          }
  
          return (String)
              application.getAttribute(Action.SERVLET_KEY);
      }
  
  
  // ---------------------------------------------------- Session Context
  
  
      /**
       * Returns the <code>java.util.Locale</code> for the user. If a 
       * locale object is not found in the user's session, the system 
       * default locale is returned.
       */
      public static Locale getLocale(HttpServletRequest request, 
                                     HttpSession session)
      {
          Locale locale = null;
  
          if (session!=null)
          {
              locale = (Locale) session.getAttribute(Action.LOCALE_KEY);
          }
  
          if ((locale==null) && (request!=null))
          {
              locale = request.getLocale();
          }
  
          return locale;
      }
  
  
      /**
       * Returns the transaction token stored in this session or 
       * <code>null</code> if not used.
       */
      public static String getToken(HttpSession session)
      {
          if (session==null)
          {
              return null;
          }
  
          return (String) session.getAttribute(Action.TRANSACTION_TOKEN_KEY);
      }
  
  
  // ---------------------------------------------------- Request Context
  
  
      /**
       * Returns the <code>org.apache.struts.action.ActionErrors</code> 
       * object for this request or <code>null</code> if none exists.
       */
      public static ActionErrors getActionErrors(HttpServletRequest request)
      {
          if (request==null)
          {
              return null;
          }
  
          return (ActionErrors) request.getAttribute(Action.ERROR_KEY);
      }
  
  
      /**
       * Returns the runtime Exception that may have been thrown by a 
       * Struts view tool or compatible presentation extension, and 
       * placed in the request. Returns <code>null</code> if none found.
       */
      public static Throwable getException(HttpServletRequest request)
      {
          if (request==null)
          {
              return null;
          }
  
          return (Throwable)
              request.getAttribute(Action.EXCEPTION_KEY);
      }
  
  
      /**
       * Returns the multipart object for this request or <code>null</code>
       * if none exists.
       */
      public static MultipartRequestWrapper getMultipartRequestWrapper(HttpServletRequest request)
      {
          if (request==null)
          {
              return null;
          }
  
          return (MultipartRequestWrapper)
              request.getAttribute(Action.MULTIPART_KEY);
      }
  
  
     /**
       * Returns the <code>org.apache.struts.ActionMapping</code> instance 
       * for this request or <code>null</code> if none exists.
       */
      public static ActionMapping getMapping(HttpServletRequest request)
      {
          if (request==null)
          {
             return null;
          }
  
          return (ActionMapping)
              request.getAttribute(Action.MAPPING_KEY);
      }
  
  
      /**
       * Returns the <code>ActionForm</code> bean associated with
       * this request of <code>null</code> if none exists.
       */
      public static ActionForm getActionForm(HttpServletRequest request, 
                                             HttpSession session)
      {
          // Is there a mapping associated with this request?
          ActionMapping mapping = (ActionMapping)request.getAttribute(Action.MAPPING_KEY);
          if (mapping == null)
          {
              return (null);
          }
  
          // Is there a form bean associated with this mapping?
          String attribute = mapping.getAttribute();
          if (attribute == null)
          {
              return (null);
          }
  
          // Look up the existing form bean
          if ("request".equals(mapping.getScope()))
          {
              return (ActionForm)request.getAttribute(attribute);
          }
          if (session != null)
          {
              return (ActionForm)session.getAttribute(attribute);
          }
  
          return null;
      }
      
  
  // ---------------------------------------------------- Struts Static Fields --
      
      /**
       * Returns the query parameter name under which a cancel button press 
       * must be reported if form validation is to be skipped.
       */
      public static String getCancelName()
      {
          return org.apache.struts.taglib.html.Constants.CANCEL_PROPERTY;
      }
      
      
      /**
       * Returns the query parameter name under which a transaction token
       * must be reported.
       */
      public static String getTokenName()
      {
          return org.apache.struts.taglib.html.Constants.TOKEN_KEY;
      }
   
  
  
  // ------------------------------------------------ Utilities -----------------
  
  
      /**
       * Returns the form action converted into an action mapping path. The
       * value of the <code>action</code> property is manipulated as follows in
       * computing the name of the requested mapping:
       * <ul>
       * <li>Any filename extension is removed (on the theory that extension
       *     mapping is being used to select the controller servlet).</li>
       * <li>If the resulting value does not start with a slash, then a
       *     slash is prepended.</li>
       * </ul>
       */
      public static String getActionMappingName(String action)
      {
  
          String value = action;
          int question = action.indexOf("?");
  
          if (question >= 0)
          {
              value = value.substring(0, question);
          }
  
          int slash = value.lastIndexOf("/");
          int period = value.lastIndexOf(".");
  
          if ((period >= 0) && (period > slash))
          {
              value = value.substring(0, period);
          }
  
          if (value.startsWith("/"))
          {
              return (value);
          }
          else
          {
              return ("/" + value);
          }
      }
  
  
      /**
       * Returns the form action converted into a server-relative URI
       * reference.
       */
      public static String getActionMappingURL(ServletContext application, 
                                               HttpServletRequest request, 
                                               String action)
      {
          StringBuffer value = new StringBuffer(request.getContextPath());
  
          // Use our servlet mapping, if one is specified
          String servletMapping = getServletMapping(application);
  
          if (servletMapping != null)
          {
              String queryString = null;
              int question = action.indexOf("?");
  
              if (question >= 0)
              {
                  queryString = action.substring(question);
              }
  
              String actionMapping = getActionMappingName(action);
  
              if (servletMapping.startsWith("*."))
              {
                  value.append(actionMapping);
                  value.append(servletMapping.substring(1));
              }
              else if (servletMapping.endsWith("/*"))
              {
                  value.append(servletMapping.substring
                               (0, servletMapping.length() - 2));
                  value.append(actionMapping);
              }
  
              if (queryString != null)
              {
                  value.append(queryString);
              }
          }
          else
          {
              // Otherwise, assume extension mapping is in use and extension is
              // already included in the action property
              if (!action.startsWith("/"))
              {
                  value.append("/");
              }
  
              value.append(action);
          }
  
          // Return the completed value
          return (value.toString());
      }
  
  
      /**
       * Returns a formatted error message. The value of message resource 
       * "errors.header" is prepended. Then, the list of error messages is 
       * rendered. The value of message resource "errors.footer" is appended.
       *
       * @param property Property name
       * @return The formatted error message. If no error messages are queued, 
       * an empty string is returned. 
       */
      public static String errorMarkup(String property, 
                                       HttpServletRequest request,
                                       HttpSession session,
                                       ServletContext application) 
      {        
          ActionErrors errors = getActionErrors(request);
          if (errors == null)
          {
              return "";
          }
          
          // fetch the error messages
          Iterator reports = null;
          if (property == null)
          {
              reports = errors.get();
          }
          else
          {
              reports = errors.get(property);
          }
  
          if (!(reports.hasNext()))
          {
              return "";
          }
                  
          // Render the error messages appropriately if errors have been queued
          StringBuffer results = new StringBuffer();
          String header = null;
          String footer = null;
          Locale locale = getLocale(request, session);
  
          MessageResources resources = getMessageResources(application);
          if (resources != null)
          {
              header = resources.getMessage(locale, "errors.header");
              footer = resources.getMessage(locale, "errors.footer");
          }
          if (header == null)
          {
              header = "errors.header";
          }
          if (footer == null)
          {
              footer = "errors.footer";    
          }
                       
          results.append(header);
          results.append("\r\n");
  
          String message;
          while (reports.hasNext()) 
          {
              message = null;
              ActionError report = (ActionError) reports.next();
              if (resources != null)
              {
                  message = resources.getMessage(locale,
                                                 report.getKey(),
                                                 report.getValues());
              }
              if (message != null) 
              {
                  results.append(message);
                  results.append("\r\n");
              }
              else
              {
                  results.append(report.getKey());
                  results.append("\r\n");
              }
          }
  
          results.append(footer);
          results.append("\r\n");
  
          // return result
          return results.toString();
      }
   
  }
  
  
  
  1.1                  jakarta-velocity-tools/struts/xdocs/index.xml
  
  Index: index.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <document>
  
      <properties>
          <title>Velocity for Struts</title>
          <author email="sidler@apache.org">Gabriel Sidler</author>
          <projectfile>xdocs/tools.xml</projectfile>
      </properties>
  
      <body>
  
      <section name="Velocity for Struts - Reference Documentation">
  
          <p>
          Velocity for Struts includes four context tools that provide access
          to Struts resources from within Velocity templates. This page is the 
          starting point to the reference documentation for the context tools.
          Primary audience are the template designers.</p> 
                 
          <p>
          Velocity for Struts currently supports the follwing four tools:
          </p>
          
          <p>
          <strong><a href="tool-MessageTool.html">MessageTool</a></strong><br />
          Provides access to the Struts message resources for internationalized output.
          </p>
  
          <p>
          <strong><a href="tool-ErrorsTool.html">ErrorsTool</a></strong><br />
          Provides methods to work with Struts error messages.
          </p>
  
          <p>
          <strong><a href="tool-FormTool.html">FormTool</a></strong><br />
          Provides miscellaneous methods to work with forms and form beans in the context 
          of Struts applications.
          </p>
  
          <p>
          <strong><a href="tool-LinkTool.html">LinkTool</a></strong><br />
          Provides methods to work with URIs.
          </p>
          
          <p>
          <strong>ActionMessagesTool</strong><br/>
          Provides methods to work with Struts action messages, a new feature in the
          upcoming 1.1. release. Will be added shortly.
          </p>
  
  
  
      </section>
  
  
   </body>
  </document>
  
  
  
  
  1.1                  jakarta-velocity-tools/struts/xdocs/tool-ErrorsTool.xml
  
  Index: tool-ErrorsTool.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <document>
  
      <properties>
          <title>ErrorsTool</title>
          <author email="sidler@apache.org">Gabriel Sidler</author>
          <projectfile>xdocs/tools.xml</projectfile>
      </properties>
  
      <body>
  
      <section name="ErrorsTool Reference Documentation">
  
          <p>
          This tool deals with Struts error messages. Errors may stem from the validation 
          of a submitted form or from the processing of a request. If there are errors, 
          they are made available to the view to render. A few important aspects about errors 
          are:</p>
          <ul>
              <li>Error message strings are looked up in the message resources. Support 
                  for internationalized messages is provided.</li>
              <li>Error messages can have up to five replacement parameters.</li>
              <li>Errors have an attribute <code>property</code> that describes the category of 
                  error. This allows the view designer to place error messages precisely where an 
                  error occurred. For example, errors that apply to the entire page can be rendered 
                  at the top of the page, errors that apply to a specific input field can be rendered 
                  next to this input field. Several methods of this tool provide a parameter 
                  <code>property</code> that allows to select a specific category of errors to operate
                  on. Without the <code>property</code> parameter, methods operate on all error messages.</li>
          </ul>
         
          <p>See the Struts User's Guide, section 
          <a href="http://jakarta.apache.org/struts/userGuide/building_view.html">Building View Components</a> 
          for more information on this topic.</p>
          
          <toolinfo version="@@@version@@@, @@@date@@@"
                    jar="velocity-tools-struts-@@@version@@@.jar"
                    clazz="org.apache.velocity.tools.struts.ErrorsTool"
                    name="$errors"
                    authors="Gabriel Sidler"
          />
  
          <methods/>
  
      </section>
  
      <section name="exist()">
          <method name="exist()">
      
              <abstract>
                  Returns true if there are errors queued, otherwise false.
              </abstract>
      
              <signature>
                  boolean exist()
              </signature>
              
              <signature>
                  boolean exist(String property)
              </signature>
  
              <parameters>
                  <parameter name="property">
                      The category of errors to check for.
                  </parameter>
              </parameters>
      
              <returns>
                  <code>true</code> if there error message queued. <code>false</code> otherwise.
              </returns>
                  
              <description>
                  <p>Calling <code>exist()</code> without the <code>property</code> parameter checks for error messages of
                  any category. The <code>property</code> parameter can be used to limit the check to 
                  error message of a specific category.</p> 
                                  
  <sourcecode>$errors.exist()
  $errors.exist("password")
  </sourcecode>
              </description>
      
          </method>
      </section>
  
      <section name="getSize()">
          <method name="getSize()">
      
              <abstract>
                  Returns the number of error messages queued.
              </abstract>
      
              <signature>
                  int getSize()
              </signature>
              
              <signature>
                  int getSize(String property)
              </signature>
  
              <parameters>
                  <parameter name="property">
                      The category of errors to operate on.
                  </parameter>
              </parameters>
      
              <returns>
                  The number of error messages.
              </returns>
         
              <description>
                  <p>Calling <code>getSize()</code> without the <code>property</code> parameter returns the total 
                  number of queued error messages. The <code>property</code> parameter can be used to 
                  obtain the number of queued error messages for a specific category.</p> 
  
  <sourcecode>$errors.getSize()
  $errors.size
  $errors.getSize("password")</sourcecode>
              </description>
  
          </method>
      </section>
  
      <section name="getAll()">
          <method name="getAll()">
      
              <abstract>
                  Returns a list of localized error messages for all errors queued.
              </abstract>
      
              <signature>
                  HashMap getAll()
              </signature>
              
              <returns>
                  If the message resources are lacking an error message for a 
                  particular message key, the key itself is used as error message
                  and an error is logged.
              </returns>
         
              <description>
                  <p>The following example shows a macro to render the error messages:</p>
  
  <sourcecode>&#35;macro (errorMarkup)
      &#35;if (&#36;errors.exist)
          &lt;ul&gt;
          &#35;foreach (&#36;e in &#36;errors.all )
              &lt;li&gt;&#36;e&lt;/li&gt;
          &#35;end
          &lt;/ul&gt;
      &#35;end
  &#35;end</sourcecode>
  
  <p>This produces output similar to the following:</p>
  
  <sourcecode>&lt;ul&gt;
      &lt;li&gt;The field Expiration Date is required.&lt;/li&gt;
      &lt;li&gt;The provided number is not a valid credit card number&lt;/li&gt;
  &lt;/ul&gt;</sourcecode>
              </description>
  
          </method>
      </section>
  
  
      <section name="get()">
          <method name="get()">
      
              <abstract>
                  Returns a list of localized error messages for a particular category
                  of errors.
              </abstract>
      
              <signature>
                  ArrayList get(String property)
              </signature>
  
              <parameters>
                  <parameter name="property">
                      The category of errors to return.
                  </parameter>
              </parameters>
              
              <returns>
                  A <code>java.util.ArrayList</code> of <code>java.lang.String</code>.
                  If no error messages exist for the specified category, 
                  <code>null</code> is returned. 
                  If the message resources are lacking an error message for a 
                  particular message key, the key itself is used as error message
                  and an error is logged.
              </returns>
         
              <description>
                  <p>The following example shows a macro to render the error messages for a 
                  particular category of errors:</p>
  
  <sourcecode>&#35;macro (errorMarkup &#36;property)
      &#35;if (&#36;errors.exist(&#36;property))
          &lt;ul&gt;
          &#35;foreach (&#36;er in &#36;errors.get(&#36;property) )
              &lt;li&gt;&#36;er&lt;/li&gt;
          &#35;end
          &lt;/ul&gt;
      &#35;end
  &#35;end</sourcecode>
  
  <p>This produces output similar to the following:</p>
  
  <sourcecode>&lt;ul&gt;
      &lt;li&gt;The field Expiration Date is required.&lt;/li&gt;
      &lt;li&gt;The provided number is not a valid credit card number&lt;/li&gt;
  &lt;/ul&gt;</sourcecode>
              </description>
  
          </method>
      </section>
  
  
      <section name="getMsgs()">
          <method name="getMsgs()">
      
              <abstract>
                  Renders the queued errors messages.
              </abstract>
      
              <signature>
                  String getMsgs()
              </signature>
  
              <signature>
                  String getMsgs(String property)
              </signature>
  
              <parameters>
                  <parameter name="property">
                      The category of errors messages to render.
                  </parameter>
              </parameters>
              
              <returns>
                  The formatted error messages. If no errors are queued, an 
                  empty <code>String</code> is returned. 
              </returns>
         
              <description>
                  <p>This method renders the queued error messages as a list. If the method
                  is called without a parameter, all queued errors are rendered. With the 
                  parameter <code>property</code> the list of rendered messages can be 
                  limited to a specific category of errors. Error message texts
                  are looked up in the message resources. If a message text
                  cannot be found, the message key will be displayed instead.</p>
                  
                  <p>The method expects a message header and a message footer 
                  to be defined in the message resources. The corresponding
                  message keys are <code>errors.header</code> and 
                  <code>errors.footer</code>.</p>
                  
                  <p>Assuming that the message resources contain the following
                  definitions:</p>
  
  <sourcecode>errors.header=Please correct the following errors:&lt;ul&gt;
  errors.footer=&lt;/ul&gt;
  error01=&lt;li&gt;The field Expiration Date is required.&lt;/li&gt;
  error02=&lt;li&gt;The input is not a valid credit card number.&lt;/li&gt;
  ...</sourcecode>
  
  <p>an error message would be rendered as follows:</p>
  
  <sourcecode>Please correct the following errors before proceeding:&lt;ul&gt;
      &lt;li&gt;The field Expiration Date is required.&lt;/li&gt;
      &lt;li&gt;The input is not a valid credit card number.&lt;/li&gt;
  &lt;/ul&gt;</sourcecode>
              </description>
  
          </method>
      </section>
  
  
  
   </body>
  </document>
  
  
  
  
  1.1                  jakarta-velocity-tools/struts/xdocs/tool-FormTool.xml
  
  Index: tool-FormTool.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <document>
  
      <properties>
          <title>FormTool</title>
          <author email="sidler@apache.org">Gabriel Sidler</author>
          <projectfile>xdocs/tools.xml</projectfile>
      </properties>
  
      <body>
  
      <section name="FormTool Reference Documentation">
  
          <p>Struts has support to parse incoming HTTP requests and populate a Java bean
          with the submitted request parameters. The same Java bean is used to populate
          forms with initial values. Additionally, a hook allows the application developer 
          to include automatic form validation code.</p> 
  
          <p>FormTool provides miscellaneous methods to work with forms and form bean in
          the context of Struts applications.</p>
          
          <toolinfo version="@@@version@@@, @@@date@@@"
                    jar="velocity-tools-struts-@@@version@@@.jar"
                    clazz="org.apache.velocity.tools.struts.FormTool"
                    name="$form"
                    authors="Gabriel Sidler"
          />
  
          <methods/>
  
      </section>
  
      <section name="getBean()">
          <method name="getBean()">
      
              <abstract>
                  Retrieve and return the form bean associated with this request.
              </abstract>
      
              <signature>
                  ActionForm getBean()
              </signature>
                  
              <returns>
                  The <code>ActionForm</code> associated with this request/session or 
                  <code>null</code> if there is no form bean associated with this mapping.
              </returns>
                  
              <description>
                  <p>This is a convenience method. The form bean is automatically 
                  available in the Velocity context under the name defined in the 
                  Struts configuration.</p> 
       
                  <p>If the form bean is used repeatedly, it is recommended to create a 
                  local variable referencing the bean rather than calling getBean()
                  multiple times.</p>
                                  
  <sourcecode>## Populating an input field with a default value
  &lt;input type="text" name="username" value="$form.getBean().username"&gt;
  
  ## The same can be written as
  &lt;input type="text" name="username" value="$form.bean.username"&gt;
  
  ## For repeated use create a local reference
  #set ($defaults = $form.bean) 
  &lt;input type="text" name="username" value="$defaults.username"&gt;
  
  ## Accessing the form using the form name defined in struts-config.xml
  ## Velocity searches the request and session attributes for loginForm
  &lt;input type="text" name="username" value="$loginForm.username"&gt;</sourcecode>
              </description>
      
          </method>
      </section>
  
      <section name="getCancelName()">
          <method name="getCancelName()">
      
              <abstract>
                  Returns the query parameter name under which a cancel button press 
                  must be reported if form validation is to be skipped.
              </abstract>
      
              <signature>
                  int getCancelName()
              </signature>
                  
              <returns>
                  The value of <code>org.apache.struts.taglib.html.Constants.CANCEL_PROPERTY</code>
              </returns>
         
              <description>
                  <p>If a request contains a request parameter with key equal to the return value
                  of this method, then automatic form validation is skipped. A typical application
                  case is to use this magic string for the name attribute of a cancel button in a form.
                  If this button is pressed, automatic form validation is skipped. If automatic form 
                  validation is not used, this magic string is irrelevant.</p>
  
  <sourcecode>## A cancel button
  &lt;input type="submit" name="$form.getCancelName()" value="Cancel"&gt;
  
  ## Can also be written as
  &lt;input type="submit" name="$form.cancelName()" value="Cancel"&gt;</sourcecode>
  
  <p>This produces the following output:</p>
  
  <sourcecode>&lt;input type="submit" name="org.apache.struts.taglib.html.CANCEL" value="Cancel"&gt;</sourcecode>
  
              </description>
  
          </method>
      </section>
  
      <section name="getToken()">
          <method name="getToken()">
      
              <abstract>
                  Retrieves and returns the transaction control token for this session.
              </abstract>
      
              <signature>
                  String getToken()
              </signature>
                  
              <returns>
                  The token <code>String</code> or <code>null</code> if no token exists.
              </returns>
  
              <see>
                  Method <a href="#getTokenName()"><code>getTokenName()</code></a> for examples. 
              </see>
  
          </method>
      </section>
  
      <section name="getTokenName()">
          <method name="getTokenName()">
      
              <abstract>
                  Returns the query parameter name under which a transaction token
                  must be reported.
              </abstract>
      
              <signature>
                  int getTokenName()
              </signature>
                  
              <returns>
                  The value of <code>org.apache.struts.taglib.html.Constants.TOKEN_KEY</code>
              </returns>
  
              <see>
                  <a href="http://jakarta.apache.org/struts/api/org/apache/struts/action/Action.html">
                  JavaDoc of class <code>org.apache.struts.action.Action</code></a> for more information on the 
                  transaction token mechanism (I don't know of any better documentation of this Struts
                  feature).
              </see>
  
         
              <description>
  <sourcecode>## A hidden form field with the transaction token
  &lt;input type="hidden" name="$form.getTokenName()" value="$form.getToken()"&gt;
  
  ## Can also be written as
  &lt;input type="hidden" name="$form.tokenName()" value="$form.token()"&gt;</sourcecode>
  
  <p>This produces output similar to:</p>
  
  <sourcecode>&lt;input type="hidden" name="org.apache.struts.taglib.html.TOKEN" 
  value="84c29b4dea56ecf69524ef6b965c5e80"&gt;</sourcecode>
              </description>
  
          </method>
      </section>
  
   </body>
  </document>
  
  
  1.1                  jakarta-velocity-tools/struts/xdocs/tool-LinkTool.xml
  
  Index: tool-LinkTool.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <document>
  
      <properties>
          <title>LinkTool</title>
          <author email="sidler@apache.org">Gabriel Sidler</author>
          <projectfile>xdocs/tools.xml</projectfile>
      </properties>
  
      <body>
  
      <section name="LinkTool Reference Documentation">
  
          <p>The LinkTool provides methods to work with URIs:</p>
          <ul>
              <li>translate logical names (Struts forwards, actions ) to URI references</li>
              <li>construct and encode query strings</li>
              <li>retrieve server, port and path info for the current request</li>
          </ul>
  
          <p>The LinkTool is somewhat special in that many of its methods return
          a new instance of LinkTool. This facilitates greatly the repeated use
          of the LinkTool in Velocity and leads to an elegant syntax.</p> 
  
          <p>I've been struggling a bit to find the right terminology for the things
          that this tool works with. Based on document 
          <a href="http://www.w3.org/Architecture/Terms">http://www.w3.org/Architecture/Terms</a>,
          I have used:</p>
          
          <dl>
              <dt>URI</dt>
              <dd>To refer to the full, absolute address of web resources, e.g. static documents
              or abstract resources like dynamically generated content. 
              Example: <code>http://myserver.org/myapp/templates/index.html</code></dd>
  
              <dt>URI Reference</dt>
              <dd>To refer to partial and relative URIs that reference a URI. Example: 
              <code>templates/index.html</code>. </dd>
  
              <dt>URL</dt>
              <dd>Not used here.</dd>
  
          </dl>
          
          
          
          <toolinfo version="@@@version@@@, @@@date@@@"
                    jar="velocity-tools-struts-@@@version@@@.jar"
                    clazz="org.apache.velocity.tools.struts.LinkTool"
                    name="$link"
                    authors="Gabriel Sidler, Nathan Bubna"
          />
  
          <methods/>
  
      </section>
  
  
      <section name="setURI()">
          <method name="setURI()">
      
              <abstract>
                  Returns a copy of this LinkTool instance with the given URI reference.
              </abstract>
      
              <signature>
                  LinkTool setURI(String uri)
              </signature>
              
              <parameters>
                  <parameter name="uri">
                      URI reference to set. The URI reference can be absolute 
                      (<code>http://www.mydomain.com/myapp/templates/index.html</code>),
                      server-relative (<code>/myapp/templates/index.html</code>), 
                      relative (<code>templates/index.html</code>) 
                      and may contain query strings (<code>templates/index.html&#63;key1=value1&amp;key2=value2</code>).
                  </parameter>
              </parameters>
      
              <returns>
                  A new instance of <code>LinkTool</code>.  
              </returns>
      
              <description>
                  <p>No conversions are applied to the given URI reference. This method will 
                  overwrite any previously set URI reference but will copy query 
                  data set with method <code>setQueryData()</code>.</p>
                  
                  <p>Note: It is Struts' recommended practice to link to
                  actions or forwards, but not directly to templates as this
                  bypassed the Struts controller. Consider using setAction() 
                  or setForward() instead.</p>
               </description>
             
  <sourcecode>## a relative reference
  $link.setURI("index.html").addQueryData("key1","val 1")
  
  ## a server-relative reference
  $link.setURI("/myapp/index.vm").addQueryData("key1","val 1")
  
  ## an absolute reference
  $link.setURI("http://myserver.org/myapp/index.vm")
  .addQueryData("key1", "val 1")
  
  ## a reference with a query string
  $link.setURI("/myapp/index.vm?key0=val0")
  .addQueryData("key1", "val 1")
  </sourcecode>
  
  <p>This produces:</p>
  
  <sourcecode>index.vm/key1=val+1
      
  /myapp/index.vm/key1=val+1
  
  http://myserver.org/myapp/index.vm?key1=val+1
  
  /myapp/index.vm?key0=val0&amp;key1=val+1</sourcecode>
  
          </method>
      </section>
  
  
      <section name="setAction()">
          <method name="setAction()">
      
              <abstract>
                  Returns a copy of this LinkTool instance with the given action path
                  converted into a server-relative URI reference.
              </abstract>
      
              <signature>
                  LinkTool setAction(String action)
              </signature>
              
              <parameters>
                  <parameter name="action">
                      An action path as defined in struts-config.xml, e.g. <code>/logon</code>.
                  </parameter>
              </parameters>
      
              <returns>
                  A new instance of <code>LinkTool</code>.  
              </returns>
      
              <description>
                  <p>The action name is translated into a server-relative URI reference. The method does 
                  not check if the specified action has been defined. It will overwrite any 
                  previously set URI reference but will copy the query string.</p>
              </description>
  
  <sourcecode>## a form tag
  &lt;form name="form1" action="$link.setAction("demo")"&gt;</sourcecode>
  
  <p>Produces something like:</p>
  
  <sourcecode>&lt;form name="form1" action="/myapp/demo.do"&gt;</sourcecode>
      
          </method>
      </section>
  
  
      <section name="setForward()">
          <method name="setForward()">
      
              <abstract>
                  Returns a copy of this LinkTool instance with the given global 
                  forward name converted into a server-relative URI reference.
              </abstract>
      
              <signature>
                  LinkTool setForward(String forward)
              </signature>
              
              <parameters>
                  <parameter name="forward">
                      The name of a global forward as defined in struts-config.xml.
                  </parameter>
              </parameters>
      
              <returns>
                  A new instance of <code>LinkTool</code> or <code>null</code> if the 
                  parameter does not map to a valid forward.
              </returns>
      
              <description>
                  <p>The global forward name is translated into a server-relative 
                  URI reference. This method will overwrite any previously set URI 
                  reference but will copy the query string.</p>
              </description>
  
  <sourcecode>## a forward
  &lt;a href="$link.setForward("start").addQueryData("key1","val 1")"&gt;
  My Link&lt;/a&gt;</sourcecode>
  
  <p>Produces something like:</p>
  
  <sourcecode>&lt;a href="/myapp/templates/index.vm?key=val+1"&gt;My Link&lt;/a&gt;</sourcecode>
  
      
          </method>
      </section>
  
  
      <section name="setAbsolute()">
          <method name="setAbsolute()">
      
              <abstract>
                  Returns a copy of this LinkTool instance with the specified context-relative
                  URI reference converted to a server-relative URI reference.
              </abstract>
      
              <signature>
                  LinkTool setAbsolute(String uri)
              </signature>
              
              <parameters>
                  <parameter name="uri">
                      A context-relative URI reference, i.e. a URI reference that is relative to the URI
                      used to address this web application.
                  </parameter>
              </parameters>
      
              <returns>
                  A new instance of <code>LinkTool</code>.  
              </returns>
      
              <description>
                  <p>The specified context-relative URI reference is converted to a server-relative URI reference.
                  This method will overwrite any previously set URI reference but will copy the query string.</p>
                  
  <sourcecode>## a context-relative hyperlink
  &lt;a href="$link.setAbsolute("templates/index.vm")
  .addQueryData("key1","val 1")"&gt;My Link&lt;/a&gt;</sourcecode>
  
  <p>Produces something like:</p>
  
  <sourcecode>&lt;a href="/myapp/templates/index.vm?key=val+1"&gt;My Link&lt;/a&gt;</sourcecode>
                  
              </description>
      
          </method>
      </section>
  
  
      <section name="addQueryData()">
          <method name="addQueryData()">
      
              <abstract>
                  Adds a key=value pair to the URI reference.
              </abstract>
      
              <signature>
                  LinkTool addQueryData(String key, Object value)
              </signature>
              
              <parameters>
                  <parameter name="key">
                      Key (name) of query parameter.
                  </parameter>
  
                  <parameter name="value">
                      Value of the query parameter. The string representation of this object is 
                      added to the query data.
                  </parameter>
              </parameters>
      
              <returns>
                  A new instance of <code>LinkTool</code>.  
              </returns>
      
              <description>
                  <p>Adds a key=value pair to the query data. This returns a new LinkTool 
                  containing both a copy of this LinkTool's query data and the new data.
                  This makes repeated use in Velocity templates easy. Query data is
                  URL-encoded before it is appended.</p>
                  
                  <p>See <a href="#setURI()">method setURI()</a> for examples.</p>
               </description>
      
          </method>
      </section>
  
  
      <section name="getURI()">
          <method name="getURI()">
      
              <abstract>
                  Returns the current URI reference.
              </abstract>
      
              <signature>
                  LinkTool getURI()
              </signature>
              
              <returns>
                  Returns the current URI reference as set by one of the methods 
                  setURI(), setAction(), setForward() or setAbsolute(). Any conversions 
                  have been applied. The returned URI reference does not included query data that was
                  added with method addQueryData().
              </returns>
      
              <see>
                  Method <a href="#getQueryData()"><code>getQueryData()</code></a> to retrieve
                  query data only. Method <a href="#toString()"><code>toString()</code></a> to 
                  retrieve the URI reference including all query data.
              </see>
              
              <description>
  <sourcecode>#set ($l = $link.setForward("start").addQueryData("key1","val 1"))
  &lt;a href="$l.getURI()"&gt;My Link&lt;/a&gt;</sourcecode>
  
  <p>Produces something like:</p>
  
  <sourcecode>&lt;a href="/myapp/templates/index.vm"&gt;My Link&lt;/a&gt;</sourcecode>
  
              </description>
          </method>
      </section>
  
  
      <section name="getQueryData()">
          <method name="getQueryData()">
      
              <abstract>
                  Returns this instance's query data.
              </abstract>
      
              <signature>
                  String getQueryData()
              </signature>
                  
              <returns>
                  This instance's query data as set by the method 
                  <a href="#setQueryData()"><code>setQueryData()</code></a>. The
                  returned String is URL-encoded, e.g. "key=value&amp;foo=this+is+encoded".
              </returns>
              <description>
  <sourcecode>#set ($l = $link.setForward("start").addQueryData("key1","val 1"))
  $l.getQueryData()</sourcecode>
  
  <p>Produces:</p>
  
  <sourcecode>key1=val+1</sourcecode>
  
              </description>
                  
          </method>
      </section>
  
  
  
      <section name="getContextURI()">
          <method name="getContextURI()">
      
              <abstract>
                  Returns the URI that addresses this web application.
              </abstract>
      
              <signature>
                  String getContextURI()
              </signature>
      
              <returns>
                  Returns the URI reference that addresses this web application, e.g. 
                  "http://myserver.net/myapp". This string does not end with a "/".
              </returns>
      
              <description>
                  <p>Note! This will not represent the URI reference or 
                  query data set for this LinkTool instance.</p>
  
  <sourcecode>$link.getContextURI()</sourcecode>
  
  <p>Produces something like:</p>
  
  <sourcecode>http://myserver.net/myapp</sourcecode>
  
              </description>
      
          </method>
      </section>
  
  
  
      <section name="getContextPath()">
          <method name="getContextPath()">
      
              <abstract>
                  Returns the context path that addresses this web application.
              </abstract>
      
              <signature>
                  String getContextPath()
              </signature>
                  
              <returns>
                  The context path that addresses this web application, e.g. 
                  <code>/myapp"</code>. This string starts with a "/" but does 
                  not end with a "/".
              </returns>
      
              <description>
                  <p> Note! This will not represent the URI reference or query 
                  data set for this LinkTool instance.</p>
  
  <sourcecode>$link.getContextPath()</sourcecode>
  
  <p>Produces something like:</p>
  
  <sourcecode>/myapp</sourcecode>
  
              </description>
      
          </method>
      </section>
  
  
  
      <section name="getBaseRef()">
          <method name="getBaseRef()">
      
              <abstract>
                  Returns the full URI of this template.
              </abstract>
      
              <signature>
                  String getBaseRef()
              </signature>
                  
              <returns>
                  The full URI of this template without any query data.
                  e.g. <code>http://myserver.net/myapp/templates/View.vm</code>.
              </returns>
      
              <description>
                  <p>Note! The returned String will not represent the URI reference or query 
                  data set for this LinkTool instance. A typical application of this method 
                  is with the HTML base tag.</p>
  
  <sourcecode>## a base tag
  &lt;base href="$link.getBaseRef()"&gt;</sourcecode>
  
  <p>Produces something like:</p>
  
  <sourcecode>&lt;base href="http://myserver.net/myapp/templates/index.vm"&gt;</sourcecode>
  
              </description>
      
          </method>
      </section>
  
  
  
  
      <section name="toString()">
          <method name="toString()">
      
              <abstract>
                  Returns the full URI that has been constructed.
              </abstract>
      
              <signature>
                  String toString()
              </signature>
              
              <returns>
                  The full URI that has been built with this tool
                  e.g. <code>/myapp/stuff/View.vm?id=42&amp;type=blue</code>.
              </returns>
      
              <description>
                  <p>Typically it is not necessary to call this method explicitly.
                  Velocity will call the toString() method automatically to 
                  obtain a representable version of objects.</p>
  
  <sourcecode>&lt;a href="$link.setAction("demo").addQueryString("key1", "val 1")"&gt;
  My Link&lt;/a&gt;</sourcecode>
  
  <p>Produces something like:</p>
  
  <sourcecode>&lt;a href="/myapp/demo.do?key1=val+1"&gt;My Link&lt;/a&gt;</sourcecode>
  
              </description>
      
          </method>
      </section>
  
   </body>
  </document>
  
  
  
  
  1.1                  jakarta-velocity-tools/struts/xdocs/tool-MessageTool.xml
  
  Index: tool-MessageTool.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <document>
  
      <properties>
          <title>MessageTool</title>
          <author email="sidler@apache.org">Gabriel Sidler</author>
          <projectfile>xdocs/tools.xml</projectfile>
      </properties>
  
      <body>
  
      <section name="MessageTool Reference Documentation">
  
          <p>
          Struts supports internationalized messages. The message strings are stored
          in NVP files by language. The following methods operate on these message 
          files.
          </p>
          
          <toolinfo version="@@@version@@@, @@@date@@@"
                    jar="velocity-tools-struts-@@@version@@@.jar"
                    clazz="org.apache.velocity.tools.struts.MessageTool"
                    name="$msg"
                    authors="Gabriel Sidler"
          />
  
          <methods/>
  
      </section>
  
      <section name="get()">
          <method name="get()">
      
              <abstract>
                  Looks up and returns the localized message for the specified key.
              </abstract>
      
              <signature>
                  String get(String key)
              </signature>
              
              <signature>
                  String get(String key, Object args[])
              </signature>
              
              <signature>
                  String get(String key, ArrayList args)
              </signature>
  
              <parameters>
                  <parameter name="key">
                      Message key.
                  </parameter>
                  
                  <parameter name="args">
                      Replacement parameters for this message. Typically an array of 
                      Strings or an ArrayList of Strings. 
                  </parameter>
              </parameters>
      
              <returns>
                  The localized message for the specified key. Returns null if no 
                  message exists for the key passed.
              </returns>
      
              <see>
                  Struts user's guide on 
                  <a href="http://jakarta.apache.org/struts/userGuide/building_view.html#i18n">
                  Internationalized Messages</a>.
              </see>
              
              <description>
                  <p>The user's locale is consulted to determine the language of the 
                  message. The second and third signature take a list of up to five
                  replacement parameters. The second signature is provided for compatibility
                  with existing applications. The third signature is Velocity-friendlier.</p>
                  
  <p>Assuming that the message resource files contain the following messages:</p>
  <sourcecode>title=Welcome to Velocity for Struts
  test=This message has five replacement parameters: {0}, {1}, {2}, {3}, {4}</sourcecode>
  
  <p>then the following Velocity script:</p>
  <sourcecode>$msg.get("title")
  $msg.title
  $msg.get("test", ["bear", "wolf", "tiger"])</sourcecode>
  
  <p>produces this output:</p>
  <sourcecode>Welcome to Velocity for Struts
  Welcome to Velocity for Struts
  This message has five replacement parameters: bear, wolf, tiger, {3}, {4}</sourcecode>                    
              </description>
      
          </method>
      </section>
  
      <section name="exists()">
          <method name="exists()">
      
              <abstract>
                  Checks if a message string for a specified message key exists
                  for the user's locale.
              </abstract>
      
              <signature>
                  boolean exists(String key)
              </signature>
              
              <parameters>
                  <parameter name="key">
                      Message key.
                  </parameter>
              </parameters>
      
              <returns>
                  <code>true</code> if a message string for the specified message 
                  key exists for the user's locale. <code>false</code> otherwise.
              </returns>
         
              <description>
  <sourcecode>$msg.exists("title")</sourcecode>
              </description>
  
          </method>
      </section>
  
      <section name="getLocale()">
          <method name="getLocale()">
      
              <abstract>
                  Returns the user's locale. If a locale is not found, the default 
                  locale is returned.
              </abstract>
      
              <signature>
                  Locale getLocale()
              </signature>
              
              <returns>
                  An instance of class <code>java.util.Locale</code>.
              </returns>
         
              <description>
  <sourcecode>$msg.getLocale()
  $msg.locale
  $msg.getLocale().getDisplayLanguage()</sourcecode>
  
  <p>produces:</p>
  <sourcecode>en
  en
  English</sourcecode>
  
  <p>The returned object of class <code>Locale</code> is automatically rendered by Velocity by
  calling its <code>toString()</code> method. The third example calls method 
  <code>getDisplayLanguage()</code> of class <code>Locale</code></p>
  
              </description>
  
          </method>
      </section>
  
  
   </body>
  </document>
  
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>