<HTML> <BODY> Hello World! </BODY> </HTML> potem zmienić rozszerzenie z ".html" na ".jsp" i załadować go w przeglądarce.

Wielkość: px
Rozpocząć pokaz od strony:

Download "<HTML> <BODY> Hello World! </BODY> </HTML> potem zmienić rozszerzenie z ".html" na ".jsp" i załadować go w przeglądarce."

Transkrypt

1 JSP JSP po prostu umieszcza Javę wewnątrz stron HTML. MoŜna wziąć stronę HTML i zmienić rozszerzenie na ".jsp" zamiast ".html". To jest dobre ćwiczenie na początek. W tym celu moŝna utworzyć plik hello.html o treści Hello World! potem zmienić rozszerzenie z ".html" na ".jsp" i załadować go w przeglądarce. Będzie ten sam efekt jak przy wyświetlaniu pliku HTML, tylko jego uzyskanie zajmie trochę więcej czasu :) Ale tylko za pierwszym razem. Przy ponownym załadowaniu, załaduje się normalnie. To co się tak naprawdę dzieje to, Ŝe JSP jest przekształcane na plik Javy, kompilowane i ładowane. Ta kompilacja ma miejsce tylko raz, więc po pierwszym razie ładowanie pliku nie trwa juz dłuŝej. (Lecz jeśli plik ulegnie zmianie, to konieczna będzie jego rekompilacja.) Oczywiście, nie jest dobrym pomysłem pisanie stron zawierających jedynie HTML z rozszerzeniem.jsp :) Dodawanie dynamicznej zawartości Jak widzieliśmy, kaŝdy plik.html moŝe być zamieniony na plik.jsp przez prostą zmianę rozszerzenia, co oczywiście nie ma większego zastosowania. To co czyni JSP przydatnym to zdolność umieszczania w nim Javy. Umieść następujący tekst w pliku z rozwinięciem.jsp ( np. hello.jsp), wrzuć go do swojego katalogu JSP i zobacz jak to wygląda w przeglądarce. Hello! The time is now = new java.util.date() ZauwaŜ, Ŝe za kaŝdym razem kiedy ładujesz stronę w przeglądarce, pojawia się ona z bieŝącym czasem. Charakterystyczne sekwencje: = i zamykają wyraŝenia javowe które są wykonywane w czasie run-time. Kod tam zawarty jest wykonywany, zamieniany na string i wpisywany w kod HTML. Tak oto moŝliwe jest uŝywanie JSP do generowania dynamicznych stron HTML, które zmieniają się w odpowiedzi na działania uŝytkownika i róŝnią się dla róŝnych uŝytkowników.

2 Skryptlety Wiadomo juŝ, Ŝe wyraŝenia javowe na stronach JSP naleŝy umieszczać pomiędzy sekwencjami = i. Ale trudno jest w ten sposób pisać duŝe kawałki kodu. JSP pozwala na pisanie całych bloków kodu Javy wewnątrz JSP. Robi się to poprzez umieszczenie tego kodu wewnątrz i (tak jak wcześniejszych wyraŝeń, ale bez znaczka = na początku sekwencji.) Taki blok kodu nazywa się "skryptlet". Jako taki, skryptlet nie generuje Ŝadnego tekstu do HTML ( chociaŝ moŝe, jak zaraz zobaczymy). Scryptlet zawiera kod Javy, który jest wykonywany za kaŝdym razem kiedy JSP jest wywoływane. Oto zmodyfikowana wersja naszego pliku JSP z poprzedniej sekcji z dodanym skryptletem. // To jest skryptlet. ZauwaŜ, Ŝe zmienna // "date" zadeklarowana w pierwszym wbudowanym // wyraŝeniu jest dostępna równieŝ w tym późniejszym. System.out.println( "Sprawdzam date" ); java.util.date date = new java.util.date(); Hello! The time is now = date Jeśli uruchomisz powyŝszy przykład, zauwaŝysz wyjście z "System.out.println" na logu serwera. Jest to bardzo wygodne przy debuggowaniu ( niektóre serwery udostępniają techniki debugowania JSP w IDE (Integrated Development Environment). Aby sprawdzić czy nasz serwer oferuje takie udogodnienia naleŝy zajrzeć w jego dokumentację). Jak juŝ było powiedziane, skryptlet sam w sobie nie generuje HTML. MoŜna to zrobić uŝywając w nim zmiennej zwanej "out". Ta zmienna nie musi być deklarowana. Jest predefiniowana dla skryptletów, razem z kilkoma innymi zmiennymi. Następujący przykład pokazuje jak skryptlet moŝe generować HTML. // Ten skryptlet deklaruje i inicjalizuje "date" System.out.println( " Sprawdzam date " ); java.util.date date = new java.util.date(); Hello! The time is now // Ten skryptlet generuje HTML out.println( String.valueOf( date ));

3 Tutaj, zamiast uŝywać wyraŝeń javowych, generujemy bezpośrednio HTML poprzez wywołanie metody println w zmiennej "out". Zmienna out" jest typu javax.servlet.jsp.jspwriter. Kolejną, bardzo uŝyteczną predefiniowaną zmienną jest "request". Jest ona typu javax.servlet.http.httpservletrequest "Request" po stronie serwera odnosi się do transakcji pomiędzy przeglądarką i serwerem. Kiedy ktoś wchodzi na jakiś URL, przeglądarka wysyła Ŝądanie (request) do serwera o ten URL i pokazuje zwrócone dane. Jako część tego Ŝądania dostępne są róŝne dane, włączając w to nazwę pliku, który przeglądarka chce dostać od serwera, i (jeśli Ŝądanie pochodzi z wciśnięcia guzika SUBMIT) informacje, które uŝytkownik wprowadził do formularza. Zmienna "request" jest uŝywana do uzyskania informacji z Ŝądania wysyłanego przez przeglądarkę. Na przykład moŝna poznać nazwę komputera klienta. Zmodyfikujmy kod jak poniŝej : System.out.println( "Sprawdam date" ); java.util.date date = new java.util.date(); Hello! Data: out.println( date ); out.println( "<BR>Your machine's address is " ); out.println( request.getremotehost()); "Response" jest podobną zmienną. Jest ona uŝywana, Ŝeby modyfikować odpowiedź wysyłaną do przeglądarki. Na przykład aby zawiadomić przeglądarkę, Ŝe trzeba połączyć się z innym adresem URL, wystarczy napisac: response.sendredirect(anotherurl); Przeglądarka wtedy wysle inne Ŝądanie do "anotherurl". Mieszanie skryptletów z HTMLem Widzieliśmy juŝ jak uŝywać zmiennej "out" do generowania kodu HTML z wnętrza skryptletu. Dla bardziej skomplikowanego HTMLa uŝywanie cały czas zmiennej "out" powoduje, Ŝe programowanie JSP traci niektóre swoje zalety. Łatwiej jest mieszać skryptlety z HTMLem.

4 Przypuśćmy, Ŝe chcemy wygenerować tabelkę w HTMLu. Jest to bardzo częsta operacja, np. generowanie tabel z tabel SQLa, czy z linii pliku. śeby utrzymać nasz przykład w miarę prostym, wygenerujemy tabelkę z numerami od 1 do N. Istotne jest pokazanie techniki, dlatego prosty przykład wystarczy. Oto fragment JSP, który to robi: <TABLE BORDER=2> for ( int i = 0; i < n; i++ ) { <TR> <TD>Number</TD> <TD>= i+1 </TD> </TR> } </TABLE> Zanim to zadziała trzeba jeszcze ustawić zmienną int "n" i dostaniemy tabelkę z "n" rzędami. WaŜną rzeczą jest jak znaki i pojawiają się w środku pętli "for", co pozwala wracać do HTMLa a potem z powrotem do skrypletu. ZałoŜenia są proste -- jak widać, moŝna wyskoczyć ze skryptletu, wypisać normalny kod HTMLa i powrócić do skryptletu. KaŜda instrukcja typu "while", "for" lub "if" kontroluje równieŝ HTML. Jeśli HTML jest wewnątrz pętli, będzie wyświetlany raz na kaŝdy obrót pętli. Kolejny przykład mieszania skrypletów i HTMLa jest pokazany poniŝej -- zakładamy tu, ze istnieje zmienna "hello" typu boolean. W zaleŝności od tego czy ustawimy ja na true czy false, zostanie wyświetlony odpowiedni fragment kodu. if ( hello ) { <P>Hello, world } else { <P>Goodbye, world } Trochę trudne jest kontrolowanie wszystkich pootwieranych nawiasów oraz znaków początku i końca skrypletu, ale przy odrobinie praktyki i dobrej metody formatowania moŝna nabrać wprawy. Dyrektywy JSP W przykładach w poprzednich sekcjach uŝywaliśmy java.util.date. Czy nie moŝna by importować java.util.*?;

5 W JSP moŝna uŝyć instrukcji "import", ale syntaksa jest trochę inna od tej normalnie uŝywanej w Javie. Popatrz na następujący page import="java.util.*" System.out.println( " Sprawdzam date " ); Date date = new Date(); Hello! The time is now = date Pierwsza linia w powyŝszym przykładzie jest nazywana "dyrektywą". Dyrektywa JSP zaczyna się UŜyta tutaj dyrektywa jest nazywana dyrektywą 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. page import="java.util.*,java.text.*" Oprócz dyrektywy page istnieje wiele innych dyrektyw JSP. Najbardziej przydatne to "include" i "taglib". Dyrektywa include jest uŝywana do fizycznego załączania zawartosci innego pliku. Załączany plik moŝe mieć rozszerzenie.html.jsp albo jakiekolwiek inne. Rezultat będzie taki jakby nasz plik JSP zawierał w sobie załączony tekst. Aby zobaczyć tę dyrektywę w akcji, stwórz nowy plik JSP Going to include include file="hello.jsp" Obejrzyj ten plik JSP w przeglądarce, a zobaczysz swój hello.jsp załączony w nowym pliku JSP. Deklaracje JSP JSP które piszesz, zamienia się w deklaracje klasy. Wszystkie skryptlety są umieszczane wewnątrz pojedynczej metody tej klasy. MoŜesz równieŝ dodawać deklaracje metod i zmiennych do tej klasy. MoŜesz później uŝywać zmiennych i metod z Twoich skryptletów i wyraŝeń.

6 Aby dodać deklarację, musisz uŝyć sekwencji! i, jak pokazano page import="java.util.*"! Date thedate = new Date(); Date getdate() { System.out.println( "In getdate() method" ); return thedate; } Hello! The time is now = getdate() Przykład jest trochę przekombinowany, Ŝeby pokazać deklaracje metod i zmiennych. Deklarowana zmienna typu Date thedate, oraz metoda getdate są dostępne w naszych skryptletach i wyraŝeniach. Ale... przykład nie działa tak jakbyśmy tego oczekiwali. Czas będzie taki sam, niezaleŝnie od tego, ile razy przeładujesz stronę. To dlatego, Ŝe deklaracje są wyliczane tylko raz kiedy strona jest ładowana. (Tak, jakbyś tworzył klasę i miał w niej deklarację inicjalizacji zmiennej.) Cwiczenie: Zmodyfikuj powyŝszy przyklad i dodaj nową funkcję computedate która reinicjalizuje thedate. Dodaj skryptlet, który wywołuje computedate za kaŝdym razem. Uwaga: Własciwym postępowaniem jest umieszczanie wszystkich zmiennych w obiektach session lub request, które przekazują sobie dane pomiędzy stronami JSP. Zmienne, które deklarujesz w skryptletach są dobre o ile potrzebujesz ich na zasięg jednego skryptletu. Tagi w JSP Kolejnym istotnym elementem składni JSP są tagi. Tagi JSP nie uŝywają znaku, lecz <. Tag JSP jest czymś w rodzaju tagu HTML. MoŜe on mieć "tag początkowy", "ciało tagu" i "tag końcowy". Początkowy i końcowy tag uŝywają nazwy tagu, zamkniętej w znaki < i >. Końcowy zaczyna się znakiem / umieszczonym po znaku <. Nazwy tagów zawierają 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, początek i koniec mogą być wygodnie złączone ze sobą, tak jak <some:tag/>

7 Tutaj poprzez zamknięcie tagu początkowego w ten sposób: /> zamiast znakiem >, kończymy tag natychmiast i bez ciała. (Konwencja składniowa jest taka jak w XML.) Tagi mogą być dwojakiego rodzaju: ładowane z zewnętrznej biblioteki, albo predefiniowane. Tagi predefiniowane zaczynają się znakami jsp:. Na przykład, jsp:include jest predefiniowanym tagiem który jest uŝywany do załączania innych stron. JuŜ widzieliśmy dyrektywę include. jsp:include jest podobna. Ale zamiast ładowania tekstu załączanego pliku w oryginalny, tak naprawdę wywołuje załączany cel w czasie wykonania (sposób, w jaki przeglądarka mogłaby wywołać załączony cel. W praktyce, to jest raczej symulowane zadanie niŝ "full round-trip" pomiędzy przeglądarką a serwerem). PoniŜej pokazany jest przypadek uŝycia jsp:include Going to include hello.jsp...<br> <jsp:include page="hello.jsp"/> Spróbuj to zrobić i zobacz, co otrzymasz. Teraz zmień "jsp:include" na "jsp:forward" i zobacz, jaka jest róŝnica. Te dwa predefiniowane tagi są często bardzo przydatne. Cwiczenie Napisz JSP, które wykonuje forward lub include, zaleŝnie od zmiennej boolean (wskazówka: Koncepcja połączenia HTML i skryptletow działa takŝe z tagami JSP!) Sesje JSP Przy pisaniu stron WWW bardzo przydatnym jest związać pewne dane z kaŝdym odwiedzającym. Do tego celu uŝyte mogą zostać "session"s w JSP. Sesja jest obiektem związanym z odwiedzającym. MoŜna do niego wrzucać pewne dane i potem je odczytywać. Dla kaŝdego odwiedzającego tworzony jest nowy obiekt sesji. Oto przykład jak moŝna w sesji zapamiętać imię odwiedzającego, a potem wyświetlić je gdzieś indziej. Najpierw formularz do wypełnienia. Nazwijmy go GetName.html <FORM METHOD=POST ACTION="SaveName.jsp"> What's your name? <INPUT TYPE=TEXT NAME=username SIZE=20> <P><INPUT TYPE=SUBMIT> </FORM> Po wypełnieniu tego formularza odwiedzający zostanie przekierowany na stronę "SaveName.jsp", która zachowa jego imię w obiekcie sesja. ZauwaŜ zmienną "session".

8 Jest ona kolejną zmienną, która jest dostępna w JSP, tak jak zmienne out i request. (W moŝesz wskazać, Ŝe nie uŝywasz sesji, i wówczas zmienna "session" nie będzie dostępna.) String name = request.getparameter( "username" ); session.setattribute( "thename", name ); <A HREF="NextPage.jsp">Continue</A> SaveName.jsp zachowuje imię uŝytkownika w sesji i udostępnia link do kolejnej strony NextPage.jsp. NextPage.jsp pokazuje jak odzyskać zachowane imię. Hello, = session.getattribute( "thename" ) Jeśli masz dwie róŝne przeglądarki (ale nie dwa okna tej samej przeglądarki), albo uruchamiasz przeglądarki na dwóch komputerach, moŝesz umieścić jedno imię w jednej przeglądarce, drugie imię w drugiej i oba imiona będą trzymane niezaleŝnie. Obiekt sesji jest trzymany przez określony czas (timeout). Potem zakłada się, Ŝe uŝytkownik nie odwiedza juŝ strony i obiekt sesji jest porzucany. Ćwiczenie: Dodaj atrybut "age" do powyŝszego przykładu.