JavaServer Pages

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

TovĂĄbbi informĂĄciĂłk