Kwiecień
08
2009

JBoss Seam – akcje

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

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.


3 odpowiedzi do “JBoss Seam – akcje”

  1. 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

  2. Cześć,

    Niestety powodów takiego zachowania może być wiele: brak zdefiniowanego interfejsu lokalnego, brak public przy metodzie albo nawet zwykła literówka. Pisząc w Seamie nauczyłem się sprawdzać wszystko po 5 razy.

    Pozdrawiam

  3. hej

    problem rozwiązałem, brakowało pustego pliku seam.properties :P http://ryznar.wordpress.com/2011/06/01/seam-adnotacja-name-nie-dziala/

Napisz Komentarz

*