AJavaServer Pages (rövidenJSP) egy technológia, melynek segítségével aszoftverfejlesztő dinamikusan tud generálniHTML,XML vagy egyéb dokumentumokatHTTP kérésekre reagálva. A JSP tekinthető aservlet réteg feletti absztrakciós szintnek. A JSP oldalból java servlet forráskód generálódik. A JSP2006 májusa óta aJ2EE specifikáció része.
Az első hivatalos JSP specifikációt1999 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ég1999-ben jelent meg a JSP 1.1 verzió decemberben, amely már lehetőséget adott acustom 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 akifejezésnyelv (angolulExpression Language vagy rövidenEL) és a JSPX dokumentumok támogatása is. A legfrissebb JSP specifikáció a JSP 2.1.
Egy JSP oldalban a következő nyelvi elemek lehetnek:
- statikus adat, példáulHTML kód
- direktívák
- szkriptelemek és változók
- akciók
- elemkönyvtárakban definiálttag-ek
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 ataglib
Azinclude direktívával be lehet illeszteni egy teljes fájl tartalmát az adott JSP oldalba. Ez hasonlatos aC programozási nyelv#include direktívájához. Statikus tartalmat illeszt be a fordítás előtt. (Dinamikus, futásidejű beillesztés ajsp:include akcióval lehetséges.) A beillesztett fájlok kiterjesztése általában.jspf, ami aJSP Fragment rövidítése:
<%@ include file="valami_file.jspf" %>
Apage 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 nemHTML 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 aHTTP 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 legyentrue, ha az adott oldal szálbiztos, értve ezalatt azt, hogy ki tud szolgálni több kérést párhuzamosan. Ha értékefalse, 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 aszoftverfejlesztő sessiont használni. Az alapértelmezett érték
true. Ha értékefalse, akkor nem használható asessionimplicit 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álaszPrintWriter 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ékefalse, akkor kivétel váltódik a puffer megtelése esetén. Alapértelmezett értéketrue: <%@ page autoFlush=false %>
Ataglib direktívával JSP elemkönyvtárakat lehet használni. Paraméterként meg kell adni egyURI-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" %>
Háromféleképpen lehetjava forráskódot elhelyezni a JSP oldalban: deklarációk, szkriptrészletek és kifejezések formájában:
Adeklará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++; }%>Aszkriptrészlet (angolulscriptlet) 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 + ".");%>Akifejezés tag-ben megadott kifejezés futási időben értékelődik ki és az értéke kerül awebszerver által visszaadott HTML kódba. Az alábbi példa
közelítő értékét generálja:
<%= Math.sqrt(2) %>
Léteznek ún. implicit objektumok, melyeket a JSP container láthatóvá tesz a JSP oldalak számára. Ezekre hivatkozhat aszoftverfejlesztő a JSP kódban:
- out
- A JSPWriter osztály példánya, aHTTP 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 aHTTP kérést reprezentálja. - response
- AHTTP válasz objektum.
- session
- AHTTP 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 objektumgetServletConfig() 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".
Amegjegyzés tag-ek formátuma az alábbi:
<%-- Megjegyzés szövege --%>
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 (angolulcustom 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 aHTTP 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, aHTTP 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 aHTTP 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
- ANetscape Navigator és azInternet Explorer korábbi verziói különbözőhtml tag-eket használtak ajava appletek beillesztésére. Ez az akció legenerálja a megfelelő böngészőspecifikustag-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 megadottJavaBean-től.
- jsp:setProperty
- Beállítja a megadott JavaBean egy tulajdonságát.
- jsp:useBean
- Létrehoz illetve újrafelhasznál egy JavaBeant.
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, angolultag library desciptor-t. Az ilyen fájlok kiterjesztése jellemzően.tld. Az alábbi példában feltesszük, hogy létezik egykrumpli.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 %>…