This page gives overview of the features of the Jakarta Struts framework.

MVC Components 
         • Application data
         • Translates Model into readable form
         • Processes user input
         • Initiates change in state of Model
         • In web design also responsible for flow control

Struts is a web application framework for developing servlet/JSP based applications.  It concentrates on the web tier and, aside from providing a simple JDBC connection pool, does not attempt to address persistence requirements.

It does, however, suggest and encourage the use of a domain object model and business logic beans.  To this end, its tag libraries include a number of tags for working with JavaBeans.

!!!Request dispatching
Struts provides a single controller servlet that dispatches requests to {{Action}} objects according to the configuration defined in the {{struts-config.xml}} file.

!!!Form processing
HTML forms are defined in JSPs using the Struts {{<html:form>}} tag and a comprehensive set of sub-tags, mirroring the regular HTML form tags.

An {{[ActionForm|]}} subclass can be written as a JavaBean to encapsulate the form data.  The {{ActionForm}} should provide a getter and setter for each form field, named after the field's property name.

On submission of a form, each form field value is copied to the corresponding attribute of the {{ActionForm}} bean.

When composing the response, each form field is initialised with the value of the corresponding attribute from the {{ActionForm}} bean.

{{ActionForm}} subclasses can optionally implement a {{validate()}} method to perform simple validation (check for mandatory fields, etc.) on the form data before control is transferred to the {{Action}} object.  If any validation errors are returned by this method, request processing stops and the response is generated using the input page.  Error messages can be included in the response using the Struts {{<html:errors>}} tag.

!!!Request handling
{{Action}} objects are subclasses of the Struts {{[Action|]}} class and should override the {{perform()}} method to handle the request.

If the {{Action}} is configured to use an HTML form, the populated {{ActionForm}} is passed to this method.

{{Action}} objects would normally delegate processing to business logic beans and can add errors to the request for output by the {{<html:errors>}} tag in a similar manner to the {{ActionForm}}.

{{Action}} object are also responsible for determining the page to be output following processing of the request.  They do this by returning an {{[ActionForward|]}} object from their {{perform()}} method.  The {{ActionForward}} object is created by specifying a symbolic name that is mapped to a JSP in the {{struts-config.xml}} file.  The symbolic name may be local to the action, or global to the application.

!!!Output composition
Struts uses JSPs to compose the response and provides several tag libraries to assist in the process.

!!Tag libraries
In addition to the {{[html|]}} tag library discussed above, Struts also includes {{[logic|]}} and {{[bean|]}} tag libraries.

!logic taglib
The {{logic}} tag library provides a number of tags for conditional processing (testing for equality, less than, greater than, etc.) and for iterating over a collection.

!bean taglib
The {{bean}} tag library provides tags for creating new beans based on other elements and outputing bean properties to the response.

Struts also supports the use of template-based JSPs.  A template JSP can be created to define a standard layout for a page.  Placeholders can be inserted in the template using the {{<template:get>}} tag from the Struts {{[template|]}} tag library.  JSPs can then be written based on the template using the {{<template:insert>}} tag to specify the template name and the {{<template:put>}} tag to supply values for the placeholders in the template.

Struts works very well with [Tiles|] making template building easy.\\

Struts supports [i18n|Abbreviations] using standard Java resource bundles.  Values from a resource bundle can be output to a page using the {{<bean:message>}} tag which takes the name of a resource bundle key as an attribute.

Resource bundle keys are also used when creating errors for the {{<html:errors>}} tag to support internationalised messages.

!!!Further reading
For further details, see the [Struts Home Page|]
\\To learn more about struts take a look at StrutsHowto.