<!--
    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>

<body>
<h2>Camel Servlet and Apache Tomcat without Spring example</h2>

This example shows how to use route messages in Apache Tomcat using servlets with Apache Camel,
without any Spring dependency.
<br/>
<br/>
To get started click <a href="camel/hello">this link</a>.
<br/>
<br/>
This example is documented at
<a href="http://camel.apache.org/servlet-tomcat-no-spring-example.html">servlet tomcat no spring example</a>

<br/>
<br/>
You can find more information about the camel servletlistener component
<a href="https://camel.apache.org/servletlistener-component.html">here</a>

<br/>
If you hit any problems please let us know on the
<a href="http://camel.apache.org/discussion-forums.html">Camel Forums</a>
<br/>
<br/>
Please help us make Apache Camel better - we appreciate any feedback you may
have. Enjoy!
<br/>
<br/>
The Camel riders!
</body>

</html>