A JavaServer Pages (röviden JSP) egy technológia, melynek segítségével a szoftverfejlesztő dinamikusan tud generálni HTML, XML vagy egyéb dokumentumokat HTTP kérésekre reagálva. A JSP tekinthető a servlet réteg feletti absztrakciós szintnek. A JSP oldalból java servlet forráskód generálódik. A JSP 2006 májusa óta a J2EE specifikáció része.
Történet
Az első hivatalos JSP specifikációt 1999 júniusában adták ki. A későbbi változatok felülről kompatibilisek ezzel az 1.0 verzióval. Szintén még 1999-ben jelent meg a JSP 1.1 verzió decemberben, amely már lehetőséget adott a custom tag libraries, magyarul elemkönyvtárak használatára. A JSP 1.2 verzió 2001 szeptemberében látott napvilágot. Ezt követte a JSP 2.0 verzió, amelyben már szerepelt a kifejezésnyelv (angolul Expression Language vagy röviden EL) és a JSPX dokumentumok támogatása is. A legfrissebb JSP specifikáció a JSP 2.1.
Szintaxis
Egy JSP oldalban a következő nyelvi elemek lehetnek:
- statikus adat, például HTML kód
- direktívák
- szkriptelemek és változók
- akciók
- elemkönyvtárakban definiált tag-ek
Direktívák
A direktívák tekinthetők a JSP konténernek szóló utasításoknak is. Attribútumaik is lehetnek. A direktívák általános alakja a következő:
<%@ direktívanév attr_1="érték_1" attr_2="érték_2" … %>
Három féle direktíva használható JSP oldalakban: include, page és a taglib
include
Az include direktívával be lehet illeszteni egy teljes fájl tartalmát az adott JSP oldalba. Ez hasonlatos a C programozási nyelv #include direktívájához. Statikus tartalmat illeszt be a fordítás előtt. (Dinamikus, futásidejű beillesztés a jsp:include akcióval lehetséges.) A beillesztett fájlok kiterjesztése általában .jspf, ami a JSP Fragment rövidítése:
<%@ include file="valami_file.jspf" %>
page
A page direktíva hatása a kapott opcióktól függ, melyeket az alábbiakban részletezünk:
- import
- Stringértékű argumentum, a generált szervlet kódban import utasítássá konvertálódik:
<%@ page import="java.util.*" %>
- contentType
- A tartalom típusát adja meg. Ezt akkor érdemes használni, ha a generált tartalom nem HTML vagy ha az alapértelmezett karaktertáblától különbözőt kívánunk használni:
<%@ page contentType="text/html;charset=ISO-8859-2" %>
- errorPage
- Azt adja meg, hogy mely oldalra irányítódjon át a felhasználó, ha kivétel történik a HTTP kérés kezelése során:
<%@ page errorPage="hibalap.jsp" %>
- isErrorPage
- Logikai értéket vehet fel. Akkor igaz az értéke, ha az adott lap hibalap:
<%@ page isErrorPage=false %>
- isThreadSafe
- Logikai értéket vehet fel. Értéke akkor legyen true, ha az adott oldal szálbiztos, értve ezalatt azt, hogy ki tud szolgálni több kérést párhuzamosan. Ha értéke false, akkor a JSP container sorbaállítja a kéréseket:
<%@ page isThreadSafe=true %>
- info
- String értékű argumentum, mely az oldal rövid leírását tartalmazhatja. Az így definiált leírást adja vissza a generált Servlet osztály
getServletInfo()
metódusa:
<%@ page info="Ez itt, kéremszépen, fontos servlet információ." %>
- extends
- Azt adja meg, hogy a JSP oldalból generált osztály mely osztálynak legyen a leszármazottja. Ritkán használják, hiszen általában megfelel az alapértelmezett öröklődés.
<%@ page extends="ValamiOsztaly" %>
- session
- logikai értékével azt határozható meg, hogy akar-e a szoftverfejlesztő sessiont használni. Az alapértelmezett érték
true
. Ha értéke false
, akkor nem használható a session
implicit objektum.
<%@ page session=false %>
- buffer
- Megadható a kimeneti puffer minimális mérete. Az alapértelmezett érték 8kb. Értéke lehet
none
is, ekkor nincs pufferelés, és minden közvetlenül íródik a HTTP válasz PrintWriter
objektumára:
<%@ page buffer="32kb" %>
<%@ page buffer="none" %>
- autoFlush
- Logikai érték, mely azt határozza meg, hogy mi történjek, ha a kimeneti puffer megtelik. Ha értéke
true
, akkor a puffer automatikusan ürítődik. Ha értéke false
, akkor kivétel váltódik a puffer megtelése esetén. Alapértelmezett értéke true
:
<%@ page autoFlush=false %>
taglib
A taglib direktívával JSP elemkönyvtárakat lehet használni. Paraméterként meg kell adni egy URI-t, ahol az elemkönyvtár leírófájlja található, valamint egy prefixumot, amivel később hivatkozni lehet az elemkönyvtár elemeire. Például így:
<%@ taglib prefix="kedvencprefixumom" uri="taglib/kedvenc.tld" %>
Szkriptelemek
Háromféleképpen lehet java forráskódot elhelyezni a JSP oldalban: deklarációk, szkriptrészletek és kifejezések formájában:
Deklarációk
A deklarációs tag-ben definiált kód teljes egészében bemásolódik a generált java servlet osztály forráskódjába. Például adattagokat lehet vele definiálni:
<%! int serverInstanceVariable = 1; %>
A deklarációs tag metódust is tartalmazhat, amely szintén a generált szervlet osztályba kerül be:
<%!
public void increaseServerInstanceVariable() {
serverInstanceVariable++;
}
%>
Szkriptrészletek
A szkriptrészlet (angolul scriptlet) tagben megadott kódrészlet a generált servlet osztály _jspService()
metódusába másolódik be.
Szintaxisa:
<% java forráskód %>
Példa:
<% int lokalisValtozo = 6 * 7 ; out.println("Hatszor hét az " + lokalisValtozo + "."); %>
Kifejezések
A kifejezés tag-ben megadott kifejezés futási időben értékelődik ki és az értéke kerül a webszerver által visszaadott HTML kódba. Az alábbi példa közelítő értékét generálja:
<%= Math.sqrt(2) %>
Implicit objektumok
Léteznek ún. implicit objektumok, melyeket a JSP container láthatóvá tesz a JSP oldalak számára. Ezekre hivatkozhat a szoftverfejlesztő a JSP kódban:
- out
- A JSPWriter osztály példánya, a HTTP válasz üzenettörzs részét reprezentálja.
- page
- Maga a generált java servlet objektum.
- pageContext
- A
javax.servlet.jsp.PageContext
osztály példánya. Az egész oldalra vonatkozó adatokat tartalmaz.
- request
- Egy
javax.servlet.http.HttpServletRequest
objektum, amely a HTTP kérést reprezentálja.
- response
- A HTTP válasz objektum.
- session
- A HTTP session objektum, mely felhasználói információk megőrzésére használható.
- config
- A servlet konfigurációs adatait tartalmazó
ServletConfig
objektum. Értéke megegyezik a servlet objektum getServletConfig()
metódusának visszatérési értékével.
- application
- Alkalmazásadatokat tartalmazó objektum.
- exception
- A dobott kivétel objektumot tartalmazza, amennyiben az adott JSP oldal hibalap, azaz
isErrorPage="true"
.
Megjegyzések
A megjegyzés tag-ek formátuma az alábbi:
<%-- Megjegyzés szövege --%>
Akciók
A JSP tartalmaz standard akciókat is, de a JSP 1.1 verziója óta lehetséges a saját akciók definiálása is saját elemkönyvtárak (angolul custom tag libraries) használatával. Az alábbi lista mutatja a JSP standard akcióit:
- jsp:include
- Hasonlatos a szubrutinhíváshoz. Hatására a servlet átadja a HTTP kérés kezelését egy másik oldalnak. Ha a megadott oldal válaszolt, akkor visszakerül a vezérlés a hívó oldalhoz. Ezzel az akcióval az egyszer megírt kód újrahasználható, s így nem kell azt duplikálni. Az a különbség az include direktíva és a jsp:include akció között, hogy míg a direktíva statikusan illeszti be egy másik oldal tartalmát fordítás előtt, addig a jsp:include akció dinamikusan, a HTTP kérés kezelésekor fut le és így dinamikusan generált tartalmat is be tud illeszteni.
- jsp:param
- A jsp:include, jsp:forward vagy jsp:params blokkok belsejében használható. A megadott paraméter hozzáadódik a kérés paraméterlistájába
- jsp:forward
- Segítségével a HTTP kérés továbbadódik egy másik URL-re. Ellentétben a jsp:include akcióval, itt a hívó oldalhoz soha nem kerül vissza a vezérlés.
- jsp:plugin
- A Netscape Navigator és az Internet Explorer korábbi verziói különböző html tag-eket használtak a java appletek beillesztésére. Ez az akció legenerálja a megfelelő böngészőspecifikus tag-et.
- jsp:fallback
- A megjelenítendő tartalom abban az esetben, ha a böngésző nem támogatja az appleteket.
- jsp:getProperty
- Lekérdez egy tulajdonságot a megadott JavaBean-től.
- jsp:setProperty
- Beállítja a megadott JavaBean egy tulajdonságát.
- jsp:useBean
- Létrehoz illetve újrafelhasznál egy JavaBeant.
Elemkönyvtárak
A JSP 1.1 és az azt követő verziókban lehetséges a saját elemkönyvtárak használata. A fejlesztőnek meg kell írnia egy java osztályban az akció kódját, továbbá kell készítenie egy elemkönyvtárleíró XML fájlt, angolul tag library desciptor-t. Az ilyen fájlok kiterjesztése jellemzően .tld
. Az alábbi példában feltesszük, hogy létezik egy krumpli.tld
elemkönyvtárleíró fájl és a hozzá tartozó implementáció. A JSP oldalban először hivatkozni kell a leírófájlra és meg kell adni a használni kívánt prefixumot a taglib direktíva segítségével, majd használhatóak az akciók:
<%@ taglib uri="krumpli.tld" prefix="trallala" %>
…
<trallala:izgalmasakcio> <%-- a nyitó tag %>
…
</trallala:izgalmasakcio> <%-- a záró tag %>
…