Skip to main content

Posts

Showing posts from March, 2009

Wstrzykiwanie EJB do akcji Struts2 z @EJB

Chciałbym dzisiaj pokazać niekoniecznie odkrywczy, ale dość ciekawy przykład integracji frameworku Struts2 z EJB3 - a wszystko sklejone za pomocą Springa. Tytuł posta jest bowiem tendencyjny: EJB można wstrzykiwać do dowolnych beanów Springowych, ale skupimy się na akcjach Struts2. Przyjmijmy, że w naszej aplikacji istnieje EJB z lokalnym interfejsem DateServiceLocal : @Local public interface DateServiceLocal { String getCurrentDate(Locale locale, TimeZone timeZone); } Usługa prosta, zwraca bieżący czas w podanej strefie czasowej, uwzględniając lokalizację (np. czas w Australii po rosyjsku). Z drugiej strony chcemy skorzystać z tej usługi w akcji Struts2. Jednak brzydzi nas (anty)wzorzec Service Locator, a tym bardziej szastanie na prawo i lewo klasą InitialContext . Mamy XXI wiek, " don't call me, I'll call you " głosi hasło reklamowe wzorca Dependency Injection. Nasza akcja powinna wyglądać tak: public class DateAction extends ActionSupport { @EJB private DateS

Wzorzec Visitor - realny przykład

Wizytator (odwiedzający) jest bardzo ciekawym wzorcem projektowym. Ponieważ wytłumaczenie w dwóch zdaniach do czego ten wzorzec służy jest dość trudne, zacznijmy od przykładu. Załóżmy, że w naszym systemie przechowujemy informacje o klientach różnego typu. Każdemu typowi odpowiada jedna klasa dziedzicząca po klasie Customer (z punktu widzenia wzorca może to też być klasa abstrakcyjna czy nawet interfejs): NormalCustomer , VipCustomer , GroupCustomer . Jedną z funkcji systemu ma być generowanie listu powitalnego dla każdego klienta, przy czym list ten ma się znacząco różnić w zależności od typu klienta. Zadanie wydaje się trywialne:  public class Customer {  //...  public abstract Letter generateInvitationLetter();  //...  } ...i wystarczy zaimplementować odpowiednią metodę w każdej z klas reprezentujących typ klienta. Polimorfizm, głupcze! - chciałoby się sparafrazować Billa Clintona. Ale czy na pewno? Za chwilę zauważymy, że każda z tych metod wymaga do pracy komponentu LetterSe