##### Struts 1

- Welcome
- Learning
- Roadmap
- Releases

##### Documentation

- User Guide
- FAQs and HOWTOs
- Release Notes
- Javadoc
- DTDDoc

##### Support

- User Mailing List
- Issue Tracker (JIRA)
- Wiki Pages

##### Components

- Struts Apps
- Struts EL
- Struts Extras
- Struts Faces
- Struts Scripting
- Struts Taglib
- Struts Tiles

##### Project Documentation

- Project Information
- Project Reports

## Welcome to Struts 1

Struts is a flexible control layer based on standard technologies like Java Servlets, JavaBeans, ResourceBundles, and XML, as well as various Apache Commons packages, like BeanUtils and Chain of Responsibility. The framework helps you create an extensible development environment for your application, based on published standards and proven design patterns.

### Struts in a Nutshell

The framework provides its own web Controller component and integrates with other technologies to provide the Model and the View. For the Model, the framework can interact with standard data access technologies, like JDBC and EJB, as well as most any third-party packages, like Hibernate,iBATIS, or Object Relational Bridge. For the View, the framework works well with JavaServer Pages, including JSTL and JSF, as well as Velocity Templates,XSLT, and other presentation systems.

The framework's Controller acts as a bridge between the application's Model and the web View. When a request is received, the Controller invokes an Action class. The Action class consults with the Model (or, preferably, a Facade representing your Model) to examine or update the application's state. The framework provides an ActionForm class to help transfer data between Model and View.

Most often, the Model is represented as a set of JavaBeans. Typically, developers will use the Commons BeanUtils to transfer data between ActionForms and the Model objects (or a Facade). Preferably, the Model will do the "heavy lifting", and the Action will act as a "traffic cop" or adapter.

### Struts Config in a Nutshell

A web application uses a deployment descriptor to initialize resources like servlets and taglibs. The deployment descriptor is formatted as a XML document and named "web.xml". Likewise, the framework uses a configuration file to initialize its own resources. These resources include ActionForms to collect input from users, ActionMappings to direct input to server-side Actions, and ActionForwards to select output pages.

Here's a simple configuration (struts-config.xml) for a login workflow:

        <?xml version="1.0" encoding="ISO-8859-1" ?>
        <!DOCTYPE struts-config PUBLIC
              "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
              "http://struts.apache.org/dtds/struts-config_1_3.dtd">
        <struts-config>
            <form-beans>
                <form-bean
                    name="logonForm"
                    type="app.LogonForm"/>
            </form-beans>
            <action-mappings>
                <action
                    path="/Welcome"
                    forward="/pages/Welcome.jsp"/>
                <action
                    path="/Logon"
                    forward="/pages/Logon.jsp"/>
                <action
                    path="/LogonSubmit"
                    type="app.LogonAction"
                    name="logonForm"
                    scope="request"
                    validate="true"
                    input="/pages/Logon.jsp">
                    <forward
                        name="success"
                        path="/pages/Welcome.jsp"/>
                    <forward
                        name="failure"
                        path="/pages/Logon.jsp"/>
                </action>
                <action
                    path="/Logoff"
                    type="app.LogoffAction">
                    <forward
                        name="success"
                        path="/pages/Logoff.jsp"/>
                </action>
            </action-mappings>
            <message-resources parameter="resources.application"/>
        </struts-config>

There are several other resources you can specify in the framework's configuration file. You can specify validations for the ActionForms in an XML descriptor, using the Struts Validator. A standard extension, Tiles, helps you build pages from smaller fragments.

Struts is extensible. Every class deployed by the framework can be replaced by your own default class. The properties of your default class can be set using the Digester's `set-property` feature. This is one reason why there are so many contributor extensions. We provide the base framework, but you can still write your application your way.

For more about the framework and its underlying technologies, see the User Guide.

### Is Struts the best choice for every project?

No. If you need to write a very simple application, with a handful of pages, then you might consider a "Model 1" solution that uses only server pages.

But, if you are writing a more complicated application, with dozens of pages, that need to be maintained over time, then Struts can help. For more about whether Model 1 or MVC/Model 2 is right for you, see Understanding JavaServer Pages Model 2 architecture.

##

Next: Learning about Struts