JavaServer Pages – užívateľské značky a knižnice 1.

11. listopadu 2002

Server-side technológie (ASP, PHP…) miešajú spolu takzvané back-end úlohy (business logic) a rozhranie programu (presentation logic) v jednom súbore. To spôsobuje problémy, pretože programátor aj dizajnér musia pracovať na jednom súbore. I napriek tomu, že je možné použiť JavaBeans, ktoré zapúzdrujú kód do externých súborov, ich používanie vyžaduje od webového vývojára istú dávku vedomostí o Jave a jej syntaxi. Tento problém v určitej miere rieši technológia užívateľských značiek (custom tags).

Čo sú užívateľské značky

Je to rozšírenie technológie JSP, ktoré prišlo s verziou JSP 1.1. Špecifikácia JSP obsahuje 6 štandardných akčných značiek a rozšírením sú práve užívateľské akcie, ktoré sa volajú cez takzvané užívateľské značky na stránke JSP. Užívateľské značky sa ukladajú do užívateľských knižníc. Tieto značky zapuzdrujú často sa opakujúce úlohy tak, aby sa dali používať nielen medzi rôznymi stránkami JSP, ale aj medzi rôznymi aplikáciami. Umožňujú tak oddeliť prácu dizajnérov a programátorov. Knižnice užívateľských značiek a obslužné súbory vytvárajú programátori v jazyku Java a samotní dizajnéri ich potom používajú na svojich stránkach.

Čo obsahujú užívateľské značky

Aby ste mohli použiť jednoduchú užívateľskú značku potrebujete:

  1. JSP stránku
    Stránkou JSP to začína, pretože na nej musíte deklarovať, kde sa nachádza súbor popisujúci knižnicu značiek (Tag Library Descriptor – TLD). A na samotnej stránke potom užívateľské značky využívate.
  2. Tag Library Descriptor
    Je to vlastne XML súbor, ktorý dokumentuje vlastnosti, informácie a umiestnenie obslužného programu značky (tag handler), čo je trieda v Jave. JSP stroj používa tento súbor, aby zistil kde nájsť a ako použiť tag handler.
  3. Tag Handler
    Je trieda v Jave. Má prístup k informáciám o stránke JSP (cez objekt pageContext). Preberá atribúty a telo užívateľskej značky. Keď skončí spracovávanie kódu, môže napríklad poslať výstup na stránku, alebo nastaviť atribúty objektu pageContext atď.

Nasledujúci obrázok zjednodušene ilustruje spoluprácu medzi jednotlivými komponentmi:

JSP stránka

Je vstupným bodom, z ktorého sa všetko odvíja. Obsahuje deklaráciu taglib, ktorá má atribúty uri a prefix. Definuje deskriptor a predponu (prefix) užívateľských značiek, ktoré chceme na stránke použiť. Jedna stránka môže obsahovať viac direktív taglib. Syntax je nasledovná:

<%@ taglib uri = „tld_URI“ prefix = „tagPrefix“ %>

Stránka JSP ďalej musí obsahovať (ak teda chceme použiť custom tags) aj samotné značky. Rozlišuje sa niekoľko typov. Takzvané jednoduché značky neobsahujú ani atribúty ani telo. To znamená, že tag handler neprevezme od značky žiadne parametre na spracovanie, iba vykoná príslušný kód. Syntax jednoduchých užívateľských značiek je:

<tagPrefix:name></tagPrefix:name>
<tagPrefix:name/> // skrátený zápis

Treba vedieť, že tagPrefix je definovaný v direktíve taglib a name je meno značky definované v súbore TLD.

Druhým typom sú značky s atribútmi. Užívateľská značka môže obsahovať jeden alebo viac atribútov, pričom ku každému je priradená nejaká hodnota (value). Názov atribútu xxx musí odpovedať metóde setXxx() v príslušnom tag handlery. Atribút sa píše malým začiatočným písmenom. Syntax je nasledovná:

<tagPrefix:name attribute = „value“/>
<tagPrefix:name attribute = „<%= value %>“/>

Z uvedeného vidieť, že hodnotu atribútu je možné vkladať aj počas požiadavky na stránku. Avšak jediná akceptovaná hodnota je typu String. Ak potrebujem získať inú hodnotu ako String, musím vykonať konverziu pomocou metódy valueOf(String). Napríklad Integer int = Integer.valueOf(String s);.

Tretím typom sú užívateľské značky s telom. Telo môže obsahovať základné alebo užívateľské značky, skriptovacie výrazy alebo obyčajný HTML/text. Samotný tag handler môže alebo nemusí spracovať telo značky. Znamená to, že dáta môžem posielať na spracovanie buď použitím atribútu alebo tela užívateľskej značky, prípadne jedným aj druhým. Syntax je nasledovná:

<tagPrefix:name attribute = „value“>
  body…
</tagPrefix:name>

Určite vás napadla otázka, ako JSP stroj vie či má (a ako) spracovať telo značky. Nuž na strane JSP stránky toho veľa nespravíme. Je treba napísať samotný tag handler tak, aby spracoval aj telo.

Posledným typom užívateľských značiek sú značky definujúce premenné. Značka totiž môže definovať premennú nejakého typu, ktorá bude spracovaná v príslušnom tag handlery a následne použitá v skripte na stránke. Syntax je takáto:

<tagPrefix:name id=“variable“ type=“package.Class“/>

Atribút id je názov premennej, type je typ (trieda) premennej. Upozorňujem, že typ premennej môže byť len objektový, teda nemôžete použiť primitívne dátové typy (int, double, byte…). Atribúty id a type sú povinné. Je nutné uvádzať plne kvalifikovaný názov triedy, napríklad java.util.Date. A v prípade vašej vlastnej triedy nezabudnite na stránku JSP umiestniť direktívu <%@ page import="package.Class" %>.

Užívateľské značky definujúce premenné môžu obsahovať a spracovávať aj telo, pričom je to treba zohľadniť pri písaní tag handlera danej značky. Doteraz nám na obsluhu značky stačil jeden tag handler, avšak pri tomto type značiek treba ešte vytvoriť ďalší, ktorý musí byť rozšírením triedy javax.servlet.jsp.tagext.TagExtraInfo. Ako z názvu triedy vyplýva, poskytuje informácie o názve a typu premennej, ktorú značka definuje.

V tejto časti som načrtol niekoľko typov užívateľských značiek, ktoré môžete využiť na svojich stránkach. Aby ste ich však mohli plnohodnotne využiť, potrebujete sa oboznámiť aj so súbormi TLD (Tag Library Descriptor), ktoré popisujú jednotlivé značky, a so samotnými tag handlermi, obsahujúcimi spracovateľský kód značky. Ale o tom až v ďalších častiach.

Prikladám jednoduchý príklad, ktorý si môžte stiahnuť. Doporučujem linku na server JSPin.com, ponúkajúci k stiahnutiu knižnice užívateľských značiek.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *