r14-05.doc

(516 KB) Pobierz
Szablon dla tlumaczy

W niniejszym rozdziale:

·         Język Tea

·         Początki

·         Informacja o żądaniu

·         Administracja Tea

·         Zastosowania Tea

·         Aplikacja „Narzędzia”

·         Ostatnie słowo

Rozdział 14.

Szkielet Tea

W tym momencie można przejść do omawiania opartych na serwletach szkieletów służących do tworzenia zawartości stron WWW. Technika JSP zostanie omówiona później, ponieważ jest on najbardziej skomplikowaną alternatywą tworzenia zawartości. Jako pierwsza omówiona zostanie Tea. TeaServlet (znana powszechnie jako Tea) to produkt Walt Disney Internet Group (WDIG) — dawniej GO.com — rozwijany przez wiele lat wewnątrz firmy w celu wspomożenia tworzenia witryn o wysokim obciążeniu takich jak ESPN.com, NFL.com, Disney.com, DisneyLand.com, Movies.com, ABC.com i GO.com. Niedawno produkt ten został udostępniony jako Open Source w nadziei, że inni uznają Tea za narzędzie przydatne i pomogą w jego rozwoju. Strategia ta posiada sens — dzielenie się narzędziami w nadziei, że inni pomogą je wyostrzyć. Tu omówiona zostanie TeaServlet 1.1.0, dostępna pod adresem http://opensource.go.com. Wymaga ona Servlet API 2.1 i JDK 1.2 lub późniejszych. Licencja TeaServlet jest oparta na licencji Apache'a, jednej z najmniej restrykcyjnych i przez to atrakcyjnych dla programistów, ponieważ według niej można wykorzystywać Tea do tworzenia nowych produktów i witryn bez udostępniania tych produktów jako Open Source. Ten model licencji wykorzystywany jest przez wszystkie projekty Apache, włączając w to serwery Apache i Tomcat.

Tea została zaprojektowana dla zadań prowadzonych przez małe zespoły programistów i producentów technicznych. Role programisty to tworzenie „aplikacji” napisanych w Javie i zainstalowanych w TeaServlet. Producent tworzy i utrzymuje ostateczny wygląd dynamicznych stron WWW poprzez tworzenie szablonów Tea, które wywołują funkcje dostarczone przez aplikacje programisty. Na przykład, w witrynie ESPN, jeden programista tworzy aplikację służącą do zarządzania statystykami zespołów, inny (pracujący niezależnie) tworzy aplikację służącą do zarządzania statystykami zawodników, a producent techniczny umieszcza dane w sieci przy pomocy szablonów Tea. Właściwie kilku producentów pracujących niezależnie może wykorzystywać te same dane wspierające w celu utworzenie stron ukierunkowanych na różnych użytkowników — działanie, które firma WDIG wykonała w swoich witrynach włączając w to Disney.com, Movies.com, ESPN.com i GO.com. Szablony tworzone są w języku Tea w celu wymuszenia całkowitego oddzielenia zawartości od prezentacji.

Język Tea

Tea to język programowania zaprojektowany do formatowania tekstu. Posiada on silnie zaznaczone typy, musi być kompilowany i został zaprojektowany do pracy w środowisku opartym na Javie. Środowiskiem tym jest TeaServlet, narzędzie wykorzystujące Tea do tworzenia stron WWW i umożliwiające dostęp do mechanizmów serwletów, z których wywoływane są pliki szablonów Tea[1].

Głównym celem języka Tea jest wymuszenie oddzielenia zawartości i prezentacji, bez poświęcania podstawowych konstruktów programistycznych. Do czasu pisania tej książki, Tea została utworzona na podstawie czterech ograniczeń:

·         Dane i typy danych nie mogą być tworzone bezpośrednio. Są one odczytywane.

·         Odczytane dane nie mogą zostać bezpośrednio modyfikowane w żaden sposób.

·         Szablon nie może w bezpośredni sposób uszkadzać swojego środowiska.

·         Dostarczana jest jedynie minimalna ilość konstruktów programistycznych.

Ograniczenia te dodatkowo chronią system przed uszkodzonymi bądź błędnymi szablonami, co jest własnością niezwykle pożądaną w przypadku witryn stale przyjmujących dużą ilość szablonów, jak zdarza się to w popularnych witrynach informacyjnych. Projekt ten jest wygodny również dla firm hostingowych, które muszą dawać klientom możliwość tworzenia stron dynamicznych, ale nie chcą, aby żaden konkretny błąd klienta mógł wpłynąć negatywnie na pozostałą część serwera.

Ale czy kolejny język, zwłaszcza język, który potrafi o wiele mniej niż Java jest tak naprawdę potrzebny? Tea Template Language Manual (Podręcznik Języka Szablonów Tea) odpowiada na to pytanie:

Tea jest wynikiem wielu lat doświadczenia z innymi mechanizmami tworzenia stron WWW. Większość opartych WWW aplikacji rozpoczyna się od znaczników HTML osadzonych w kodzie, niezależnie od tego, czy jest to C, Perl, czy Java. Podejście to jest odpowiednie dla małych lub początkujących projektów, ponieważ nie wymaga dużej ilości programowania.

Ponieważ zmiany w formatowaniu strony mogą zdarzać się często, a twórcy nie chcą ich dokonywać, nieodwołalnie przesuwają się oni w stronę wykorzystywania pewnego rodzaju szablonowego mechanizmu wymiany elementów. Każdy element jest po prostu obszarem zablokowanym dla łańcucha, który zawiera dane utworzone przez aplikację. Te systemy szablonów dalej ewoluują w stronę obsługi specjalnych konstrukcji służących do formatowania tabeli, formularzy i prostej logiki warunkowej.

Podczas wprowadzania konstrukcji programistycznych do szablonu, podstawową trudnością jest stworzenie czegoś, co będzie posiadać wystarczającą moc, a zarazem będzie proste i bezpieczne. Jeżeli jest to zbyt potężne, wtedy kompletne aplikacje mogą być tworzone przez szablony. Jeżeli jest zbyt słabe, wtedy w aplikacji musi być zawarte formatowanie HTML. Jeżeli nie jest proste lub bezpieczne, wtedy programiści aplikacji musza sami stworzyć szablony.

Inaczej niż w przypadku istniejących języków osadzanych w czymś podobnym do ASP lub JSP, Tea jest językiem zaprojektowanym specjalnie do tego, aby spełniać wymagania systemu szablonów. Jest on bezpieczny, prosty, wydajny i potężny.

Każdy egzemplarz Tea jest zintegrowany ze specjalnym serwletem. Serwlet ten daje szablonom Tea kontrolę nad tworzeniem strony, zachowując silne powiązania z aplikacją wspierającą utworzoną przez programistę Javy. Podczas gdy serwlet ten dostarcza funkcjonalności podobnej do JSP, Tea wymusza poprawne rozdzielenie model-widok ze względu na międzynarodowe ograniczenia języka. Chociaż jest to także sugerowany model separacji w JSP, nie może on być w tamtym przypadku wymuszony. Dodatkowo szablony Tea nie obsługują własności programów, które mogą zostać wykorzystane nieodpowiedzialnie. Modyfikacje nie muszą przechodzić przez ścisłą korektę i fazę testów, która jest wymagana w przypadku JSP.

Każda osoba pracująca nad projektem powinna mieć dostęp do narzędzi pozwalających na pracę z maksymalną wydajnością, a Tea wykonuje swoją część pracy poprzez umożliwienie programiście wykonywania dokładnie tego, co jest mu potrzebne, tak łatwo jak to tylko możliwe, i żadnej dodatkowej pracy ponad to. Nawet w przypadku projektów tworzonych przez początkujących programistów wykorzystanie Tea posiada swoje zalety. Narzędzie wspomaga nabywanie dobrych praktyk programistycznych i ułatwia utrzymanie aplikacji.

Czytelnicy niniejszej książki powinni również pamiętać, że Tea nie jest językiem zaprojektowanym dla programistów, ale dla producentów technicznych. Jest językiem prostszym niż Java, bezpieczniejszym, ale tak samo wydajnym.

Początki

Aby zapoznać się z Tea, można przyjrzeć się kilku samodzielnym szablonom. Szablony te nie wykorzystują żadnych wspierających „aplikacyjnych” klas Javy, i w związku z tym nie mają wielkich możliwości działania. Poniżej przedstawiono pierwszy z szablonów:

<% template ProstaStrona() %>

To jest prosta strona, która nie robi praktycznie nic.

Powyższy szablon po prostu wyświetla „To jest prosta strona, która nie robi praktycznie nic.” każdemu, kto uzyska do niej dostęp. Szablony złożone są z obszarów kodu i tekstu. Obszary kodu są ograniczane znakami <% i %> (nie są wymagane żadne inne znaki ograniczające). Tekst poza obszarem kodu jest wyświetlany przez szablon bez żadnego formatowania, właśnie dlatego powyższy szablon po prostu wyświetla proste zdanie.

Aby uruchomić szablon, należy po pierwsze zapamiętać go w pliku o nazwie ProstaStrona.tea. Podobnie jak w klasach Javy, nazwa pliku musi być taka sama jak nazwa szablonu zadeklarowana przez konstruktora (łącznie z wielkością liter), a plik musi posiadać rozszerzenie .tea. Miejsce, w którym szablon powinien zostać zapisany, jest konfigurowalne. Poleca się katalog będący podkatalogiem WEB-INF, taki jak WEB-INF/szablony.

Następnym etapem przed uruchomieniem aplikacji jest instalacja samej Tea. Należy pobrać dystrybucję dostępną pod adresem http://opensource.go.com i wypełnić instrukcje instalacji w niej zawarte — umieścić plik TeaServlet.jar w ścieżce klas serwera WWW. Następnie należy dokonać edycji deskryptora web.xml aplikacji WWW w celu zarejestrowania TeaServlet pod nazwą tea z parametrem inicjacji określającym pozycję informacji o konfiguracji. Należy również skonfigurować zasadę odwzorowania przedrostków tak, że tea/* wywołuje serwlet tea. Przykład dodatku do web.xml jest przedstawiony w przykładzie 14.1.

Przykład 14.1.

Instalacja TeaServlet

<!-- ... -->

<servlet>

    <servlet-name>

        tea

    </servlet-name>

    <servlet-class>

        com.go.teaservlet.TeaServlet

    </servlet-class>

    <init-param>

        <param-name>

            properties.file

        </param-name>

        <param-value>

            <!—Należy dokonać edycji tak, aby wskazywało na bezwzględną ścieżkę do -->

            <!—pliku właściwości-->

            /tomcat/webapps/teatime/WEB-INF/TeaServlet.properties

        </param-value>

    </init-param>

</servlet>

<servlet-mapping>

    <servlet-name>

        tea

    </servlet-name>

    <url-pattern>

        /tea/*

    </url-pattern>

</servlet-mapping>

<!-- ... -->

Jedyną informacją, którą należy dostosować, jest ścieżka do pliku TeaServlet.properties. Powinna być to ścieżka bezwzględna. Plik TeaServlet.properties definiuje zachowanie TeaServlet. Może być on stosunkowo długi, dlatego, że plik web.xml wskazuje na zewnętrzny plik zamiast bezpośrednio zawierać informacje konfiguracyjne. Pełne omówienie pliku właściwości nastąpi później, a teraz wykorzystany będzie najprostszy z możliwych plik TeaServlet.properties:

# TeaServlet.properties

#

# Określenie miejsca szablonów Tea

template.path = /tomcat/webapps/herbatka/WEB-INF/szablony

Proszę upewnić się co do umieszczenia pliku właściwości w miejscu określonym w pliku web.xml. Ostatnim krokiem jest ponowne uruchomienie serwera tak, aby mógł odczytać nowy plik web.xml (w przypadku niektórych serwerów nie jest to konieczne).

Kiedy TeaServlet zostanie właściwie zainstalowany, dostęp do ProstaStrona można uzyskać w miejscu takim jak http://localhost:8080/herbatka/tea/ProstaStrona. Część ścieżki /herbatka określa aplikację WWW, do której uzyskiwany jest dostęp. Następna część /tea jest tak sama, jak odwzorowanie przedrostków podane w web.xml herbatka, co powoduje uruchomienie TeaServlet w celu obsłużenia żądania. Szablony mogą również zostać umieszczone w podkatalogach pod template.path, w którym to przypadku wywoływane są przy pomocy ścieżki zawierającej podkatalogi takie jak /herbatka/tea/podkat/ProstaStrona.

Informacja o żądaniu

Tworzenie statycznej zawartości wiąże się z dużą ilością pracy, tak więc teraz utworzone zostanie coś bardziej dynamicznego. Konstruktor szablonu może przyjmować dowolną ilość parametrów, których wartości są automatycznie przekazywane z parametrów żądania (poprzez łańcuch zapytania i dane POST). Parametry te mogą być typu String, Integer, Float, Double i każdego innej podklasy java.lang.Number. Konwersja do typów numerycznych następuje automatycznie. Jeżeli nie zostanie przekazany żaden parametr o danej nazwie, lub konwersja typu nie powiedzie się, szablon otrzymuje wartość parametru null. Szablon przedstawiony w przykładzie 14-2 wykorzystuje swój konstruktor do przyjęcia parametru o nazwie nazwisko.

<% template ProstaStrona(String nazwisko) %>

To jest prosta strona, która nie robi praktycznie nic

poza wyświetleniem nazwiska: <% nazwisko ?>

Jeżeli uzyska się dostęp do szablonu jako herbatka/tea/ProstaStrona?imię=Janek, na stronie wyświetlone zostanie „Janek”. Jeżeli dostęp do szablonu nastąpi bez parametru nazwisko, na stronie wyświetlone zostanie „null”. Przykład 14.2 przedstawia szablon sprawdzający ten parametr.

Przykład 14.2.

Szablon sprawdzający nazwiska

<% template ProstaStrona(String nazwisko) %>

To jest prosta strona, która nie robi praktycznie nic

poza wyświetleniem nazwiska: <% nazwisko ?>

<P>

 

<%

if (nazwisko == null) {

  "Nie podano nazwiska"

}

if (name == "Sędzia") {

  "Proszę wstać"

}

%>

Powyższy nowy szablon sprawdza , czy nazwisko wynosi null i, jeżeli tak, wyświetla użytkownikowi ostrzeżenie. Szablon sprawdza również, czy podane nazwisko brzmi Sędzia i , jeżeli tak, traktuje użytkownika w specjalny sposób. Ważne jest, by zauważyć dwa elementy porównania Sędzia — po pierwsze wartości łańcuchów w Tea mogą zostać sprawdzone pod kątem równości przy pomocy operatora == (jak to jest w przypadku wszystkich obiektów). Oznacza to, że nie jest konieczne wyjaśnianie producentowi technicznemu celu metody .equals(). Po drugie, łańcuch null może być porównany z innym łańcuchem bez ryzyka wystąpienia wyjątku NullPointerException, co mogłoby się zdarzyć w przypadku .equals().

Sięganie głębiej

Inne informacje o żądaniu są dostępne przy pomocy TeaServlet. Na przykład, szablon Tea może uzyskać bezpośredni dostęp do nagłówków i cookies żądania, a także do parametrów. Przykład 14.3 przedstawia szablon Tea przeglądający informacje o żądaniu. W praktycznych przypadkach, rzadkością jest konieczność uzyskania przez szablon Tea bezpośredniego dostępu do tych informacji, zamiast tego można wykorzystać aplikację, która może dostarczyć przetworzoną wersję informacji.

Przykład 14.3.

Szablon przeglądający informacje o żądaniu

<% template Przegl() %>

 

<HTML><HEAD><TITLE>Przeglądanie</TITLE></HEAD><BODY>

 

<% zadanie = getRequest()  // Typ obiektu jest narzucony %>

 

<H1>Różne informacje</H1>

QueryString: <% zadanie.queryString %> <BR>

RemoteUser: <% zadanie.remoteUser %> <BR>

 

<H1>Informacje o parametrach</H1>

<%

foreach (paramName in zadanie.parameters.names) {

  paramName ": " zadanie.parameters[paramName] "<BR>"

}

%>

 

<H1>Informacja o atrybutach żądania</H1>

<%

foreach (attribName in zadanie.attributes.names) {

  attribName ': ' zadanie.attributes[attribName] '<BR>'

}

%>

 

 

<H1>Header Informacja o nagłówkach</H1>

<%

foreach (headerName in zadanie.headers.names) {

  headerName ': ' zadanie.headers[headerName] '<BR>'

}

%>

 

<h1>Informacja o cookies</h1>

<%

foreach (cookie in request.cookies.all) {

  cookie.name ': ' cookie.value '<BR>'

}

%>

Wartość cookie identyfikatora sesji wynosi<% zadanie.cookies["JSESSIONID"].value %>.

 

<% // Rzeczy niemożliwe do wykonania w Tea... %>

<%/*

"<H1>Odczyt z sesji użytkownika</H1>"

zadanie.session["moze"] = "popracuje pozniej"

 

"<H1>Ustawienie atrybutu</H1>"

zadanie.attributes["nie"] = "będzie pracował"

 

"<H1>Konfiguracja cookie</H1>"

// Manipulacje odpowiedzią poprzez funkcje aplikacji

*/%>

 

</BODY></HTML>

Powyższy przykład może powiedzieć dużo o Tea. Po pierwsze, zmienne lokalne (takie jak zadanie) nie muszą być deklarowane według typu obiektu. Posiadają one silnie zaznaczony typ, ale przydzielanie typu jest ukryte. W języku istnieje słowo kluczowe isa pozwalające na obsługę kwestii związanych z tworzeniem zmiennych, jeżeli jest to konieczne.

Wykorzystane zostało wyrażenie foreach, które obsługuje często występujące zadanie wykonywania pętli nad zestawem obiektów. Jest to elastyczna konstrukcja, która może działać zarówno na tablicach, jak i na każdych innych obiektach będących rozszerzeniem java.util.Collection. Wyrażenie foreach obsługuje również działanie według zakresu i wstecz. Na przykład:

foreach (licznik in 1 .. 10 reverse) { licznik '<BR>' }

wyświetla odliczanie począwszy od 10. Wyrażenie foreach obsługuje w Tea wszystkie zadania związane z pętlami, nie występują wyrażenia for i while. (W związku z tym w Tea nie występują żadne pętle nieskończone.)

Wyrażenia w Tea nie muszą kończyć się średnikiem, jak to jest w przypadku Javy, ani też nie muszą występować w osobnych liniach. Zamiast tego, kompilator Tea wykorzystuje skonstruowaną uważnie gramatykę Tea w celu obliczenia końca wyrażeń! Średniki są obsługiwane w celu umożliwienia rzadkich okoliczności, w których średnik jest konieczny do uniknięcia dwuznaczności wyrażeń i jako ułatwienie dla programistów Javy, którzy instynktownie dodają średniki.

Zazwyczaj nie ma potrzeby wykorzystania w Tea operatora łączenia łańcuchów. Obecność łańcuchów w „podwójnych cudzysłowach” i 'pojedynczych cudzysłowach' wewnątrz kodu Tea dostarcza wystarczających wskazówek, w którym miejscu powinno wystąpić łączenie. W celu uzyskania bardziej zaawansowanego łączenia należy wykorzystać znak &. Znak + nie jest wykorzystywany, ponieważ jego nadmierne stosowanie powoduje niejasności.

Komentarze w Tea tworzone są według standardów Javy, w których /* i */ ograniczają komentarze o długości większej niż jedna linia, a // rozpoczyna komentarz jednoliniowy. Komentarze te nie są wysyłane do klienta, jeżeli pamięta się o umieszczeniu ich wewnątrz bloku kodu Tea.

W powyższym przykładzie wykorzystano długi komentarz w celu z...

Zgłoś jeśli naruszono regulamin