Serwery JSP (1)Jeśli nie masz dostępu do serwera obsługującego JSP, wówczas Twoim pierwszym krokiem do rozpoczęcia pracy z JSP jest ściągnięcie go z internetu.Jest wiele serverów dostępnych za darmo, jak chociażby: Blazix from Desiderata Software (1.5 Megabytes, JSP, Servlets and EJBs) |
Początki z JSP (2)JSP po prostu umieszcza Javę wewnątrz stron HTML . Można wziać stronę HTML i zmienić rozszeszenie na ".jsp" zamiast ".html". To jest dobre ćwiczenie na początek.W tym celu można utworzyć plik hello.html o tresci <HTML> <BODY> Hello World! </BODY> </HTML>potem zmienić rozszerzenie z ".html" na ".jsp" i zaladować go w przeglądarce. Bedzie 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 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 jesli plik ulegnie zmianie, to konieczna bedzie jego rekompilacja.) Oczywiscie, nie jest dobrym pomysłem pisanie stron zawierających jedynie HTML z rozszerzeniem .jsp :)
|
Dodawanie dynamicznej zawartości (3)Jak widzielismy, 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. <HTML> <BODY> Hello! The time is now <%= new java.util.Date() %> </BODY> </HTML>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.
|
Scryptlety (4)Wiadomo już, że wyrażenia javowe na stronach JSP należy umieszczać pomiędzy sekwencjami <%= i %> .Ale trudno jest w ten sposob 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 wywolywane. Oto zmodyfikowana wersja naszego pliku JSP z poprzedniej sekcji z dodanym skryptletem. <HTML> <BODY> <% // 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( "Evaluating date now" ); java.util.Date date = new java.util.Date(); %> Hello! The time is now <%= date %> </BODY> </HTML>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. <HTML> <BODY> <% // Ten skryptlet deklaruje i inicjalizuje "date" System.out.println( "Evaluating date now" ); java.util.Date date = new java.util.Date(); %> Hello! The time is now <% // Ten skryptlet generuje HTML out.println( String.valueOf( date )); %> </BODY> </HTML>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".
"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 wcisnię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ę.
<HTML> <BODY> <% System.out.println( "Evaluating date now" ); java.util.Date date = new java.util.Date(); %> Hello! The time is now <% out.println( date ); out.println( "<BR>Your machine's address is " ); out.println( request.getRemoteHost()); %> </BODY> </HTML> "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". |
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.
|
Dyrektywy JSP (6)W przykładach w poprzednich sekcjach uzywalismy java.util.Date. Czy nie mozna by importować java.util.*?;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 przykład: <%@ page import="java.util.*" %> <HTML> <BODY> <% System.out.println( "Evaluating date now" ); Date date = new Date(); %> Hello! The time is now <%= date %> </BODY> </HTML>Pierwsza linia w powyższym przykładzie jest nazywana "dyrektywą". Dyrektywa JSP zaczyna się sekwencją <%@. 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. Np. <%@ page import="java.util.*,java.text.*" %>Oprócz dyrektywy page istnieje wiele innych dyrektyw JSP. Najbardziej przydatne to "include" i "taglib". Dyrektywa taglib omówiona zostanie pózniej. 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 <HTML> <BODY> Going to include hello.jsp...<BR> <%@ include file="hello.jsp" %> </BODY> </HTML>Obejrzyj ten plik JSP w przeglądarce, a zobaczysz swój hello.jsp załączony w nowym pliku JSP. Deklaracje JSP (7)JSP ktore piszesz, zamienia się w deklaracje klasy. Wszystkie skryptlety są umieszczane wewnątrz pojedyńczej metody tej klasy.Możesz również dodawać deklaracje metod i zmiennych do tej klasy. Możesz później używac zmiennych i metod z Twoich skryptletów i wyrażeń. Aby dodać deklarację, musisz użyc sekwencji <%! i %>, jak pokazano poniżej. <%@ page import="java.util.*" %> <HTML> <BODY> <%! Date theDate = new Date(); Date getDate() { System.out.println( "In getDate() method" ); return theDate; } %> Hello! The time is now <%= getDate() %> </BODY> </HTML>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 dziala 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
|
Tagi w JSP (8)Kolejnym istotnym elementem składni JSP sa tagi. Tagi JSP nie uzywaja 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żywaja 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/>Tutaj poprzez zamknięcie tagu początkowego w ten sposob: /> 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 zaczynaja się znakami jsp: . Na przykład, jsp:include jest predefiniowanym tagiem który jest używany do załaczania innych stron. Już widzielismy 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 (sposob, w jaki przegladarka mogłaby wywołac załączony cel. W praktyce, to jest raczej symulowane zadanie niż "full round-trip" pomiedzy przegladarka a serwerem). Poniżej pokazany jest przypadek użycia jsp:include <HTML> <BODY> Going to include hello.jsp...<BR> <jsp:include page="hello.jsp"/> </BODY> </HTML>Spróbuj to zrobić i zobacz, co otrzymasz. Teraz zmień "jsp:include" na "jsp:forward" i zobacz, jaka jest rożnica. Te dwa predefiniowane tagi są często bardzo przydatne. Cwiczenie Napisz JSP, które wykonuje forward lub
include, zależnie od zmiennej boolean (wskazowka:
Koncepcja polaczenia HTML i skryptletow dziala takze z tagami JSP!)
|
Sesje JSP (9)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 <HTML> <BODY> <FORM METHOD=POST ACTION="SaveName.jsp"> What's your name? <INPUT TYPE=TEXT NAME=username SIZE=20> <P><INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML>Po wypełnieniu tego formularza odwiedzający zostanie przekierowany na stronę "SaveName.jsp", która zachowa jego imię w obiekcie sesja. Zauważ zmienną "session". Jest ona kolejną zmienną, która jest dostępna w JSP, tak jak zmienne out i request. (W dyrektywie @page 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 ); %> <HTML> <BODY> <A HREF="NextPage.jsp">Continue</A> </BODY> </HTML>SaveName.jsp zachowuje imię użytkownika w sesji i udostępnia link do kolejnej strony NextPage.jsp. NextPage.jsp pokazuje jak odzyskać zachowane imię. <HTML> <BODY> Hello, <%= session.getAttribute( "theName" ) %> </BODY> </HTML>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.
|
Formularze są jednym z najbardziej popularnych narzędzi służących do tworzenia stron internetowych. JSP
ułatwia korzystanie z formularzy.
|
Wprowadźmy metody rozszerzające tagi JSP.
Pozwalają one na dodawanie tagów podobnych do:
jsp:include
lub jsp:forward, ale także o innych prefiksach niż jsp: i z dodatkowymi możliwościami.
|
Linkiwięcej możesz przeczytac na stronach:
|