2011-01-05 16 views
7

Mam stan akcji, który ocenia wyrażenie, a następnie przechodzi do różnych innych stanów w zależności od wyniku. Jednym ze stanów wyniku jest stan podrzędny, który przekazuje kontrolę do innego przepływu, przykład;Spring Webflow: jak przekazać atrybut z jednego przepływu do drugiego podczas przejścia?

<action-state id="doWork"> 
    <evaluate expression="someAction.doWork(someInput)" /> 
<transition on="WORKSUCCESS" to="workSuccess" /> 
<transition on="WORKFAIL" to="fixFail" /> 
</action-state> 

<subflow-state id="fixFail" subflow="someOtherPlace/someOtherWorkToFixFail"> 
    <input name="someNumber" value="1" type="java.lang.Integer" /> 
    <transition on="finish" to="workSuccess" /> 
</subflow-state> 

Jak widać mogę przejść wejście do subflow poprzez tagu wejściowego ale moje pytanie brzmi: w jaki sposób mogę określić i przekazać dodatkowe wejścia, które chcę występować wtedy i tylko wtedy, gdy subflow-stan jest nazywany z przejścia WORKFAIL? Załóżmy, że stan podrzędny "fixFail" można wywołać z innych stanów akcji.

Próbowałem rzeczy podobnych do poniższych bez żadnego efektu;

<action-state id="doWork"> 
    <evaluate expression="someAction.doWork(someInput)" /> 
<transition on="WORKSUCCESS" to="workSuccess" /> 
<transition on="WORKFAIL" to="fixFail"> 
      <attribute name="newInput" value="3000" type="java.lang.Integer" /> 
    </transition> 
</action-state> 

<subflow-state id="fixFail" subflow="someOtherPlace/someOtherWorkToFixFail"> 
    <input name="someNumber" value="1" type="java.lang.Integer" /> 
    <input name="someNumber2" value="flowScope.newInput" type="java.lang.Integer" /> 
    <transition on="finish" to="workSuccess" /> 
</subflow-state> 

Odpowiedz

13

Istnieją trzy sposoby na wykonanie tego. Można to zrobić poprzez rozmowę, sesji lub jako atrybuty przekazywane w

  • ConversationScope. Jeśli pole jest w conversationScope pole jest widoczne wszędzie w tej konkretnej przepływu jak również subflows że przepływ (oraz ich przejściami)

  • SessionScope: (Prawdopodobnie nie co chcesz) jest widoczna dla wszystkich przepływów i
    ich subflows

Finał ly można przekazać pole jako atrybut w stan subflow np

<subflow-state id="fixFail" subflow="someOtherPlace/someOtherWorkToFixFail"> 
    <input name="someNumber" value="1" type="java.lang.Integer" /> 
    <input name="someNumber2" value="flowScope.newInput" type="java.lang.Integer" /> 
    <transition on="finish" to="workSuccess" /> 
</subflow-state> 

w twojej subflow za xml

<?xml version="1.0" encoding="UTF-8"?> 
<flow> 
    <input name="someNumber"/> 
    <input name="someNumber2"/> 
    ... 
</flow> 

W tym przykładzie someNumber i someNumber dwa są przekazywane jako atrybutów swojej subflow. W którym można je ocenić jako ${someNumber}

EDIT:

To jest zajęcie swój komentarz pytanie. Jeśli chcesz ustawić zmienną w zakresie konwersacji w określonym okresie przejściowym można zrobić:

<transition on="WORKFAIL" to="fixFail" > 
    <set name="conversationScope.someVariable" value="Hello World"/> 
</transition> 

Następnie w JSP

${someVariable} <!-- This will print out 'Hello World' --> 
+0

Hmmm conversationScope brzmi jak co chcę w tym przypadku myślę. Zgadzam się, że sesja jest tym, czego chcę, ponieważ użytkownik powtarza te przepływy po ich pierwszym zakończeniu i czy pozostałyby jakieś atrybuty sesji, prawda? Gdzie atrybuty z zakresami konwersacji znikałyby, gdy główny przepływ zakończyłby się i nie byłby obecny, gdyby użytkownik wprowadził przepływ główny po raz drugi, prawda? Czy istnieje sposób dodania do conversationScope w przejściu na = "WORKFAIL"? Chciałbym zachować go w xml/jsps, a nie dodawać do kodu Java akcji. –

+0

@Nick Foote - spójrz na moją edycję, aby odpowiedzieć na twoje pytanie –

+0

Pozdrawiam, że działa jak uczta, tak oczywiste, kiedy widzisz, próbowałem różnego rodzaju rzeczy jak $ {converationScope.someVariable} w jsp !! –

Powiązane problemy