People and technology
RSS Feed

Articles

  • Radzenie sobie z błędami w Tapestry5

    Dziś przyjrzymy się stronom błędu jakie generuje nam Tapestry, i wcale nie będzie to negatywny temat. Tapestry 5 stara się poprawić produktywność developera również w tym aspekcie i dostarczając jak najwięcej informacji. Jeśli się spodziewacie, że za chwilę wkleję wam stack trace na 6 ekranów to grubo się zawiedziecie. No, ale po kolei. Zacznijmy od kodu. Na początek dodajmy w klasie strony 3 gettery i w templacie strony dodajemy wywołanie wszystkich 3

    
    	public String getHello(){
    		return "Hello";
    	}
    	public String getHi(){
    		return "Hi";
    	}
    	public String getWorld(){
    		return "World";
    	}
    
    	${getHi()}<br/>
    	${HelLo}<br/>
    	${word}<br/>
    

    Naszym oczom ukaże się kolorowa, pozytywnie nastawiająca, strona (choć mnie te kolory drażnią ;))

    Na stronie znajdują się informacje uszeregowane według wartości jaką przedstawiają dla developera. Wpierw dowiadujemy się co się nie udało (i nie trzeba było tego z stacku wyczytać). Następnie Tapestry zaczyna uściślać informację i podawać rozwiązania możliwe. W przypadku gdy dostajemy unknown value exception, framework domyśla się, że mogliśmy popełnić literówkę, bądź nas IDE nie wspiera i nie podpowiada co możemy w templacie wstawić. W takim przypadku Tapestry listuje wszystkie dostępne properties do jakich możemy się odwołać na stronie. Przy kilku innych błędach również dostaniemy przydatne wskazówki. Ponadto na stronie znajduje się stack trace, w którym można usunąć fragmenty bez znaczenia dla użytkownika. Za nim dostaniemy szereg informacji o środowisku, w którym przyszło naszej aplikacji działać.

    Jako, że głupio zostawić tak stronę z błędem, to zmieniamy word na world, wciskamy F5 w przeglądarce (tylko żadnego redeploya mi tam nie robić! Produktywność zwiększamy!) i naszym oczom ukazuje się to czego oczekiwaliśmy.  Przy okazji zwracam uwagę , że Tapestry jest case insensitive. Możemy pisać słitaśnym casem (jak na forum internetowym), a Tapestry uzna, że jesteśmy upośledzeniu i w ramach wyrównywania szans zignoruje nasze wiElbLaDY.

    Ogółem cała strona to jedna z małych rzeczy, a cieszy.

    Z ciekawostek: strona nie pokazuje się gdy ustawimy aplikację w producation mode. Przed T5.2 elementy były chyba w innych miejscach

    Read More »

  • Tapestry 5.2 beta:)

    No więc wczoraj czasu nie było, ale Tapestry oficjalnie stało się betą. Liczyłem, że ekipa powiadomi o tym również na głównej stronie ale postanowili tego nie robić. To co ma być jedną z lepszych zmian w najbliższym wydaniu, to to, że pojawi się z nim również nowa strona główna. Szkice + to nad czym pracują można już podejrzeć, poniżej link do newsa w któym oficjalnie T5.2 stało się betą

    http://people.apache.org/~uli/tapestry-site/2010/10/11/tapestry-version-521-beta.html

    A z info ode mnie:   chciałem domenę podpiąć, ale dopiero jak już wykonałęm milion kroków (włącznie z zamówieniem karty z mbanku) to WP mnie poinformowało, że Polskiej domeny to oni mnie nie podepną :mad: Pewnie mogłem o tym przeczytać, ale i tak jestem zły. Może w weekend poczytam więcej i przekonam ich, że warto ;)

    3majcie kciuki. Jutro postaram się o sensowniejszy wpis, a kolejny w weekend.

    Read More »

  • Edycja stron w Tapestry

    No to skoro mamy już pierwszy działający projekt  to czas coś zakodzić.

    Zacznijmy od uruchomienia projektu i przejścia na stronę główną, jeśli wszystko działa to wracamy do edytora i otwieramy pliki Index.java i Index.tml Pierwszy pod lupę pójdzie plik .tml. Samo rozszerzenie pochodzi od Tapestry Markup Language, ale spokojnie, nie musimy poznawać kolejnego DSLa. Szablony (ang. Templates) Tapestry są dokumentami xhtml z drobnymi dodatkami. W przeciwieństwie np do jsp czy jsf nie musimy poznać nowego zestawu tagów by wykonać najprostszą tabelkę. Pozwala to podejrzeć większość stron T5 w zwykłym edytorze HTMLa czy podejrzeć w przeglądarce bez potrzeby kompilowania :) Znacząco ułatwia to pracę z osobami, które nie znają Tapestry czy javy w ogóle, a muszą edytować nasze szablony (np. osoby odpowiedzialne za grafikę). No, ale wracając do kodu, obecnie mamy

    
    <html t:type="layout" title="projektBlogowy Index"
          t:sidebarTitle="Current Time"
          xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
          xmlns:p="tapestry:parameter">
            <!-- Most of the page content, including <head>, <body>, etc. tags, comes from Layout.tml -->
    
        <p>${message:greeting}</p>
    
        <p:sidebar>
    
            <p>
                Just to prove this is live:
            </p>
    
            <p>The current time is: ${currentTime}.</p>
    
            <p>
                [<t:pagelink page="Index">refresh</t:pagelink>]
            </p>
        </p:sidebar>
    
    </html>
    

    Na stronie po za kilkoma tagami htmlowymi widzimy ${currentTime}. Jest to tak zwana ekspansja (ang. expansion). Domyślnie jest to odwołanie do własności (ang. property) strony, z wykorzystanie notacji java beans (czyli 2 metody: get/is i set) . Ale stop, strona ma własności? W Tapestry ma. Każdy template jest ściśle związany z plikiem java o tej samej nazwie znajdującym się w tym samym pakiecie. Tapestry jest silnie zorientowane na stronę a stroną jest w tym przypadku plik .java. To od jego lokalizacji zależy adres URL jaki wyświetli się w przeglądarce. Wszystkie strony muszą znajdować się w pakiecie pages bądź w jego podpakiecie. Jak już pewnie się domyśliliście wszystkie properties są dostępne z poziomu szablonu. Zmodyfikujmy więc metodę getCurrentTime by otrzymać następujący kod

    
    	public String getCurrentTime() {
    		return "Hello at "+new SimpleDateFormat().format(new Date());
    	}
    

    i po zmianie w przeglądarce przeładowujemy stronę. I voila! Na stronie mamy nową wartość. Jak ktoś nie podążał uważnie za wpisem to zmienia wartość zwracaną na np HelloWorld i przeładowuje stronę bez ponownego deployowania aplikacji czy reloadu. Jedną z przyjemniejszych cech T5 jest tzw. Live Class Reloading. Wszystkie zmiany dokonane w szablonie, na stronie czy w implementacji serwisu są odwzorowane od razu na stronie. Przyspiesza to pracę nad projektem i zwiększa produktywność. Można oczywiście kupić JRebela, ale lepiej chyba mieć te 200$ skoro różnicy nie widać ;)

    Wracając jednak do stron. Nie wszystkie wartości do jakich chcemy mieć dostęp mogą być zapisane w postaci property, np. hashCode(). Co wtedy? Najzwyczajniej na świecie wywołujemy metodę ${hashCode()}. Proste, prawda?
    To chyba tyle na dziś. Wymyśliłem sobie, że będę starał się tworzyć krótkie wpisy.

    Read More »

  • Zaczynamy pierwszy projekt w Tapestry 5

    Tak jak obiecałem w poprzednim wpisie: czas zacząć pracę. Projekt stworzymy z wykorzystaniem mavena. W Eclipsie z wtyczką m2 New -> Maven -> Maven Project, na ekranie wyboru archetypu wybieramy która wersja nas interesuje. Obecnie wybieramy pomiędzy Tapestry 5.1.0.5 a 5.2.1-snapshot. Pierwszy to stabilna wersja, drugi jest jeszcze rozwijany, ale w wpisach będę się odwoływać do zawartych w 5.2 nowościach. Zmiany nie są poważne, ale podążają przyjętą w Tapestry ścieżką stabilnego rozwoju, co związane jest z burzliwą historią frameworku, ale o tym innym razem.  Jeszcze referencja do tutoriala pokazującego jak rozpocząć projekt korzystając z konsoli Mavena.  W obu przypadkach otrzymujemy projekt podobny z tym przedstawionym na zrzucie ekranowym. Sam obrazek jest odnośnikiem do dokumentacji opisującej strukturę projektów.tapestry-project-layout

    O ile w wielu szkieletach aplikacyjnych układ pakietów nie ma najmniejszego znaczenia, o tyle w Tapestry jest to podstawa konfiguracji. Już wyjaśniam, T5 kieruje się zasadą convention over configuration, której jednym z przejawów jest układ katalogów.  Podobne podejście znać mogą użytkownicy np grailsów. Pomijając strukturę mavenową, istotne jest umiejscowienie kilku pakietów. Tapestry skanuje nasz projekt od głównego korzenia  (package root - w tym przypadku com.example.myapp) w poszukiwaniu pakietów o nazwach:

    • services
    • pages
    • components
    • mixins

    Dodatkowe moduły (np integracja z hibernatem) mogą dodać kolejne domyślne lokalizacje, ale tylko wymienione trzeba znać, a spokojnie można pominąć nawet mixins.

    Mając już strukturę podobną do tej widocznej obok, możemy uruchomić to co powstało poprzez wtyczkę run-jetty-run / wtyczkę/konsolę mavena / spakowanie całości do pliku war i uruchomienie w kontenerze aplikacyjnym (jetty czy tomcat wystarczy).

    W przypadku run-jetty-run niezbędne jest podanie dodatkowo jako vm argumentu  -Dorg.mortbay.jetty.webapp.parentLoaderPriority=true Znalazłem dziś działającego następce run-jetty-run. Można go znaleźć na google code Działa tak samo, ale pozwala nam korzystać z nowszej wersji Jetty i własnej konfiguracji serwera.

    Uruchamiając mavenem jako goal podajemy jetty:run

    Informacje jak skonfigurować inne IDE możemy znaleźć na Tapestry Wiki w sekcji Preparing your development environment

    A następnym razem zaczniemy kodować i pozmieniamy trochę strony.

     

    BTW mam skłonności do offtopicowania, upominajcie mnie proszę jak zacznę za bardzo od tematu odbiegać :)


    Read More »

  • Przygotowania do pracy z Tapestry 5

    No to jak zapowiedziałem, zaczynamy monotematyczność Tapestrową. Pierwszy wpis będzie, jak mam nadzieję, najmniej interesujący z całej serii. Zaczniemy od zapoznania się z moim warsztatem. Jeśli macie problem z tymi narzędziami to śmiało piszcie, kilku kombinacji używałem podczas poszukiwań tej najbardziej mi pasującej.

    1. Eclipse jako IDE. Posiada mnóstwo wtyczek + jestem przyzwyczajony do niego. Pracuje się mi z nim najwygodniej, choć w pracy przekabacają mnie na Ideowca.
    2. maven + wtyczka m2 do eclipsa
    3. run-jetty-run -dla tych co nie przepadają za mavenem. Wtyczka pozwala na uruchomienie Jettiego bezpośrednio w workspacie eclipsa. Posiada jeszcze jedną zaletę: bez kombinowania odpala aplikację. Przydatne według mnie w projektach testowych, gdy wystarczy nam budowanie aplikacji poprzez IDE

    I to wszystko. Tapestry jest proste, nie wymaga wybitnego wsparcia. Polecam jednak skorzystać z tego hacka oraz dodać kilka templatów. Pozwoli to łatwiej edytować strony. Istnieje również wtyczka Loom do eclipsa, ale nie wiem czy projekt jeszcze żyje. Z innych IDE wiem, że Idea oferuje jakieś wsparcie dla T5, ale nigdy w pracy nie miałem czasu przetestować co dokładnie wspiera.

    Od następnego wpisu zaczynamy pracę z tapestry. Postaram się teorią za bardzo nie nudzić.

    Read More »

Michal Gruca
Michal Gruca

Manager by title, developer at heart

Twitter Email

TOC