====
     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.
====


TemplateServlet examples

[ /readme.txt ]
This readme file. For clarity sake, it does not contain a welcome file and
therefore the servlet container should list all files and subdirectories listed
below.

[ /3.times.HelloWorld.html ]
Prints three times "Hello World!" and the session id.

[ /javasystemproperties.htm ]
Lists Java runtime system properties.
