Fact-checked by Grok 2 weeks ago

Apache Struts

Apache Struts is a free, open-source framework for that implements the Model-View-Controller (MVC) to facilitate the development of elegant, modern, and enterprise-ready web applications. The framework emphasizes , reducing while providing extensibility through a robust plugin architecture that supports integrations like services, , and handling. Originally launched as Struts 1 in 2000, the project reached its end-of-life with version 1.3.10 in December 2008, after which shifted to Struts 2—a complete rewrite that evolved from the merger of the WebWork framework and elements of the original Struts codebase around 2005–2006. Struts 2, now simply referred to as in its latest iterations (up to version 7.1.1 as of October 2025), builds on Servlet API extensions and object-oriented principles to streamline the creation of scalable applications, with ongoing releases addressing security enhancements and modern tooling compatibility.

Introduction

Overview

Apache Struts is a free, open-source framework for developing web applications using the Model-View-Controller (MVC) . This framework simplifies development by handling HTTP requests, managing navigation, and enforcing between the model (business logic), view (presentation), and controller (request processing) components. Apache Struts integrates with (formerly Java EE) technologies, including Servlets, JSP, and session management, to support the creation of robust enterprise web applications that are scalable and maintainable. As of 2025, it is actively maintained by , with development focused on the Struts 2 lineage, now encompassing versions 6.x and 7.x (latest 7.1.1 as of October 2025) as the primary active branches following the end-of-life of Struts 2.5.x.

Development and Maintenance

Apache Struts originated from early MVC frameworks and was founded in May 2000 by Craig McClanahan as part of the Apache Jakarta Project. It graduated to become a top-level Apache project in March 2004, marking its transition to independent governance under the Apache Software Foundation. The Apache Struts Project Management Committee (PMC), established in 2004, oversees day-to-day operations, including decision-making on releases, code changes, security patches, and ensuring compliance with Apache bylaws. The PMC, chaired by the project Vice President, consists of active contributors who guide community development and maintain the project's intellectual property. Community involvement is facilitated through public mailing lists for discussions on development, user support, and announcements, as well as the Apache issue tracker for reporting bugs, proposing enhancements, and submitting patches. Contribution guidelines encourage volunteers to join as committers or members after demonstrating consistent participation, fostering a collaborative open-source environment. Security practices emphasize proactive , with the project issuing patches on the same day vulnerabilities are disclosed, as seen in the rapid response to CVE-2017-5638 in March 2017—a remote execution flaw exploited in the breach later that year due to unapplied updates. The team maintains the plugin ecosystem by recommending restrictions on development-only plugins like Config Browser in production and provides guidelines for secure configurations, such as disabling devMode and using allowlists for OGNL expressions. Apache Struts is distributed under the Apache License 2.0, a permissive that permits free use, modification, and distribution in both open-source and commercial projects without requiring derivative works to be open-sourced.

History

Origins and Early Versions

Apache Struts originated in May 2000 when Craig R. McClanahan developed it as an open-source MVC framework for web applications, drawing inspiration from the Model 2 architecture and earlier servlet-based MVC implementations to separate concerns in . McClanahan, involved in the Java Servlet and JSP expert groups as well as Tomcat implementation, donated the framework to the Apache Software Foundation later that year, where it became a subproject of the initiative. The inaugural public release, Struts 1.0, arrived on June 15, 2001, marking a significant milestone by introducing foundational elements like the ActionServlet for orchestrating request processing, classes to encapsulate application logic, and form beans to handle user input binding and basic validation. This version provided a standardized approach to building dynamic web applications using Java servlets and JSPs, addressing the growing complexity of enterprise web development in an era before widespread alternatives like Spring MVC emerged in 2003. Subsequent early releases built on this foundation with key enhancements. In 2002, Struts integrated with Jakarta Tag Libraries to streamline JSP templating and custom tag usage, improving developer productivity for view-layer construction. Struts 1.1, with its beta versions appearing in late 2002 and final release in June 2003, incorporated the Tiles framework for modular page layouts, enabling reusable UI components without tight coupling to specific actions. By Struts 1.2 in 2004, the framework saw notable improvements, including declarative validation rules via XML configuration and expanded support for client-side checks, further solidifying Struts as a robust choice for servlet-centric web applications. Struts' early adoption was driven by its provision of a mature, convention-based structure for handling HTTP requests in servlet containers, filling a critical gap for standardized MVC patterns in EE before dependency injection frameworks gained prominence. By the time of its 1.0 release, the project already boasted contributions from 26 developers and a with over 1,300 subscribers, reflecting rapid community interest in its practical tools for form processing and .

Evolution to Struts 2

By the mid-2000s, the framework faced significant limitations that hindered its adaptability to evolving needs, including heavy reliance on XML-based files, tight between components that complicated extension and testing, and challenges in handling complex request processing. These issues prompted the Struts development team to initiate a comprehensive rewrite between 2005 and 2006, aiming to modernize the architecture while preserving core MVC principles. A key influence was the merger with the WebWork framework, whose community and codebase were integrated into the Struts project to leverage WebWork's more flexible, interceptor-based design and POJO-oriented actions, ultimately rebranding WebWork 2 as Apache Struts 2. The first general availability release of Apache Struts 2, version 2.0.0, arrived in February 2007, marking a pivotal shift by introducing annotation-based options to reduce XML verbosity and enabling (POJO) actions that eliminated the need for extending specific base classes, thereby improving testability and loosening servlet dependencies. This redesign addressed Struts 1's action model, which required thread-safety measures, by adopting per-request action instantiation for simpler lifecycle management. Subsequent milestones built on this foundation; for instance, Struts 2.1 in 2008 introduced the Convention plugin, enabling zero- setups through class naming conventions and package structures, further minimizing . Later advancements focused on integration with modern web standards, such as the addition of robust plugin support in Struts 2.5 released in 2016, which facilitated easier creation of RESTful web services with and XML handling out of the box. Security received heightened attention following the , which exploited an unpatched vulnerability in the Jakarta Multipart parser (CVE-2017-5638); in response, the project issued version 2.5.10 and subsequent updates in 2017, incorporating stricter input validation and other protections to mitigate remote code execution risks. As of 2025, Apache Struts continues to evolve toward greater compatibility with contemporary enterprise standards, emphasizing support for 9 and later specifications through its 7.x series, with the latest stable release 7.1.1 incorporating modularization for better plugin independence and alignment with 17+. This ongoing development maintains Struts' relevance in cloud-native and environments while ensuring for legacy migrations.

Architecture

Model-View-Controller Implementation

implements the () architectural pattern, specifically the Model 2 variant, to separate concerns in development, enabling scalable and maintainable Java-based applications. In this implementation, the framework provides a central controller to handle incoming requests, delegates to independent model components, and renders responses through decoupled view technologies, promoting between layers. The Model in Struts represents the application's business logic and data persistence, typically implemented using plain old Java objects (POJOs) or Enterprise JavaBeans (EJBs) that operate independently of the framework. These components encapsulate domain-specific operations, such as data validation, database interactions, and rule enforcement, without direct dependencies on Struts classes, allowing reuse across different presentation layers. The View layer focuses on presentation and user interface rendering, primarily utilizing JavaServer Pages (JSP), Apache FreeMarker, or Velocity templates to generate dynamic content. Struts enhances views with custom tag libraries, such as the <s:property> tag, which retrieves and displays values from the model or action context, ensuring clear separation from controller logic and facilitating reusable UI components. The Controller serves as , intercepting HTTP requests and routing them to appropriate handlers based on configuration mappings. In Struts 1.x, this is managed by the central ActionServlet, while Struts 2.x employs the StrutsPrepareAndExecuteFilter to process requests through a filter chain, invoking action classes that coordinate with the model. The overall flow in Struts follows a structured sequence: an incoming request reaches the controller, which maps it to an action class for processing; the action interacts with the model to execute ; finally, the controller forwards the results to the view for rendering the response, maintaining and facilitating . This pattern ensures that changes in one layer, such as updating the view technology, minimally impact others.

Core Components and Flow

Apache Struts implements the Model-View-Controller (MVC) pattern through several core components that facilitate request handling and response generation. In both Struts 1 and Struts 2, Action classes serve as the primary controllers, encapsulating the to process HTTP requests and interact with the model layer. In Struts 1.x, these classes extend a base Action class and implement an execute method returning an ActionForward to determine the next view. In Struts 2.x, action classes are typically plain old Java objects (POJOs) with an execute method (or equivalent) that returns a string result code. Additionally, Result types define how responses are rendered, such as the dispatcher result for forwarding to JSP pages or redirect results for HTTP redirects, configured to map action outcomes to view resources. Struts 2 introduces advanced data binding mechanisms absent in earlier versions, including the ValueStack and OGNL (Object-Graph Navigation Language). The ValueStack acts as a stack of objects, starting with the Action instance at the top, enabling seamless data transfer between layers without explicit getters and setters. OGNL expressions evaluate against this stack for dynamic property access in views, such as referencing action properties directly (e.g., postalCode) or non-stack objects via the # prefix (e.g., #session.user), supporting collections and projections for flexible data manipulation. This contrasts with Struts 1, where data binding relies on simpler form beans and request parameters without such an integrated expression language. The request-response lifecycle in Struts follows a structured flow, varying slightly between versions. In Struts 1, an incoming HTTP request reaches the central ActionServlet, which uses the configuration file (struts-config.xml) to map the URL to an appropriate Action class via the RequestProcessor. The processor populates form beans from request parameters, invokes the Action's execute method to engage the model, and forwards the result to a view based on mappings. Struts 2 modernizes this with a filter-based approach: the StrutsPrepareAndExecuteFilter, which internally uses a , receives the request, consults struts.xml or annotations to identify the Action via the ActionMapper, creates an ActionProxy, and builds an ActionInvocation that executes a stack of interceptors before and after the Action. Interceptors provide modular pre- and post-processing, such as parameter binding or workflow control, replacing Struts 1's monolithic RequestProcessor with a more extensible interceptor stack. Finally, the selected Result type renders the view, completing the cycle. Error handling in Struts ensures robust application stability through declarative mappings for exceptions. Both versions support global exception configurations: Struts 1 uses struts-config.xml to define that map exception types to forward names, often integrated with web.xml for servlet-level error pages. Struts 2 extends this with and in struts.xml, allowing mappings like java.lang.Exception to an "error" result rendering a dedicated JSP, with the ExceptionInterceptor automatically catching unhandled errors during the . Action-specific mappings override globals, and exceptions are exposed in views via stack properties for logging or display, such as <s:property value="exception"/>.

Versions and Compatibility

Struts 1.x

Apache Struts 1.x serves as the foundational version of the framework, implementing the Model-View-Controller (MVC) pattern through a centralized servlet-based designed for web applications. The core controller component is the ActionServlet, which acts as the central dispatcher for handling incoming HTTP requests, processing them according to configuration rules, and forwarding to appropriate classes for execution. This servlet initializes the framework upon application startup, parses configuration files, and delegates request processing to a RequestProcessor instance, ensuring a consistent flow from client input to model interaction and view rendering. Integral to this architecture are FormBeans, implemented as subclasses of ActionForm, which encapsulate user input data from HTML forms and facilitate validation before passing it to the model layer. These beans provide getter and setter methods that map directly to form fields, enabling automatic population from request parameters and supporting scope management (e.g., request or session) to maintain state across interactions. All mappings, including those for FormBeans, Actions, and forward paths, are defined declaratively in the struts-config.xml file, which uses XML elements like <action-mappings>, <form-beans>, and <global-forwards> to wire the application's components without embedding configuration logic in code. This XML-driven approach centralizes the framework's wiring but requires manual maintenance for larger applications. Struts 1.x includes several key modules to extend its core functionality. The Tiles module, originally developed as part of the Struts ecosystem, enables the creation of composable views by assembling reusable page fragments (e.g., headers, footers, and body content) into full layouts defined in a tiles configuration file, promoting modular UI design and reducing JSP duplication. The Validator module provides a reusable for both client-side () and server-side input validation, integrating with ActionForms through XML rules in validator-rules.xml and form-specific settings in validation.xml to check fields against predefined or custom rules like required fields or email formats. Additionally, DynaActionForms offer a dynamic alternative to traditional ActionForms, allowing form definitions entirely in struts-config.xml without requiring a custom class; properties are specified with types (e.g., String, int), enabling runtime creation and access via bean utilities for prototyping or simple forms. Despite its robustness for applications at the time, 1.x exhibits several limitations that have contributed to its obsolescence. The reliance on verbose XML in struts-config.xml for nearly all aspects—from mappings to validation rules—results in that scales poorly and hinders rapid compared to more declarative or annotation-based alternatives. classes are instantiated as singletons by the framework, necessitating explicit thread-safety measures such as avoiding mutable instance variables or using , which increases complexity and risk of concurrency issues in multi-threaded servlet environments. Furthermore, the architecture's tight to the servlet and requirement for subclassing base classes like and ActionForm limit extensibility and , making it challenging to mock dependencies or integrate with modern inversion-of-control containers without significant refactoring. 1.x reached end-of-life status in 2013, with its final release (1.3.10) in 2008, after which no official security patches or bug fixes have been provided by the project; however, it persists in many legacy systems due to the high cost of migration in large-scale deployments. In terms of compatibility, Struts 1.x requires a servlet container supporting Servlet API 2.3 or later (e.g., 4.x) and JSP 1.2, allowing integration with older Java EE (now ) environments through standard JDBC, EJB, or tools like Hibernate for the model layer. It does not support newer servlet specifications without adaptation. For migration to subsequent versions, the Apache Struts project provides strategies including the Struts 1 Plugin for Struts 2, which enables gradual integration by allowing existing Struts 1 Actions and Forms to run within a Struts 2 application via compatibility wrappers, alongside tools like XML transformation utilities (e.g., XSLT-based config converters) and tutorials for rewriting core components. These paths support hybrid deployments during transition, minimizing disruption for legacy codebases.

Struts 2.x and Beyond

Struts 2.x represents a significant evolution in the , emphasizing simplicity and flexibility through POJO-based actions that do not require extending framework-specific classes, allowing developers to focus on using standard objects. This design choice reduces and enhances , as actions can be instantiated and tested independently of the framework. Annotation-driven configuration further streamlines development by enabling declarations like @Action for mapping URLs to methods and @Result for specifying outcomes, serving as an alternative to traditional XML files and promoting cleaner code. Complementing this, the Convention Plugin automates the discovery of actions, results, and packages based on , eliminating much of the boilerplate configuration while maintaining explicit control where needed. The framework supports modular extensions through plugins, including the JSON Plugin, which facilitates the creation of RESTful web services by serializing action results to format for easy consumption by clients. For ORM integration, Struts 2 commonly pairs with JPA via the Spring Plugin, enabling of entity managers and repositories for seamless data persistence in applications. Additionally, the Portlet Plugin provides support for developing JSR-286 portlets in environments, though it has been deprecated since version 6.0.0 in favor of broader compatibility. In terms of compatibility, Struts 2 offers full support for 10 and later as of version 7.0.0 released in December 2024, ensuring alignment with modern servlet containers and 17+. The latest stable release is version 7.1.1 (October 2025), which maintains these compatibility requirements. Asynchronous processing is enabled through async actions and the Async Plugin, leveraging Servlet API 3.0+ for non-blocking operations in high-throughput scenarios. Security enhancements include built-in CSRF protection via the Token Interceptor, which validates unique session tokens to prevent unauthorized requests.

Key Features

Configuration and Interceptors

Apache Struts 2 applications are primarily configured through the struts.xml file, which defines packages, actions, and results to map URLs to handler classes and specify outcomes such as JSP views or redirects. Packages in struts.xml serve as logical units that group related actions, results, result types, interceptors, and interceptor stacks, allowing inheritance from base packages like struts-default for modular configuration. For zero-XML configuration, Struts 2 supports 5 annotations via the Convention Plugin, where developers can use @Action to map methods to URLs, @Result to define outcomes, and @Namespace to organize paths without editing XML files. Constants, such as struts.enable.DynamicMethodInvocation to enable dynamic method calls on actions, are set in properties files like struts.properties or directly in struts.xml, overriding defaults from struts-default.xml for framework behavior customization. Interceptors in Struts 2 form a stackable pipeline that processes requests before and after action invocation, implementing core features like parameter binding and exception handling in a modular, extensible manner. The default interceptor stack, named defaultStack, includes essential interceptors such as params for setting request parameters on the action, validation for input checking, and workflow for handling validation errors by redirecting to input views if needed. Interceptors are configured in struts.xml under the <interceptors> element, where individual ones are registered and grouped into reusable stacks like basicStack or custom ones that reference the default for layered processing. To create custom interceptors, developers extend AbstractInterceptor and override the intercept method to add logic, such as logging request details or performing authentication checks before invoking the next element in the chain via ActionInvocation.invoke(). Best practices for Struts 2 configuration emphasize namespaces to modularize applications by prefixing action paths (e.g., /user namespace for user-related actions), preventing name conflicts and enabling declarative security on namespace levels while using the root / or default empty namespace for global elements. Wildcards in action names, such as <action name="/user/*" class="com.example.User{1}Action">, allow a single mapping to handle multiple URLs like /user/profile or /user/edit, with {1} substituting the captured segment for dynamic class or result resolution, reducing configuration verbosity when ordered properly in struts.xml. For development efficiency, Struts 2 supports reloading XML configurations like struts.xml without application restart by setting struts.configuration.xml.reload=true in struts.properties, though this incurs a minor performance cost unsuitable for production. A key Struts 2-specific feature is the ModelDriven interface, which actions implement by providing a getModel() returning a model object, enabling automatic population of that object with request parameters and placing it atop the value stack for form handling and validation. The Model Driven Interceptor, part of the defaultStack, detects ModelDriven actions and pushes the model onto the stack, facilitating a form-bean-like approach where JSP tags bind directly to model properties without cluttering the action class.

Validation and Internationalization

Apache Struts provides robust mechanisms to ensure input integrity in web applications, supporting both server-side and approaches. Validation rules can be defined using XML configuration files, such as validators.xml, where developers specify checks for required fields, formats, lengths, and numeric ranges using built-in validators like requiredstring, , and . Alternatively, annotations such as @Validations and @RequiredFieldValidator enable declarative validation directly in classes, allowing for concise rule definitions without external XML files. These methods integrate seamlessly with the framework's validation interceptor, which automatically invokes validation prior to execution and populates messages if checks fail. The framework handles validation errors by mapping them to specific UI fields through FieldError objects, which can be displayed in views using tags like <s:fielderror>. This ensures user-friendly feedback, such as highlighting invalid inputs with localized messages. For client-side validation, Struts supports generation via the Validator plugin, enabled by setting validate="true" on form tags, which mirrors server-side rules to provide immediate browser-based checks without full page reloads. Developers can extend validation capabilities by creating custom validators that inherit from ValidatorSupport, overriding methods like validate to implement domain-specific logic, such as business rule enforcement or integration with external services. Internationalization (i18n) in facilitates multi-language support by leveraging Java's ResourceBundle for locale-specific resources, typically stored in properties files like global.properties under the . These bundles contain key-value pairs for messages, labels, and validation errors, loaded based on the user's detected from request parameters, , or browser settings. In views, the <s:text> tag retrieves and renders translated text dynamically, for example, <s:text name="welcome.message" />, pulling the appropriate string from the bundle while supporting parameter substitution for personalized content. Advanced i18n features include formatting dates, times, and numbers according to conventions, using Struts' built-in support for Java's and NumberFormat classes integrated with ResourceBundle. For instance, a key in the bundle can render as "MM/dd/yyyy" for en_US or "dd/MM/yyyy" for en_GB, ensuring cultural appropriateness without hardcoding formats. Custom resource bundles can be registered globally via struts.custom.i18n.resources in struts.properties, allowing hierarchical loading for package-specific overrides. This approach extends to action classes and interceptors, where getText() methods access bundles for dynamic messaging, promoting scalable, locale-aware applications.

Usage and Implementation

Basic Setup and Configuration

To begin using Apache Struts 2, developers must meet specific prerequisites, including 17 or higher for compatibility with the framework's requirements, the API version 6 or later to handle lifecycles, and a build tool such as for managing dependencies like the struts2-core artifact. A servlet container, such as 10.1 or later (for 6.0 support), is necessary to deploy and run the . Basic knowledge of , JSP, filters, , HTTP, and XML is also recommended to understand the configuration processes. The initial setup involves several key steps to integrate into a project. First, create a standard Maven-based project, ensuring the pom.xml file includes the Struts core dependency:
xml
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>7.1.1</version> <!-- Latest stable version as of November 2025 -->
</dependency>
Additionally, include logging dependencies like Log4j 2 for runtime diagnostics. Next, configure the web.xml file in the WEB-INF directory to register the Struts , which intercepts requests and dispatches them through the framework:
xml
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.[StrutsPrepareAndExecuteFilter](/page/StrutsPrepareAndExecuteFilter)</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
This filter, [StrutsPrepareAndExecuteFilter](/page/StrutsPrepareAndExecuteFilter), serves as the entry point for Struts processing all incoming requests. Finally, place a struts.xml configuration file in the src/main/resources directory (which maps to WEB-INF/classes at runtime) to define packages, actions, and results; a basic version enables development mode and maps a default action:
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN" "https://struts.apache.org/dtds/struts-6.0.dtd">
<struts>
    <constant name="struts.devMode" value="true" />
    <package name="default" extends="struts-default">
        <action name="[index](/page/Index)">
            <result>/index.jsp</result>
        </action>
    </package>
</struts>
This setup allows the to handle requests routed to the [index](/page/Index) action, forwarding to index.jsp. For a minimal functional example, define a package in struts.xml and create an action class that extends ActionSupport, which provides default implementations for common methods like execute(). Note that in Struts 7.x, XWork classes have been refactored from com.opensymphony.xwork2 to org.apache.struts2. Consider a simple "" action in the package org.apache.struts.helloworld.action:
java
package org.apache.struts.helloworld.action;
import org.apache.struts2.action.ActionSupport;

public class HelloWorldAction extends ActionSupport {
    public String execute() throws Exception {
        return SUCCESS;
    }
}
Map this action in struts.xml under the package:
xml
<package name="helloworld" extends="struts-default">
    <action name="hello" class="org.apache.struts.helloworld.action.HelloWorldAction" method="execute">
        <result name="success">/HelloWorld.jsp</result>
    </action>
</package>
The corresponding result is a JSP file, HelloWorld.jsp, placed in src/main/webapp, which displays output using Struts tags:
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head><title>[Hello World](/page/Hello_World)</title></head>
<body>
    <h2>Hello from [Struts](/page/The_Struts)!</h2>
</body>
</html>
Accessing /hello.[action](/page/Action) invokes the action and renders the JSP upon successful execution. Environment considerations include support to streamline development. The official IntelliJ IDEA plugin provides features like XML validation, for struts.xml, and action navigation, compatible with recent versions including 2025.x and supporting 7.x. For , the Clipse plugin offers content assistance, hyperlinks, and validation for 2 configurations, though it is outdated (last updated 2015) and compatibility with 7 and modern should be verified. Testing can be facilitated with the 2 Plugin (latest 7.1.1), which includes StrutsTestCase—an extension of 's TestCase—to simulate requests and verify action outcomes without a full deployment. Note package changes for imports in tests.

Building a Simple Application

To build a simple Apache Struts application, consider a basic user login scenario where a form collects username and password inputs, an Action processes the submission, performs validation, and directs to success or error pages based on the outcome. This example uses Struts 7.x (as of November 2025), assuming a prior setup with the necessary JAR files in the WEB-INF/lib directory and web.xml configured for the Struts dispatcher. Update imports to use org.apache.struts2 packages. Begin by creating the Action class to handle the login logic. Extend the ActionSupport class and override the execute() method to process the POST request, validate inputs, and return a result string like "success" or "input" for error handling. For Struts 7.x, annotate parameters with @StrutsParameter if injection is needed (enabled by default). For instance:
java
import org.apache.struts2.action.ActionSupport;
import org.apache.struts2.validator.annotations.Validation;
import org.apache.struts2.interceptor.validation.annotations.ValidationParameter;

@Validation
public class LoginAction extends ActionSupport {
    @ValidationParameter(validatorType = "required")
    private String username;
    @ValidationParameter(validatorType = "required")
    private String password;

    // Getters and setters
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }

    @Override
    public String execute() {
        // Simple validation check (detailed rules covered in the Validation and Internationalization section)
        if (username == null || username.isEmpty() || password == null || password.isEmpty()) {
            addActionError(getText("login.errors.required"));
            return INPUT;
        }
        // Simulate authentication
        if ("admin".equals(username) && "pass".equals(password)) {
            return SUCCESS;
        } else {
            addActionError(getText("login.errors.invalid"));
            return INPUT;
        }
    }
}
This uses annotations for validation and the addActionError method to queue error messages for display. Next, develop the JSP form for user input, leveraging tags from the struts-tags library. Place this in a file like login.jsp under the web application's root or a subdirectory, using <s:form> for form handling and <s:textfield> for inputs, with <s:submit> to trigger the . An example form might look like:
jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head><title>[Login](/page/Login)</title></head>
<body>
    <s:form action="login" method="post">
        <s:textfield name="username" key="login.username" size="20" />
        <s:password name="password" key="login.password" size="20" />
        <s:submit key="login.submit" />
    </s:form>
    <s:fielderror />
</body>
</html>
The key attributes reference properties from a message resource bundle for , and <s:fielderror> displays validation errors. For success and error pages, create success.jsp and error.jsp with simple content like welcome messages or error notifications, mapped via result strings. Configure the application flow in struts.xml, located in WEB-INF/classes or src/main/resources. Define the package, Action mapping, and result types to link the URL "/login" to the LoginAction class, specifying views for "success", "input", and other outcomes. A minimal configuration (using Struts 6.0 DTD for with 7.x):
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
    "https://struts.apache.org/dtds/struts-6.0.dtd">
<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <package name="default" extends="struts-default">
        <action name="login" class="com.example.LoginAction">
            <result name="success">/success.jsp</result>
            <result name="input">/login.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>
This setup enables the framework to intercept requests to "/login.action" and invoke . For testing and debugging, deploy the application to a servlet container like by packaging it as file and starting the . Access the form at http://localhost:8080/yourapp/login.action; submitting valid credentials (e.g., username "admin", password "pass") should redirect to success.jsp, while invalid ones return to login.jsp with . Common issues include the "NoActionFound" , often due to missing .action extensions in URLs or incorrect mappings in struts.xml—verify the name and namespace. Integrate for logging by adding its JAR and configuring log4j.properties to capture execution traces, such as:
properties
log4j.rootLogger=DEBUG, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.logger.org.apache.struts2=DEBUG
This logs framework events to the console during development. Note the logger name updated for new packages. To extend the application, add a simple interceptor for request logging by defining a custom one that implements Interceptor and logs incoming parameters before the Action executes. Register it in struts.xml within the default package's interceptor stack:
xml
<interceptors>
    <interceptor name="logger" class="com.example.LoggingInterceptor"/>
    <interceptor-stack name="defaultStack">
        <interceptor-ref name="logger"/>
        <interceptor-ref name="defaultStack"/>
    </interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>
The LoggingInterceptor class (with updated imports for Struts 7.x) could log details like:
java
import org.apache.struts2.ActionInvocation;
import org.apache.struts2.interceptor.Interceptor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LoggingInterceptor implements Interceptor {
    private static final Logger logger = LogManager.getLogger(LoggingInterceptor.class);

    @Override
    public void destroy() {}

    @Override
    public void init() {}

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        logger.info("Request intercepted: " + invocation.getProxy().getActionName());
        return invocation.invoke();
    }
}
This prepends to the default stack without altering behavior.

Adoption and Impact

Notable Projects and Usage

Apache Struts has seen widespread adoption in enterprise environments, particularly for building robust Java-based web applications in sectors such as banking, e-commerce, and defense. Notable users include for financial systems, for e-commerce platforms, and for government and aerospace-related portals. These organizations leverage Struts' MVC architecture to handle complex workflows and large-scale data processing, often in legacy systems that remain operational due to the framework's stability and integration capabilities. As of mid-2025, surveys indicate that over 4,567 companies worldwide continue to use Apache Struts, with a significant portion being large enterprises employing more than 10,000 people and generating over $1 billion in revenue. This represents approximately 0.8% of the overall backend framework , underscoring its persistent role in web development despite the rise of newer alternatives. A prominent highlighting Struts' impact is the , where attackers exploited a in Apache Struts (CVE-2017-5638) to access sensitive information of 147 million individuals. The incident, which stemmed from an unpatched version of the framework in Equifax's dispute portal, exposed critical risks in legacy deployments and prompted widespread audits across enterprises using Struts. In 2025, additional critical vulnerabilities (e.g., CVEs 2025-54656, 2025-48976, and 2025-48734) have further emphasized the need for updates in ongoing legacy systems. Successful migrations, such as those in and financial sectors, have involved updating to Struts 2.x or integrating modern practices to mitigate similar vulnerabilities without full rewrites. The Struts project's community remains active, with its official repository garnering 959 stars and reflecting ongoing contributions from maintaining and extending the framework. On , the 'struts' tag supports extensive discussions, aiding and best practices for implementations in environments.

Comparisons with Alternatives

Apache Struts, as an action-oriented MVC framework, is frequently contrasted with other Java web frameworks like Spring MVC, JavaServer Faces (JSF), and , highlighting differences in architecture, flexibility, and suitability for various application types. These comparisons reveal Struts' strengths in straightforward request handling and maturity within servlet-based environments, while exposing limitations in modern reactive paradigms or component-rich UIs. Compared to Spring MVC, Struts offers a simpler out-of-the-box MVC structure with less emphasis on (IoC), making it easier to set up basic action mappings without extensive configuration. However, Spring MVC excels in full-stack development through robust and , allowing for reusable components across layers like data access and . Struts' actions are instantiated per request, potentially increasing overhead in high-traffic scenarios, whereas Spring's controllers promote efficiency and testability. In contrast to JSF, adopts a lightweight, action-oriented approach focused on requests to handlers, which suits RESTful APIs and simpler web services but provides less support for complex, stateful user interfaces. JSF, being component-based, enables richer development with reusable widgets and event-driven rendering, offering multiple mechanisms for element rendering beyond Struts' direct generation via tags. Struts is thus preferable for backend-heavy applications, while JSF better serves interactive, form-centric frontends in enterprise settings. Against the , Struts remains servlet-centric and mature for traditional integrations, leveraging established plugins for validation and internationalization, but it lacks Play's reactive, stateless model optimized for scalable, real-time applications. Play emphasizes minimal resource use and hot-reloading for rapid iteration, making it more aligned with , whereas Struts is favored for maintaining legacy systems requiring servlet container compatibility. Key decision factors include , where Struts is more accessible for beginners due to its prescriptive MVC flow compared to Spring's broader ecosystem demands; performance, with benchmarks showing similar throughput in standard MVC tasks but Play edging out in asynchronous handling; and ecosystem maturity, pitting Struts' targeted plugins against Spring Boot's extensive starters for quicker integrations. Ultimately, Struts suits projects prioritizing simplicity and servlet heritage, while alternatives like Spring or Play better address enterprise-scale or reactive needs.

References

  1. [1]
    Welcome to the Apache Struts project
    Apache Struts is a free, open-source, MVC framework for creating elegant, modern Java web applications. It favors convention over configuration, is extensible ...Download a Release · Releases · Getting started · Announcements 2024
  2. [2]
    Apache Struts 1 End-Of-Life (EOL) Announcement
    Started in 2000, Struts 1 had its last release - version 1.3.10 - in December 2008. In the meantime the Struts community has focused on pushing the Struts 2 ...
  3. [3]
  4. [4]
    Download a Release of the Apache Struts
    The Apache Struts 7.1.1 is an elegant, extensible framework for creating enterprise-ready Java web applications. It is available in a full distribution, or as ...Missing: history | Show results with:history
  5. [5]
    Nutshell - Apache Struts
    Apache Struts 2 helps you create an extensible development environment for enterprise-grade applications, based on industry standards and proven design ...
  6. [6]
    From a birds eye - Apache Struts
    The Apache Struts web framework is a free open-source solution for creating dynamic web applications using Java. Web applications differ from conventional ...
  7. [7]
    Key Technologies Primer - Apache Struts
    Struts is written in the Java programming language. Java is an object-orientated language, and the framework makes good use of many object-orientated techniques ...
  8. [8]
    Apache Struts Releases
    Full releases for current version are listed at Download page. Individual JARs are also made available through Apache Maven repositories, like ibiblio.
  9. [9]
    Apache Struts 2.5.x End-Of-Life (EOL) Announcement
    The Struts 2.5.x web framework will reach its end of life in 6 months and won't be longer officially supported.
  10. [10]
    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 ...Missing: history | Show results with:history
  11. [11]
    MEDIA ALERT: The Apache Software Foundation Confirms Equifax ...
    Sep 14, 2017 · Apache Struts is an Apache Software Foundation Top-Level Project (since 2004) and is overseen by a self-selected team of active contributors ...
  12. [12]
    Project Management Committee Charter - Apache Struts
    The PMC is responsible for day-to-day management, overseeing code changes, ensuring lawful property, and making binding decisions. The PMC chair is the VP.Project Management... · Decision Making · Action Items
  13. [13]
    Apache Struts Committee
    Committee established: 2004-03 · PMC Chair: René Gielen · Reporting cycle: January, April, July, October, see minutes · PMC Roster (from committee-info; updated ...Missing: Management | Show results with:Management
  14. [14]
    Mailing Lists - Apache Struts
    Guidelines. Mailing lists provide a simple and effective communication mechanism. With potentially thousands of subscribers, there is a common set of etiquette ...Missing: JIRA | Show results with:JIRA
  15. [15]
    How to Help FAQ - Apache Struts
    Some Apache projects ask that you to submit your patch to the mailing list. We would prefer that you create a JIRA issue and then attach the patch to the issue.
  16. [16]
    Security - Apache Struts
    The Apache Struts 2 doesn't provide any security mechanism - it is just a pure web framework. Below are few tips you should consider during application ...Missing: audits | Show results with:audits<|control11|><|separator|>
  17. [17]
    Project Licenses - Apache Struts
    Apr 20, 2020 · 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, ...
  18. [18]
    Creation of the Struts Framework - Programming Jakarta Struts [Book]
    The Struts framework was created by Craig R. McClanahan and donated to the ASF in 2000. Craig is deeply involved in the expert groups for the Servlet and ...Missing: origins | Show results with:origins
  19. [19]
    Adopting Struts 2.0 - InfoWorld
    Oct 11, 2007 · Apache Struts (or simply Struts) was released in July 2001. Since its release, it has become the de facto standard for building Web ...<|control11|><|separator|>
  20. [20]
    Announcements 2003 - Apache Struts
    The Struts team is proud, and extremely pleased, to announce the Final release of Struts 1.1. This release includes significant new ...
  21. [21]
    Announcements 2004 - Apache Struts
    The Struts team is pleased to announce the release of Struts 1.2.6 Beta. This release includes minor new functionality, and a number of fixes for bugs.Missing: becomes top- level
  22. [22]
    Comparing Struts 1 and 2 - Apache Struts 2 Wiki - Apache Software Foundation
    ### Motivations for Moving from Struts 1 to Struts 2
  23. [23]
    Convention plugin - Apache Struts
    The Convention Plugin is bundled with Struts since 2.1 and replaces the Codebehind Plugin and Zero Config plugins. It provides the following features:Introduction · Setup · Converting a Codebehind... · Annotation reference
  24. [24]
    Apache Struts Statement on Equifax Security Breach - The ASF Blog
    Sep 9, 2017 · Equifax suffered from a security breach and information disclosure incident that was potentially carried out by exploiting a vulnerability in the Apache Struts ...Missing: audits | Show results with:audits
  25. [25]
    Announcements 2025 - Apache Struts
    The Apache Struts is an elegant, extensible framework for creating enterprise-ready Java web applications. The framework has been designed to streamline the ...
  26. [26]
    Announcements 2024 - Apache Struts
    Dec 19, 2024 · The Apache Struts is an elegant, extensible framework for creating enterprise-ready Java web applications. The framework has been designed to ...
  27. [27]
    Using tags - Apache Struts
    The most common use of the property tag is to “get” the value returned by calling a public get method (of the Action class) and then to include that value in ...
  28. [28]
    Core Developers Guide - Apache Struts
    Core Developers Guide. Struts 2 processes requests using three core types: interceptors, actions and results. Each may be configured via XML or annotations.
  29. [29]
    OGNL - Apache Struts
    OGNL is the Object Graph Navigation Language (see OGNL page for the full documentation of OGNL). Here, we will cover a few examples of OGNL features that co ...
  30. [30]
    The Struts 2 Request Flow - Apache Struts 2 Wiki - Apache Software Foundation
    ### Summary of Apache Struts 2 Request Flow and Core Components
  31. [31]
    Exception handling - Apache Struts
    In this tutorial we'll explore how to enable the Struts framework to handle any uncaught exceptions generated by a web application. Struts provides robust ...Global Exception Handling · Exception Handling Per Action · Logging Exceptions
  32. [32]
    struts-core 1.3.10 javadoc (org.apache.struts)
    apache.struts.chain.contexts, This package provides objects that encapsulate access to the request and session-scoped resources to service command processing.<|control11|><|separator|>
  33. [33]
    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, ...
  34. [34]
    Struts 1 - Building Controller Components - GitHub Pages
    Nov 29, 2008 · To use DynaActionForms with the Struts Validator, specify org.apache.struts.validator.ValidatorActionForm (or your subclass) as the form-bean ...
  35. [35]
  36. [36]
  37. [37]
    Action (Apache Struts API Documentation)
    Actions must be programmed in a thread-safe manner, because the controller will share the same instance for multiple simultaneous requests. This means you ...
  38. [38]
    Upgrading to Struts 1.3 - Apache Software Foundation
    Jul 1, 2019 · Beginning with Struts 1.3, a servlet container that supports Servlet 2.3 and JSP 1.2 (such as Tomcat 4.x) is required. 2. Packaging. While ...
  39. [39]
    A Quick Struts 2 Intro | Baeldung
    Nov 12, 2022 · Some of Struts 2 features are: POJO (plain old Java Objects)-based actions; plugin support for REST, AJAX, Hibernate, Spring, etc; convention ...
  40. [40]
    Annotations - Apache Struts
    Oct 24, 2010 · Struts provides an alternative to using XML to configure your application by using standard naming conventions and annotations for your action names.
  41. [41]
    JSON plugin - Apache Struts
    The JSON plugin provides a json result type that serializes actions into JSON. Given this JSON string: { "doubleValue": 10.10, "nestedBean": { "name": "Mr Bean ...Missing: S2JPA Portlet
  42. [42]
    Struts 2 + Spring 2 + JPA + AJAX - Apache Software Foundation
    Dec 27, 2006 · On this tutorial we will demonstrate how to setup Struts 2 in Eclipse, and make it work with Spring, Java Persistence API (using Hibernate) and ...
  43. [43]
    Portlet Plugin - Apache Struts
    The Portlet Plugin is used for developing JSR286 portlets using Struts 2. portlet-class. To use the Struts 2 Portlet framework, use org.apache.struts2.portlet.Missing: S2JPA JSON
  44. [44]
    Is Struts-core-6.X.X compatible with Jakartaee 10? - Stack Overflow
    Jul 11, 2023 · It is not clear but looks like Struts 2 is compatible only up to Java/Jakarta EE 8. Payara 6 only supports Jakarta EE 10.Can I use Apache Struts 2 with Java 11/17?Does latest version 6.* Struts2 support Tomcat 10?More results from stackoverflow.comMissing: modularization | Show results with:modularization
  45. [45]
    Async Plugin - Apache Struts
    The Async plugin allows to implement actions as using an Asynchronous Processing available as from Servlet API 3. It's a thin layer over the Servlet async layer ...
  46. [46]
    Token Interceptor - Apache Struts
    Ensures that only one request per token is processed. This interceptor can make sure that back buttons and double clicks don't cause un-intended side affects.
  47. [47]
    struts.xml - Apache Struts
    The core configuration file for the framework is the default ( struts.xml ) file and should reside on the classpath of the webapp (generally /WEB-INF/classes ).Missing: 2 | Show results with:2
  48. [48]
    Package Configuration - Apache Struts
    Package Configuration. Packages are a way to group actions, results, result types, interceptors, and interceptor-stacks into a logical configuration unit.
  49. [49]
    Annotations - Apache Struts
    Action Annotations. Since Struts 2.1, these annotations are provided by the Convention Plugin. Codebehind and Zero Config plugins are deprecated from Struts ...
  50. [50]
    Constant Configuration - Apache Struts
    Constants provide a simple way to customize a Struts application by defining key settings that modify framework and plugin behavior.
  51. [51]
    Interceptors - Apache Struts
    Interceptors can execute code before and after an Action is invoked. Most of the framework's core functionality is implemented as Interceptors.
  52. [52]
    Interceptor Configuration - Apache Struts
    Interceptors allow you to define code to be executed before and/or after the execution of an Action method. (The “Filter” pattern.)
  53. [53]
    Writing Interceptors - Apache Struts
    The intercept method is where the interceptor code is written. Just like an action method, intercept returns a result used by Struts to forward the request to ...
  54. [54]
    Namespace Configuration - Apache Struts
    Struts 2 Namespaces are the equivalent of Struts Action 1 modules, but more convenient and flexible. Default Namespace. The default namespace is "" - an ...
  55. [55]
    Wildcard Mappings - Apache Struts
    Wildcards can be used to combine similar mappings into one more generic mapping. The best way to explain wildcards is to show an example and walk through how ...
  56. [56]
    Reloading configuration - Apache Struts
    Struts allows for dynamic reloading of xml configuration file (ie, reloading actions.xml). This allows you to reconfigure your action mapping during development ...Missing: 2 | Show results with:2
  57. [57]
    Model Driven - Apache Struts
    In Struts 2 request parameters are bound directly to fields in the actions class, and this class is placed on top of the stack when the action is executed.
  58. [58]
    Validation - Apache Struts
    Struts 2 validation is configured via XML or annotations. Manual validation in the action is also possible, and may be combined with XML and annotation-driven ...Missing: Jakarta EE<|control11|><|separator|>
  59. [59]
    Validations Annotation - Apache Struts
    If you want to use several annotations of the same type, these annotations must be nested within the @Validations() annotation.
  60. [60]
    Validation Interceptor - Apache Struts
    This interceptor runs the action through the standard validation framework, which in turn checks the action against any validation rules.Missing: FieldError | Show results with:FieldError
  61. [61]
    Client Side Validation - Apache Struts
    Client-side validation can be enabled on a per-form basis by specifying validate="true" in the form tag.
  62. [62]
    Localization - Apache Struts
    The framework supports internationalization (i18n) in the following places: the UI Tags; Messages and Errors from the ValidationAware; Within action classes ...
  63. [63]
    text tag - Apache Struts
    If the named message is not found in a property file, then the body of the tag will be used as default message. If no body is used, then the stack can be ...Missing: view | Show results with:view
  64. [64]
    Formatting Dates and Numbers - Apache Struts
    Struts2 supports localization (l10n) aware formatting of dates, times and numbers very easily, utilizing Java's built-in date formatting features.
  65. [65]
  66. [66]
    Hello World using Struts
    The <s:property> tag displays the value returned by calling the method getMessageStore of the HelloWorldAction controller class. That method returns a ...
  67. [67]
    IntelliJ IDEA plugin - Apache Struts
    Apr 1, 2024 · The plugin has been adapted to support the latest versions of the Struts framework and as well to support the latest IntelliJ IDEA.
  68. [68]
    StrutsClipse · Struts2 plugin for Eclipse IDE
    StrutsClipse provides Eclipse IDE integration for developing Apache Struts2 based applications. Struts XML Content assist Hyperlinks Validation Quick Outline
  69. [69]
    JUnit plugin - Apache Struts
    The JUnit Plugin supports testing actions within a Struts invocation, meaning that a full request is simulated, and the output of the action can be tested.
  70. [70]
    Apache Struts - HG Insights - Technology Discovery Platform
    Apache Struts (formerly Jakarta Struts) is an open-source MVC framework designed for developers. It enables users to create and build Java-based ...Missing: adoption examples Alibaba government
  71. [71]
    Why Many Enterprises Still Run on Apache Struts 1 & 2 (and How to ...
    May 23, 2025 · This article explains why organizations stay on legacy Struts, the risks associated with them, and how to keep those systems secure and compliant without a ...
  72. [72]
    Market Share of Apache Struts - JavaScript MVC Framework - 6Sense
    Around the world in 2025, over 4610 companies have started using Apache Struts as JavaScript MVC Framework tool. Customers, Employee Range, City, Region ...
  73. [73]
    Companies using Apache Struts and its marketshare - Enlyft
    1812 companies use Apache Struts. Apache Struts is most often used by companies with >10000 employees & $>1000M in revenue. Our usage data goes back 8 years ...Missing: 2025 | Show results with:2025
  74. [74]
    Struts - Overview, Market Share, Users & Alternatives
    According to our data, Struts ranks 17th among the backend frameworks we track. It has 0.8% of the backend framework market share and is detected on 0.09% of ...
  75. [75]
    Equifax, Apache Struts, and CVE-2017-5638 Vulnerability
    Sep 14, 2017 · Equifax confirmed that their high-profile, high-impact data breach was due to an exploit of a vulnerability in an open source component, Apache Struts CVE-2017 ...
  76. [76]
    Equifax Releases Details on Cybersecurity Incident, Announces ...
    Sep 15, 2017 · The attack vector used in this incident occurred through a vulnerability in Apache Struts (CVE-2017-5638), an open-source application framework ...
  77. [77]
    Apache Struts is a free, open-source, MVC framework for ... - GitHub
    Apache Struts is licensed under the Apache License 2.0 and this will not change. We maintain a clean IP and you are “safe” to use the project. Sometimes you ...
  78. [78]
    Newest 'struts' Questions - Stack Overflow
    The Apache Struts web framework is a free open-source solution for creating Java web applications. Sign up to watch this tag and see more personalized content.
  79. [79]
    STRUTS 2 vs SPRINGMVC: Know the Difference & Choose ... - DZone
    Sep 15, 2015 · Struts 2 Actions are initiated every time when a request is made, whereas in Spring MVC the Controllers are created only once, stored in memory ...Missing: comparison | Show results with:comparison
  80. [80]
    Difference between Spring MVC and Struts MVC - Stack Overflow
    May 30, 2011 · The major difference between Spring MVC and Struts is: Spring MVC is loosely coupled framework whereas Struts is tightly coupled.Missing: comparison | Show results with:comparison
  81. [81]
    Developing Web Applications with JavaServer Faces - Oracle
    JSF, however, does have some advantages over Struts. For example, in Struts there is only one way to render an element, while JSF provides several mechanisms ...
  82. [82]
  83. [83]
    overview - 1.2 - Play Framework
    The Play framework is a clean alternative to bloated Enterprise Java stacks. It focuses on developer productivity and targets RESTful architectures. Play is a ...Play Framework Overview · Fix The Bug And Hit Reload · Simple Stateless Mvc...
  84. [84]
    Compare apache struts vs play framework - DiscoverSDK
    Play is based on a lightweight, stateless, web-friendly architecture and features predictable and minimal resource consumption (CPU, memory, threads) for ...
  85. [85]
    Java MVC Frameworks Comparison | JRebel by Perforce
    Nov 9, 2023 · The comparison includes Spring, Grails, Vaadin, GWT, Wicket, Play!, Struts, and JSF, based on rapid prototyping, complexity, ease of use, and ...
  86. [86]
    Top 10 Java Backend Frameworks - Netguru
    Sep 3, 2025 · From the widely acclaimed Spring Framework to the innovative Play Framework, these frameworks cater to various aspects of backend development.