...
* | Matches zero or more characters excluding the slash ('/') character. | ||||
** | Matches zero or more characters including the slash ('/') character. | ||||
\character | The backslash character is used as an escape sequence. Thus
matches the character asterisk ('*'), and
matches the character backslash ('\'). |
Note |
---|
Patterns can optionally be matched "loosely". When the end of the pattern matches *[^*]*$ (wildcard, no wildcard, wildcard), if the pattern fails, it is also matched as if the last two characters didn't exist. The goal is to support the legacy "*!*" syntax, where the "!*" is optional. |
In the action mapping and action results, the wildcard-matched values can be accessed with the token {N} where N is a number from 1 to 9 indicating which wildcard-matched value to substitute. The whole request URI can be accessed with the {0} token.
...
Note |
---|
Similar functionality can also be implemented using a custom ActionMapper. The ActionMapper will need to parse the namespace and request itself to set parameters on the matched action. The default ActonMapper is responsible for invoking the PatternMatcher. |
Parameters after the action name
To use parameters in the URL, after the action name, make sure this is set:
...
Code Block | ||||
---|---|---|---|---|
| ||||
<package name="edit" extends="struts-default" namespace="/edit"> <action name="/person/*" class="org.apache.struts.webapp.example.EditAction"> <param name="id">{1}</param> <result name="failure" path="<result>/mainMenu.jsp"jsp</>result> </action> </package> |
When a URL like /edit/person/123
is requested, EditAction will be called, and its "id" field will be set to 123.
Advanced Wildcards
From 2.1.9+ regular expressions can be defined defined in the action name. To use this form of wild card, the following constants must be set:
Code Block | ||||
---|---|---|---|---|
| ||||
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<constant name="struts.patternMatcher" value="regex" />
|
The regular expressions can be in two forms, the simplest one is {FIELD_NAME}, in which case the field with the FIELD_NAME in the action will be populated with the matched text, for example:
Code Block | ||||
---|---|---|---|---|
| ||||
<package name="books" extends="struts-default" namespace="/">
<action name="/{type}/content/{title}" class="example.BookAction">
<result>/books/content.jsp</result>
</action>
</package>
|
In this example, if the url /fiction/content/Frankenstein
is requested, BookAction's field "type" will be set to "fiction", and the field "title" will be set to "Frankenstein".
The regular expression can also be in the form {FIELD_NAME:REGULAR_EXPRESSION}. The regular expression is a normal Java regular expression. For example:
Code Block | ||||
---|---|---|---|---|
| ||||
<package name="books" extends="struts-default" namespace="/">
<action name="/{type}/{author:.+}/list" class="example.ListBooksAction">
<result>/books/list.jsp</result>
</action>
</package>
|
In this example, if the url /philosophy/AynRand/list
is requested, ListBooksAction's field "type" will be set to "philosophy" and "author" to "AynRand".
The matched groups can still be accessed using the {X} notation, like:
Code Block | ||||
---|---|---|---|---|
| ||||
<package name="books" extends="struts-default" namespace="/">
<action name="/books/{ISBN}/content" class="example.BookAction">
<result>/books/{1}.jsp</result>
</action>
</package>
|