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
-
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.
-
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. -
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.
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ć :)
-
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.
- Eclipse jako IDE. Posiada mnóstwo wtyczek + jestem przyzwyczajony do niego. Pracuje się mi z nim najwygodniej, choć w pracy przekabacają mnie na Ideowca.
- maven + wtyczka m2 do eclipsa
- 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ć.