Erweiterte Platzhalterzuordnungen Parameter wurden in der Prepare () - Methode nicht gefunden

Aus der Dokumentation:Erweiterte Wildcard-Zuordnungen von Struts2:

Erweiterte Platzhalter

Ab 2.1.9 können reguläre Ausdrücke im Aktionsnamen definiert werden. Um diese Form des Platzhalters zu verwenden, müssen die folgenden Konstanten festgelegt werden:

<constant name="struts.enable.SlashesInActionNames" value="true"/> 
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<constant name="struts.patternMatcher" value="regex" />

Die regulären Ausdrücke können in zwei Formen vorliegen, die einfachste ist{FIELD_NAME}, in welchem ​​Fall das Feld mit demFIELD_NAME in der Aktion wird mit dem passenden Text aufgefüllt, zum Beispiel:

<package name="books" extends="struts-default" namespace="/">
    <action name="/{type}/content/{title}" class="example.BookAction">
        <result>/books/content.jsp</result>
    </action> 
</package>

In diesem Beispiel, wenn die URL/fiction/content/Frankenstein wird angefordert, BookAction's Feld "type"wird gesetzt auf"fiction"und das Feld"title"wird gesetzt auf"Frankenstein".

Dies ist absolut großartig und funktioniert gut, wenn Sie diese Variablen in einer regulären Action-Methode lesen, wie zexecute().

Wenn Sie versuchen, sie aus dem zu lesenprepare() Methode, sie sind null, weil diePrepareInterceptor Läuft, bevor die anderen Interceptors für die Einstellung der Parameter verantwortlich sind. Die übliche Methode zur Behebung dieses Problems besteht darin, den entsprechenden Interceptor Stack zu verwenden, um die Parameter abzurufen, die bereits bei der Ausführung von ausgeführt wurdenprepare() Methode...

Aus der Dokumentation: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. -->

Dies funktioniert gut für Parameter, die von der Seite kommen, aber esfunktioniert nicht für die von Advanced Wildcards festgelegten Parameter. Sie sind immer noch null.

Wie kann dieses Problem behoben werden?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage