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.