Tagi JSTL

Tagi JSTL (JSP Standard Tags Library) pozwalają do plików JSP wprowadzić struktury charakterystyczne dla programów – np. pętle. Zajmiemy się teraz wyświetleniem wszystkich pracowników w postaci tabelki. Odwołamy się do klasy EmployeesDao, która zwraca nam pracowników przechowywanych w bazie danych w postaci listy obiektów. Najwygodniej jest stworzyć w naszym serwlecie pole typu EmployeesDao:

Nie dzieje się tu nic specjalnego. Metoda getAll() zwraca listę pracowników i przekazuje ją do widoku. W pliku JSP będziemy iterować po tej liście generując odpowiedni kod HTML. Przygotowuję najpierw schemat prostej tabelki:

Do uruchamiania struktur typowo programowych (np. pętli) służą tagi JSTL, są to specjalne biblioteki tagów, które dają możliwość tworzenia instrukcji warunkowych, formatowania liczb i dat. Mamy trzy podstawowe biblioteki tagów:

  • core – pozwala na tworzenie instrukcji warunkowych, pętli>
  • functions – uruchamianie funkcji – np. trim(), sprawdzanie długości listy
  • fmt – formatowanie danych, obsługa ustawień internacjonalnych
Użyjemy teraz biblioteki core. Aby mieć dostęp do tego co oferuje musimy ją najpierw zaimportować specjalną instrukcją taglib:

Napisanie pętli za pomocą tagów JSTL jest nawet prostsze niż w czystej Javie.

JSTL bardzo przypomina XML. Do tagów z biblioteki core odwołujemy się po prefiksie określonym w trakcie importu. Zbiór po którym będziemy iterować podajemy jako wyrażenie języka EL, a następnie określamy nazwę pojedynczego elementu w obrębie obrotu pętli. Jest to inny zapis dobrze znanej nam pętli for-each z Javy:

Pozostał jeszcze atrybut varStatus. Określenie jego wartości pozwala na używanie numeru obrotu pętli – ja użyłem tej wartości do wyświetlania numeru wiersza. Do pliku JSP dodałem jeszcze trochę CSS. Efektem wywołania powyższego serwletu jest poniższa strona:

Tag c:if – najprostsza instrukcja warunkowa

Do powyższej tabelki dodamy jeszcze jedną kolumnę tak by wykorzystać dwa kolejne tagi z biblioteki core – tag c:if i c:choose. Wyświetlimy teraz informację o tym czy pracownik zarabia powyżej średniej. Muszę zatem dorzucić kolejny atrybut do żądania http – wartość typu Double, która będzie reprezentować średnią zarobków. Obsłużymy teraz prosty warunek na warstwie widoku stosując tag c:if. Dodam do generowanej tabeli jeszcze jedną kolumnę:

Oprogramowuję jej zawartość oczywiście wewnątrz pętli c:forEach.

Warunek do sprawdzenia to atrybut test tagu c:if. Warunek do sprawdzenia podaję jako wyrażenie EL. Jeśli warunek jest spełniony zostanie wyświetlona zawartość tagu c:if. Jest to tylko pojedyncza instrukcja warunkowa – za pomocą c:if nie ma możliwości wykonać znanego nam z Javy bloku if-else. Służy do tego tag c:choose, który omówimy w kolejnym rozdziale.

c:choose czyli bardziej złożone warunki

Tak jak powiedziałem za pomocą tagu c:if nie napiszemy prostego bloku if-else. Służy do tego tag c:choose o bardziej złożonej strukturze:

Za pomocą tagu c:choose tworzymy strukturę if-else if-else. Warunki sprawdzane są liniowo, przy czym pojedynczy warunek oznaczamy tagiem c:when – sekcję else oznaczamy tagiem c:otherwise. W wyniku powyższych modyfikacji wywołanie serwletu da nam poniższy wynik:

Biblioteka fmt – formatujmy nasze dane

W bibliotece fmt zawarto tagi, które potrafią formatować liczby i daty. Znajdziemy tam również tagi odpowiedzialne za internacjonalizację plików JSP – obsługę tzw. ResourceBundle i obiektów klasy Locale. Z oczywistych powodów najbardziej będą interesować nas tagi:

  • fmt:formatDate
  • fmt:formatNumber

fmt:formatDate – formatowanie dat

Nazwa mówi sama za siebie. W zasadzie w tym małym rozdziale pokażę w zasadzie dwa tagi z biblioteki fmt. Zaczniemy od dodania formatowania daty zatrudnienia do powyższej tabeli. Robimy to za pomocą tagu fmt:formatDate w następujący sposób:

Do atrybutu value przekazujemy obiekt typu Date jako wyrażenie EL. Spójrzmy na wynik:

Nic się nie zmieniło? Dzieje się tak dlatego, że Java wykryła parametry lokalizacyjne właściwe dla Polski i zastosowała je dla formatowania daty. Po dodaniu poniższego tagu w dowolnym miejscu przed formatowaniem, zostaną zastosowane ustawienia właściwe dla Francji.

Zmiany widać od razu:

Często jednak będziemy chcieli uniezależnić się od opcji lokalnych i zawsze wyświetlić datę w ten sam sposób. Musimy wtedy określić atrybut pattern tagu fmt:formatDate w następujący sposób:

W Javie miesiące oznaczamy jako duże MM!

Tag fmt:formatNumer – formatowanie liczb

Liczby formatujemy za pomocą tagu fmt:formatNumber podobnie jak daty. Formatowanie liczb ma jednak więcej opcji dodatkowych:

Atrybut minFractionDigits określa minimalną ilość miejsc dziesiętnych (analogicznie maxFractionDigits). Do formatowania musimy także przekazać wartość jaką chcemy formatować – ma ona znaleźć się w atrybucie value. Dodatkowo możemy też podać czym jest dana liczba w atybucie type. Może przyjąć trzy wartości:

  • number
  • currency
  • percentage
Atrybut currencySymbol jest raczej oczywisty. Po wywołaniu efekt formatowania jest od razu widoczny:

Regulowanie opcji lokalizacyjnych oczywiście dalej działa. Po przestawieniu Locale na en zobaczymy już tak sformatowane liczby:

Ten artykuł jest elementem poniższych kursów: