Fact-checked by Grok 2 weeks ago

Apache Struts 1

Apache Struts 1 is a free, open-source framework for that implements the Model-View-Controller (MVC) to facilitate the development of scalable and maintainable enterprise-level web applications. Founded in May 2000 by Craig McClanahan and donated to , it serves as a flexible control layer built on standard technologies including Java Servlets, , ResourceBundles, and XML, enabling developers to create extensible environments based on proven . At its core, Struts 1 separates application logic into three interconnected components: the Model, which handles data and often integrated with technologies like JDBC or Hibernate; the View, responsible for using JavaServer Pages (JSP), JSTL, or templates; and the Controller, which processes user requests via the central ActionServlet and dispatches them to appropriate Action classes for execution. Key features include ActionForm beans for form and transfer between the Model and View, as well as through an XML file (struts-config.xml) that defines mappings for actions, forms, and forwards, promoting reusability and modularity in complex web applications with numerous pages. The emphasizes extensibility, allowing developers to replace core classes or add plugins for enhanced functionality. Struts 1 saw its initial release in June 2001 and evolved through multiple versions, with the final stable release, version 1.3.10, issued in December 2008. By April 2013, the Apache Struts Project officially announced the end-of-life for Struts 1.x, shifting community focus to Struts 2, leaving legacy users without official security updates or bug fixes, though , , and artifacts remain available for purposes. Despite its retirement, Struts 1 influenced modern and continues to power some enterprise systems due to its robust MVC foundation.

Introduction

Overview

Apache Struts 1 is an open-source for developing Java-based web applications, implementing the Model-View-Controller (MVC) architectural pattern to separate business logic, user interface, and control flow. It leverages standard Java technologies such as Servlets for handling HTTP requests and JavaServer Pages (JSP) for dynamic rendering, along with , ResourceBundles, and XML for configuration and internationalization. The framework's core purpose is to promote maintainable code by decoupling concerns in web applications, enabling developers to manage complex user interactions, process form submissions, and integrate with backend systems like databases or enterprise JavaBeans more effectively. Originally created by programmer Craig McClanahan, Struts 1 was donated to in May 2000, marking the start of its development as an open-source project under the Apache Jakarta subproject. It quickly became a for enterprise in the early 2000s, with its first stable release following shortly thereafter. The Apache Struts Project Team announced the end-of-life for Struts 1.x in April 2013, declaring it legacy software with no further official support or updates, though its last version, 1.3.10, was released in December 2008. In its basic workflow, incoming HTTP requests are intercepted by the central ActionServlet controller, which consults the struts-config.xml file to determine the appropriate class for processing the request based on URL mappings. The selected executes the , potentially interacting with the model layer, and then returns an ActionForward object to direct the response to a specific view, such as a JSP page, for rendering the final output to the user. This streamlined process ensures consistent handling of requests while allowing extensibility through custom actions and validators.

Design Goals

Apache Struts 1 was designed primarily to promote the Model-View-Controller (MVC) in web applications, aiming to separate application logic (model) from presentation (view) and control flow (controller) to enhance code maintainability and scalability. By mapping MVC concepts to standard web components like servlets and JSPs, the framework encouraged developers to build modular, testable applications that could handle complex enterprise requirements without tightly coupling to user interfaces. A core objective was seamless integration with the Servlet , leveraging the ActionServlet as the central controller to process HTTP requests and dispatch them efficiently, while extending servlet capabilities without introducing proprietary dependencies. This design ensured portability across any compliant servlet container, such as , aligning with J2EE (now ) best practices for building robust, standards-based web applications. The framework also prioritized a configurable request-handling mechanism through XML-based descriptors like struts-config.xml, which allowed flexible mapping of URLs to actions and resources, evolving from simpler servlet conventions to provide greater customization for diverse deployment scenarios. Struts 1 further emphasized support for both and large-scale by offering reusable components, including custom tag libraries for form handling and validation, which reduced and accelerated cycles. Its extensible enabled with complementary technologies like JDBC for and EJBs for distributed components, fostering reusable patterns suitable for environments. Underpinning these goals was a to community-driven as an project, licensed under the Apache Software License, Version 1.1 to promote open collaboration and widespread adoption.

History

Origins and Development

Apache Struts 1 originated from the efforts of Craig R. McClanahan, who developed the initial framework and donated it to the Apache Software Foundation's in May 2000. This donation marked the formal launch of the Struts project as an open-source initiative under Apache, building on McClanahan's prior involvement in the servlet container project. The framework drew inspiration from the Model-View-Controller (MVC) design pattern, which had proven effective in desktop graphical user interfaces, adapting it to promote in web application development. The primary motivation for creating Struts was to overcome the challenges of early Java web development, particularly the tight coupling between presentation logic in JavaServer Pages (JSP) or servlets and underlying business logic, which made applications difficult to maintain and scale. By implementing a standardized MVC architecture for the web—often referred to as "Model 2"—Struts aimed to provide a reusable structure that facilitated cleaner code organization, reusability, and easier testing of components. McClanahan, as the lead developer, envisioned Struts as a community-driven tool to standardize best practices for servlet- and JSP-based applications, addressing the ad-hoc nature of web development at the time. Key contributors to Struts 1 included McClanahan, who served as the primary architect, along with David Geary, who provided significant code contributions and expertise in patterns. Additional input came from a growing community of developers, including those from organizations like , which integrated and extended Struts in enterprise environments. The development process emphasized iterative improvements, with releases shaped by feedback from the Apache mailing lists and early issue tracking systems, fostering collaborative evolution within the ecosystem. In March 2004, following the formation of its own Project Management Committee (PMC) chaired by McClanahan, graduated to become the independent top-level project, reflecting its maturity and broad adoption. This transition separated it from the broader umbrella, allowing focused governance and continued innovation in response to community needs.

Release Timeline

The project was founded in May 2000, with the production version 1.0 released on June 15, 2001, marking the debut of an open-source MVC framework for web applications, with the core ActionServlet serving as the central controller to handle requests and dispatch to appropriate actions. Key milestones followed to address evolving needs in . Version 1.1, finalized on June 30, 2003, introduced with the Tiles framework, enabling reusable page layouts and layout components directly within applications. This release maintained while adding support for declarative and enhanced form validation options. Version 1.2, released on August 31, 2004, focused on configuration improvements, including multi-module support for larger applications and streamlined deployment descriptors. It also deprecated certain legacy features to encourage modern practices, such as using the new struts-config_1_2.dtd for XML validation. The 1.3 series began with version 1.3.0 in December 2005, emphasizing security enhancements like pluggable request processors and improved input sanitization to mitigate common web vulnerabilities. Subsequent updates in this branch, such as 1.3.5 in 2006, provided bug fixes and minor improvements, including better with JavaServer Faces. The final stable release, 1.3.10, arrived on December 4, 2008, incorporating critical bug fixes and security patches to address known issues in earlier 1.3 versions. Security updates continued sporadically until 2013, primarily through minor releases like 1.3.8 and 1.3.9 in 2007. Deprecation was formally announced on April 5, 2013, declaring Struts 1 end-of-life due to the superior modularity and extensibility of Struts 2, with no further official updates beyond critical fixes post-1.3.10. The project's support lifecycle concluded officially in 2013. Following the official EOL, community initiatives such as the WebLegacy project have emerged to maintain and update Struts 1, releasing versions like 1.3.11 as of 2024.
VersionRelease DateKey Additions
1.0June 15, 2001Basic MVC with ActionServlet
1.1June 30, 2003Tiles integration, exception handling
1.2August 31, 2004Module support, improved configuration
1.3.0December 2005Security enhancements, composable processors
1.3.10December 4, 2008Final fixes, security patches

Architecture

Model-View-Controller Implementation

Apache Struts 1 implements the Model-View-Controller (MVC) architectural pattern to structure web applications, promoting for enhanced maintainability and scalability. In this , the controller layer serves as the central orchestrator, with the ActionServlet functioning as a that intercepts all incoming HTTP requests and delegates processing based on predefined mappings. This centralized approach ensures that remains insulated from presentation details, allowing developers to manage request routing uniformly. The model layer in Struts 1 consists of plain Java objects (POJOs) or Enterprise JavaBeans (EJBs) that encapsulate the application's business logic and data access, remaining entirely decoupled from the web tier. These model components handle core operations such as data validation, persistence, and computation, interacting with underlying resources like databases without direct exposure to HTTP specifics. This decoupling facilitates reuse of business logic across different interfaces and simplifies testing outside the web environment. For the view layer, Struts 1 primarily utilizes (JSP) to render dynamic content, though it supports alternative renderers for flexibility. Views are not directly accessible via URLs; instead, the controller forwards control to them after processing, preventing direct client exposure and enforcing a clean boundary between presentation and logic. This mechanism ensures that views focus solely on formatting data received from the model, often using tag libraries for streamlined output generation. The request flow in Struts 1 follows a straightforward sequence: an incoming request reaches the ActionServlet, which identifies the appropriate handler via mappings and invokes it to process the request, potentially consulting the model for business operations, before forwarding the result to the designated for rendering. This minimizes between components, streamlining development for complex applications. Core components like Actions facilitate this delegation within the controller, as detailed in subsequent sections. By enforcing MVC separation, Struts 1 significantly reduces the risk of "" in multi-tier web applications, enabling modular development where changes in one layer—such as updating a for a new device—do not propagate to others. This pattern's adoption in Struts 1 supports scalable architectures, particularly beneficial for enterprise systems requiring robust request handling and logic isolation.

Core Components

The core components of Apache Struts 1 form the foundational elements for implementing the Model-View-Controller (MVC) pattern in web applications, handling request processing, business logic execution, and response routing. These components are primarily defined within the org.apache.struts.action and org.apache.struts.config packages, enabling developers to build extensible web applications through configuration-driven mechanisms. ActionServlet serves as the central controller servlet in Struts 1, functioning as a that initializes the upon application startup by loading the struts-config.xml file and processing all incoming HTTP requests. It acts as the front controller, intercepting requests mapped to *.do (or a custom extension), delegating to a RequestProcessor for validation, form population, and action invocation, and ensuring thread-safety through its design. This servlet supports configurations by allowing multiple instances via servlet initialization parameters, each handling a distinct application module within a single web archive () file. The class is an abstract adapter that encapsulates the application's , providing the execute() method, which subclasses override to process requests by interacting with the model layer and returning an ActionForward for view selection. Developers subclass Action to implement custom logic, ensuring operations are stateless and thread-safe by avoiding instance variables and delegating to separate business objects or ; the method signature is ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response). Subtypes such as DispatchAction extend this functionality to promote by mapping multiple related operations (e.g., add, edit, delete) to a single class, using request parameters to determine which method to invoke, thus reducing the proliferation of similar action classes. ActionForm represents form data as a JavaBean, facilitating the transfer of input between the view (e.g., HTML forms) and the controller, with properties that mirror form field names for automatic population via Apache Commons BeanUtils. It includes lifecycle hooks such as the reset(ActionMapping mapping, HttpServletRequest request) method to reinitialize form properties (essential for session-scoped forms to clear previous data) and the ActionErrors validate(ActionMapping mapping, HttpServletRequest request) method to perform custom validation, returning an ActionErrors object containing any errors to prevent action execution if invalid. ActionForms can be scoped to request or session, enabling state management across multiple requests in multi-page workflows. ActionMapping and ActionForward are configuration-driven objects that handle request routing and response direction, defined in struts-config.xml to decouple implementation from URLs. An ActionMapping instance corresponds to a specific <action> element, storing attributes like the path (URI pattern, supporting wildcards), type ( class), name (associated ActionForm), and validate flag to control form validation; it is retrieved by the RequestProcessor to instantiate and invoke the appropriate . Complementing this, ActionForward encapsulates forward targets, with properties such as name (logical identifier), path (JSP or resource URI), and redirect (boolean for vs. server-side forwarding), allowing Actions to return a named forward for flexible navigation without hardcoding paths. These objects enable declarative control over application flow, with global forwards available across the application. Struts 1's module support allows multiple independent applications to coexist within a single file, each with its own resources like ActionForms, ActionMappings, and ActionForwards, prefixed by a path (e.g., /module1/ or /module2/) and initialized via separate config parameters in the ActionServlet declaration. This is managed through ModuleConfig instances, providing isolation while sharing the core framework infrastructure, ideal for large-scale deployments with distinct subsystems.

Configuration and Setup

struts-config.xml Structure

The struts-config.xml file serves as the primary for Apache Struts 1 applications, defining the mappings, forms, forwards, and other resources essential for requests and managing application flow. It is conventionally placed in the /WEB-INF/ of the to ensure it is not directly accessible via HTTP, and it is parsed by the framework's ActionServlet during the servlet's initialization phase to load the configuration into memory as for runtime use. The file adheres to XML syntax and is typically validated against a Document Type Definition (DTD) to enforce its schema, with versions like Struts 1.3 utilizing struts-config_1_3.dtd for structure enforcement. The root element is <struts-config>, which encapsulates all configuration directives. Key elements within <struts-config> include <form-beans>, which declares reusable ActionForm subclasses for handling form data; each <form-bean> specifies a unique name attribute for reference and a type attribute pointing to the fully qualified class name. The <action-mappings> element configures URL paths to Action classes, linking them to form beans via the name attribute, setting scope (e.g., request or session), input resources, and validation flags; nested <forward> elements within individual <action> tags define outcome-specific redirects. Additionally, <global-forwards> provides application-wide logical name mappings to resources like JSP pages, using attributes such as name, path, and redirect to specify context-relative paths and HTTP redirect behavior. For internationalization, the <message-resources> element loads property bundles, with a parameter attribute indicating the base name of the resource bundle (e.g., ApplicationResources), enabling key-based message retrieval across locales. Extensions are integrated via the <plug-in> element, which instantiates classes implementing the PlugIn interface to hook into the ActionServlet lifecycle events like initialization and destruction, often used for modules such as Tiles or custom validators; parameters can be passed as nested <set-property> elements. The <global-exceptions> element may also be included to map exception types to handler classes for centralized error management. A basic example of an <action> configuration within <action-mappings> might appear as follows, mapping a login path to an Action class while associating it with a form bean:
xml
<action path="/login" 
        type="com.example.LoginAction" 
        name="loginForm" 
        scope="request" 
        validate="true" 
        input="/login.jsp">
    <forward name="success" path="/welcome.jsp"/>
    <forward name="failure" path="/login.jsp" redirect="true"/>
</action>
This structure wires the Action and ActionForm components declared elsewhere in the file, ensuring request handling follows the defined paths and validations.

Deployment and Integration

Apache Struts 1 requires a (JDK) version 1.4 or later to compile and run applications, with JDK 1.4.2 recommended for compatibility with build tools like . Additionally, it demands a servlet container supporting the Servlet API 2.3 or higher and JSP 1.2 or later, such as 4.0 or subsequent versions, to handle deployment. Deployment involves packaging the application as a file, which includes the core struts.jar placed in the WEB-INF/lib directory. The WEB-INF/web.xml descriptor must configure the ActionServlet with a <servlet-mapping> element, typically mapping requests ending in *.do to the servlet for processing Struts actions. The struts-config.xml file resides in WEB-INF to define action s and other configurations, while JSP files include tag declarations for Struts-specific tags like html and bean. Once assembled, the is deployed by copying it to the servlet container's webapps directory, often requiring a server restart to initialize the application. Early versions of Struts 1 relied on for building applications, using Ant 1.5.4 or later to compile , assemble files, execute tests, and manage deployments through scripted tasks. Starting with Struts 1.2, integration with became available, allowing developers to generate project skeletons via the mvn [archetype](/page/Archetype):create command with a Struts-specific , streamlining dependency management and build processes. Testing 1 applications incorporates for unit tests on classes, extended by tools like StrutsTestCase, which simulates the Struts environment using mock objects to verify logic without a full servlet . This approach enables isolated testing of form handling and validation, often integrated into or build scripts for automated execution. Common pitfalls in deployment include classpath conflicts arising from missing or incorrectly placed tag library JARs, such as struts-taglib.jar, leading to errors where the cannot locate Struts tags due to URI mismatches in JSP declarations. Version conflicts also occur in shared environments like application servers (e.g., JBoss), where duplicate or incompatible Struts libraries in the global interfere with the application's isolated dependencies, resulting in ClassNotFoundException or linkage errors during startup.

Key Features

Action and Form Handling

In Apache Struts 1, form submission begins when a user submits data via an HTTP request, triggering the framework's RequestProcessor to instantiate or retrieve an ActionForm subclass associated with the request. The ActionForm, a JavaBean that must implement Serializable, has its properties automatically populated from the request parameters by the controller servlet before any further processing occurs. This population step ensures that form data is encapsulated in a type-safe object, facilitating validation and execution. Following population, the framework invokes the ActionForm's reset() method to initialize properties to default values, such as setting flags for checkboxes to false, preventing carryover from previous submissions. Next, if validation is enabled in the action mapping, the validate() method is called on the ActionForm; this method, which returns an ActionErrors object containing any validation failures or null if valid, allows developers to implement custom checks on form properties. If errors are present, the framework forwards control back to the input form page specified in the action mapping, repopulating the form with the submitted values for user correction. Upon successful validation, control passes to the associated class, where the execute() is invoked to process the request. The execute() has the signature public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) and serves as an adapter between the incoming request and the application's business logic. Developers override this method to perform tasks such as updating model components, querying databases, or preparing data for the view, ultimately returning an ActionForward object to direct the response—either to a success page, failure page, or another resource. Action instances must be thread-safe, as they are shared across multiple requests. Error handling during form processing relies on the ActionErrors collection, which encapsulates validation messages reported by the ActionForm's validate() method. This class supports both global errors (affecting the entire form) and field-specific errors, added via methods like add(String property, ActionError error), where the property identifies the erroneous field and the ActionError provides a message key with optional arguments for . If ActionErrors is non-empty after validation, the framework stores it in the request scope and forwards to the designated input page, where JSP tags like <html:errors> can display the messages to the user. In the execute() method, additional errors can be collected similarly and saved using saveErrors(request, errors) before forwarding. For forms with multiple submit buttons, such as those requiring different actions like "Save" or "Delete," Struts 1 provides the LookupDispatchAction subclass of . This class dispatches to specific methods in the subclass based on a request (e.g., "action") whose matches a key defined in the application's resource bundle, mapped via the developer's implementation of getKeyMethodMap(). For instance, a of "button.save" could invoke a "save" method, enabling modular handling without separate action mappings. A representative example is handling a form using an ActionForm subclass like LogonForm, which captures username and password fields. Upon submission, the framework populates LogonForm properties from the request, calls reset() and validate()—where validate() might check for empty fields and return ActionErrors with messages like "Username is required"—and if valid, invokes LogonAction's execute() method. The execute() method authenticates the user against a model (e.g., a user database), then returns an ActionForward to "/Welcome.jsp" on success or saves new ActionErrors and forwards to "/Logon.jsp" on failure, ensuring users see appropriate error messages on the login page.

Validation Framework

The Validation Framework in Apache Struts 1 integrates with the Jakarta Commons Validator library to enable both server-side and client-side validation of form data, ensuring input integrity without embedding validation logic directly in application code. It supports declarative configuration for common checks and programmatic overrides for custom needs, reducing boilerplate while allowing flexibility for complex scenarios. Declarative validation is configured in a validation.xml file, where rules are defined within <form-validation> and <formset> elements for specific forms. For instance, the required rule mandates that a field cannot be null or empty, as in <field property="userName" depends="required"/>. The minlength rule enforces a minimum character length, specified via a minlength variable, such as <field property="password" depends="required,minlength"> <arg0 key="password.minlength"/> </field>, where the argument references a bundle key for the length value. Similarly, the email rule validates against a standard email pattern using regular expressions, like <field property="email" depends="required,email"/>. These rules are processed automatically during form submission, populating an ActionErrors object with any violations. For scenarios requiring custom logic, programmatic validation allows developers to override the validate() method in subclasses of ActionForm, such as ValidatorForm. This method, which returns an ActionErrors instance, can add errors via add() calls, for example: ActionErrors errors = new ActionErrors(); if (someCondition) { errors.add("fieldName", new ActionMessage("error.key")); } return errors;. It executes after declarative checks, enabling hybrid approaches where built-in rules handle basics and custom code addresses domain-specific validations. The framework is enabled through the ValidatorPlugIn, declared in struts-config.xml as <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/> </plug-in>. This plugin loads predefined rules from validator-rules.xml—which includes implementations for required, minlength, email, and others—and custom form rules from validation.xml. Forms must extend ValidatorForm to leverage these features automatically. Client-side validation is supported by automatic generation of from the declarative rules, integrated into JSP forms via the <html:form> tag, which adds an onsubmit handler like onsubmit="return validateUserNameForm(this);". This script performs preliminary checks in the browser using functions defined in validator-rules.xml, mirroring server-side logic to improve without full round-trips. If client-side validation fails, submission is blocked, and errors are displayed immediately. Validation errors are displayed in JSPs using the <html:errors/> tag, which iterates over the ActionErrors collection and renders messages from resource bundles configured in struts-config.xml, such as <message-resources parameter="ApplicationResources"/>. For example, keys like errors.required={0} is required in the bundle provide localized text, with {0} substituted by the field label. Alternatively, <html:messages id="msg" property="fieldName"> can target specific fields, ensuring errors are presented clearly and accessibly.

Internationalization Support

Apache Struts 1 provides built-in support for internationalization (i18n) by leveraging Java's Locale and ResourceBundle classes to enable multi-language applications without extensive custom coding. This allows developers to define locale-specific messages, labels, and formatting rules in resource bundle files, which are automatically selected based on the user's preferred locale. Resource bundles in Struts 1 are typically named ApplicationResources.properties for the default locale (e.g., English) and extended for other locales, such as ApplicationResources_fr.properties for or ApplicationResources_es_MX.properties for . These files use a simple key-value format, where keys reference translatable strings (e.g., welcome.message=Welcome to our application) and values provide the localized text. To load these bundles, the struts-config.xml file includes a <message-resources> element specifying the base bundle name, such as <message-resources parameter="ApplicationResources"/>, which places the bundle in application scope under the org.apache.struts.action.MESSAGE_KEY. Multiple <message-resources> elements can be defined for modular applications, each with a unique key attribute to avoid conflicts. If a is missing in the selected locale's bundle, Struts displays the surrounded by question marks (e.g., ???missing.key???) unless the null attribute is set to false in the . Locale resolution in Struts 1 follows a prioritized order to determine the appropriate language and regional settings for a request. First, it checks the user's session for a stored Locale object under the key org.apache.struts.Globals.LOCALE_KEY; if present, this locale is used. If no session locale exists, Struts falls back to the request's locale, derived from the browser's Accept-Language header sent in the HTTP request. Additionally, a locale request parameter (e.g., en_US) can override the locale for the current request and persist it to the session if the controller's locale attribute is enabled (default: true) in struts-config.xml. This mechanism supports dynamic language switching, such as via a URL like /index.do?locale=fr_FR, which updates the session locale and reloads the appropriate resource bundle for subsequent requests. In JSP pages, Struts 1 facilitates the display of localized text through the <bean:message> tag from the Bean Tag Library, which retrieves the message for the current using a specified key. For example, <bean:message key="welcome.message"/> outputs the translated welcome text, automatically substituting the correct bundle based on the resolved . The tag supports parameterization with attributes like arg0, arg1 for dynamic values, leveraging Java's MessageFormat class to insert them into the message string (e.g., welcome.user=Welcome, {0}! with <bean:message key="welcome.user" arg0="<%=userName%>"/>). For more advanced UI integration, the optional Struts-Faces library extends i18n support to JavaServer Faces components, allowing seamless locale propagation in hybrid Struts-JSF applications. Struts 1 integrates with Java's java.text package for locale-sensitive formatting of dates, numbers, and , ensuring outputs adapt to cultural conventions without additional configuration. For instance, the DateFormat and DecimalFormat classes, accessed via resource bundles or directly in actions and JSPs, automatically apply patterns like MM/dd/yyyy for English or dd/MM/yyyy for English based on the current . Currency formatting follows similar rules, using NumberFormat.getCurrencyInstance(locale) to produce symbols and decimal separators appropriate to the region (e.g., $1,234.56 in en_ vs. 1 234,56 € in fr_FR). These formats can be embedded in resource bundle messages or applied in custom tags, maintaining consistency across the application.

Extensions

Tiles Layout Framework

The Tiles Layout Framework is an extension integrated into Apache Struts 1 that enables the composition of web pages using reusable, modular components known as tiles, facilitating a templating approach for consistent user interfaces. It operates within the view layer of the by assembling into layouts, allowing developers to define page structures separately from content. Integration of Tiles into Struts 1 occurs primarily through the TilesPlugIn class, which is declared in the struts-config.xml file to initialize the framework. This plugin references a separate , typically tiles-config.xml or tiles-defs.xml, where page definitions are specified. For Struts 1.1 and later, the plugin supports module-aware factories for multi-module applications, with the option to share a single definition factory across modules by setting moduleAware="false". An example configuration in struts-config.xml is:
xml
<plug-in className="org.apache.struts.tiles.TilesPlugin">
  <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/>
  <set-property property="moduleAware" value="true"/>
</plug-in>
Core components of Tiles include definitions, which map logical names to layouts or sub-components, and attributes, which hold values for insertion into those layouts. Definitions are authored in XML within the configuration file, using elements like <definition> to specify a name, path to a layout JSP, and attributes such as header, body, or footer. Inheritance is supported via the extends attribute, enabling a base definition to be extended for specialized pages; for instance:
xml
<definition name="base" path="/layouts/classicLayout.jsp">
  <put name="header" value="/common/header.jsp"/>
  <put name="footer" value="/common/footer.jsp"/>
</definition>

<definition name="homePage" extends="base">
  <put name="body" value="/home/body.jsp"/>
  <put name="title" value="Home Page"/>
</definition>
This structure promotes nested definitions, where complex pages can build upon simpler ones. In JSP pages, Tiles are inserted using the <tiles:insert> tag from the Tiles tag library, referencing a definition by name or directly embedding attributes. Attribute substitution allows dynamic overriding, such as passing a custom body content at runtime with <tiles:put name="body" value="..."/> inside the insert tag. A typical usage example in a JSP is:
jsp
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<tiles:insert definition="homePage" flush="true">
  <tiles:put name="title" value="Custom Title"/>
</tiles:insert>
The layout JSP, like classicLayout.jsp, then retrieves these attributes using <tiles:get name="header"/> or similar tags to render the composed page. The primary benefits of Tiles include the creation of reusable templates that minimize JSP code duplication across an application, as common elements like headers and footers can be defined once and extended. Nested and inheritable definitions further enhance modularity, allowing hierarchical page structures that simplify maintenance and updates to site-wide layouts. Version-specific enhancements in 1.1 and subsequent releases include the introduction of the TilesPlugIn for streamlined initialization and support for dynamic content insertion through improved tag handling and integration in later iterations like 1.2. These updates, building on earlier contrib-based implementations in 1.0.x, enabled better extensibility for runtime attribute processing and multiple definition factories.

Validator and Custom Tags

The extension in Apache Struts 1 serves as a declarative validation mechanism for ActionForm inputs, integrating with the Validator library to enable server-side and client-side checks without embedding logic in Java code. This extension operates as a standalone within Struts applications, configurable via XML files that define reusable rulesets. Validation rules are specified in validator-rules.xml, which declares built-in and custom validators such as required for mandatory fields, mask for regular expression matching, email for address format verification, and creditcard for Luhn algorithm-based number validation. For instance, a creditcard rule might be defined as follows in validator-rules.xml:
xml
<validator name="creditcard"
           classname="org.apache.struts.validator.FieldChecks"
           method="validateCreditCard"
           msg="errors.creditcard">
  <javascript><![CDATA[
    function validateCreditCard(form) {
      // Luhn algorithm implementation
    }
  ]]></javascript>
</validator>
This rule can then be applied in validation.xml to a specific form field, like <field property="cardNumber" depends="required,creditcard">, linking it to the corresponding action path in struts-config.xml for automatic invocation during form processing. Custom validators extend this by implementing ValidatorAction interfaces and registering new <validator> elements in validator-rules.xml, allowing pluggable behaviors like domain-specific checks. Struts 1's custom JSP tag libraries enhance view-layer productivity by providing reusable components for form handling, data display, and conditional logic, divided into HTML, Bean, and Logic sublibraries. The HTML library generates interactive elements tied to form beans; for example, <html:form action="/submitForm" method="post"> creates a form that posts to a Struts action, while <html:text property="userInput" size="30"/> renders a bound text field that populates and repopulates from the form bean on errors. The Bean library facilitates data output with tags like <bean:write name="userForm" property="fullName" filter="true"/>, which safely renders a property value, escaping characters to prevent injection issues. Complementing this, the library supports flow control, such as <logic:iterate id="item" name="itemList" type="java.lang.String"> <bean:write name="item"/><br/> </logic:iterate>, which iterates over a collection to display list items dynamically. For tailored functionality, developers extend javax.servlet.jsp.tagext.TagSupport to build custom , implementing doStartTag() and doEndTag() for processing, then declare them in a Tag Library Descriptor (TLD) file placed in the /WEB-INF directory. A TLD example might include:
xml
<taglib>
  <tlib-version>1.0</tlib-version>
  <tag>
    <name>customDisplay</name>
    <tag-class>com.example.CustomTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
      <name>value</name>
      <required>true</required>
    </attribute>
  </tag>
</taglib>
This enables usage like <mytags:customDisplay value="Hello"/> after mapping via <%@ taglib uri="/WEB-INF/custom.tld" prefix="mytags" %>. Struts tags support nesting and composition for complex views; for instance, <html:form> can contain <logic:iterate> loops with embedded <html:text> and <bean:write> for generating dynamic, data-driven forms that adapt to user input or collections. In Struts 2, these tag concepts were retained but unified into a single library with enhanced features like better , while the was evolved into a more flexible supporting annotations alongside XML.

Security Considerations

Common Vulnerabilities

One of the most critical vulnerabilities in Apache Struts 1 is CVE-2016-1181, affecting versions 1.x through 1.3.10, where the ActionServlet mishandles multithreaded access to an ActionForm instance. This flaw allows remote attackers to execute arbitrary code by leveraging a or passing a serialized instance of an ActionForm that has already been used, potentially manipulating components in server memory such as Servlets and the ClassLoader. Closely related is CVE-2016-1182 in the same versions, where the ActionServlet fails to properly restrict configurations. Attackers can exploit this to conduct denial-of-service () attacks by overwhelming validation resources or perform (XSS) through unescaped outputs in form handling and tag libraries, injecting malicious scripts into user sessions. Parameter manipulation issues in Struts 1, particularly through ActionForm objects, serve as precursors to more sophisticated expression evaluation problems in subsequent frameworks. These allow attackers to tamper with request parameters to invoke unintended methods or access restricted resources, potentially leading to under concurrent request conditions. CSRF vulnerabilities arise from inadequate token handling in Struts 1 forms, where the built-in token mechanism may not sufficiently validate request origins if misconfigured, enabling attackers to forge requests on behalf of authenticated users. Complementing this are XSS risks from unescaped outputs in tags like <html:errors>, which lacks automatic and may require manual escaping for ; <bean:write> sanitizes by default unless the filter="false" attribute is explicitly set, but misconfiguration can still allow injection in responses. Historical exploits of unpatched Struts 1 versions have stemmed from these persistent flaws in older deployments. The framework's widespread adoption in legacy Java web applications amplified the impact, resulting in breaches where attackers leveraged XSS and parameter tampering for data exfiltration or further compromise.

Mitigation Strategies

To mitigate security risks in Apache Struts 1 applications, administrators should first ensure deployment of the final stable release, version 1.3.10 (December 2008), which includes patches for vulnerabilities known prior to its release, such as certain cross-site scripting issues. However, as Struts 1 reached end-of-life in April 2013 with no further official updates, it remains vulnerable to issues discovered afterward, including recent ones like CVE-2025-48734 (remote code execution via BeanUtils classloader manipulation, as of August 2025). To further reduce exposure, developers must disable or avoid dangerous configuration options, such as exposing the class parameter in action mappings, which can enable classloader manipulation; this is achieved by reviewing and sanitizing struts-config.xml to exclude unnecessary parameters and plugins, for example, by setting the "parameter" attribute to suppress dangerous keys. Input forms a core defense layer, requiring validation of all incoming parameters using the framework's validate() method in ActionForm subclasses to enforce rules like required fields, length limits, and type checks before processing. Complementing this, output escaping prevents injection attacks by rendering dynamic content with the <bean:write> tag's filter="true" attribute (the default), which automatically converts HTML-sensitive characters (e.g., < to &lt;) to their equivalents, ensuring safe display in JSP views. For (CSRF) protection, Struts 1 includes built-in handling: generate a unique via saveToken() in the originating , embed it as a hidden field in forms using <html:hidden property="token"/>, and validate it on submission with isTokenValid() or resetToken() to confirm request authenticity and prevent replay. If additional robustness is needed, integrate extensions like the CSRFGuard to automate management across non-form interactions. Ongoing auditing is essential for legacy systems; conduct regular vulnerability scans using tools like , which automates detection of issues such as insecure direct object references or misconfigurations in Struts actions through active and passive scanning modes. Complement scans by restricting Action access via role-based controls defined in web.xml security constraints, mapping user roles to specific patterns (e.g., /secure/*) to enforce and before . At the infrastructure level, implement rules to block direct access to sensitive resources like configuration files under WEB-INF, although Struts 1 protects struts-config.xml by default via servlet container conventions; additionally, enforce for all traffic using server configurations (e.g., Tomcat's SSL connector) to encrypt sessions and prevent man-in-the-middle interception of tokens or credentials. Due to the end-of-life status, migration to Struts 2 or modern frameworks is strongly recommended for long-term security.

Legacy and Migration

Differences from Struts 2

Apache represents a fundamental redesign of the framework, originally derived from the WebWork 2 project rather than an incremental update to Struts 1, resulting in significant architectural and functional divergences that improved modularity and developer productivity. This shift addressed limitations in Struts 1, such as tight coupling to the servlet API and verbose configuration, making more suitable for modern practices. In terms of configuration, Struts 1 relies heavily on XML files like struts-config.xml to define actions, form beans, and mappings, with no support for annotations or -over-configuration principles, leading to and maintenance challenges. Conversely, Struts 2 supports XML options in struts.xml and introduces annotation-driven configuration (e.g., @Action and @Result annotations), alongside -over-configuration via its Convention Plugin to automatically map actions based on class names and methods, reducing explicit setup. Architecturally, Struts 1 employs Action instances managed by the ActionServlet, requiring developers to ensure thread-safety through , while form handling depends on ActionForm subclasses tightly coupled to the servlet lifecycle. Struts 2, however, instantiates s per request as plain old objects (POJOs), eliminating thread-safety concerns and decoupling them from the servlet by using Maps to represent request, session, and application contexts for better testability. Additionally, Struts 2 replaces Struts 1's RequestProcessor with an extensible interceptor stack, allowing modular handling of cross-cutting concerns like validation and logging on a per-action basis. For tags and extensibility, Struts 1 provides a tag library based on JSP with limited expression language support via JSTL, restricting dynamic interactions and integration with modern frontend technologies. Struts 2 enhances this with a modern tag set leveraging the Object-Graph Navigation Language (OGNL) for powerful expressions and a ValueStack for flexible data access, alongside a architecture that facilitates seamless extensions for features like support and integration with frameworks such as or Hibernate. Performance-wise, Struts 1 incurs a heavier footprint due to the mandatory use of form beans extending base classes and Actions that demand careful , potentially introducing bottlenecks in high-concurrency scenarios. Struts 2's POJO-based approach and per-request instantiation minimize overhead, as the servlet container's object pooling offsets creation costs, resulting in a lighter, more efficient runtime. Struts 2 was rewritten from scratch without backward compatibility to Struts 1, breaking API contracts in areas like action execution and to enable these improvements, which ultimately led to its adoption as the primary framework while Struts 1 entered end-of-life without further maintenance.

Migration Approaches

Migrating from Apache Struts 1 to Struts 2 requires careful planning due to architectural differences, such as the shift from singleton actions in Struts 1 to per-request POJOs in Struts 2, and the elimination of mandatory servlet dependencies. The official migration strategies outline three non-exclusive paths that allow incremental adoption while minimizing disruption. The first approach, dual processor with shared resources, involves integrating Struts 2 JARs into an existing Struts 1.3 application and configuring distinct patterns—such as *.action for Struts 2 and *.do for Struts 1—to run both s side-by-side. This enables gradual of features, with shared elements like message resources, validation rules, and the Tiles to reduce redundancy. Developers can incrementally route requests to the new , leveraging plugins like the Tiles integration for Struts 2 to maintain consistency. A second strategy emphasizes studying rewritten applications, such as the Mailreader demo, which has been ported from Struts 1 to 2, to identify best practices for refactoring actions, forms, and configurations. This path aids in understanding how to adapt Struts 1 patterns, like ActionForms, to 2's model-driven validation and interceptor-based processing. The third path utilizes a conversion wizard tool, which parses Struts 1 files like struts-config.xml and web.xml to generate equivalent Struts 2 configurations, such as struts.xml, while flagging areas requiring manual intervention. XSLT transformations and text-processing utilities can automate conversions for validation XML to Struts 2's global validation files and message resources to properties files, though full automation is not guaranteed due to semantic differences. Additionally, bridge objects and utilities facilitate reuse of Struts 1 components in Struts 2 environments, including TextProvider for accessing legacy message resources, interceptors for applying Struts 1 validations, and emulation classes that wrap Struts 1 actions to implement the Struts 2 interface. These bridges support executing Commons Chain instances via interceptors and session-aware invocations of Struts 1's execute() method, easing the transition for complex applications. Challenges in migration include the non-trivial conversion of JSP tags from Struts 1's and libraries to Struts 2's UI and other tag sets, often requiring manual rewriting for compatibility. Additionally, while tools provide a starting point, they depend on community contributions and may not achieve 100% compatibility, necessitating thorough testing of action mappings, form handling, and support.

References

  1. [1]
    Struts 1 – Welcome - GitHub Pages
    Mar 1, 2024 · Welcome to Struts 1. Struts is a flexible control layer based on standard technologies like Java Servlets, JavaBeans, ResourceBundles, and XML, ...
  2. [2]
    Announcements 2002 - Apache Struts
    Dec 31, 2002 · The Struts project was founded in May 2000 by Craig McClanahan. McClanahan is also the lead developer of Tomcat 4.0, Sun's reference ...
  3. [3]
    Struts 1 – Table of Contents
    **Summary of Struts 1 Introduction and Overview:**
  4. [4]
    Announcements 2007 - Apache Struts
    8 July 2007 - Struts Downloads Skyrocket in 2007. Since its release in June 2001, Apache Struts (struts.apache.org) has become the most popular web framework ...
  5. [5]
    Apache Struts 1 End-Of-Life (EOL) Announcement
    The Apache Struts Project Team would like to inform you that the Struts 1.x web framework has reached its end of life and is no longer officially supported.
  6. [6]
    Struts 1 Reaches End Of Life - InfoQ
    Apr 7, 2013 · Struts 1 was originally created by Craig McClanahan and donated to the Apache Foundation in May 2000. It became the de-facto standard for ...Missing: initial | Show results with:initial
  7. [7]
    Apache Struts 1 Reaches End of Life -- ADTmag
    Apr 8, 2013 · Created in 2000 by former Sun Microsystems programmer Craig McClanahan, who later released it to the open source community, the Struts 1.Missing: initial | Show results with:initial
  8. [8]
    Apache Struts 1 End-Of-Life (EOL) Press Release
    Apr 5, 2013 · The Apache Struts Project Team would like to inform you that the Struts 1.x web framework has reached its end of life and is no longer officially supported.
  9. [9]
    Struts User's Guide - Apache's svn
    Aug 10, 2000 · The Struts architecture implements the concepts of the Model-View-Controller design pattern by mapping them to web application components and concepts.
  10. [10]
    From a birds eye - Apache Struts
    A tag library that helps developers create interactive form-based applications with server pages. The framework's architecture and tags are buzzword compliant.
  11. [11]
    Apache Struts Releases
    Release, Release Date, Vulnerability, Version Notes. Struts 7.0.0, 19 December 2024, Version notes. Struts 6.7.0, 17 November 2024, Version notes. Struts 6.6.1 ...
  12. [12]
    Programming Jakarta Struts [Book] - O'Reilly
    The Struts Framework, originally created by Craig R. McClanahan and donated to the Apache Software Foundation's Jakarta project in 2000, has become one of ...Missing: 1999 | Show results with:1999
  13. [13]
    [PDF] The Model-View_Controller Design Pattern: 'Model2' JSP ...
    In March of 2000, Craig McClanahan launched the Struts project as a subproject of the Apache Jakarta project.Missing: inspiration | Show results with:inspiration
  14. [14]
    1. Introduction - Programming Jakarta Struts, Second Edition [Book]
    The Struts framework was created by Craig R. McClanahan and donated to the Apache Software Foundation (ASF) in 2000. The project now has several committers ...
  15. [15]
    The Jakarta Site - News and Status
    Jakarta Struts graduats with honors into Apache Struts - Jakarta Struts formed its own PMCs in order to become Apache Struts - Top Level Project in The Apache ...
  16. [16]
    Java Basics: What Is Apache Struts? - JRebel
    Nov 29, 2023 · Apache Struts is a modern Java framework that uses the Model, View, Controller (MVC) architecture for building enterprise-ready web applications.
  17. [17]
    Announcements 2003 - Apache Struts
    23 Feb 2003 - Struts 1.1 Release Candidate 1 Released. The Struts team is proud to announce the release of Struts 1.1 Release Candidate 1.
  18. [18]
    Announcements 2004 - Apache Struts
    Dec 12, 2004 · 19 Sep 2004 - Struts 1.2.​​ 4 for General Availability. This release includes significant new functionality, as well as numerous fixes for bugs ...
  19. [19]
    Announcements 2005 - Apache Struts
    14 Dec 2005 - Apache Struts to release Struts 1.3.0 as the "Action Framework" · Composable Request Processor · ActionDynaForm interfaces · Arbitrary configuration ...
  20. [20]
    Struts 1 - Release Notes (since 1.2.8) - GitHub Pages
    Nov 29, 2008 · This section contains release notes for changes that have taken place to the seven new subprojects known as Struts Classic since Version 1.2.9.Missing: history | Show results with:history
  21. [21]
    Announcements 2008 - Apache Struts
    04 December 2008 - Struts 1.3.10 General Availability Release. The Apache Struts group is pleased to announce that Struts 1.3.10 is available as a "General ...
  22. [22]
    Apache Struts - VA.gov
    Version, Release Date, Vendor End of Life Date, Vendor Desupport Date. 1.3.5, 08/16/2006. 1.3.8, 03/10/2007. 1.3.9, 08/11/2007. 1.3.10, 12/04/2008 ...<|control11|><|separator|>
  23. [23]
    Struts 1 – Building Controller Components
    ### Summary of Struts 1 MVC: Controller, Model, View, Request Flow, and Benefits
  24. [24]
    Action (Apache Struts API Documentation)
    An Action is an adapter between the contents of an incoming HTTP request and the corresponding business logic that should be executed to process this request.Missing: core | Show results with:core
  25. [25]
  26. [26]
    Index of /dtds - Apache Struts
    Index of /dtds ; [ ], struts-config_1_3.dtd, 2022-06-07 08:08 ; [ ], struts-config_1_4.dtd, 2022-06-07 08:08 ; [ ], tiles-config.dtd, 2022-06-07 08:08 ...
  27. [27]
    ActionServlet (Apache Struts API Documentation)
    Parses one module config file. protected void, process(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
  28. [28]
  29. [29]
    Struts 1 - Installation - GitHub Pages
    Servlet Container - You must download and install a servlet container that is compatible with the Servlet API Specification, version 2.3 or later, and the ...
  30. [30]
    The Struts Framework Project - Installation (1.1)
    Ant Build System - If you are building Struts from the source distribution, you must download and install version 1.5.4 (or later) of the Ant build system. Make ...
  31. [31]
    Struts 1 - How to Build Applications - GitHub Pages
    Nov 29, 2008 · How to Build Applications. This document outlines one possible sequence of development steps that can be followed to create a Struts ...
  32. [32]
    StrutsTestCase for JUnit
    StrutsTestCase for JUnit is an extension of the standard JUnit TestCase class that provides facilities for testing code based on the Struts framework.
  33. [33]
    Struts 1 - struts-taglib.jar is not being found by my web application
    Mar 14, 2010 · I'm guessing that the URI doesn't match, which means the class loader won't be able to find the tag library even if the JAR is in the CLASSPATH.JBoss 7.1.1 struts deployement problems - java - Stack OverflowStruts tag lib errors while deploying on JBOSS - Stack OverflowMore results from stackoverflow.com
  34. [34]
    Why struts application throws java.lang.ClassNotFoundException?
    Aug 6, 2024 · Failed to define class org.apache.strutsel.taglib.tiles.ELPutListTag in Module "deployment.example.war:main" from Service Module Loader: java.lang.LinkageError.
  35. [35]
    ActionForm (Apache Struts API Documentation)
    An ActionForm is a JavaBean optionally associated with one or more ActionMappings. Such a bean will have had its properties initialized from the corresponding ...
  36. [36]
    ActionErrors (Apache Struts API Documentation)
    A class that encapsulates the error messages being reported by the validate() method of an ActionForm . Validation errors are either global to the entire ...
  37. [37]
    LookupDispatchAction (Apache Struts API Documentation)
    Process the specified HTTP request, and create the corresponding HTTP response (or forward to another web component that will create it). Return an ...
  38. [38]
    StrutsBeginnerValidatorFramework - STRUTS1 - Apache Software Foundation
    ### Summary of Apache Struts 1 Validation Framework
  39. [39]
    Struts Validator - Apache's svn
    The Validation Framework was made to work with Struts, but can be used for validation of any java bean. It can perform basic validations to check if a field ...Missing: documentation | Show results with:documentation
  40. [40]
    The Struts User's Guide - Validator Guide
    Requires a minlength variable. <field property="name" depends="required,minlength ... xml. <validator name="required" classname="org.apache.struts.validator ...
  41. [41]
    org.apache.struts.validator Class ValidatorPlugIn
    ValidatorPlugIn loads ValidatorResources based on configuration in the struts-config.xml. Field Detail log private static org.apache.commons.logging.Log log
  42. [42]
    Struts 1 - Building View Components - GitHub Pages
    Nov 29, 2008 · Each Locale represents a particular choice of country and language (plus an optional language variant), and also a set of formatting assumptions ...
  43. [43]
    Localization - Apache Struts
    Struts 1 users should be familiar with the application.properties resource bundle, where you can put all the messages in the application that are going to be ...
  44. [44]
    The Struts User's Guide - Configuring Applications
    Struts has built in support for internationalization (I18N). You can define one or more <message-resources> elements for your webapp; modules can define their ...<|control11|><|separator|>
  45. [45]
    Internationalizing Struts Application - javaskool.com
    Jan 6, 2018 · Like Java, Struts' internationalization support is centered on the Locale class and resource bundles. However, Struts differs in that it ...
  46. [46]
    Struts 1.3: How to set a default Locale in a web app? - Stack Overflow
    Dec 5, 2008 · I have two or three i18n files in my struts application. I am able to switch between these by setting the Global.LOCALE_KEY variable in the session.Missing: resolution | Show results with:resolution
  47. [47]
    bean Tag message - GitHub Pages
    Retrieves an internationalized message for the specified locale, using the specified message key, and write it to the output stream.
  48. [48]
    Package org.apache.struts.tiles
    The Tiles taglib and framework allows building web pages by assembling reusable pieces of pages, called Tiles. A Tiles is usually a simple JSP page. TagLib ...Simple Examples · Struts1. 1 · Struts1. 0. X
  49. [49]
    Tiles Framework
    In this tutorial, you will always prefix html links with subdomain name. If you also plan to use Struts, you can use the <link> or <img> ...
  50. [50]
    Using Apache Struts to Create User Pages
    This simple layout template indicates that the body of the page is built from four tiles: masthead, navbar, subnavbar, and content. Each tile corresponds to a ...Layout Template · Tiles Definitions · Updating The Navigation Bar<|control11|><|separator|>
  51. [51]
    Struts Release Notes (since 1.1) - GitHub Pages
    2003-12-29 - struts-faces: Various updates regarding the JSF Final Draft and to prepare for Tiles support. 2003-12-17 - struts-jericho: Whiteboard directory for ...
  52. [52]
    Installing Struts 1.1 - JavaRanch
    The first, validator-rules.xml was included as part of the Struts installation. The second, validation.xml, will be created by you. This file contains the rules ...
  53. [53]
    Struts - Custom Tag Library Reference - Apache's svn
    This document contains reference information about each of the tags defined in the Struts custom tag library. For each tag, the following information is ...
  54. [54]
    Understanding Struts Custom Tags | Oracle FAQ
    Jan 24, 2004 · This article is about custom tags, how to develop them and how to make maximum use of them. This article is also about tag libraries that come with Struts.Missing: TagSupport | Show results with:TagSupport
  55. [55]
  56. [56]
    Vulnerability Details : CVE-2016-1181 - Struts
    Jul 4, 2016 · CVE-2016-1181 : ActionServlet.java in Apache Struts 1 1.x through 1.3.10 mishandles multithreaded access to an ActionForm instance, ...
  57. [57]
    Vulnerability Details : CVE-2016-1182 - Struts
    Jul 4, 2016 · CVE-2016-1182 : ActionServlet.java in Apache Struts 1 1.x through 1.3.10 does not properly restrict the Validator configuration, ...
  58. [58]
    CVE-2012-1007 : Multiple cross-site scripting (XSS) vulnerabilities ...
    Feb 7, 2012 · Multiple cross-site scripting (XSS) vulnerabilities in Apache Struts 1.3.10 allow remote attackers to inject arbitrary web script or HTML ...<|control11|><|separator|>
  59. [59]
    bean Tag write - GitHub Pages
    Retrieve the value of the specified bean property, and render it to the current JspWriter as a String by the ways:
  60. [60]
  61. [61]
    Migration Strategies - Apache Struts 2 Wiki - Apache Software Foundation
    ### Migration Strategies from Struts 1 to Struts 2
  62. [62]
    Migration Tools - Apache Struts 2 Wiki - Apache Software Foundation
    ### Summary of Struts 1 to Struts 2 Migration Tools