<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you 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.
-->
<html>
<head>
  <title>FreeMarker Example Web Application 2 - Help</title>
  <meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1">
</head>
<body>

<h1>FreeMarker Example Web Application 2</h1>

<p>To try this example you should visit
<a href="index.a"><code>http://<i>yourServer</i>/<i>thisWebApp</i>/index.a</code></a>

<p><b>Note:</b> To simplify the example, the guest-book entries are not stored
persistently. If you reload the servlet all guest-book entry will lose.


<h2>What's this example about?</h2>

<p>This is a very primitive controller servlet class (was written based on FreeMarker Example Web Application 1)
and a simple guest-book appliction that uses the conroller servlet class. This whole stuff is a very
primitive thing. It is only to get you started if you plan to develop some custom "framework" for your
Web applications, rather than using an already written framework.
Note that a Web application framework can use very different approach than this
example.


<h2>How this example works?</h2>

<p>This example uses a primitive controller servlet, <code>example.ControllerServlet</code>.
To add application specific behavior, you should extend this servlet
with an application specific subclass, that adds the so-called action
methods. Here we implement a primitive guest book application by
extending <code>ControllerServlet</code> with <code>GuestbookServlet</code>, that adds 3
action methods:
<ul>
  <li><code>indexAction</code>: Shows the whole guest-book.
  <li><code>formAction</code>: Show the from where you enter a guest-book entry.
  <li><code>addAction</code>: Adds a new guest-book entry.
</ul>

<p>The <code>ControllerServlet</code> calls the action methods when it receives client requests.
It deduces the name of the action methods to call
from the request URL. The servlet will be invoked only if the request URL is
ending with ".a", as you can see in the <code>WEB-INF/web.xml</code>, otherwise a static file
(for example this html file, or an image file) will be returned as is.
To deduce the method name, the servlet removes the <code>.a</code> and the Web-application directory
from the request URL, and then appends <code>"Action"</code>. Thus, if you type
<code>http://<i>yourServler</i>/<i>thisWebApp</i>/foo.a</code>, then it will try to
call the <code>fooAction</code> method.

<p>Each action method gets two parameters: the <code>HttpServletRequest</code>, and
the <code>Page</code> object. The <code>Page</code> object plays the role of
<code>HttpServletResponse</code>, but instead of calling low lever methods,
you add objects to the data model with <code>put(<i>name</i>, <i>value</i>)</code>, and
choose the template (the view) with <code>setTemplate(<i>templateName</i>)</code>; the
tedious dirty work is done by <code>ControllerServlet</code>.

<p>The templates are stored in the <code>WEB-INF/templates</code> directory.

<p>For more details read the source code.

<hr>
<p><a href="index.a">Back to the index page</a>
  
</body>
</html>