Pluggable framework architecture that allows request lifecycles to be customized for each action.
Flexible validation framework that allows validation rules to be decoupled from action code.
Hierarchical approach to internationalization that simplifies localizing applications.
Automatic type conversion that transparently maps values from HTTP to native Java data objects, solving one of the most tedious efforts when creating web applications.
Integrated dependency injection engine that manages component lifecycle and dependencies. (By default, the framework utilizes Spring for dependency injection.)
Modular configuration files that use packages and namespaces to simplify managing large projects with hundreds of actions.
Java 5 annotations that reduce configuration overhead. (Java 1.4 is the minimum platform.)
View
Reusable user interface tags that allow for easy component-oriented development using themes and templates. Bundled tags ranges from simple text fields to advanced tags like date pickers and tree views.
JSTL-compatible expression language (OGNL) that exposes properties on multiple objects as if they were a single JavaBean.
Optional Interceptor plugins that can execute long-running queries in the background, prevent multiple form submissions, or handle custom security schemes.