JavaServer Pages (JSP) je technologie pro vývoj hlavně dynamických HTML stránek založená na jazyce Java. Vyvinul ji v Sun, ale pak ji koupila firma Oracle. Při tvorbě se tedy používá primárně HTML a Java. Do kódu HTML se vkládá Java. Odděluje se od HTML takto: <% .. Java kód .. %> a tyto bloky se nazývají skriptlety. Na straně serveru se tedy vloží vygenerovaný HTML místo Javy v souboru. Jde o podobný princip, jako u PHP. Přípona souborů je .jsp.
Životní cyklus JSP
V okamžiku requestu ze strany klienta na server, si web container zkontroluje zdali je už vytvořený Servlet k dané JSP stránce. Pokud ne, tak vytváří Servlet. Pokud daný Servlet najde, tak kontroluje staří obou souborů a pokud je JSP stránka mladší, tak Servlet vytvoří znovu. Pokud ne, tak pro zlepšení výkonu použije již existující Servlet. Životní cyklus JSP se skládá ze sedmi částí:
- Překlad JSP
- Kompilace JSP
- Classloading – načte korespondující Servlet třídu
- Instantiation – připraví Servlet třídu
- Inicializace – jspInit()
- Zpracování požadavku (Request) – jspService()
- Zahození objektu – jspDestroy()
Výhody
Mezi hlavní výhody JSP patří možnost využít všech možností, co nabízí Servlety a navíc implicitních objektů, předdefinovaných tagů, Expression Language (EL) a vlastních tagů.
JSP API
Všechny vygenerované Servlety musí implementovat dvě rozhraní. Prvním je JspPage interface, z kterého implementuje dvě metody z životního cyklu:
- public void jspInit() – metoda je volána při prvním requestu, stejně jako metoda init() u Servlet rozhraní
- public void jspDestroy() – metoda je volána na konci životního cyklu JSP, kdy je stránka zahozena
Z druhého rozhraní, HttpJspPage, dostává metodu:
- public void _jspService() – metoda je volána při každém požadavku na JSP stránku, co přijde do web containeru (webový, aplikační server), metoda nemůže být přepsána (@Override).
Implicitní objekty
Web container vytváří devět implicitních objektů, které jsou dostupné pro všechny JSP stránky:
- out – JspWriter
- request – HttpServletRequest
- response – HttpServletResponse
- config – ServletConfig
- application – ServletContext
- session – HttpSession
- pageContext – PageContext
- page – Object
- exception – Throwable
Tagy
Scriptlet tag
Syntax: <% ... %>
Využívá se pro exekuci Java kódu v JSP a může deklarovat proměnné (uvnitř metody service()).
Expression tag
Syntax: <%= ... %>
Vypisuje output stream bez potřeby použití out.print().
Declaration tag
Syntax: <%! ... %>
Deklaruje objekty a metody mimo metodu service(), takže nezabírají paměť při každém volání.
Direktivy - JSP Directives
JSP Directives jsou zprávy, které říkají web containeru, jak má přeloži JSP stránku do Servletu.
Page directives
Syntax: <%@ page attribute="value" %>
Definují atributy pro celou JSP stránku.
- import – Importuje třídu, rozhraní nebo obsah celého balíčku.
- contentType – Definuje MIME (Multipurpose Internet Mail Expression) – výchozí hodnota „text/html; charset=ISO-8859-1“.
- extend – Definuje rodičovskou třídu.
- info – Nastavuje informace, které vrací metoda getServletInfo().
- buffer – Nastavuje velikost v kilobytech bufferu, který zpracováva výstup generovaný z JSP stránky – výchozí hodnota 8 kb.
- language – Specifikuje skriptovací jazyk použitý v JSP – výchozí hodnota „java“.
- isElIgnored – Ignoruje Expression Language na stránce – defaultně „false“.
- isThreadSafe – Servlety i JSP jsou defaultně vláknově bezpečné, aby se mohli jednotlivé requesty zpracovávat paralelně. Při nastavení „false“ jsou requesty serializovány.
- errorPage – Pokud dojde k chybě, tak dojde k přesměrování na definovanou stránku.
- isErrorPage – Definuje, že tato stránka je errorPage
Include directive
Syntax: <%@ include file="resourceName" %>
Se používá pro vkládání obsahu z různých zdrojů, jako jsou JSP, HTML nebo textové soubory. Obsah je do stránky vložen pouze jednou a to v době překladu, takže je vhodnější vkládat statické zdroje. Velká výhoda je znovu použitelnost kódu při vkládání HTML stránek.
Taglib directive
Syntax: <%@ taglib uri="uriOfTheTagLibrary" prefix="prefix" %>
Definuje knihovnu tagů, které můžeme využít v JSP stránce. Tagy jsou definovány TLD (Tag Library Despriptor) souboru.
Odchytávání výjimek
Pro odchytávání výjimek a ošetření případných chyb, ke kterým může dojít máme dvě možnosti. První je skrze Page directives a to konkrétně pomocí atributů errorPage a isErrorPage. Druhou možností je využití <error-page> elementu ve web.xml souboru.
Příklady s využitím web.xml souboru:
<web-app>
…
<error-page>
<exception-type> java.lang.Exception </exception-type>
<location>/error.jsp</location>
</error-page>
…
</web-app>
<web-app>
…
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
…
</web-app>
JSP Action tagy
JSP Actiony tagy se používají pro řízení a správu JSP stránek a pro práci s Java Beany. Seznam action tagů: jsp:forward, jsp:include, jsp:useBean, jsp:setProperty, jsp:getProperty, jsp:plugin, jsp:param, jsp:fallback.
jsp:forward
Syntax:
bez parametru:
<jsp:forward page="relativeURL | <%= expression%>" />
s parametrem:
<jsp:forward page="relativeURL | <%=expression %>"
<jsp:param name="parameterName" value="value | <%= expression %>" />
</jsp:forward>
Jsp:forward přeposílá request na další zdroj.
jsp:include
Syntax:
<jsp:include page="relativeURL | <%= expression %>" />
Jsp:include vkládá obsah v době requestu, což umožňuje vytvářet dynamicky generovaný obsah stránek.
jsp:useBean
Syntax:
<jsp:useBean id= "instanceName" scope= "page | request | session | application"
class= "packageName.className" type= "packageName.className" beanName="packageName.className | <%= expression >" >
</jsp:useBean>
Jsp:useBean vrací nebo vytváří Java Bean podle definovaného scope v atributu.
Atributy
- id – identifikuje beanu v daném scope
- scope
- page – pouze pro danou stránku (výchozí hodnota)
- request – v rámci requestu
- session – v rámci session
- application – pro celou aplikaci . nejširší scope
- class – specifikuje třídu pro kterou vytváří objekt (třída musí splňovat náležitosti Java Beany)
- type – specifikuje datový typ Java Beany
- beanName – inicializuje beanu skrze java.beans.Beans.instantiate() metodu
jsp:setProperty
Syntax:
<jsp:setProperty name="instanceOfBean" property= "*" | property="propertyName" param="parameterName" | property="propertyName" value="{ string | <%= expression %>}" />
Jsp:setProperty nastavuje hodnotu vlastnosti/atributu beany.
jsp:getProperty
Syntax:
<jsp:getProperty name="instanceOfBean" property="propertyName" />
Jsp:getProperty vrací hodnotu vlastnosti/atributu beany.
Expression Language (EL)
Syntax: ${ expression }
EL zjednodušuje přístup k datům uložených v Java Beanách a dalších objektech jako je request, session nebo application. Do JSP bylo EL přidáno v verzi 2.0.
Implicitní objekty v EL
- pageScope, requestScope, sessionScope, applicationScope – mapuje atribut podle jména v daném scope
- param – mapuje request parametr do jedné proměnné
- paramValues – mapuje request parametr do pole proměnných
- header – mapuje request hlavičku do jedné proměnné
- headerValues – mapuje request hlavičku do pole proměnných
- cookie – mapuje název cookies do hodnoty proměnné
- initParam – mapuje inicializační parametr
- pageContext – umožňuje přístup k objektům jako je request, session a podobně
Operátory v EL
[] .
() (změna priorit operátorů)
- (unární operace) not ! empty
* / div % mod
+ - (binární operace)
< > <= >= lt gt le ge
== != eq ne
&& and
|| or
? :
Klíčová slova v EL
Lt, le, gt, ge, eq, ne, true, false, and, or, not, instanceof, div, mod, empty, null
JSTL (JSP Standard Tag Library)
JSTL je set tagů pro zjednodušení vývoje JSP stránek, ve kterých není potřeba používat scriptlet tagy.
5 základních knihoven
- core tags – práce s proměnnými, URL management, kontrola a správa stránek (prefix c)
- sql tags – podpora SQL a přístup do DB (prefix sql)
- xml tags – správa XML a jejich transformace (prefix x)
- internationalization tags – formátování a lokalizace (prefix fmt)
- function tags – manipulace se stringem (prefix fn)
Vlastní tagy v JSP
Jedná se o uživatelem vytvořené tagy. Jejich vytvářením se vyhýbáme scriptlet tagům a separujeme byznys logiku od JSP stránky. Další výhodou je znovu použitelnost kódu.
<prefix:tagname attr1="value1"....attrn="valuen" >
…
</prefix:tagname>
Příklady kódu
Počítání v cyklu for do šesti:
<p>Počítání do šesti:</p> <!-- HTML -->
<% for (int i=1; i<=6; i++) { %> <!-- JSP -->
<p>Číslo : <%= i %>.</p> <!-- HTML & JSP -->
<% } %> <!-- JSP -->
<p>Dopočítáno.</p> <!-- HTML -->
A výsledek:
Počítání do šesti:
Číslo : 1.
Číslo : 2.
Číslo : 3.
Číslo : 4.
Číslo : 5.
Číslo : 6.
Dopočítáno.
Externí odkazy