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

szerkesztés

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.

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

szerkesztés

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

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" %>

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 %>

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

szerkesztés

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

szerkesztés

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

szerkesztés

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

szerkesztés

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

szerkesztés

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

szerkesztés

A megjegyzé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 (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

szerkesztés

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 %>
…

További információk

szerkesztés