Zaawansowane odwzorowania wieloznaczne Parametry nie zostały znalezione w metodzie Prepare ()
Z dokumentacji:Zaawansowane odwzorowania wieloznaczne Struts2:
Zaawansowane symbole wieloznaczne
Od 2.1.9+ można zdefiniować wyrażenia regularne zdefiniowane w nazwie akcji. Aby użyć tej formy wieloznacznej, należy ustawić następujące stałe:
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<constant name="struts.patternMatcher" value="regex" />
Wyrażenia regularne mogą być w dwóch formach, najprostsza jest{FIELD_NAME}
, w którym to przypadku pole zFIELD_NAME
w akcji zostanie wypełniony dopasowany tekst, na przykład:
<package name="books" extends="struts-default" namespace="/">
<action name="/{type}/content/{title}" class="example.BookAction">
<result>/books/content.jsp</result>
</action>
</package>
W tym przykładzie, jeśli adres URL/fiction/content/Frankenstein
jest wymagane, pole BookAction ”type
„zostanie ustawiony na”fiction
„i pole”title
„zostanie ustawiony na”Frankenstein
„
Jest to absolutnie świetne i działa dobrze, jeśli czytasz te zmienne w zwykłej metodzie akcji, jakexecute()
.
Jeśli spróbujesz przeczytać je zprepare()
metoda, są zerowe, ponieważPrepareInterceptor
uruchamia się przed innymi Interceptorami odpowiedzialnymi za ustawianie parametrów; zwykłym sposobem rozwiązania tego problemu jest użycie odpowiedniego stosu przechwytywacza, aby uzyskać parametry już wypełnione podczas wykonywaniaprepare()
metoda...
Z dokumentacji:ParamsPrepareParamStack
<!-- An example of the paramsPrepareParams trick. This stack
is exactly the same as the defaultStack, except that it
includes one extra interceptor before the prepare interceptor:
the params interceptor.
This is useful for when you wish to apply parameters directly
to an object that you wish to load externally (such as a DAO
or database or service layer), but can't load that object
until at least the ID parameter has been loaded. By loading
the parameters twice, you can retrieve the object in the
prepare() method, allowing the second params interceptor to
apply the values on the object. -->
Działa to doskonale dla parametrów pochodzących ze strony, ale tonie działa dla parametrów ustawionych przez Zaawansowane symbole wieloznaczne. Nadal są zerowe.
Jak rozwiązać ten problem?