JBoss Seam – konwersacje
Po krótkiej przerwie wracam do omawiania JBoss Seam. Tym razem zajmę się konwersacjami, czyli – w uproszczeniu – sesyjnymi komponentami stanowymi zintegrowanymi ze stroną internetową.
Uruchamiam środowisko Eclipse, otwieram File→New→Seam Conversation, w polu Seam component name wpisuję SampleConversation i klikam Finish. W przeciwieństwie do akcji, kreator konwersacji tworzy tylko dwa pliki:
sampleConversation.xhtml- strona konwersacji w projekcie aplikacji WWW,
SampleConversation.java- plik z komponentem sesyjnym.
Komponent sesyjny
Do pliku zaimportowane są następujące pakiety:
import static org.jboss.seam.ScopeType.CONVERSATION; import java.io.Serializable; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Begin; import org.jboss.seam.annotations.End; import org.jboss.seam.annotations.Logger; import org.jboss.seam.annotations.Scope; import org.jboss.seam.log.Log;
Sam komponent implementuje Serializable i posiada dwie adnotacje – @Scope(CONVERSATION) oznacza, że komponent ma być widoczny w ramach jednej konwersacji (kiedy indziej napiszę więcej na ten temat), zaś @Name to nazwa komponentu:
@Scope(CONVERSATION)
@Name("SampleConversation")
public class SampleConversation
implements Serializable {
}
Poniżej przedstawione zostały pola i metody prostej konwersacji generowanej przez JBoss Tools:
@Logger
private Log log;
private int value;
@Begin
public String begin() {
log.info("beginning conversation");
return "success";
}
public String increment() {
log.info("incrementing");
value++;
return "success";
}
@End
public String end() {
log.info("ending conversation");
return "home";
}
public int getValue() {
return value;
}
Komponent posiada pole value, którego wartość może zostać pobrana przy pomocy metody getValue. Metoda begin rozpoczyna nową konwersację (@Begin), zaś end ją kończy (@End) i powraca na stronę home.seam. W trakcie trwania konwersacji pole value może być inkrementowane przy wykorzystaniu metody increment. W klasie dostępne jest jeszcze pole log, które pozwala na zapisywanie komunikatów do pliku lub na konsolę.
Strona
Aktywne elementy pliku XHTML to wartość pola value:
<span class="value">#{SampleConversation.value}</span>
oraz przyciski zarządzające konwersacją:
<h:commandButton id="begin" value="Begin"
action="#{SampleConversation.begin}"
rendered="#{not conversation.longRunning}"/>
<h:commandButton id="inc" value="Increment"
action="#{SampleConversation.increment}"
rendered="#{conversation.longRunning}"/>
<h:commandButton id="end" value="End"
action="#{SampleConversation.end}"
rendered="#{conversation.longRunning}"/>
Tekst na przyciskach to kolejno Begin, Increment i End, i uruchamiają metody begin, increment oraz end komponentu SampleConversation. Pierwszy z nich widoczny jest wtedy, gdy konwersacja nie została rozpoczęta (#{not conversation.longRunning}), zaś dwa pozostałe – gdy konwersacja trwa (#{conversation.longRunning}).
Zasady dotyczące tworzenia konwersacji
Tak jak w przypadku akcji, wskazane jest stosowanie zasady otwarcia i zamknięcia. Konwersacja jest komponentem stanowym i może zawierać wiele metod, wykonywanych w kolejności lub nie. Jednak z punktu widzenia użytkownika jedna konwersacja powinna pozwalać na wykonanie jednej (choć złożonej) czynności.
Podsumowanie
W przeciwieństwie do pojedynczych akcji, konwersacje mogą składać się z wielu wywołań różnych metod. Jest to szczególnie przydatne w sytuacji, gdy jakaś czynność wymaga przeprowadzenia wielu operacji na zestawie danych bez konieczności ich każdorazowego zapisywania do bazy.



