<?xml version="1.0" encoding="UTF-8"?>
<!--
  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.
-->
<!DOCTYPE document [
  <!ENTITY project SYSTEM "project.xml">
]>
<document url="index.html">

  &project;

  <properties>
    <author email="craigmcc@apache.org">Craig R. McClanahan</author>
    <author email="remm@apache.org">Remy Maucherat</author>
    <author email="yoavs@apache.org">Yoav Shapira</author>
    <title>Documentation Index</title>
  </properties>

<body>

<section name="Introduction">

<p>This is the top-level entry point of the documentation bundle for the
<strong>Apache Tomcat</strong> Servlet/JSP container.  Apache Tomcat version
<version-major-minor/> implements the Servlet 3.1 and JavaServer Pages 2.3
<a href="http://wiki.apache.org/tomcat/Specifications">specifications</a> from the
<a href="http://www.jcp.org">Java Community Process</a>, and includes many
additional features that make it a useful platform for developing and deploying
web applications and web services.</p>

<p>Select one of the links from the navigation menu (to the left) to drill
down to the more detailed documentation that is available.  Each available
manual is described in more detail below.</p>

</section>


<section name="Apache Tomcat User Guide">

<p>The following documents will assist you in downloading and installing
Apache Tomcat, and using many of the Apache Tomcat features.</p>

<ol>
<li><a href="introduction.html"><strong>Introduction</strong></a> - A
    brief, high level, overview of Apache Tomcat.</li>
<li><a href="setup.html"><strong>Setup</strong></a> - How to install and run
    Apache Tomcat on a variety of platforms.</li>
<li><a href="appdev/index.html"><strong>First web application</strong></a>
    - An introduction to the concepts of a <em>web application</em> as defined
    in the Servlet Specification.  Covers basic organization of your web application
    source tree, the structure of a web application archive, and an
    introduction to the web application deployment descriptor
    (<code>/WEB-INF/web.xml</code>).</li>
<li><a href="deployer-howto.html"><strong>Deployer</strong></a> -
    Operating the Apache Tomcat Deployer to deploy, precompile, and validate web
    applications.</li>
<li><a href="manager-howto.html"><strong>Manager</strong></a> -
    Operating the <strong>Manager</strong> web app to deploy, undeploy, and
    redeploy applications while Apache Tomcat is running.</li>
<li><a href="realm-howto.html"><strong>Realms and Access Control</strong></a>
    - Description of how to configure <em>Realms</em> (databases of users,
    passwords, and their associated roles) for use in web applications that
    utilize <em>Container Managed Security</em>.</li>
<li><a href="security-manager-howto.html"><strong>Security Manager</strong></a>
    - Configuring and using a Java Security Manager to
    support fine-grained control over the behavior of your web applications.
    </li>
<li><a href="jndi-resources-howto.html"><strong>JNDI Resources</strong></a>
    - Configuring standard and custom resources in the JNDI naming context
    that is provided to each web application.</li>
<li><a href="jndi-datasource-examples-howto.html">
    <strong>JDBC DataSource</strong></a>
    - Configuring a JNDI DataSoure with a DB connection pool.
    Examples for many popular databases.</li>
<li><a href="class-loader-howto.html"><strong>Classloading</strong></a>
    - Information about class loading in Apache Tomcat, including where to place
    your application classes so that they are visible.</li>
<li><a href="jasper-howto.html"><strong>JSPs</strong></a>
    - Information about Jasper configuration, as well as the JSP compiler
    usage.</li>
<li><a href="ssl-howto.html"><strong>SSL</strong></a> -
    Installing and
    configuring SSL support so that your Apache Tomcat will serve requests using
    the <code>https</code> protocol.</li>
<li><a href="ssi-howto.html"><strong>SSI</strong></a> -
    Using Server Side Includes in Apache Tomcat.</li>
<li><a href="cgi-howto.html"><strong>CGI</strong></a> -
    Using CGIs with Apache Tomcat.</li>
<li><a href="proxy-howto.html"><strong>Proxy Support</strong></a> -
    Configuring Apache Tomcat to run behind a proxy server (or a web server
    functioning as a proxy server).</li>
<li><a href="mbeans-descriptor-howto.html"><strong>MBean Descriptor</strong></a> -
    Configuring MBean descriptors files for custom components.</li>
<li><a href="default-servlet.html"><strong>Default Servlet</strong></a> -
    Configuring the default servlet and customizing directory listings.</li>
<li><a href="cluster-howto.html"><strong>Apache Tomcat Clustering</strong></a> -
    Enable session replication in a Apache Tomcat environment.</li>
<li><a href="balancer-howto.html"><strong>Balancer</strong></a> -
    Configuring, using, and extending the load balancer application.</li>
<li><a href="connectors.html"><strong>Connectors</strong></a> -
    Connectors available in Apache Tomcat, and native web server integration.</li>
<li><a href="monitoring.html"><strong>Monitoring and Management</strong></a> -
    Enabling JMX Remote support, and using tools to monitor and manage Apache Tomcat.</li>
<li><a href="logging.html"><strong>Logging</strong></a> -
    Configuring logging in Apache Tomcat.</li>
<li><a href="apr.html"><strong>Apache Portable Runtime</strong></a> -
    Using APR to provide superior performance, scalability and better
    integration with native server technologies.</li>
<li><a href="virtual-hosting-howto.html"><strong>Virtual Hosting</strong></a> -
    Configuring virtual hosting in Apache Tomcat.</li>
<li><a href="aio.html"><strong>Advanced IO</strong></a> -
    Extensions available over regular, blocking IO.</li>
<li><a href="extras.html"><strong>Additional Components</strong></a> -
    Obtaining additional, optional components.</li>
<li><a href="maven-jars.html"><strong>Using Tomcat libraries with Maven</strong></a> -
    Obtaining Tomcat jars through Maven.</li>
<li><a href="security-howto.html"><strong>Security Considerations</strong></a> -
    Options to consider when securing an Apache Tomcat installation.</li>
<li><a href="windows-service-howto.html"><strong>Windows Service</strong></a> -
    Running Tomcat as a service on Microsoft Windows.</li>
<li><a href="windows-auth-howto.html"><strong>Windows Authentication</strong></a> -
    Configuring Tomcat to use integrated Windows authentication.</li>
<li><a href="jdbc-pool.html"><strong>High Concurrency JDBC Pool</strong></a> -
    Configuring Tomcat to use an alternative JDBC pool.</li>
<li><a href="web-socket-howto.html"><strong>WebSocket support</strong></a> -
    Developing WebSocket applications for Apache Tomcat.</li>
<li><a href="rewrite.html"><strong>URL rewrite</strong></a> -
    Using the regexp based rewrite valve for conditional URL and host rewrite.</li>

</ol>

</section>


<section name="Reference">

<p>The following documents are aimed at <em>System Administrators</em> who
are responsible for installing, configuring, and operating an Apache Tomcat server.
</p>
<ul>
<li><a href="RELEASE-NOTES.txt"><strong>Release notes</strong></a>
    - Known issues in this Apache Tomcat release.
    </li>
<li><a href="config/index.html"><strong>Apache Tomcat Server Configuration Reference</strong></a>
    - Reference manual that documents all available elements and attributes
      that may be placed into the Apache Tomcat <code>conf/server.xml</code> file.
    </li>
<li><a href="http://tomcat.apache.org/connectors-doc/index.html"><strong>JK Documentation</strong></a>
    - Complete documentation and HOWTOs on the JK native webserver connector,
      used to interface Apache Tomcat with servers like Apache HTTPd, IIS
      and others.</li>
<li>Servlet 3.1
    <a href="http://jcp.org/aboutJava/communityprocess/final/jsr340/index.html">
    <strong>Specification</strong></a> and
    <a href="http://docs.oracle.com/javaee/7/api/javax/servlet/package-summary.html">
    <strong>Javadoc</strong></a>
    </li>
<li>JSP 2.3
    <a href="http://jcp.org/aboutJava/communityprocess/mrel/jsr245/index2.html">
    <strong>Specification</strong></a> and
    <a href="http://docs.oracle.com/javaee/7/api/javax/servlet/jsp/package-summary.html">
    <strong>Javadoc</strong></a>
    </li>
<li>EL 3.0
    <a href="http://jcp.org/aboutJava/communityprocess/final/jsr341/index.html">
    <strong>Specification</strong></a> and
    <a href="http://docs.oracle.com/javaee/7/api/javax/el/package-summary.html">
    <strong>Javadoc</strong></a>
    </li>
<li>WebSocket 1.0
    <a href="http://jcp.org/aboutJava/communityprocess/final/jsr356/index.html">
    <strong>Specification</strong></a> and
    <a href="http://docs.oracle.com/javaee/7/api/javax/websocket/package-summary.html">
    <strong>Javadoc</strong></a>
    </li>
</ul>

</section>


<section name="Apache Tomcat Developers">

<p>The following documents are for Java developers who wish to contribute to
the development of the <em>Apache Tomcat</em> project.</p>
<ul>
<li><a href="building.html"><strong>Building from Source</strong></a> -
    Details the steps necessary to download Apache Tomcat source code (and the
    other packages that it depends on), and build a binary distribution from
    those sources.
    </li>
<li><a href="changelog.html"><strong>Changelog</strong></a> - Details the
    changes made to Apache Tomcat.
    </li>
<li><a href="http://wiki.apache.org/tomcat/TomcatVersions"><strong>Status</strong></a> -
    Apache Tomcat development status.
    </li>
<li><a href="developers.html"><strong>Developers</strong></a> - List of active
    Apache Tomcat contributors.
    </li>
<li><a href="funcspecs/index.html"><strong>Functional Specifications</strong></a>
    - Requirements specifications for features of the <em>Catalina</em> servlet
    container portion of Apache Tomcat.</li>
<li><a href="api/index.html"><strong>Javadocs</strong></a>
    - Javadoc API documentation for Apache Tomcat's internals.</li>
<li><a href="architecture/index.html"><strong>Apache Tomcat Architecture</strong></a>
    - Documentation of the Apache Tomcat Server Architecture.</li>
</ul>

</section>


</body>
</document>
