<?xml version="1.0"?>
<!--
Copyright 1999-2006 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.
-->
<!--
// ======================================================================== 78
-->
<document>

    <properties>
        <title>Welcome</title>
    </properties>

    <body>

        <a name="Welcome"/>
        <section name="Welcome to Apache Struts!">
            <p>
                The goal of the Apache Struts project is to encourage
                application
                architectures based on the "Model 2" approach, a variation of
                the
                classic Model-View-Controller (MVC) design paradigm.
                Under Model 2,
                a servlet (or equivalent) manages business logic execution,
                and presentation logic resides mainly in server pages.
            </p>

            <p>
                The Apache Struts project encourages Model 2 designs in two
                ways.
                First, by providing open source frameworks and toolkits
                that help developers build applications for the web.
                Second, by providing friendly and honest mailing lists
                where both newcomers and veterans discuss how to use Struts
                software
                in their own Model 2 applications.
            </p>

            <p>
                Originally, the Apache Struts software was distributed
                as one monolithic bundle.
                Today, the Apache Struts project is comprised of two distinct
                frameworks
                and several other subprojects.
                The two frameworks are the
                <strong>Struts Action Framework</strong>
                and
                the
                <strong>Struts Shale Framework</strong>
                .
                Struts Action is the original request-based framework.
                Struts Shale is a component-based framework based on
                JavaServer Faces.
                Both frameworks are first-class citizens of the Apache Struts
                project.
            </p>

            <a name="frameworks"/>
            <subsection name="Why two frameworks?">
                <p>
                    When
                    <a href="http://java.sun.com/j2ee/javaserverfaces/">
                        JavaServer Faces arrived</a>
                    ,
                    our development community chose to "make new friends but
                    keep the old".
                    Some of us want (or need) to stick with the original
                    request-based framework.
                    Others are ready to switch to an component-based framework
                    that builds on JavaServer Faces.
                    We offer both frameworks because we have volunteers to
                    create and maintain both frameworks.
                </p>

                <p>
                    If you are starting a new project, you might want to
                    consider our Shale
                    Framework. Some people feel that JSF and Shale is the
                    quickest way to
                    write new Java web applications. Others, however, prefer
                    the URL
                    mapping style of a request framework. No matter what your
                    preference
                    is, we offer an actively developed framework for you. If
                    you are not
                    sure which to use, go ahead and try them both out.
                </p>

                <p>
                    If you have mature Action Framework applications in
                    production, don't worry,
                    we are still here, same as ever.
                    After all, we have our share of mature application in
                    production too.
                </p>

                <p>
                    For more about how Action and Shale fit together,
                    see our
                    <a href="kickstart.html">KickStart FAQ</a>
                    .
                </p>
            </subsection>

            <a name="subprojects"/>
            <subsection name="Why so many subprojects?">
                <p>
                    To make the Struts Action Framework easier for us to
                    maintain,
                    we've subdivided the original monolithic distribution into
                    several subprojects.
                    Each subproject has its own website, documentation, and
                    release cycle,
                    and may be downloaded separately.
                    The JARs and external dependencies for our extensions to
                    Struts Action are being
                    bundled into a convenient distribution known as the
                    "Struts Action Library".
                </p>
                <p>
                    The subprojects will be distributed as part of the Struts
                    Action 1.3.x release series.
                    The initial 1.3.0 release is still under development.
                    Right now,
                    <a href="http://struts.apache.org/downloads.html">
                        Struts 1.2.8 is the best available release</a>
                    .
                </p>
            </subsection>

            <a name="about"/>
            <subsection name="About Apache Struts">
                <p>
                    Apache Struts is a volunteer project and
                    all support for the framework is provided by unpaid
                    volunteers.
                    This documentation bundle and the mailing lists are the
                    primary ways
                    to learn how to use Struts.
                    The next few pages are devoted to helping you understand
                    what resources are available to you.
                    Since Apache Struts is a volunteer project,
                    and our resources are limited,
                    it is important that we first help you help yourself.
                </p>

                <ul>
                    <li>
                        Struts is a project of the
                        <a href="http://www.apache.org">
                            The Apache Software Foundation</a>
                        .
                    </li>
                    <li>
                        The official Apache Struts home page is at
                        <a href="http://struts.apache.org/">
                            http://struts.apache.org/</a>
                        .
                    </li>
                </ul>
            </subsection>
        </section>

        <section>
            <p class="right">
                <strong>Next:</strong>
                <a href="announce.html">Announcements</a>
            </p>
        </section>

    </body>
</document>
