Jazyk Java Aplety, servlety a jiná drůbež (4) Minule jsme dokončili povídání o servletech. V tomto - již závěrečném - dílu našeho malého průvodce programováním pro web se ještě podíváme na stránky JSP a alespoň krátce si povíme o zvláštnostech ladění tohoto druhu programů. Stránky JSP Jak jste se snad přesvědčili minule, servlety jsou skvělá věc - ale také mají své problémy. Často je obsah HTML stránky z větší části "statický", pevně daný, a pouze malé úseky se vytvářejí dynamicky, na základě požadavků. Pak tvoří převážnou část servletu příkazy println(), které vypisují stále stejný zdrojový kód HTML. Jistě si dovedete představit, že napsat takový servlet je úmorná práce. A právě tady oceníme tzv. stránky JSP. Zkratka pochází z anglického JavaServer Pages, a znamená tedy něco jako "javské serverové stránky". Seznamte se... Jako nejjednodušší příklad stránky JSP si vezmeme obyčejný HTML soubor, např. tento:
Váš požadavek dorazil na server <%= new java.util.Date() %>
Máte-li na svých hodinkách více nebo méně, není to naše vina. Výsledek ukazuje obrázek 1. Stiskneme-li v prohlížeči tlačítko Obnovit, dostaneme nový (aktuálnější) časový údaj. (Další úpravy - např. formátu data - si můžete zkusit sami.) Javský kód Vložený úsek javského kódu signalizuje "samotná" úvodní dvojice <%, tj. bezprostředně za ní následuje některý z "bílých znaků" (mezera, nový řádek atd.); úsek, jak už víme, končí řetězcem %>. Tento kód bude vložen do metody _jspService(). I v javském kódu samozřejmě můžeme používat předdefinované proměnné, můžeme volat jejich metody apod. Jako příklad napíšeme stránku JSP, která nám ukáže typ požadavku a všechna jeho záhlaví. <%-- Soubor Pozadavek.jsp --%>
<%
java.util.Enumeration hn = request.getHeaderNames();
while(hn.hasMoreElements())
{
String pom = hn.nextElement().toString();
out.println(pom + ": " + request.getHeader(pom)+ "
");
} %>
Zavoláme-li tuto stránku z prohlížeče pomocí URL http://localhost:8080/Pozadavek.jsp, objeví se obrázek 2.
Direktivy
Direktivy mají tvar
<%@ jméno_direktivy atribut="hodnota" %>
Atributů může být i více; pak se zápisy atribut="hodnota" zapisují za sebe (nebo spíše pod sebe) a oddělují se jen bílými znaky; hodnota musí být vždy uzavřena v uvozovkách. JSP používá direktivy page, include a taglib. První z nich umožňuje pracovat se strukturou stránky JSP, druhá slouží ke vkládání souborů do JSP stránek a třetí umožňuje používat uživatelem definované značky ve stránkách JSP. Podrobný rozbor by přesáhl možnosti našeho seriálu, a proto mi nezbývá než odkázat na dokumentaci [6] nebo na knihu M. Halla [1]. (V době, kdy budete tento článek číst, už by měl být na trhu český překlad.)
Zde si alespoň řekneme, že atribut import direktivy page umožňuje zpřístupnit ve stránce JSP (tj. v jejích výrazech, javských kódech nebo deklaracích) třídu nebo celý balík, podobně jako příkaz import ve zdrojovém souboru v Javě.
V předchozím příkladu jsme použili rozhraní java.util.Enumeration. Vložíme-li jako první řádek direktivu
<%@ page import="java.util.*" %>
můžeme v deklaraci proměnné hn vynechat kvalifikaci jménem balíku:
<%
Enumeration hn = request.getHeaderNames();
...
Deklarace
Deklarace v JSP začíná <%! a může obsahovat libovolnou deklaraci vyhovující syntaktickým pravidlům Javy. Tato deklarace se uloží do těla třídy servletu, který vznikne překladem JSP stránky. (Jde tedy o deklaraci datové složky nebo metody servletu. Jak jsme viděli v předchozím příkladu, může i javský kód obsahovat deklaraci proměnné, půjde ovšem o proměnnou lokální v metodě _jspService().)
Poznamenejme, že v deklaracích nelze používat předdefinované proměnné.
Jako příklad napíšeme stránku JSP, která bude počítat faktoriály nezáporných celých čísel. (Jistě si pamatujete, že faktoriál čísla n se značí n! a je to součin 1.2. ... . n. Není definován pro záporná čísla, navíc platí 0! = 1.) Nejprve vytvoříme formulář HTML, který bude obsahovat jedno vstupní pole pro zadání čísla a tlačítko pro jeho odeslání. I když jde o téměř doslovnou analogii formuláře z minulého dílu, pro pohodlí si ho zde zopakujeme: