| <!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->transform->compile->load->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->parse->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> |
| <%@ page buffer="12kb" %> |
| <%@ page autoFlush="true" %> |
| </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("text/html;charset=8859_1"); |
| pageContext = _jspxFactory.getPageContext(this, request, response, |
| "", true, 8192, true); |
| |
| application = pageContext.getServletContext(); |
| config = pageContext.getServletConfig(); |
| session = pageContext.getSession(); |
| out = pageContext.getOut(); |
| |
| out.write("<html>\r\n<head><title>Hello</title></head>\r\n<body>\r\n<h1>\r\n"); |
| if (request.getParameter("name") == null) |
| out.write("\r\n Hello World\r\n"); |
| else |
| out.write("\r\n Hello, "); |
| request.getParameter("name"); |
| out.write("\r\n</h1>\r\n</body></html>\r\n"); |
| |
| } catch (Exception ex) { |
| if (out != null && 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> <- Previous | |
| Next -> <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 © 1999-2004, The Apache Software Foundation |
| </em></font></div> |
| </td></tr> |
| </table> |
| </body> |
| </html> |
| <!-- end the processing --> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |