A WEB programozása - JSP1 dr.Gál Tibor
2010. őszi félév
Általános jellemzők
JavaServer Pages (JSP)
Java utasításokat helyezetünk el a HTML lapon Ezket a Java utasításokat a kiszolgáló végrehajtja Az ügyfél felé generált tartalom: statikus HTML kód + Java utasítások eredménye A JSP utasításokat a <% ... %> karakterekkel zárjuk közre Példa: ... Kedves <%=request.getParameter("nev")%> Köszönjük, hogy JSP tanfolyamunkra jelentkezett. ...
A request a szervletek HttpServletRequest objektumának, a getParameter() pedig a szervletek getParameter() metódusának felel meg
Kiterjesztésük: .jsp Telepítési hely: bárhová (pl. ahová a statikus weboldalakat) De: a kiszolgáló a JSP oldalt első híváskor szervletté alakítja, s a statikus tartalmat is ez a szerver generálja. Helyük: %tomcat%/work/Catalina/localhost/eloadasJSP/org/apache/jsp
JSP oldalak elemei: Statikus HTML tartalom Szkript elemek Java programrészek, a szervlet service metódusának részei lesznek Direktívák
Statikus tartalom Azonos a közönséges HTML oldalakon használttal egyetlen kivétellel A <% karakterkombinációt a <\% karakterekkel kell megadni (<% ugyanis mindig valamilyen JSP elemet vezet be)
A szervlet globális jellemzőit specifikálják
Akcióelemek Meglévő komponensek használatát specifikálják, ill. a JSP motor viselkedését szabályozzák.
JSP specifikáció állandó fejlődése 0.92, 1.0, 1.1, 1.2, 2.0 változatok Tomcat 5.xx kompatibilis a Servlet API 2.4 és JSP 2.0 változattal
1
A WEB programozása - JSP1 dr.Gál Tibor
2010. őszi félév
Szkript elemek Java kód beillesztésére szolgálnak Három fajtájuk JSP kifejezések <%=kifejezes %> kiértékelésük után beszúródnak a kimenetbe Szkriptek <% kod %> a szervlet service() metódusába szúródnak be Deklarációk <%! kod %> a szervlet osztály törzsébe szúródnak be, minden metóduson kívül
JSP kifejezések http://localhost:8080/eloadasJSP/1.jsp A pontos idő: <%= new java.util.Date() %>
Figyelem: <% = kezdés hibás! De a kifejezes%> és a kifejezes %> befejezés egyaránt megengedett Implicit változók egyszerűsíthetik a kifejezéseket
request a kérelemhez kapcsolódó HttpServletRequest objektum response a válaszhoz kapcsolódó HttpServletResponse objektum session a kérelemhez kapcsolódó HttpSession objektum out a PrintWriter osztály pufferelt típusa (JspWriter)
XML szintaxis <jsp:expression> Java kifejezés
http://localhost:8080/eloadasJSP/2.html:
// A 2.jsp oldal Üdvözlöm kedves <%=request.getParameter("AzOnNeve")%>
JSP szkriptek Összetettebb feladatok elvégzésére Tetszőleges, de osztály és metódusdefiníciót nem tartalmazó Java programrészek beszúrása a service() metódusba Alakjuk: <% kod %> Ezek is hozzáférhetnek az explicit változókhoz Kiirás belőlük a HTML az out változóval történhet Az XML szintaxis <jsp:scriptlet> java kod
Az előbbi példa megoldása JSP szkripttel // Az egyik megoldás Üdvözlöm kedves <% String nev = request.getParameter("AzOnNeve"); out.println(nev); %> // A másik megoldás <% String nev = request.getParameter("AzOnNeve"); out.println("Üdvözlom kedves " + nev); %>
2
A WEB programozása - JSP1 dr.Gál Tibor Mivel a statikus tartalom is print utasításként szúródik be a Java utasítások közé, ezért a szkripteknek nem kell komplett Java utasításoknak lenni! Példa <% if (Math.random() < 0.5) { %> Nagyon
boldog születésnapot kívánok! <% } else { %> Sok
Boldogságot kívánok születésnapodon! <% } %>
A fentiek az alábbiakba fordítódnak le if (Math.random() < 0.5) { out.println( "Nagyon
boldog születésnapot kívánok!" ); } else { out.println( "Sok
Boldogságot kívánok születésnapodon!" ); }
2010. őszi félév
JSP deklarációk
Metódusok és példányváltozók definiálását teszik lehetővé A szervlet osztály törzsébe szúródnak be Maguk nem generálnak kimenetet Alakjuk: <%! kod %>
Az XML szintaxis <jsp:declaration> java kod
Példa: a szervlet betöltése óta fellépet kérelmek előállítása <%! private int accessCount = 0; %> Az oldal lekéréseinek száma a szervlet betöltése óta: <%= ++accessCount %>
http://localhost:8080/eloadasJSP/3.jsp
Felhasználó definiált osztályok Mint láttuk, magán a JSP oldalon nem deklarálhatók, de az alkalkazás WEB-INF/classes könyvtárában igen! Bár kerülendők, mivel portábilisabb megoldásokkal helyettesíthetők (lásd később: JavaBeans és felhasználó definiált akciós elemek). Figyelem: az adott osztályt csomagban kell elhelyezni, s a csomagnak megfelelően a classes könyvtár megfelelő alkönyvtárába tenni! http://localhost:8080/eloadasJSP/SajatOsztaly.jsp Példa: A JSP oldal <%@ page import="auxclasses.ReadTextFile, java.util.regex.*" %> <% ReadTextFile rtf = new readTextFile(application.getRealPath("data/TestData.txt")); String s = rtf.read(); s = Pattern.compile("\n").matcher(s).replaceAll("
"); out.println(s); %>
Az osztály package auxclasses; import java.io.*; public class ReadTextFile { String filePath = null; boolean hiba = false; public ReadTextFile(String filePath) { this.filePath = filePath; } public String read(){ String ss = "", s; try { FileReader fr = new FileReader(filePath); BufferedReader br = new BufferedReader(fr); while((s=br.readLine())!=null) ss += s + "\n"; fr.close(); } catch (IOException e) { hiba = true; return null; } return ss; } }
3
A WEB programozása - JSP1 dr.Gál Tibor JSP direktívák A szervlet globális struktúráját módosítják Három fajtájuk page direktíva: osztályok importálása, szevlet testreszabása, stb. include direktíva: fájlok beszúrása a JSP oldalnak szervletté transzformálásakor taglib direktíva: saját jelölőelemek használatára
Alakja <%@ direktivaNev jellemzo="ertek" %> vagy akár <%@ direktivaNev jellemzo1="ertek1" jellemzo2="ertek2" ... jellemzoN="ertekN" %>
XML szintaxis <jsp:directive.direktivaTipus jellemzo="ertek" /> konkrétan pl. a page direktívára <jsp:directive.page import="java.util.*" />
A page direktíva (folytatás) Az isThreadSafe jellemző - Igaz értéke esetén a létrehozandó szervlet implementálja a SingleTheradModel interfészt (ez a kiindulási érték) - Példák <%@ page isThreadSafe="true" %> <%@ page isThreadSafe="false" %>
A session jellemző - Azt szabályozza, hogy az adott oldal részt vesz-e a munkafolyamatban - Kiindulási értéke true, amikor is részt vesz - Példák http://localhost:8080/eloadasJSP/jatek12.jsp <%@ page session="true" %> <%@ page session="false" %>
A buffer jellemző - A JspWriter osztály out változóhához a puffer mértét specifikálja - A kiszolgáló addig nem generál kimenetet, amíg a puffer be nem telik - Példa <%@ page buffer="32kb" %>
2010. őszi félév
A page direktíva Lehetséges jellemzői import, contentType, isThreadSafe, session, buffer, autoflush, extends, infoo, errorPage, isErrorPage, language
Az import jellemző - Java csomagok importálása - A többi jellemzővel ellentétben többször is előfordulhat - Példák <%@ page import="java.util.*" %> <%@ page import="java.Math.*,java.sql.*" %>
A contentType jellemző - a kimenet MIME típusát állítja be - kiindulási értéke text/html - Példák <%@ page contentType="text/plain" %> <%@ page contentType="text/html; charset=iso-8859-2" %>
- alternatív megoldás <% response.setContentType("text/plain"); %>
A page direktíva (folytatás) Az autoflush jellemző - Igaz értéke (default) esetén a puffer kiürítendő, ha megtelt - Hamis értéke esetén kivételt generál a rendszer, ha a puffer túlcsordul - Példák <%@ page autoflush="true" %> <%@ page autoflush="false" %>
Az errorPage jellemző - Azt az oldalt specifikálja, amelynek át kell adni a vezérlést, ha egy Throwable kivételt az adott oldal nem kezel le - Példa <%@ page errorPage="relativURL" %>
Az isErrorPage jellemző - Igaz értéke arra utal, hogy ez az oldal egy másik oldal hibakezelő oldalaként szolgál. Kiindulási értéke hamis. - Példa <%@ page isErrorPage="true" %>
4
A WEB programozása - JSP1 dr.Gál Tibor Az include direktíva jsp\IncludeDirective\JSP1.2SyntaxReference\index.html Fájlok beszúrására használható az oldalnak szervletbe való transzformálásának időpontjában A beszúrt fájl maga is html vagy jsp típusú is lehet Alakja <%@ include file="relativURL" %>
A relatív URL a JSP oldalhoz képest értendő, de / jellel kezdve azt, az alkalmazás gyökeréhez relatív 1.... Példa: egy navigációs elem beszúrása az oldal elejére <%@ include file="/navbar.html" %> ...
2010. őszi félév
Speciáls szerkezetek JSP megjegyzés: a fordító figyelmen kívül hagyja, s nem adódik át a HTML oldalnak <%-- megjegyzés --%>
HTML megjegyzés: ez átadódik a HTML oldalnak, és a benne lévő JSP kód végrehatódik!
Statikus szövegben a <% és %> helyett <\%
Implicit objektumoknak is nevezik őket. Fajtáik: request, response, out, session, application, config, pageContext. request, response, out, session: lásd korábban Az application változó - ServletContext típusú objektum - /getServletContext() metódussal kapható meg a szervletekben/ - perzisztens adatok tárolhatók benne, s ezek mindegyik szervlet és JSP számára hozzáférhetők - olvasás/írás a getAttribute() és setAttribute() metódussal Csak Object típus írható bele!!! Object típust ad vissza az olvasás - kasztolás!!! //írás String s = request.getParameter("UserNeve"); application.setAttribute("nev",s);
%\>
Jellemzőben a ' és " és %> és <% helyett \'
Előre definiált változók
és
és
\"
és
<\%
és
%\>
Az application változó (folytatás) - Az alkalmazás telepítési leírójában (deployment descriptor) megadott konfigurációs paramétert is hozzáférhetővé teszi az alkalmazás minden szervlete és jsp oldala számára http://localhost:8080/eloadasJSP/ApplicationTest.jsp http://localhost:8080/eloadasJSP/mester.jsp szurlolo.jsp manuálisan megnyitandó
<param-name>jelszo <param-value>NagyTigris
String psw = application.getInitParameter("jelszo");
- Az alkalmazás ServletContext objektumán metódusok használata http://localhost:8080/eloadasJSP/ApplicationTest1.jsp <%= application.getRealPath("/");
//olvasás String txt = (String)application.getAttribute("nev");
5
A WEB programozása - JSP1 dr.Gál Tibor
2010. őszi félév
A config változó
• A pageContext változó
Lehetővé teszi az adott JSP oldal számára specifikus init paraméterekhez a hozzáférést. Ezek a paraméterek a telepítési leíróban adhatók meg a servlet elemekben (az ok: a JSP oldalakat a kiszolgáló szervletekbe fordítja). http://localhost:8080/eloadasJSP/ConfigTest.jsp <servlet> <servlet-name>ConfigTest <jsp-file>/ConfigTest.jsp
<param-name>jelszo <param-value>KisTigris
Lehetővé teszi az összes objektumhoz a hozzáférést az oldal hatáskörében, s rajtuk a javax.servlet.jsp.PageContex osztály metódusainak használatát. Különösen hasznos az EL objektumok és a közönséges JSP objektumok közötti együttműködéskör, mivel ez az egyetlen közös objektum a két rendszerben (lásd később). Mivel a JSP oldal tartalmazza a jelenlegi kérelmet, munkafolyamatot és alklmazást, a pageContext lehetővé teszi a hozzáférést a JSP oldallal társított összes hatáskörhöz. Ez a default hatáskör mindenobjektum számára, beleértve a JavaBeans komponenseket is. A page hatáskörű objektumok tipikusan lokális változókhoz kötöttek, melyekhez szkriptletekben, kifejezésekben, JavaBeans elemekben és felhasználódefiniált elemekben férünk hozzá.
<servlet-mapping> <servlet-name>ConfigTest
/ConfigTest.jsp String psw = config.getInitParameter("jelszo");
Akcióelemek XML szintaxist használnak A szervlet motor viselkedését szabályozzák A rendelkezésre álló elemek (JSP 2.0)
jsp:useBean, jsp:setProperty, jsp:getProperty jsp:include jsp:forward jsp:plugin jsp:attribute jsp:body jsp:invoke jsp:output jsp:root jsp:text
A jsp:useBean, jsp:setProperty és a jsp:getProperty akcióelemek JavaBeans API Szabványos forma - Vizuális fejlesztő eszközök feltárhassák az osztályok tulajdonságait - Programkód írása nélkül létrehozhatók és manipulálhatók legyenek ilyen osztályok, stb.
Legalapvetőbb jellemzők a JSP oldalak vonatkozásában Az osztálynak nem lehet konstruktora, vagy ha van, akkor egy nulla argumentumúnak is kell lenni Az osztály nem tartalmazhat nyilvános példányváltozókat A példányváltozókhoz a getXxx() és setXxx() alakú metódusokkal, ill. a logikai típusok esetén az isXxx() és setXxx() alakú metódusokkal kell hozzáférni – a példányváltozó első betűje kisbetűből nagybetűvé változik a metódusban! Míg a JSP szkriptek és kifejezések egy osztály tetszőleges metódusához hozzáférhetnek, a JSP akcióelemek csak az előbbi metódusokat használva férhetnek hozzá.
Előnyök a közönséges osztályokkal szemben XML szintax Hatáskör rendelhető hozzájuk Portábilisak
6
A WEB programozása - JSP1 dr.Gál Tibor
2010. őszi félév
Osztott használat – a scope jellemző
Alapvető szintaxis Specifikálás – a megadott osztályból egy objektum példányosítása, s társítása az id-vel specifikált névhez
<jsp:useBean id="test" class="package.class" scope="session" />
<jsp:useBean id="test" class="package.class" />
Négy különböző érték rendelhető hozzá page Default érték. A bean csak a jelenlegi oldal számára férhető hozzá (jelenlegi PageContext objektum tárolja). application Az osztott használatú ServletContext tárolja a beant, így az application objektumon keresztül az alkalmazás összes JSP oldala számára hozzáférhető. Alternatív hozzáférés a getServletContext()-tel megkapott ServletContext objektum getAttribute(), setAttribute() metódusaival. session A HttpSession tárolja a beant, így a munkafolyamat oldalai számára hozzáférhető. request A ServletRequest tárolja a beant a jelenlegi JSP oldal fennállása alatt, s ezen objektum getAttribute() metódusával is hozzáférhető
A példányosított bean egy tulajdonságának módosítása <jsp:setProperty name="test" property="message" value="Hello Világ" /> A példányosított bean egy tulajdonságának olvasása <jsp:getProperty name="test" property="message" />
Járulékos lehetőségek Olvasás és írás szkriptlettel <%=test.getMessage() %> <% test.setMessage("Hello Világ"); %> Írás futásidejű értékkel – pl. az űrlapról beolvasott értékkel <% test.setMessage(request.getParameter("txt1")) %> // vagy
<jsp:setProperty name="test" property="message" value='<%=request.getParameter("txt1")%>' /> // vagy
!
<jsp:setProperty name="test" property="message" param="txt1" />
!
A csoport minden oldalán elhelyezendő jsp utasítások:
Feltételes létrehozás Csak akkor hoz létre egy beant a rendszer, ha azonos id és scope jellemzővel még nincs létrehozott bean. Ellenkező esetben a meglévőre ad vissza egy referenciát. Konténeres alak használata <jsp:useBean ...> Body
<jsp:useBean id="counter" class="/AWP.myBeans.AccessCountBean" scope="application"> <jsp:setProperty name="counter" property="firstPage" value="Current Page Name" /> A csoportba tartozó oldalakhoz a hozzáférések száma: <jsp:getProperty name="counter" property="accessCount" />
A törzs csak akkor hajtódik vége, ha új beant hoz létre a rendszer.
Példa: Számlálandó a hozzáférések száma az alkalmazás oldalainak egy csoportjához, s tárolandó az első hozzáfért oldal neve. Nem tudjuk azonban, melyik oldalhoz történik először a hozzáférés, melyikben tároljuk az oldal nevét? A feltételes végrehajtás segít.
Az AccessCountBean.java package myBeans; public class AccessCountBean { private String firstPage; private int accessCount = 1; public String getFirstPage(){return(firstPage);} public void setFirstPage(String fP){firstPage = fP;} public int getAccessCount(){return(accessCount++);} }
7
A WEB programozása - JSP1 dr.Gál Tibor 1. példa: táblázat generálás http://localhost:8080/eloadasJSP/tableBean.jsp A jsp oldal
2010. őszi félév
A tableBean osztály package beans; public class tableBean { private String private String
<jsp:useBean id="table" class="beans.tableBean" /> <jsp:setProperty name="table" property="source" value="11::22::33;; aa::bb::cc;; xx::yy::zz" />
source = null; result = null;
public void setSource(String source) {this.source = source;} public String getResult(){ String ttt = "
"; String[] sorok = source.split(";;"); for(int i=0; i<sorok.length; i++){ ttt += ""; String[] oszlopok = sorok[i].split("::"); for(int j=0; j" + oszlopok[j] + "< td>"; ttt += "
"; } return (ttt+"
"); }
<jsp:getProperty name="table" property="result" />
}
2. példa: adatbázis tábla letöltés http://localhost:8080/eloadasJSP/DBSelectBean.jsp A jsp oldal <jsp:useBean id="bbb" class="beans.DBSelectBean" /> <jsp:setProperty name="bbb" property="driver" value="sun.jdbc.odbc.JdbcOdbcDriver" /> <jsp:setProperty name="bbb" property="url" value="jdbc:odbc:Tanszek" /> <jsp:setProperty name="bbb" property="query" value="select * from munkatarsak" /> <jsp:setProperty name="bbb" property="cim" value="Munkatársak" /> <jsp:getProperty name="bbb" property="result" /> <jsp:setProperty name="bbb" property="query" value="select Név,Életkor from munkatarsak where Életkor<60" /> <jsp:getProperty name="bbb" property="result" />
A JavaBeans osztály package beans; import java.sql.*; public class DBSelectBean { private private private private private
String String String String String
driver url query cim result
= = = = =
null; null; null; null; null;
// A Az beállító metódusok AccessCountBean.java public public public public
void void void void
setDriver(String driver) {this.driver = driver;} setUrl(String url) {this.url = url;} setQuery(String query) {this.query = query;} setCim(String cim) {this.cim = cim;}
8
A WEB programozása - JSP1 dr.Gál Tibor A JavaBeans osztály (1. folytatás) // Az egyetlen kiolvasó metódus public String getResult(){ String ss = null; try { Class.forName(driver); Connection con = DriverManager.getConnection(url,"",""); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); ss = printResultSet(rs); rs.close(); stmt.close(); con.close(); Az AccessCountBean.java return ss; } catch (Exception ex) { return "Az adatbázis nem érheto el"; } }
A JavaBeans osztály (3. folytatás) s += "
"; s += "
";
} }
while ( rs.next() ) { s += ""; for (int i=1; i<=numCols; i++) { s += "" + rs.getString(i) + " | "; } s += "
"; } sAz+=AccessCountBean.java "
"; s += "
"; s += "