blob: a13428cd62f19583bec824a6fc5f5024435b581c [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright 1999-2004 The Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- Content Stylesheet for Site -->
<!-- start the processing -->
<!-- ====================================================================== -->
<!-- GENERATED FILE, DO NOT EDIT, EDIT THE XML FILE IN xdocs INSTEAD! -->
<!-- Main Page Section -->
<!-- ====================================================================== -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<meta name="author" value="Jon S. Stevens">
<meta name="email" value="jon@latchkey.com">
<title>Velocity - You make the decision - Taglibs</title>
</head>
<body bgcolor="#ffffff" text="#000000" link="#525D76">
<table border="0" width="100%" cellspacing="0">
<!-- TOP IMAGE -->
<tr>
<td align="left">
<a href="http://jakarta.apache.org"><img src="http://jakarta.apache.org/images/jakarta-logo.gif" border="0"/></a>
</td>
<td align="right">
<a href="http://jakarta.apache.org/velocity/"><img src="../images/logo.gif" alt="Velocity" border="0"/></a>
</td>
</tr>
</table>
<table border="0" width="100%" cellspacing="4">
<tr><td colspan="2">
<hr noshade="" size="1"/>
</td></tr>
<tr>
<!-- LEFT SIDE NAVIGATION -->
<td width="20%" valign="top" nowrap="true">
<!-- ============================================================ -->
<p><strong>About</strong></p>
<ul>
<li> <a href="../index.html">Overview</a>
</li>
<li> <a href="../getting-started.html">Getting Started</a>
</li>
<li> <a href="http://jakarta.apache.org/builds/jakarta-velocity/">Download</a>
</li>
<li> <a href="../install.html">Install</a>
</li>
<li> <a href="../design.html">Design</a>
</li>
<li> <a href="../contributors.html">Contributors</a>
</li>
<li> <a href="../changes.html">ChangeLog</a>
</li>
<li> <a href="../code-standards.html">Coding Standards</a>
</li>
<li> <a href="../license.html">License</a>
</li>
<li> <a href="../todo.html">TODO</a>
</li>
<li> <a href="http://issues.apache.org/bugzilla/enter_bug.cgi?product=Velocity">Report Issues</a>
</li>
</ul>
<p><strong>Community</strong></p>
<ul>
<li> <a href="../powered.html">Powered By Velocity</a>
</li>
<li> <a href="http://jakarta.apache.org/site/getinvolved.html">Get Involved</a>
</li>
<li> <a href="http://jakarta.apache.org/site/mail.html">Mailing Lists</a>
</li>
<li> <a href="http://jakarta.apache.org/site/cvsindex.html">CVS Repositories</a>
</li>
</ul>
<p><strong>Docs</strong></p>
<ul>
<li> <a href="../user-guide.html">User's Guide (English)</a>
</li>
<li> <a href="../user-guide_fi.html">User's Guide (Finnish)</a>
</li>
<li> <a href="../user-guide_fr.html">User's Guide (French)</a>
</li>
<li> <a href="../user-guide_es.html">User's Guide (Spanish)</a>
</li>
<li> <a href="../developer-guide.html">Developer's Guide</a>
</li>
<li> <a href="../vtl-reference-guide.html">VTL Reference Guide</a>
</li>
<li> <a href="../specification.html">Specification</a>
</li>
<li> <a href="../api/index.html">Javadoc</a>
</li>
</ul>
<p><strong>Tools</strong></p>
<ul>
<li> <a href="../tools/index.html">Velocity Tools</a>
</li>
<li> <a href="../anakia.html">Anakia : XML->doc tool</a>
</li>
<li> <a href="../texen.html">Texen : text generation</a>
</li>
<li> <a href="../dvsl/index.html">DVSL : XML xformation</a>
</li>
<li> <a href="../veltag.html">Veltag : JSP taglib</a>
</li>
<li> <a href="../migration.html">Migration to Velocity</a>
</li>
<li> <a href="../devtools.html">Editors and IDEs</a>
</li>
</ul>
<p><strong>Comparisons</strong></p>
<ul>
<li> <a href="../ymtd/ymtd.html">YMTD</a>
</li>
<li> <a href="../differences.html">VM/WM Differences</a>
</li>
<li> <a href="../casestudy1.html">JSP vs. Velocity</a>
</li>
<li> <a href="../casestudy2.html">XMLC vs. Velocity</a>
</li>
</ul>
<p><strong>Site Translations</strong></p>
<ul>
<li> <a href="http://jakarta.apache.org/velocity/">English</a>
</li>
<li> <a href="http://www.ingrid.org/jajakarta/velocity/velocity-1.2-rc2/docs-ja/index.html">Japanese</a>
</li>
</ul>
</td>
<td width="80%" align="left" valign="top">
<table border="0" cellspacing="0" cellpadding="2" width="100%">
<tr><td bgcolor="#525D76">
<font color="#ffffff" face="arial,helvetica,sanserif">
<a name="Taglibs"><strong>Taglibs</strong></a>
</font>
</td></tr>
<tr><td>
<blockquote>
<p>
Taglibs are intended to be the savior for JSP. They are billed as the
way to allow one to extend JSP so that there is a nice MVC abstraction
while still adding functionality to the base "language". This is where
Struts has concentrated a good portion of its efforts by providing a
nice taglib library for people to use.
</p>
<p>
The advantage of using taglibs is that they allow you to extend the
"language" syntax of JSP to provide the things that are missing from it,
but are available in Java. In other words, instead of encouraging people
to embed Java code within their pages, this has been now abstracted to
encouraging people to embed XML tags in their page. How is this any
better than what ColdFusion did with their product? JSP is on the
cutting edge of re-inventing the broken wheel. Yea!
</p>
<p>
This is an example that shows how logic would be embedded into your JSP
page. It is borrowed directly from the Struts documentation.
</p>
<div align="left">
<table cellspacing="4" cellpadding="0" border="0">
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#ffffff"><pre>
&lt;%@ page language=&quot;java&quot; %&gt;
&lt;%@ taglib uri=&quot;/WEB-INF/struts-logic.tld&quot; prefix=&quot;logic&quot; %&gt;
&lt;!-- Is the number guess right? --&gt;
&lt;logic:equal parameter=&quot;number&quot; value=&quot;7&quot;&gt;
You guessed right! You win a high speed blender!
&lt;/logic:equal&gt;
&lt;!-- If the number guessed was wrong --&gt;
&lt;logic:notEqual parameter=&quot;number&quot; value=&quot;7&quot;&gt;
&lt;!-- Less Than --&gt;
&lt;logic:lessThan parameter=&quot;number&quot; value=&quot;7&quot;&gt;
A little higher...
&lt;/logic:lessThan&gt;
&lt;!-- Greater Than --&gt;
&lt;logic:greaterThan parameter=&quot;number&quot; value=&quot;7&quot;&gt;
A little lower...
&lt;/logic:greaterThan&gt;
&lt;/logic:notEqual&gt;
</pre></td>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
</table>
</div>
<p>
The same example using Velocity would be written like this:
</p>
<div align="left">
<table cellspacing="4" cellpadding="0" border="0">
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#ffffff"><pre>
&lt;!-- Is the number guess right? --&gt;
#if ( $number == 7 )
You guessed right! You win a high speed blender!
#end
&lt;!-- If the number guessed was wrong --&gt;
#if ( $number != 7 )
&lt;!-- Less Than --&gt;
#if ( $number &lt; 7 )
A little higher...
&lt;!-- Greater Than --&gt;
#elseif ( $number &gt; 7 )
A little lower...
#end
#end
</pre></td>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
</table>
</div>
<p>
Of course this could be written even cleaner as:
</p>
<div align="left">
<table cellspacing="4" cellpadding="0" border="0">
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#ffffff"><pre>
#if($number == 7)
You guessed right! You win a high speed blender!
#elseif( $number &lt; 7 )
lower
#else
higher
#end
</pre></td>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
</table>
</div>
<p>
This really falls into a preferences situation. In other words, which
syntax would someone prefer to use? It seems as though the amount of
typing required to implement the taglibs approach would be a major
deciding factor for many people. One reason is that the more typing that
needs to be done, the more chances for errors. Lets continue with
another example taken from the Struts documentation:
</p>
<div align="left">
<table cellspacing="4" cellpadding="0" border="0">
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#ffffff"><pre>
&lt;%@ page language=&quot;java&quot; %&gt;
&lt;%@ taglib uri=&quot;/WEB-INF/struts-bean.tld&quot; prefix=&quot;bean&quot; %&gt;
&lt;%@ taglib uri=&quot;/WEB-INF/struts-logic.tld&quot; prefix=&quot;logic&quot; %&gt;
&lt;%
java.util.ArrayList list = new java.util.ArrayList();
list.add(&quot;First&quot;);
list.add(&quot;Second&quot;);
list.add(&quot;Third&quot;);
list.add(&quot;Fourth&quot;);
list.add(&quot;Fifth&quot;);
pageContext.setAttribute(&quot;list&quot;, list, PageContext.PAGE_SCOPE);
%&gt;
&lt;logic:iterate id=&quot;myCollectionElement&quot; name=&quot;list&quot;&gt;
Element Value: &lt;bean:write name=&quot;myCollectionElement&quot; /&gt;&lt;br /&gt;
&lt;/logic:iterate&gt;
</pre></td>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
</table>
</div>
<p>
It is clear from the Struts example above that the whole strict MVC
model has been broken again because a call to
<code>java.util.ArrayList</code> and creating an Object is embedding
Java code within a template. Compound that with the idea that one needs
to place that <code>ArrayList</code> into the <code>pageContext</code>
is even more confusing. Not only that but the designer has to remember
to use a bunch of cryptic code at the top of the file that makes
references to some taglib document as well as declare a prefix
attribute. Why do things need to be so overly complicated?
</p>
<p>
The same example using Velocity would be written like this:
</p>
<div align="left">
<table cellspacing="4" cellpadding="0" border="0">
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#ffffff"><pre>
#set ( $list = [&quot;First&quot;, &quot;Second&quot;, &quot;Third&quot;, &quot;Fourth&quot;, &quot;Fifth&quot;] )
#foreach ( $item in $list )
Element Value: $item&lt;br /&gt;
#end
</pre></td>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
</table>
</div>
<p>
Moving on with examples, we come back to the previous <a href="./ymtd-sampleapp.html">sample application</a> provided in Jason
Hunter's book that was shown before. This time it has been implemented
entirely within the Struts framework.
</p>
<div align="left">
<table cellspacing="4" cellpadding="0" border="0">
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#ffffff"><pre>
&lt;%-- toolview-tag.jsp --%&gt;
&lt;%@ taglib uri=&quot;/WEB-INF/struts.tld&quot; prefix=&quot;struts&quot; %&gt;
&lt;%
String title = &quot;Tool Listing&quot;;
String deck = &quot;A list of content creation tools&quot;;
String desc = &quot;Without tools, people are nothing more than animals.&quot;;
%&gt;
&lt;%@ include file=&quot;/header.jsp&quot; %&gt;
&lt;%@ page session=&quot;false&quot; %&gt;
&lt;%@ page errorPage=&quot;/errorTaker.jsp&quot; %&gt;
&lt;%-- Fetch the tools array as a request attribute --%&gt;
&lt;jsp:useBean id=&quot;tools&quot; class=&quot;Tool[]&quot; scope=&quot;request&quot;/&gt;
&lt;struts:iterate id=&quot;tool&quot; collection=&quot;&lt;%= tools %&gt;&quot;&gt;
&lt;HR SIZE=2 ALIGN=LEFT&gt;
&lt;H3&gt;
&lt;%-- Automatically HTML-escapes values --%&gt;
&lt;struts:property name=&quot;tool&quot; property=&quot;name&quot; /&gt;
&lt;% if (((Tool)tool).isNewWithin(45)) { %&gt;
&lt;FONT COLOR=#FF0000&gt;&lt;B&gt; (New!) &lt;/B&gt;&lt;/FONT&gt;
&lt;% } else if (((Tool)tool).isUpdatedWithin(45)) { %&gt;
&lt;FONT COLOR=#FF0000&gt;&lt;B&gt; (Updated!) &lt;/B&gt;&lt;/FONT&gt;
&lt;% } %&gt;
&lt;/H3&gt;
&lt;A HREF=&quot;&lt;struts:property name=&quot;tool&quot; property=&quot;homeURL&quot;/&gt;&quot;&gt;
&lt;struts:property name=&quot;tool&quot; property=&quot;homeURL&quot;/&gt;&lt;/A&gt;&lt;BR&gt;
&lt;%-- Assume don't want HTML in comments --%&gt;
&lt;struts:property name=&quot;tool&quot; property=&quot;comments&quot; /&gt;
&lt;/struts:iterate&gt;
&lt;%@ include file=&quot;/footer.jsp&quot; %&gt;
</pre></td>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
</table>
</div>
<p>
At this point, we now have a combination of standard JSP tags as well as
Struts specific tags. The use of Struts has appeared to clean things up
significantly with regards to embedded scriptlets. Note that quite a
few of JSP's warts are still shining through. Is it as easy to grok
as the Velocity version?
</p>
<p>
Velocity comes in with a simpler soluton that is designed around the
idea of a few core template tags. A scripting language is something like
PHP which may require months of usage to completely master. A template
language is something that can be mastered in just a few hours. This is
what differentiates Velocity from being a scripting language vs. a
template language.
</p>
<p>
For example, Velocity has the following core template tags (otherwise
known as "directives"):
</p>
<div align="left">
<table cellspacing="4" cellpadding="0" border="0">
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#ffffff"><pre>
#if
#else
#elseif
#foreach
#set
#parse
#include
</pre></td>
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
</table>
</div>
<p>
It is possible to add more #directives to Velocity either by adding them
directly to the parser or adding them through an API. It is also
possible to use a neat feature of Velocity called Velocimacro's which
are documented <a href="../user-guide.html#velocimacro">here</a>.
</p>
<p>
Some people suggest that the benefit to JSP and Struts is that it simply
extends HTML, which is something that designers already understand. This
is a powerful argument. However, the reality is that HTML is not a
template language. In other words, there is no logic in HTML. For
example, it is not possible to embed conditional statements (like in the
very first example above) into HTML.
</p>
<p>
What this means is that Taglibs allow developers to infinitely extend
HTML to become much much more than it previously was. Almost like
inventing another scripting language. This is reminiscent the early
browser wars where each company was implementing their own browser tags.
Netscape went so far as to invent the &lt;blink&gt; tag. What did we
learn from that? Is that really a good thing? Sure, standardizing
taglibs is a great idea. Will it ever become widely adopted? We sure
hope so.
</p>
<p>
One last point to make about using a HTML syntax is that this really
pigeon holes JSP and Struts into simply being a tool for creating
dynamic HTML/XML/WML (ie: tag markup) code. Velocity on the other hand
is designed to take as input any type of text (Java, SQL, HTML, etc) and
output anything as a result of running it through its processing engine.
</p>
<p>
You make the decision.
</p>
<p>
<strong>[ <a href="ymtd-sampleapp.html">Sample App</a> &lt;- Previous |
Next -&gt; <a href="./ymtd-embedded.html">Embedded Usage</a> ]
</strong></p>
</blockquote>
</p>
</td></tr>
<tr><td><br/></td></tr>
</table>
</td>
</tr>
<!-- FOOTER -->
<tr><td colspan="2">
<hr noshade="" size="1"/>
</td></tr>
<tr><td colspan="2">
<div align="center"><font color="#525D76" size="-1"><em>
Copyright &#169; 1999-2004, The Apache Software Foundation
</em></font></div>
</td></tr>
</table>
</body>
</html>
<!-- end the processing -->