JBoss Seam – akcje
Najprostrzymi składnikami JBoss Seam udostępniającymi funkcjonalność są akcje. W odniesieniu do EJB, akcja jest po prostu bezstanowym komponentem sesyjnym.
Ale po kolei… File→New→Seam Action – wypełniam tylko Seam component name wpisując SampleAction. Klikam Finish. Otrzymuję kilka nowych plików:
sampleAction.xhtml- w projekcie aplikacji WWW,
SampleAction.java- plik z interfejsem lokalnym komponentu,
SampleActionBean.java- plik z komponentem,
SampleActionTest.java- plik z testami komponentu (w projekcie testów),
SampleActionTest.xml- plik konfiguracyjny testów.
O testach napiszę przy innej okazji.
Plik XHTML zawiera najprostrzy interfejs WWW służący do wykonania akcji. Kluczowym elementem jest przycisk wywołujący właściwą metodę:
<h:commandButton
id="sampleAction"
value="sampleAction!"
action="#{SampleAction.sampleAction}"/>
Lokalny interfejs komponentu
package org.domain.project.session;
import javax.ejb.Local;
@Local
public interface SampleAction {
public void sampleAction();
}
Serwer Java EE określa się mianem kontenera komponentów EJB (w tym przypadku także komponentów Seam). Aby komponent mógł być obsługiwany przez inne klasy znajdujące się wewnątrz kontenera, musi posiadać interfejs lokalny (istnieją też interfejsy zdalne, lecz w przypadku aplikacji WWW są one zbędne). Taki interfejs oznaczony jest adnotacją @Local i zawiera wszystkie udostępniane metody komponentu.
Komponent sesyjny
package org.domain.project.session;
import javax.ejb.Stateless;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.log.Log;
import org.jboss.seam.international.StatusMessages;
@Stateless
@Name("SampleAction")
public class SampleActionBean implements SampleAction {
@Logger private Log log;
@In StatusMessages statusMessages;
public void sampleAction() {
log.info("SampleAction.sampleAction() action called");
statusMessages.add("sampleAction");
}
}
Komponenty sesyjne służą do wykonywania pewnych czynności związanych z logiką biznesową programu. Komponenty bezstanowe (@Stateless) nie pamiętają własnego stanu (no dobrze – pamiętają, ale stan komponentu może być zmieniany przez dowolnego klienta). Co za tym idzie, każda metoda komponentu bezstanowego wykonuje wszystkie czynności powiązane ze sobą ciągiem przyczynowo-skutkowym. Innymi słowy, każde kolejne wywołanie metody komponentu jest niezależne od poprzednich.
Nazwa komponentu (@Name) określa nazwę, pod jaką komponent ma być udostępniany. Na przykład w pliku XHTML istnieje odwołanie do komponentu o nazwie SampleAction.
Do zapisywania informacji do logów służy pole typu Log oznaczone adnotacją @Logger. Wszelkie komunikaty będą zapisywane do właściwych plików na serwerze, ale mogą być też wyświetlane na konsoli.
Pole statusMessages pozwala przekazywać pewne komunikaty do strony internetowej. Na przykład po wywołaniu metody sampleAction() zostanie wyświetlony komunikat o treści sampleAction.
Zasady dotyczące tworzenia akcji
Wszelkie akcje powinny być tworzone z zachowaniem zasady hermetyzacji zmienności oraz zasady otwarcia i zamknięcia. Dlatego nie należy implementować zbyt szerokiej funkcjonalności w jednej akcji. Idealnym rozwiązaniem byłoby zawarcie w jednym komponencie tylko jednej metody, ewentualnie kilku ściśle powiązanych ze sobą metod.
Podsumowanie
Akcje realizują podstawową funkcjonalność aplikacji JBoss Seam. Zaryzykowałbym stwierdzenie, że wszystkie funkcje programu można zrealizować z ich użyciem. Jednak niekiedy wygodniej jest wykorzystać sesyjne komponenty stanowe, zwane konwersacjami. Ale o tym kiedy indziej.




Cześć
Możesz mi podpowiedzieć dlaczego @Name może nie działać? Usunąłem wpis odnośnie ziarna z faces-config.xml, zamiast tego dałem właśnie @Name(„nazwa”) i wywołanie funkcji ziarna (w szablonie), czyli #{nazwa.mojafunkcja) nie zwraca wyniku. W logach nie ma wyjątków
Seam 2.2.2, Tomcat 7.0.11
Cześć,
Niestety powodów takiego zachowania może być wiele: brak zdefiniowanego interfejsu lokalnego, brak
publicprzy metodzie albo nawet zwykła literówka. Pisząc w Seamie nauczyłem się sprawdzać wszystko po 5 razy.Pozdrawiam
hej
problem rozwiązałem, brakowało pustego pliku seam.properties
http://ryznar.wordpress.com/2011/06/01/seam-adnotacja-name-nie-dziala/