JSP – Java Server Pages

JSP – Java Server Pages

Java Server Pages to technologia pozwalająca tworzyć dynamiczne treści. Podobnie jak serwlety działa po stronie serwera. Jednakże w odróżnieniu od nich bardziej nadają się do wyświetlania odpowiedzi, gdyż w tym przypadku zaszywamy Javę w statycznej treści html, a nie na odwrót. Dość szybko widać jak niewygodne jest tworzenie odpowiedzi w wygodnej i ładnej formie w całości w obiekcie out. Przed przystąpieniem do tej lekcji warto zapoznać się z artykułem poświęconym na temat serwletów.

Różnice między JSP a serwletami

Podstawową różnicą jest zmiana podejścia. W JSP główną częścią pliku powinien być kod odpowiedzialny za warstwę prezentacji. Kod Javy umieszczamy pod specjalnymi znacznikami.

Drugą różnicą jest cykl życia aplikacji gdyż strony JSP są konwertowane do postaci serwletu.

Kiedy zatem korzystać z JSP? Wtedy, gdy odpowiedź od serwera powinna być wyświetlona w przystępnej dla użytkownika formie stosując np. css. Natomiast w przypadku, gdy ważniejsza jest sama logika aplikacji wygodniej jest używać serwletów.

Znaczniki

Różne znaczniki pełnią specjalne role w dokumentach JSP. Mogą pełnić rolę informacyjną dla kontenera, wskazywać miejsce na kod Javy lub po prostu pełnić funkcję komentarza.

Dyrektywy

<%@ page dyrektywa %> – dostarczają informacji do kontenera JSP na temat strony, w jaki sposób przetwarzać informacje. Poniżej przykład dyrektywy.

  • language – informuje kontener jaki język użyliśmy w dokumencie JSP.
  • contentType – wskazuje zestaw znaków użyty przy kodowaniu zawartości strony oraz sposób np. html, XML.
  • pageEncoding – kodowanie znaków użyte przy odpowiedzi do klienta.
  • session – informuje czy strona JSP jest częścią sesji http. Jeśli tak, to możemy używać obiektu session oraz zmiennych sesyjnych.
  • buffer – określa rozmiar buforu strumienia wyjściowego.
  • autoFlush – informuje czy bufor powinien być automatycznie czyszczony.
  • errorPage – wskazuje stronę, która wyświetli się w przypadku wystąpienia wyjątku.
  • isErrorPage – informuje kontener, że dana strona jest przeznaczona do obsługi wyjątku.
  • extends – wskazuje, którą klasę rozszerza nasza strona JSP po konwersji na serwlet.
  • import – określa, które pakiety należy zaimportować.
  • info – informacje o stronie.
  • isThreadSafe – informuje kontener JSP czy strona obsługuje wielowątkowość przy dostępie do niej.

<%@ include … %> – Umożliwia załączenie pliku do dokumentu JSP. Przykładem może być podział wynikowej strony na wiele fragmentów np. nagłówek, stopka i część główna. Zazwyczaj tylko ta ostatnia jest zmienna, w związku z tym, żeby nie powielać tego samego kodu możemy go umieścić w osobnym pliku. Następnie załączamy go tym tagiem w odpowiednim miejscu.

<%@ taglib … %> – Pozwala wczytać dodatkowe tagi.

Skryptlety

<% kod Javy %> – umieszczamy dowolny kod napisany w języku Java. W większości przypadków wynik nie jest widoczny dla użytkownika końcowego. Wyjątkiem jest wywołanie metod print obiektu out.

<%! deklaracja zmiennych %> – w takim znaczniku można umieścić deklarowane zmienne, które można użyć później w dowolnym miejscu w pliku JSP. Jeśli chcemy wykorzystać je na innej stronie JSP musimy wykorzystać np. Sesję lub zmienną request.

<%= wyrażenie %> – element, który po uruchomieniu jest konwertowany do postaci łańcucha znakowego, a następnie wyświetlany.

<%– Komentarz w JSP –%> – komentarze podobnie jak w normalnej Javie nie są widoczne, ani nie powodują wykonywania żadnych czynności. Są całkowicie pomijane przez środowisko JSP.

Obiekty predefiniowane JSP

W przypadku stron JSP możemy od razu korzystać z niektórych zdefiniowanych wcześniej obiektów, które w serwletach trzeba samemu utworzyć. Poniżej znajduje się ich lista.

  • request – obiekt klasy HttpServletRequest – zawiera dane żądania od klienta np. dostęp do przesłanych danych z formularza.
  • response – obiekt klasy HttpServletResponse – zawiera informacje odpowiedzi dla klienta od serwera.
  • session – obiekt klasy HttpSession – informacje na temat sesji.
  • out – obiekt klasy JspWriter – treść wyświetlana po stronie klienta.
  • exception – obiekt potrzebny do obsługi wyjątków.

Przykład aplikacji JSP

Podobnie jak w serwletach potrzebny nam będzie Dynamic Web Project. Tworzymy go w Eclipse, a następnie w katalogu Web Content tworzymy np. Index.jsp (zamiast html). Poniżej znajduje się przykładowa treść takiego dokumentu.

JSP jako warstwa prezentacji

Wróćmy na chwilę do przykładu aplikacji, która obliczała wyznacznik macierzy kwadratowej 3×3. Pamiętamy, że w przypadku serwletu problemem jest wyświetlenie odpowiedzi, gdyż każdą linię należy napisać przy pomocy metody out.print(). Lepszym rozwiązaniem jest rozdzielenie warstwy prezentacji, która będzie się znajdowała w pliku JSP, natomiast serwlet będzie obsługiwał logikę aplikacji.

Aplikacja będzie wyglądać tak samo, natomiast ze względu na rozdzielenie warstw prezentacji od logiki będziemy potrzebować dodatkowego pliku demo.jsp, który serwer odeśle jako odpowiedź.

Nowością będzie przekazanie przekazanie metodą setAttribute() wartości, które są dostępne w serwlecie. Następnie pozostaje wyświetlić te dane na stronie JSP. Poniżej znajdują się kody źródłowe opisanego projektu. Pliki *.html i *.jsp należy umieścić w katalogu WebContent, a plik serwletu w JavaResources\src.

Plik index.html pozostał bez zmian.

Różnicą w tym dokumencie jest końcówka metody doPost(). Poprzednio przesyłaliśmy odpowiedź od razu do klienta. Tym razem przekazujemy wyniki obliczeń do dokumentu JSP. W tym celu wykorzystujemy obiekt klasy RequestDispatcher oraz metodę forward(). Zwróćmy uwagę, że w metodzie getRequestDispatcher() znajduje się nazwa strony i musi ona istnieć w folderze WebContent.

Takie rozwiązanie jest znacznie wygodniejsze i bardziej czytelne. W tym pliku nie znajdują się żadne obliczenia, jedynie przekazywane są wartości z serwletu. Wyświetlamy je przy pomocy tagu wyrażeń <%= %>.

Przechwytywanie wyjątków

Najprostszą możliwością jest obsługa błędów w bloku try-catch. Nie jest to jednak dobry styl i lepiej wykorzystać specjalny obiekt exception dostarczony nam domyślnie przez JSP. Dzięki zastosowaniu tej metody mamy obsługa wszystkich wyjątków znajduje się w jednym miejscu. Należy wykonać następujące czynności.

W pliku JSP, w którym może wystąpić wyjątek dopisujemy następującą deklarację

A w pliku errorpage.jsp dopisujemy.

W wyniku powyższych czynności możemy użyć obiektu exception i wywołać np. metodę getMessage().

JSTL – JSP Standard Tag Library

W poprzednim rozdziale pokazaliśmy jak łatwo jest używać Javy pisząc jej kod w skryptletach. Jednakże nie jest to dobra praktyka, gdyż w przypadku większej aplikacji nieładnie wygląda przeplatanie Javy i kodu html. Znacznie lepiej jest rozdzielić warstwę prezentacji danych od ich przetwarzania. Przydatne w tym jest zrozumienie wzorca projektowego MVC (ang. model view controller).

Wspomniany JSTL jest biblioteką zawierającą wiele tagów pomagających używanie typowych struktur. W ich skład wchodzą instrukcje warunkowe, pętle, SQL oraz XML.

Instalacja pakietu JSTL

Pierwszym krokiem powinno być pobranie z sieci dostępnej biblioteki. Następnie należy umieścić ją w w projekcie w folderze WebContent\webinf\lib. Ostatnim krokiem jest dodanie dyrektywy.

Tag core

W tej grupie znajdują się najczęściej wykorzystywane tagi. Wśród nich znajdziemy obsługę pętli, instrukcji warunkowych, przekierowań oraz wyświetlanie danych oraz ich zapis. Poniżej pokażemy kilka przykładów.

Zapisywanie i wyświetlanie zmiennych.

Instrukcja warunkowa if.

Instrukcja warunkowa choose jest odpowiednikiem if-else.

Poniżej pokażemy przykładowy projekt składający się z trzech plików. Startowym będzie serwlet symulujący pobranie danych z bazy, Drugim dokument JSP wyświetlający dane (warstwa prezentacji), a trzeci będzię zwykłą klasą reprezentującą model.

Zwróćmy uwagę na klasę Gory, która reprezentuje nasz model. Utworzyliśmy ją zgodnie z dobrą praktyką czyli pole jest prywatne. W związku z tym niezbędne jest dodanie metod – getNazwa() i setNazwa() trzymając się konwencji nazewniczej. W przeciwnym przypadku kontener zwróci błąd, gdyż nie będzie mógł dostać się do prywatnego pola.

Wynik uruchomienia powyższego kodu jest następujący.

Wynik uruchomienia projektu korzystając z JSTL

Tag SQL

JSTL pozwala na połączenie z bazą danych bez potrzeby używania kodu Javy. Wystarczy użyć specjalnych tagów. Po dokładniejsze informacje na temat baz danych opisaliśmy już w jednym z poprzednich w wpisów.

Pierwszym krokiem jest wskazanie źródła danych i służy do tego tag <sql:setDataSource/>.

  • var – nazwa po której będziemy odwoływać się do bazy danych,
  • driver – sterownik JDBC,
  • url – adres bazy danych,
  • user – nazwa użytkownika bazy danych,
  • password – hasło, które uwierzytelnia podanego wcześniej użytkownika.

Po połączeniu się z bazą danych możemy wysłać do niej zapytanie. Tym razem wykorzystamy tag <sql:query/>

Wewnątrz tagów znajduje się zapytanie napisane w języku SQL. Dodatkowo wskazujemy dwa atrybuty.

  • var – nazwa zmiennej typu ResultSet
  • dataSource – zmienna, która wskazuje bazę danych.

Ostatnim krokiem jest wyświetlenie otrzymanych danych. W tym celu wykorzystamy znane już tagi core.

  • var – zmienna, która wskazuje na pojedynczy rekord pobrany z bazy danych,
  • items – źródło danych.

Pobieramy dane do wyświetlenia ze zmiennej gora. Następnie wybieramy do wyświetlenia kolumnę Nazwa.

About the author

Kamil editor