Plan Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 09 T. Romańczukiewicz Jagiellonian University 2009/2010
Plan Plan 1 JSP 2 Podsumowanie
Plan JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans 1 JSP Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Bibliioteki tagów 2 Podsumowanie
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans XML, poprawnie sformuowanie Sposoby opisu XML DTD XML Schema XPATH Sposoby prezentacji CSS XSLT DOM SAX JAXB Serwlety JSP
JSP JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans JSP pozwala na umieszczanie w jednym dokumencie statycznego kodu HTML z zawartościa generowana dynamicznie (podobnie jak PHP) Kod generowany dynamicznie jest umieszczany w dokumencie HTML za pomoca znaczników <% oraz %> Jest powszechnie obsługiwana (nie narzuca systemu operacyjnego czy serwera WWW) Umożliwia pełny dostęp do technologii serwletów Serwlet można interpretować jako kod javy zawierajacy umieszczony w nim kod HTML JSP można interpretować jako kod HTML zawierajacy umieszczony wewnatrz kod javy
JSP JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans JSP Jasielskie Stowarzyszenie Przedsiębiorców pozwala na umieszczanie w jednym dokumencie statycznego kodu HTML z zawartościa generowana dynamicznie (podobnie jak PHP) Kod generowany dynamicznie jest umieszczany w dokumencie HTML za pomoca znaczników <% oraz %> Jest powszechnie obsługiwana (nie narzuca systemu operacyjnego czy serwera WWW) Umożliwia pełny dostęp do technologii serwletów Serwlet można interpretować jako kod javy zawierajacy umieszczony w nim kod HTML JSP można interpretować jako kod HTML zawierajacy umieszczony wewnatrz kod javy
JSP JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans JSP Java Server Pages pozwala na umieszczanie w jednym dokumencie statycznego kodu HTML z zawartościa generowana dynamicznie (podobnie jak PHP) Kod generowany dynamicznie jest umieszczany w dokumencie HTML za pomoca znaczników <% oraz %> Jest powszechnie obsługiwana (nie narzuca systemu operacyjnego czy serwera WWW) Umożliwia pełny dostęp do technologii serwletów Serwlet można interpretować jako kod javy zawierajacy umieszczony w nim kod HTML JSP można interpretować jako kod HTML zawierajacy umieszczony wewnatrz kod javy
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Listing 1: Przykład 1 <HTML> 2 <BODY> 3 4 Hello! The time is now <%= new java.util.date() %> 5 6 <% 7 / / T h i s i s a s c r i p t l e t. N o t i c e t h a t t h e " d a t e " 8 / / v a r i a b l e we d e c l a r e here i s a v a i l a b l e i n t h e 9 / / embedded e x p r e s s i o n l a t e r on. 10 System.out.println( "Evaluating date now" ); 11 java.util.date date = new java.util.date(); 12 %> 13 Hello! The time is now <%= date %> 14 </BODY> 15 </HTML>
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans JSP a Servlety Dokumenty JSP sa niejawnie, automatycznie przekształcane do postaci serwletów - łatwiej i przejrzyściej jest tworzyć zwykłe strony HTML niż stosować instrukcje println tworzace kod HTML. Strony JSP składaja się ze statycznego kodu HTML, znaczników JSP oraz kodu utworzonego w języku JAVA - jest to kod serwletów, więc niemożliwe jest zrozumienie technologii JSP bez znajomości technologii serwletów JSP - wygodniej stosować do tworzenia stron składajacych się z dużej ilości statycznego HTML (prezentacja danych) Serwlety lepsze sa do zastosowań, w których postać generowanych (zwykle dynamicznie) wyników jest zmienna a wykonywane zadania wymagaja tworzenia niewielu danych wyjściowych (przetwarzanie danych) Optymalne rozwiazanie zastosowanie serwletów i JSP
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Typy elementów skryptowych JSP Elementy skryptowe pozwalaja na wstawianie kodu javy do serwletów generowanych na podstawie stron JSP, sa to: Wyrażenia postaci: <%= wyrazenie javy %>; sa przetwarzane a wyniki ich wykonania zostaja wstawione do kodu generowanego przez serwlet Skryptlety postaci: <% kod javy %>; sa wstawiane do metody _jspservice serwletu (wywoływanej przez metodę service) Deklaracje: <%! Deklaracja pola lub metody %>; sa wstawiane do treści klasy serwletu, poza jakimikolwiek metodami
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Stosowane do umieszczania wartości bezpośrednio w wynikach przekazywanych do klienta, wyrażenie jest obliczane w czasie obsługi żadania, np.: <%= new java.util.date()%> Aby uprościć postać wyrażeń można w nich używać zmiennych predefiniowanych (obiektów niejawnych), które informuja jakie nazwy będa mieć zmienne lokalne używane w metodzie _jspservice (w serwletach wygenerowanych na podstawie stron JSP zastępuje metodę doget). Najważniejsze to: request (obiekt HttpServletRequest), np. Twój komputer: <%= request.getremotehost()%> response (obiekt HttpServletResponse) session (obiekt HttpSession) out (obiekt Writer) buforowana wersja obiektu JspWriter używana do przesyłania wyników do klienta application (obiekt ServletContext) tej struktury danych używaja wspólnie wszystkie servlety i strony JSP wchodzace w skład danej aplikacji WWW (do przechowywania wspólnych danych)
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Listing 2: skryptlet 1 <HTML> 2 <BODY> 3 <% 4 / / T h i s s c r i p t l e t d e c l a r e s and i n i t i a l i z e s " d a t e " 5 System.out.println( "Evaluating date now" ); 6 java.util.date date = new java.util.date(); 7 %> 8 Hello! The time is now 9 <% 10 out.println( date ); 11 out.println( "<BR>Your machine s address is " ); 12 out.println( request.getremotehost()); 13 %> 14 </BODY> 15 </HTML>
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Mieszanie skryptletów z HTML Do generowania kodu HTML z wnętrza skryptletu można używać zmiennej out. Dla bardziej skomplikowanego HTMLa używanie cały czas zmiennej out może być kłopotliwe. Łatwiej jest mieszać skryptlety z HTMLem: Listing 3: Przykład - generowanie tabelki 1 <TABLE BORDER=2> 2 <% 3 for ( int i = 0; i < n; i++ ) { 4 %> 5 <TR> 6 <TD>Number</TD> 7 <TD><%= i+1 %></TD> 8 </TR> 9 <% 10 } 11 %> 12 </TABLE> Zanim to zadziała trzeba jeszcze ustawić zmienna int n. Znaki %> i %< pozwalaja powrócić do HTML a potem spowrotem do skryptletu Każda instrukcja typu while, for lub if kontroluje również HTML.
Dyrektywy JSP JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans W poprzednim przykładzie użyto java.util.date. W JSP można użyć instrukcji import Listing 4: Dyrektywy w JSP 1 <%@ page import="java.util.*" %> 2 <HTML> 3 <BODY> 4 <% 5 System.out.println( "Evaluating date now" ); 6 Date date = new Date(); 7 %> 8 Hello! The time is now <%= date %> 9 </BODY> 10 </HTML> Pierwsza linia w powyższym przykładzie jest nazywana "dyrektywa". Dyrektywa JSP zaczyna się sekwencja <%@. Użyta tutaj dyrektywa jest nazywana dyrektywa page. Dyrektywa page może zawierać listę wszystkich importowanych pakietów. Aby zaimportować ich więcej niż jeden, należy oddzielić poszczególne pakiety przecinkiem. Np. <%@ page import="java.util.*,java.text.*"%>
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Dyrektywa include jest używana do fizycznego załaczania zawartosci innego pliku. Załaczany plik może mieć rozszerzenie.html.jsp albo jakiekolwiek inne. Rezultat będzie taki jakby nasz plik JSP zawierał w sobie załaczony tekst. Listing 5: Dyrektywa include 1 <HTML> 2 <BODY> 3 Going to include hello.jsp...<br> 4 <%@ include file="hello.jsp" %> 5 </BODY> 6 </HTML>
Deklaracje JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Listing 6: Deklaracje 1 <%@ page import="java.util.*" %> 2 <HTML> 3 <BODY> 4 <%! 5 Date thedate = new Date(); 6 Date getdate() 7 { 8 System.out.println( "In getdate() method" ); 9 return thedate; 10 } 11 %> 12 Hello! The time is now <%= getdate() %> 13 </BODY> 14 </HTML> Deklarowana zmienna typu Date thedate, oraz metoda getdate sa dostępne w naszych skryptletach i wyrażeniach. Czas będzie taki sam przy każdym przeładowaniu strony. Deklaracje sa wyliczane tylko raz kiedy strona jest ładowana.
Znaczniki JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Moga zapisywać do strumienia wyjściowego oraz tworzyć, modyfikować i używać obiekty. Sposób wykonania akcji zależy od cech obsługiwanego żadania. Składnia akcji opiera się na XML Tagi JSP nie uzywaja znaku <%, lecz <. Tag JSP jest czymś w rodzaju tagu HTML. Może on mieć "tag poczatkowy", ćiało tagu"i "tag końcowy". Poczatkowy i końcowy tag używaja nazwy tagu, zamkniętej w znaki < i >. Końcowy zaczyna się znakiem / umieszczonym po znaku <. Nazwy tagów zawieraja znak dwukropka w środku, część przed dwukropkiem opisuje typ tagu. Na przykład: <some:tag> body </some:tag> Jeśli tag nie potrzebuje ciała, poczatek i koniec moga być wygodnie złaczone ze soba, tak jak <some:tag/> Tagi moga być dwojakiego rodzaju: ładowane z zewnętrznej biblioteki, albo predefiniowane.
Znaczniki JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Tagi predefiniowane zaczynaja się znakami jsp:. Np. jsp:include jest predefiniowanym tagiem, który jest używany do załaczania innych stron. Działa ona podobnie jak dyrektywa include ale zamiast ładowania tekstu załaczanego pliku w oryginalny, tak naprawdę wywołuje załaczany cel w czasie wykonania. jsp:forward przekierowywuje do innej strony Listing 7: Akcja właczania 1 <HTML> <BODY> 2 Going to include hello.jsp...<br> 3 <jsp:include page="hello.jsp"/> 4 </BODY> </HTML>
Sesje w JSP JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Sesja jest obiektem zwiazanym z odwiedzajacym. Można do niego wrzucać pewne dane i potem je odczytywać. Dla każdego odwiedzajacego tworzony jest nowy obiekt sesji. Przykład: Formularz Listing 8: Formularz 1 <HTML> 2 <BODY> 3 <FORM METHOD=POST ACTION="SaveName.jsp"> 4 What s your name? <INPUT TYPE=TEXT NAME=username SIZE=20> 5 <P><INPUT TYPE=SUBMIT> 6 </FORM> 7 </BODY> 8 </HTML> Po wypełnieniu tego formularza odwiedzajacy zostanie przekierowany na stronę ŚaveName.jsp", która zachowa jego imię w obiekcie sesja. Zmienna sesion to kolejna zmienna, która jest dostępna w JSP, tak jak zmienne out i request.
Sesje w JSP cd. JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans SaveName.jsp zachowuje imię użytkownika w sesji i udostępnia link do kolejnej strony NextPage.jsp. Listing 9: SaveName.jsp 1 <% 2 String name = request.getparameter( "username" ); 3 session.setattribute( "thename", name ); 4 %> 5 <HTML> 6 <BODY> 7 <A HREF="NextPage.jsp">Continue</A> 8 </BODY> 9 </HTML> NextPage.jsp pokazuje jak odzyskać zachowane imię. Listing 10: NextPage.jsp 1 <HTML> 2 <BODY> 3 Hello, <%= session.getattribute( "thename" ) %> 4 </BODY> 5 </HTML>
Formularz i Beans JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans JSP ułatwia korzystanie z formularzy. Standardowy sposób obsługi JSP polega na zdefiniowaniu "bean". Potrzebujemy tylko zdefiniować klasę, która zawierać będzie pola takie jak pola formularza. Pola klasy musza mieć śetters"(atrybuty) pasujace do pół formularza. Przykład Listing 11: GetName.html 1 <HTML> 2 <BODY> 3 <FORM METHOD=POST ACTION="SaveName.jsp"> 4 What s your name? <INPUT TYPE=TEXT NAME=username SIZE=20><BR> 5 What s your e-mail address? <INPUT TYPE=TEXT NAME=email SIZE=20><BR> 6 What s your age? <INPUT TYPE=TEXT NAME=age SIZE=4> 7 <P><INPUT TYPE=SUBMIT> 8 </FORM> 9 </BODY> 10 </HTML>
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Formularz i Beans c.d. JSP ułatwia korzystanie z formularzy. Standardowy sposób obsługi JSP polega na zdefiniowaniu "bean". Potrzebujemy tylko zdefiniować klase, która zawierać będzie pola takie jak pola formularza. Pola klasy musza mieć śetters"(atrybuty) pasujace do pół formularza. Przykład Listing 12: GetName.html 1 <HTML> 2 <BODY> 3 <FORM METHOD=POST ACTION="SaveName.jsp"> 4 What s your name? <INPUT TYPE=TEXT NAME=username SIZE=20><BR> 5 What s your e-mail address? <INPUT TYPE=TEXT NAME=email SIZE=20><BR> 6 What s your age? <INPUT TYPE=TEXT NAME=age SIZE=4> 7 <P><INPUT TYPE=SUBMIT> 8 </FORM> 9 </BODY> 10 </HTML> Żeby przesyłać te dane, zdefiniujmy klasę javy z polami username, email i age i wprowadźmy metody publiczne setter setusername, setemail i setage i getter ; podobnie ze słowem get zamiast set.
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Formularz i Beans c.d. Listing 13: GetName.html 1 public class UserData { 2 String username; 3 String email; 4 int age; 5 6 public void setusername( String value ) { username = value; } 7 public void setemail( String value ) { email = value; } 8 public void setage( int value ) { age = value; } 9 10 public String getusername() { return username; } 11 public String getemail() { return email; } 12 public int getage() { return age; } 13 } Trzeba się upewnić,czy jej ścieżka jest dostępna na serwerze. Na serwerze może być także zdefiniowany specjalny katalog, gdzie możemy umieścić class bean. Jeśli zmienimy ścieżke do niego, serwer musi być zatrzymany i zrestartowany,jeśli aktualnie pracuje.
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Formularz i Beans c.d. Listing 14: SaveName.jsp 1 <jsp:usebean id="user" class="userdata" scope="session"/> 2 <jsp:setproperty name="user" property="*"/> 3 <HTML> 4 <BODY> 5 <A HREF="NextPage.jsp">Continue</A> 6 </BODY> 7 </HTML> Tag usebean będzie szukał instancji UserData w tej sesji. Jeśli znajdzie ja to ja uaktualni. W przeciwnym przypadku stworzy nowa instancję (nowy bean) UserData Tag setproperty automatycznie przesyła dane wejściowe, łaczy nazwy z odpowiednimi metodami i umieszcza dane w bean!
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Formularz i Beans c.d. Listing 15: NextPage.jsp 1 <jsp:usebean id="user" class="userdata" scope="session"/> 2 <HTML> 3 <BODY> 4 You entered<br> 5 Name: <%= user.getusername() %><BR> 6 Email: <%= user.getemail() %><BR> 7 Age: <%= user.getage() %><BR> 8 </BODY> 9 </HTML> Tag usebean się powtarza. Bean jest dostępny przez nazwę zmiennej user z klasy UserData. Dane wprowadzane przez użytkownika sa przechowywane w bean. Przykład można byłoby uprościć. Nie potrzebujemy ŚaveName.jsp", celem dla GetName.html może być NextPage.jsp, i dane będa ciagle dostępne, jeśli tylko dodamy taga jsp:setproperty. SaveName.jsp można byłoby rozbudować o obsługę błędów - i np prośbę o poprawienie danych
Tag libraries JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans W celu skozystania z biblioteki dodaje się dyrektywę: <%@ taglib prefix="blx"uri="/blx.tld"%> "uriókreśla gdzie znaleźć opis biblioteki tagów. "Prefix"jest unikatowy dla biblioteki tagów. Ta dyrektywa mówi, że będziemy używać biblioteki tagów zaczynajac od blx: Biblioteka Blazix wprowadza tag blx:getproperty. Ten tag może być używany, żeby pozwolić użytkownikom na edytowanie danych. W pliku GetName.jsp dodamy i umieścimy formularz wewnatrz blx:getproperty Listing 16: GetName.jsp 1 <%@ taglib prefix="blx" uri="/blx.tld" %> 2 <jsp:usebean id="user" class="userdata" scope="session"/> 3 <HTML> 4 <BODY> 5 <blx:getproperty name="user" property="*"> 6 <FORM METHOD=POST ACTION="SaveName.jsp"> 7 What s your name? <INPUT TYPE=TEXT NAME=username SIZE=20><BR> 8 What s your e-mail address? <INPUT TYPE=TEXT NAME=email SIZE=20><BR> 9 What s your age? <INPUT TYPE=TEXT NAME=age SIZE=4> 10 <P><INPUT TYPE=SUBMIT> 11 </FORM> 12 </blx:getproperty> 13 </BODY> 14 </HTML> Aby wszystkie formularze były prawidłowo modyfikowane przez bibliotekę tagów, umieszczamy wszystkie pola formularza wewnatrz blx:getproperty Użytkownik może teraz edytować dane.
haveerror i errors musi być ponownie T. Romańczukiewicz inicjalizowane XML 09 za każdym razem dlatego, że sa Tag libraries c.d JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Listing 17: SaveName.jsp 1 <%@ taglib prefix="blx" uri="/blx.tld" %> 2 <%! 3 boolean haveerror; 4 StringBuffer errors; 5 6 public void errorhandler( String field, String value, Exception ex ) { 7 haveerror = true; 8 if ( errors == null ) errors = new StringBuffer(); 9 else errors.append( "<P>" ); 10 errors.append( "<P>Value for field \"" + field + "\" is invalid." ); 11 if ( ex instanceof java.lang.numberformatexception ) 12 errors.append( " The value must be a number." ); 13 } 14 %> 15 <% 16 / / V a r i a b l e s must be i n i t i a l i z e d o u t s i d e d e c l a r a t i o n! 17 haveerror = false; 18 errors = null; 19 %> 20 <HTML><BODY> 21 <jsp:usebean id="user" class="userdata" scope="session"/> 22 <blx:setproperty name="user" property="*" onerror="errorhandler"/> 23 <% 24 if ( haveerror ) { 25 out.println( errors.tostring()); 26 pagecontext.include( "GetName.jsp" ); 27 } else pagecontext.forward( "NextPage.jsp" ); 28 %> 29 </BODY></HTML>
Tag libraries c.d JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans haveerror i errors musi być ponownie inicjalizowane za każdym razem dlatego, że sa one inicjalizowane na zewnatrz deklaracji. jeśli pojawi się bład w trakcie procesu blx:setproperty, wyświetli się bład i wtedy załacz GetName.jsp, żeby użytkownik mógł poprawiać błędy. Jeśli nie pojawia sie żadne błędy, automatycznie przekazujemy użytkownika do NextPage.jsp. Wciaż jest problem z formularzami, jesli age"pokaże się zainicjalizowany na zero zamiast pusty. To można łatwo naprawić dodajac emptyint=0 do obu tagów blx:getproperty i blx:setproperty (pola bean powinny być inicjalizowane na "0"). "0" nie jest odpowiednia wartościa dla wieku dlatego możemy jej użyc do markowania pustych stringów (można wybrać inna wartość np ujemna)
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Definiowanie własnych tagów Aby zdefiniować własny tag należy Zaimplementować klasę handler dla tagu zadeklarować tag w tag library descriptor Pełny przykład na http://java.sun.com/products/jsp/tutorial/taglibraries7.html#62074 Klasa dla znacznika pustego <tlt:simple /> Listing 18: SimpleTag.java 1 public SimpleTag extends Tag Support { 2 public int dostarttag() throws JspException { 3 try { 4 pagecontext.getout().print("hello."); 5 } catch (Exception ex) { 6 throw new JspTagException("SimpleTag: " + e.getmessage()); 7 } 8 return SKIP_BODY; 9 } 10 public int doendtag() { return EVAL_PAGE; } 11 } Implementowane sa metody dostarttag() i doendtag().
Descriptor JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans tag library descriptor (TLD) Jest dokumentem XML opisujacym bibliotekę tagów <taglib> - element główny <tlibversion> - wersja <jspversion> - wersja JSP, od której zależy biblioteka <shortname> - może być traktowane jako przedrostek <uri> - URI jednoznacznie definujace bibliotekę <info> - Dodatkowe informacje o bibliotece <tag> - opis tagu. W najprostszym przypadku: 1 <tag> 2 <tagclass>classname</tagclass> 3 <bodycontent>empty</bodycontent> 4... 5 </tag>
JSP Podsumowanie Przypomnienie JSP - wstęp Dyrektywy JSP Znaczniki Sesje Beans Istnieje również możliwość rozszerzenia definicji tagów o atrybuty zawartość (bodycontent)
Plan JSP Podsumowanie 1 JSP 2 Podsumowanie
JSP Podsumowanie JSP pozwala na dynamiczne generowanie zawartości HTML, XML itp. Można mieszać statyczna zawartość (czysty HTML) z zawartościa dynamicza (tzw. skryptlety) - wygodniejsze użycie niż w przypadku serwletów Zawartość dynamiczna generowana jest z kodu javy, który zamieniany jest na servlet. Możliwe jest użycie dyrektyw (np wczytywanie innych plików) Można używać znaczników Możliwa jest obsługa sesji Do obsługi formularzy najlepiej jest korzystać z Beanów, czyli klas ze zdefiniowanymi metodami typu get i set. Wyniki z formularza moga zostać przepisane do pól obiektu, który można przekazać w sesji Możliwe jest też korzystanie z bibliotek tagów. Można też samodzielie tworzyć nowe tagi (klasa handler + opis w TLD)