<!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 - Generation?</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="Generation?"><strong>Generation?</strong></a>
        </font>
      </td></tr>
      <tr><td>
        <blockquote>
                                    <p>
JSP touts as an advantage that it takes an existing .jsp page and
compiles that into a Servlet for speed and efficiency reasons. What this
means is that it first parses the .jsp page into the resulting mess
below and then it uses javac or your favorite Java compiler (ie: Jikes)
to compile that Servlet into a .class file which is then loaded by the
Servlet Engine. Wow, just explaining all of that gave me a headache, how
about you?
</p>
                                                <p>
The point being that using JSP is now a multi step process. The authors
of JSP have done a good job of hiding this process stuff behind the
scenes in such a way that you do not even notice it. One simply edits
the .jsp page in their favorite editor and then uses their browser to
call the page via a URI which starts the process of transforming it into
a .class file.
</p>
                                                <p>
There are some fundamental issues that are being dealt with in the
generated .jsp template. The first one is the class name. What happens
is that the engine needs to produce a name that is unique in order to
work around class loader issues that might crop up. Therefore, each and
every time one modifies a .jsp page, a new file is created on disk in
the temporary directory. Unfortunately, this directory ends up growing in
size until someone decides to clean it up. The engine could probably do
this for you, except then it might make the mistake of actually removing
the wrong file.
</p>
                                                <p>
The point being that this whole process of
edit-&gt;transform-&gt;compile-&gt;load-&gt;run is really unnecessary and in
particular, a bad design. On the other hand, Velocity will simply load
templates, parse them a single time and then store an Abstract Syntax
Tree (AST) representation of the template in memory which can then be
re-used over and over again. The process is simply edit-&gt;parse-&gt;run. The
benefit is that working with Velocity templates ends up being much
faster and it also removes the requirement of having a javac compiler
and temporary scratch directory hanging around. In Velocity, when the
template changes, the existing cached template is simply replaced with a
freshly parsed version.
</p>
                                                <p>
Another advantage to Velocity's approach for templates is that the
actual template data can be stored anywhere, including a database or
remote URI. By using configurable template loaders, it is possible to
create template loaders that can do anything that you want.
</p>
                                                <p>
Even without Turbine, Velocity offers several ways to deal with errors.
Where frameworks such as Struts and Turbine come handy is by providing
ways of properly dealing with errors. However, due to the fact that
Struts is based on top of JSP, it also inherits the same amount of
problems associated with JSP. The next chapter will go into more details
on that.
</p>
                                                <p>
One final problem in the design shown below is that the JSP page only
catches <code>Exception</code>'s. What if the code within a JSP page
throws another exception like <code>OutOfMemoryError</code>? The problem
here is that OOME is based on <code>Throwable</code>, not
<code>Exception</code>. Therefore, it is much more difficult to catch
this exception with just a JSP page. Future versions of the JSP spec and
implementations will improve on this.
</p>
                                                <p>
This nice <a href="./images/jsp-nasa-crash.gif" target="newWindow">example</a> provided by our friends at NASA, which
sends multi-billion dollar equipment through the heavens, is a perfect
example of why JSP needs better error handling.
</p>
                                                <p>
Buffering is also another big issue as constantly writing to the output
stream is not very efficient.
</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 buffer=&quot;12kb&quot; %&gt;
&lt;%@ page autoFlush=&quot;true&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>
These are examples of telling JSP to buffer the output 12kb and to
autoFlush the page. Struts+JSP has implemented the MVC model by
providing the View portion through JSP templates. What part of the MVC
model do you think that those tags belong? You guessed it, not the part
where they are being used.
</p>
                                                <p>
Velocity's approach to dealing with this issue is by allowing the
developer to pass a stream into the rendering engine. If there is an
exception thrown, during rendering, then the exception can be caught and
dealt with. Buffering is also handled by passing properly buffered
stream to the parser. Again, if there is an error, then another stream
can be easily substituted for the output.
</p>
                                                <p>
Here is an example of the intermediate code generated by Tomcat 3.3m2:
</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>
package jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class helloworld_1 extends org.apache.jasper.runtime.HttpJspBase {

    static {
    }
    public helloworld_1( ) {
    }

    private static boolean _jspx_inited = false;

    public final void _jspx_init() throws org.apache.jasper.JasperException {
    }

    public void _jspService(HttpServletRequest request, HttpServletResponse  response)
        throws java.io.IOException, ServletException {

        JspFactory _jspxFactory = null;
        PageContext pageContext = null;
        HttpSession session = null;
        ServletContext application = null;
        ServletConfig config = null;
        JspWriter out = null;
        Object page = this;
        String  _value = null;
        try {

            if (_jspx_inited == false) {
                _jspx_init();
                _jspx_inited = true;
            }
            _jspxFactory = JspFactory.getDefaultFactory();
            response.setContentType(&quot;text/html;charset=8859_1&quot;);
            pageContext = _jspxFactory.getPageContext(this, request, response,
			&quot;&quot;, true, 8192, true);

            application = pageContext.getServletContext();
            config = pageContext.getServletConfig();
            session = pageContext.getSession();
            out = pageContext.getOut();

            out.write(&quot;&lt;html&gt;\r\n&lt;head&gt;&lt;title&gt;Hello&lt;/title&gt;&lt;/head&gt;\r\n&lt;body&gt;\r\n&lt;h1&gt;\r\n&quot;);
            if (request.getParameter(&quot;name&quot;) == null) 
              out.write(&quot;\r\n          Hello World\r\n&quot;);
            else 
              out.write(&quot;\r\n          Hello, &quot;);
            request.getParameter(&quot;name&quot;); 
              out.write(&quot;\r\n&lt;/h1&gt;\r\n&lt;/body&gt;&lt;/html&gt;\r\n&quot;);

        } catch (Exception ex) {
            if (out != null &amp;&amp; out.getBufferSize() != 0)
                out.clearBuffer();
            if (pageContext != null) pageContext.handlePageException(ex);
        } finally {
            if (out instanceof org.apache.jasper.runtime.JspWriterImpl) { 
                ((org.apache.jasper.runtime.JspWriterImpl)out).flushBuffer();
            }
            if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
        }
    }
}
</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>
You make the decision.
</p>
                                                <p>
<strong>[ <a href="ymtd-saying-hello.html">Saying Hello</a> &lt;- Previous | 
    Next -&gt; <a href="./ymtd-error-handling.html">Error Handling</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 -->




















