Currently if you support multiple extensions (eg. struts.action.extension=action,html,,) there is no way to tell struts for a particular action which extension you always want to use. This has two downsides:
1. When struts has to generate an url, for example in the form tag, or the "redirectAction" result type, there is no way to specify the extension to use, so it ends up using the current invocation's extension if possible, or otherwise the default, neither of which might be correct.
2. You can invoke the action with any of the supported extensions, creating duplicate pages with no clear canonical version. (Bad for SEO as well)
What I propose is allowing the user to specify an optional specific extension at the package and action level in the struts xml configuration like so:
1. When selecting an extension when building an URL for an action, it would first see if there was an extension to use at the action level. If not it would check the package level (including package inheritance). If still no specific extension, it would behave as it currently does.
2. When mapping an incoming URL to an action, the reverse will also hold. If the action or its package specify a specific extension, then the action can only be matched if the URL has that extension.
So in the above example, the following urls would be expected to work:
1. /a1 (action level no extension)
2. /b1.html (action level "html" extension)
3. /c1.action (no action level extension, using package level "action" extension)
However, an url like "/b1.action" will not match any actions because "action" extension doesn't match the action's "html" extension.
This change would be 100% backwards because if you don't specify any extension attributes on the package or action, it falls back to the current behavior.