Kwiecień
17
2009

JBoss Seam – konwersacje

Słowa kluczowe: | Kategorie: Seam Framework
No Gravatar

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, IncrementEnd, 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.

Napisz Komentarz

*