Lukasz Lenart created WW-5791:
---------------------------------
Summary: Struts Boot: run a Struts application from main() with an
embedded container and programmatic action registration
Key: WW-5791
URL: https://issues.apache.org/jira/browse/WW-5791
Project: Struts 2
Issue Type: New Feature
Components: Core
Reporter: Lukasz Lenart
Fix For: 7.5.0
h2. Goal
Give newcomers a working Struts application with almost no setup: add one
dependency, write an action class, run {{main()}}, see the page. No
{{web.xml}}, no {{struts.xml}}, no external servlet container. Standalone — no
Spring dependency.
h2. Minimal scope
* New {{struts-boot-starter}} artifact pulling in core and an embedded servlet
container (Tomcat), registering {{StrutsPrepareAndExecuteFilter}} in code.
* {{StrutsBoot.run(App.class, args)}} entry point; the application class
implements {{StrutsBootApplication}}.
* Fluent action registration, fed into the configuration through a single
{{ConfigurationProvider}} built on {{PackageConfig}} / {{ActionConfig}} /
{{ResultConfig}} builders. No Convention plugin, no classpath scanning.
{code:java}public class HelloApp implements StrutsBootApplication {
public static void main(String[] args) {
StrutsBoot.run(HelloApp.class, args);
}
@Override
public void actions(ActionRegistry actions) {
actions.action("hello", HelloAction.class)
.success("hello.ftl");
actions.namespace("/admin", admin -> {
admin.action("users", UserAction.class)
.method("list")
.success("admin/users.ftl");
admin.action("users/save", UserAction.class)
.method("save")
.httpMethods(POST)
.result("input", "admin/userForm.ftl")
.redirectAction("success", "users");
});
}
}
{code}
* Defaults: each namespace is a package extending {{struts-default}}; top level
is namespace {{""}}; {{method}} defaults to {{execute}}; {{success(path)}} is
shorthand for {{result("success", path)}}; interceptors default to
{{defaultStack}}, overridable per action or namespace by stack name;
{{httpMethods(...)}} maps to the http-method restriction from WW-3717.
* Views: FreeMarker only, chosen by {{.ftl}} extension, resolved from
{{classpath:/templates/}}.
* Configuration: the existing {{struts.properties}}; Boot-only settings (port,
context path) under a {{struts.boot.*}} prefix. Not {{application.properties}},
to avoid clashing with Spring Boot.
* A {{struts.xml}} on the classpath is still loaded alongside the registry.
* Runnable fat jar via a Maven plugin.
h2. Parked for later
* Running an existing Struts WAR as a self-contained jar (migration path).
* JSP views in the embedded container.
* Gradle plugin.
* Alternative containers (Jetty, Undertow).
* Fluent definition of custom interceptor stacks.
* Global results, global exception mappings, wildcard actions in the registry.
* Optional bridge to Convention plugin annotations.
* Dev-mode reload of templates and registry.
* Project generator / quick-start archetype.
* Health and info endpoints.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)