Title: Programrendszerek Fejleszt
1Programrendszerek Fejlesztése
2A mai eloadás tartalma
- Java Servlet
- Servlet Interfész
- Servlet Context
- Request
- Response
- Filter
- Session
- Web Application
- Probléma a Java Servlettel
- Template eszközök
- Java Server Pages
- Áttekintés
- Elemei
- Életciklusa
- Objektumok
- Java Beanek használata
- Java Standard Tag Library
- Custom Tag Library
- Java Server Faces
- Feladata
- Elemei
- Navigáció
- Támogató Bean
3Források
- http//java.sun.com/products/servlet/docs.html
- http//java.sun.com/developer/onlineTraining/Servl
ets/Fundamentals/contents.html - http//www.onjava.com/pub/a/onjava/2002/07/31/tomc
at.html
4Webes szolgáltatások
- Java Servlet
- Környezet
- Tomcat 4.0
- server.xml
- web.xml
5Java Servlet
- Java technológiára épülo web komponens
- platform független, bytecode
- dinamikusan betöltheto
- dinamikus tartalom eloállítására alkalmas
- egy tároló menedzseli (servlet engine)
- a web szerver vagy az alkalmazásszerver része,
vagy önálló alkalmazás saját web szerverrel
(Tomcat) - biztosítja azt a környezetet amelyen keresztül a
kérések és a válaszok (request, response)
lekezelhetoek - tartalmazza és menedzseli a servlet-eket egész
életfolyamatuk alatt
6Példa
- A kliens kapcsolatba lép a web szerverrel és
elküld egy HTTP kérést - A kérést a web szerver átadja a servlet tárolónak
amely futhat - ugyanabban a process-ben
- ugyanazon a gépen másik process-ben
- másik gépen
- A servlet tároló a kérés paraméterei alapján
meghívja a megfelelo servlet-et (URL) - A servlet a kérés paraméterei alapján
megállapítja mit szeretne a kliens ennek
megfeleloen végrehajtja a megfelelo muveleteket.
Válaszol a kliensnek a válasz objektum
segítségével - Miután a servlet tároló megállapította, hogy a
servlet befejezte a feladatot átadja a vezérlést
a web szervernek
7A servlet-ek elonyei
- hatékony
- hagyományos CGI n hívás n process
- kényelmes
- hatékony eszköztár a HTML urlap adatok
értelmezésére (http fejléc, süti, viszony) - platform független
- biztonságos
- nem általános shell program környezetben fut (itt
ki kell szurni a speciális karaktereket ) - buffer túlcsordulás nem léphet fel
- JVM (hibakezelés, )
- olcsó
- Tomcat - ingyenes
8A servlet interfész
- a servlet interfész megvalósítása vagy öröklése
teszi a servlet-et servlet-té (javax.servlet.Servl
et) - GenericServlet absztrakt osztály
- service
- HttpServlet absztrakt osztály
- HttpServletRequest
- HttpServletResponse
- kérés kezelo metódusok
- service
- minden kérésnél meghívódik
- HTTP specifikus kérés kezelo metódusok
- doGet
- doPost
- doPut
- doDelete
- doHead
- doOptions
- doTrace
- getLastModified
leggyakrabban használtak
9Példa
- import java.io.
- import javax.servlet.
- import javax.servlet.http.
- public class HelloWWW extends HttpServlet
- public void doGet(HttpServletRequest
request,HttpServletResponse response) throws
ServletException, IOException -
- response.setContentType("text/html")
- PrintWriter out response.getWriter()
- String docType
- "lt!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0
Transitional//EN\"gt\n" - out.println(docType "ltHTMLgt\nltHEADgtltTITLEgtHellolt/
TITLEgtlt/HEADgt\n" - "ltBODYgt\nltH1gtHello WWWlt/H1gt\nlt/BODYgtlt/HTMLgt")
-
10Servlet-ek csomagolása
- többen is fejleszthetnek egy web portált
- egy könyvtár használata nem célszeru
- külön könyvtárat célszeru használni
- csomagok használata (package)
- csomagnév.servlet
11A servlet életciklusa
- betöltés, példányosítás
- a tároló indításakor
- amikor szükség van az adott servlet-re
- inicializálás csak a betöltéskor
- init metódus
- argumentum nélküli nem olvas semmilyen
beállítást - ServletConfig object az elso sorban kötelezo
meghívnia super.init(config) metódust - betöltéskor pl. JDBC kapcsolat felépítése
- kérés feldolgozás minden egyes kérésre új szál
- service
- meghívja a megfelelo doXXX metódust (Request,
Response) - nem célszeru ezt felülírni (használjuk a
megfelelo doXXX metódusokat) - doXXX
- a szolgáltatás befejezése régóta nem aktív,
server leálítása, - destroy adatbázis kapcsolat bezárása,
háttérszálak leállítása,
121. rész
- import java.io.
- import javax.servlet.
- import javax.servlet.http.
- public class ShowMessage extends HttpServlet
- private String message
- private String defaultMessage "No message."
- private int repeats 1
- public void init(ServletConfig config) throws
ServletException - super.init(config)
- message config.getInitParameter("message")
- if (message null)
- message defaultMessage
-
- try
- String repeatString config.getInitParameter("
repeats") - repeats Integer.parseInt(repeatString)
- catch(NumberFormatException nfe)
13- public void doGet(HttpServletRequest
request,HttpServletResponse response) - throws ServletException, IOException
- response.setContentType("text/html")
- PrintWriter out response.getWriter()
- String title "The ShowMessage Servlet"
- out.println(ServletUtilities.headWithTitle(title)
- "ltBODY BGCOLOR\"FDF5E6\"gt\n"
- "ltH1 ALIGNCENTERgt" title "lt/H1gt")
- for(int i0 iltrepeats i)
- out.println(message "ltBRgt")
-
- out.println("lt/BODYgtlt/HTMLgt")
-
2. rész
14Egy-szál modell
- alap esetben a servlet egy példánya található meg
a memóriában - minden egyes kérés teljesítésére egy új szál
indul - figyelnünk kell a párhuzamos futásra, a megfelelo
eroforrások zárolására - Request, Response objektum csak a servlet futása
közben használható ! (recycling) - megakadályozható a párhuzamos futtatás a
SingleThreadModel interfész megvalósításával - ekkor egyszerre csak egy szál fut (a kérések egy
várakozási sorban figyelnek ?) - ezzel a megoldással nagyon lelassíthatjuk
rendszerünk muködését !
15Servlet futási környezet
- ServletContext interfész
- ilyennek látja a servlet a környezetét
- a tárolónak kell megvalósítania az interfészt
- ServletConfig config getServletConfig()
- a ServletContext objektum segítségével a servlet
- eseményeket menthet el (log)
- megállapíthatja az egyes források URL címét
- elmenthet és kiolvashat olyan értékeket a
környezetben melyet más, a környezetben futó
servlet-ek olvashatnak
16Hasznos metódusok
- inicializáló paraméterek
- getInitParameter
- getInitParameterNames
- környezeti paraméterek (JavaBean-ek használata)
- setAttribute
- getAttribute
- getAttributeNames
- removeAttribute
- eroforrások (HTML, GIF,JPEG) (nem alkalmasak
dinamikus tartalom kezelésére pl. index.jsp) - getResource
- getResourceAsStream
- ideiglenes könyvtár
- File tempdir(File)getServletContext().getAttribut
e("javax.servlet.context.tempdir")
17Kérés objektum
- HttpServletRequest
- Minden információ a HTTP kérésbol
- POST paraméterek
- getParameter
- getParameterNames
- getParameterValues
- getParameterMap
- HTTP fejléc
18A HTML urlap által küldött adatok kezelése
- GET metódus esetén az URL-ben kódolva jelennek
meg az adatok - http//host/path?userMartyHalloriginbwidestl
ax - POST metódus esetén a fejlécben vagy a törzsben
helyezkednek el - getParameter metódussal a POST kezelheto !
- karakterlánc (string) a visszatérési érték
- üres karakterlánc, ha nincs értéke a paraméternek
- NULL, ha nincs ilyen paraméter
- getParameterValues egy karaterlánc tömböt ad
vissza (ekkor egy paraméternek több értéke lehet
pl. checkbox) - a paraméter nevek érzékenyek a kis és a nagy
beture - getParameterNames - a használható paraméterek
listáját adja vissza (Enumeration)
19Perl script példa
- read(STDIN, buffer, ENV'CONTENT_LENGTH')
- _at_pairs split(//, buffer)
- foreach pair (_at_pairs)
-
- (name, value) split(//, pair)
- value tr// /
- value s/(a-fA-F0-9a-fA-F0-9)/pack("C",
hex(1))/eg FORMname value -
20Példa (HTML)
- lt!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN"gt - ltHTMLgt
- ltHEADgt
- ltTITLEgtCollecting Three Parameterslt/TITLEgt
- lt/HEADgt
- ltBODY BGCOLOR"FDF5E6"gt
- ltH1 ALIGN"CENTER"gtCollecting Three
Parameterslt/H1gt - ltFORM ACTION"servlet/ThreeParams METHODPOSTgt
- First Parameter ltINPUT TYPE"TEXT"
NAME"param1"gtltBRgt - Second Parameter ltINPUT TYPE"TEXT"
NAME"param2"gtltBRgt - Third Parameter ltINPUT TYPE"TEXT"
NAME"param3"gtltBRgt - ltCENTERgt
- ltINPUT TYPE"SUBMIT"gt
- lt/CENTERgt
- lt/FORMgt
- lt/BODYgt
- lt/HTMLgt
21Példa (Servlet)
- import java.io.
- import javax.servlet.
- import javax.servlet.http.
- public class ThreeParams extends HttpServlet
- public void doGet(HttpServletRequest
request,HttpServletResponse response) throws
ServletException, IOException -
- response.setContentType("text/html") PrintWriter
out response.getWriter() - String title "Reading Three Request
Parameters" - out.println(ServletUtilities.headWithTitle(title)
"ltBODY BGCOLOR\"FDF5E6\"gt\nltH1 ALIGNCENTERgt"
title "lt/H1gt\nltULgt\n ltLIgtltBgtparam1lt/Bgt "
request.getParameter("param1") "\n" - " ltLIgtltBgtparam2lt/Bgt " request.getParameter("para
m2") "\n" - " ltLIgtltBgtparam3lt/Bgt " request.getParameter("para
m3") "\n" "lt/ULgt\n" - "lt/BODYgtlt/HTMLgt")
- public void doPost(HttpServletRequest
request,HttpServletResponse response) throws
ServletException, IOException doGet(request,
response)
22A HTTP paraméterek kezelése
- getHeader(paraméter)
- string ha volt ilyen paramtér
- NULL ha nem volt ilyen paraméter
- ezzel elvileg minden típus olvasható azonban
vannak az egyes speciális paraméterekre külön
metódusok - getCookies egy cookie tömböt kapunk
- getAuthType, getRemoteUser
- getContentLength
- getContentType
- getDateHeader ,getIntHeader
- getHeaderNames minden fejléc név egy
Enumeration objektumban - getHeaders ha egy fejléc többször is szerepel
akkor is visszaadja a fenti módon - getMethod
- getRequestURI
- getProtocol
23Minden fejléc kiíratása
- import java.io.
- import javax.servlet.
- import javax.servlet.http.
- import java.util.
- public class ShowRequestHeaders extends
HttpServlet - public void doGet(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException - response.setContentType("text/html")
- PrintWriter out response.getWriter()
- String title "Servlet Example Showing Request
Headers" - out.println(
-
- Enumeration headerNames request.getHeaderNames()
- while(headerNames.hasMoreElements())
- String headerName (String)headerNames.nextElemen
t() - out.println("ltTRgtltTDgt" headerName)
- out.println(" ltTDgt" request.getHeader(headerName
)) -
- out.println("lt/TABLEgt\nlt/BODYgtlt/HTMLgt")
-
Minden paraméter kiíratása
24Válasz objektum
- magában foglal minden információt a kliens
számára - használhatunk buffer-t
- getBufferSize
- setBufferSize (a tároló nagyobbra is állíthatja)
- isCommitted
- reset
- resetBuffer a fejrészt és a státusz kódot nem
törli - flushBuffer
- Fejlécek
- setHeader
- addHeader
- setIntHeader
- setDateHeader
- addIntHeader
- addDateHeader
- Használjuk a X-Powered-By fejlécet
(X-Powered-By Servlet/2.4 JSP/2.0 (Tomcat/5.0
JRE/1.4.1)) - Átirányítás
- sendRedirect
- sendError
25Státusz kezelése
- response.setStatus(int),
- public void sendError(int code, String message)
- public void sendRedirect(String url)
- response.sendRedirect(response.encodeURL(url))
26Képek létrehozása
- Kép létrehozása
- Frame f new Frame()
- f.addNotify() // nem kell az ablakot megnyitni
csak egy ilyen objektumot hozunk létre - Image img f.createImage(width, height),
- Rajzoljunk a képbe
- Graphics g img.getGraphics()
- g.fillRect(...)
- g.drawString(...)
- A Content-Type válasz fejléc beállítása
- response.setContentType("image/gif")
- Egy válasz stream-et nyitunk
- OutputStream out response.getOutputStream()
- Küldjük el képünket GIF formátumban, itt egy
kódolót kell használnunk. Ilyent a
http//www.acme.com/java/ címen tudunk elérni. - try new GifEncoder(img, out).encode()
catch(IOException ioe)
27Példa alkalmazás
28Eredmény
29Viszony követés
- a HTTP állapotmentes
- fontos az állapotkövetés
- bevásárló kosár
- négy megoldás
- sütik
- URL átírás
- HTTPS viszony követés
- rejtett HTML mezok
30Sütik (Cookies)
- rövid szöveges információk melyeket a web szerver
küld a kliensnek - segítségével
- azonosíthatjuk a felhasználót egy e-commerce
viszony alatt (bevásárló kosár) - elkerülheto a felhasználói név és a jelszó
(alacsony biztonsági szint) - személyre szabható az oldal
- a felhasználói információ értékes (célozott
reklámok)
31Problémák
- 4 kbyte, 20 cookie/site, 300 süti összesen
- az emberek nem szeretik, ha a kereso gépek
megjegyzik mit szeretnek keresni - a sütikben tárolt információ nem biztonságos (más
is használhatja a gépet, lemásolható a süti) - a fenti okok miatt a felhasználók gyakran
kikapcsolják a sütiket
32Sütik használata
- new Cookie(name, value)
- cookie.setXxx
- response.addCookie(cookie)
- request.getCookies egy tömböt ad vissza melynek
Cookie objektum elemei vannak, NULL ha nincs süti - cookie.getXxx
33Sütik létrehozása
- sem a neve sem az értéke nem tartalmazhatja a
következo karaktereket - ( ) , " / ? _at_
- a következo metódusoknak meg van a getXxx párja
is - setComment() megjegyzést adhatunk a sütihez
- setDomain() segítségével beállíthatjuk a
sütihez tartozó tartományt (a böngészo többek
között ez alapján állapítja meg kinek mit adhat
vissza) - setMaxAge() a süti érvényességének idotartamát
állíthatjuk be másodpercben (-1 csak a jelenlegi
viszonyban érvényes) - setName() a süti nevét állítja be
- setPath() a tartományon belüli érvényességet
adja meg - setSecure() csak titkosított kapcsolaton
keresztül viheto át - setValue() az értékét adhatjuk meg
34- import java.io.
- import javax.servlet.
- import javax.servlet.http.
- public class SetCookies extends HttpServlet
- public void doGet(HttpServletRequest
request,HttpServletResponse response) - throws ServletException, IOException
- for(int i0 ilt3 i)
- Cookie cookie new Cookie("Session-Cookie "
i,"Cookie-Value-S" i) - response.addCookie(cookie)
- cookie new Cookie("Persistent-Cookie "
i,"Cookie-Value-P" i) - cookie.setMaxAge(3600)
- response.addCookie(cookie)
-
- response.setContentType("text/html")
- PrintWriter out response.getWriter()
- String title "Setting Cookies"
- out.println
- (ltheadgtlt/headgtltBODY BGCOLOR\"FDF5E6\"gt\n"
- "ltH1 ALIGN\"CENTER\"gt" title "lt/H1gt\n"
Sütik létrehozása
35- import java.io.
- import javax.servlet.
- import javax.servlet.http.
- public class ShowCookies extends HttpServlet
- public void doGet(HttpServletRequest
request,HttpServletResponse response) - throws ServletException, IOException
- response.setContentType("text/html")
- PrintWriter out response.getWriter()
- String title "Active Cookies"
- out.println(ServletUtilities.headWithTitle(title)
-
- Cookie cookies request.getCookies()
- Cookie cookie
- for(int i0 iltcookies.length i)
- cookie cookiesi
- out.println("ltTRgt\n"
- " ltTDgt" cookie.getName() "\n"
- " ltTDgt" cookie.getValue())
-
Sütik kiolvasása
36URL átírás
- http//host/path/file.htmljsessionid1234,
- nem tiltható le
37HTML rejtett mezo
- ltINPUT TYPE"HIDDEN" NAME"session" VALUE"..."gt
- csak akkor muködik ha minden oldal dinamikusan
generált
38Egy teljesebb megoldás
- HttpSession API
- magas szintu interfész mely sütiken vagy URL
átíráson alapul - sütit használ ha lehetséges, amennyiben nem akkor
átvált URL átírásra - az alsó részeivel nem kell foglalkoznunk
39Létrehozása
- HttpSession session request.getSession(true)
- létrehoz egy viszony objektumot
- amennyiben már volt egy (valamikor régen, vagy
most) akkor azt nyitja meg (true) - a HttpSession objektum a szerveren tárolódik
- komoly adatstruktúrával rendelkezhet melyet mi
adhatunk meg
40Példa
- HttpSession session request.getSession(true)
- ShoppingCart cart (ShoppingCart)session.getValue
("shoppingCart") - if (cart null)
-
- cart new ShoppingCart()
- session.putValue("shoppingCart", cart)
-
- doSomethingWith(cart)
41Metódusok
- set/getAttribute()
- removeAttribute()
- getAttributeNames() enumeration
- getId() a viszony azonosítót adja vissza
- isNew() true ha a kilens még nem látta a
viszonyt - getCreationTime()
- getLastAccessedTime()
- getMaxInactiveInterval()
- invalidate()
42A kérés továbbadása
- RequestDispatcher interfész
- a ServletContext objektumból tudjuk eloállítani
- getRequestDispatcher a servlet elérési
útvonalát adhatjuk meg (a futási környezeten
belül /-el kezdodik) - getNamedDispatcher a servlet ServletContext-ben
ismert nevét adhatjuk meg - továbbítás
- include nem módosíthatja a válsz objektum
fejléc mezoit, - forward csak akkor használhatjuk, ha még nem
válaszoltunk a kliensnek (nincs adat a bufferben,
ezt elobb törölni kell) - az esetleges paraméterek elsobbséget élveznek
43Példa
- String path /raisons.jsp?orderno5
- RequestDispatcher rd context.getRequestDispatche
r(path) - rd.include(request, response)
44Tomcat könyvtár hierarchia
- bin -gt itt helyezkednek el az indító, leállító
szkriptek fájlok - log -gt log fájlok
- lib -gt jar fájlok
- conf -gt server.xml
- itt tudunk új környezetet létrehozni
- webapps -gt webes alkalmazások könyvtára
45server.xml
- server elem egy lehet belole
- service elem egy vagy több connector elem lehet
benne de egy engine elem - connector HTTP1.1 vagy Warp itt tudjuk például
a port-ot beállítani - engine a Tomcat szolgáltatási pontja, ezen
belül tudjuk létrehozni például a virtuális
címeket - host itt tudjuk megadni a hozzá tartozó URL-t
és a gyökér könyvtárat - contex az egyes alkalmazások környezetéet
definiálja a host-on belül.
46Példa
- ltServer port"8005" shutdown"SHUTDOWN"
debug"0"gt - ltService name"Tomcat-Standalone"gt
- ltConnector className"org.apache.catalina.conn
ector.http.HttpConnector" - port"8080" minProcessors"5"
maxProcessors"75" - enableLookups"true"
redirectPort"8443" - acceptCount"10" debug"0"
connectionTimeout"60000"/gt - ltEngine name"Standalone" defaultHost"localho
st" debug"0"gt - ltLogger className"org.apache.catalina.logge
r.FileLogger" - prefix"catalina_log."
suffix".txt" - timestamp"true"/gt
- ltRealm className"org.apache.catalina.realm.
MemoryRealm" /gt - ltHost name"localhost" debug"0"
appBase"webapps" unpackWARs"true"gt - ltValve className"org.apache.catalina.valv
es.AccessLogValve" - directory"logs"
prefix"localhost_access_log." suffix".txt" - pattern"common"/gt
- ltLogger className"org.apache.catalina.log
ger.FileLogger" - directory"logs"
prefix"localhost_log." suffix".txt" - timestamp"true"/gt
- ltContext path"/teszt" docBase"teszt"
47Alkalmazás környezet
- html, jsp,
- WEB-INF
- classes itt helyezkednek el a class fájlaink
(jó esetben csomagokban)com.mycompany.mypackage.M
yServlet /WEB-INF/classes/com/mycompany/mypackage
/MyServlet.class - web.xml leírja az általunk használt
servlet-eket, , újra kell indítani a Tomcat-et,
hogy újra értelmezze - lib az általunk használt jar fájlokat
helyezhetjük el itt pl. jdbc fájlok
48web.xml
- URL-ek testreszabása
- URL-ek kikapcsolása
- Servler-ek inicializálása
- Servler-ek betöltése elore
- Szurok definiálása
- Hiba, és köszönto oldalak definiálása
49URL-ek testreszabása
- a leggyakrabban használt szolgáltatása
- servlet elem
- servlet-name
- servlet-class, jsp-file (/ !!!!)
- servlet-mapping elem
- servlet-name
- url-pattern (/valami, /.asp)
50Példa
- lt?xml version"1.0" encoding"ISO-8859-1"?gt
- lt!DOCTYPE web-app PUBLIC
- "-//Sun Microsystems, Inc.//DTD Web Application
2.3//EN" - "http//java.sun.com/dtd/web-app_2_3.dtd"gt
- ltweb-appgt
- lt!-- ... --gt
- ltservletgt
- ltservlet-namegtTestlt/servlet-namegt
- ltservlet-classgtmoreservlets.TestServletlt/servlet
-classgt - lt/servletgt
- ltservlet-mappinggt
- ltservlet-namegtTestlt/servlet-namegt
- lturl-patterngt/UrlTestlt/url-patterngt
- lt/servlet-mappinggt
- lt!-- ... --gt
- lt/web-appgt
51Servlet meghívó letiltása
- amennyiben egy másik URL-en keresztül érjük el
akkor az inicializálás végrehajtódik - ha erre számítunk akkor az alapértelmezett URL
letiltására két módunk van - a /servlet/ útvonal átirányítása
- az Invoker servlet globális kikapcsolása
- install_dir/conf/web.xml
- lt!--
- ltservlet-mappinggt
- ltservlet-namegtinvokerlt/servlet-namegt
- lturl-patterngt/servlet/lt/url-patterngt
- lt/servlet-mappinggt
- --gt
52Példa
- lt?xml version"1.0" encoding"ISO-8859-1"?gt
- lt!DOCTYPE web-app PUBLIC
- "-//Sun Microsystems, Inc.//DTD Web Application
2.3//EN" - "http//java.sun.com/dtd/web-app_2_3.dtd"gt
- ltweb-appgt
- ltservletgt
- ltservlet-namegtSorrylt/servlet-namegt
- ltservlet-classgtmoreservlets.SorryServletlt/servlet
-classgt - lt/servletgt
- lt!-- ... --gt
- ltservlet-mappinggt
- ltservlet-namegtSorrylt/servlet-namegt
- lturl-patterngt/servlet/lt/url-patterngt
- lt/servlet-mappinggt
- lt!-- ... --gt
- lt/web-appgt
53Servlet-ek inicializálása
- init-param elem
- param-name ,param-value
- public void init()
- ServletConfig config getServletConfig()
- firstName config.getInitParameter("firstName")
- emailAddress config.getInitParameter("emailAddre
ss") -
- alkalmazás szintu kezdeti paraméterek
- context-param elem
- param-name, paramvalue
54Példa
- ltcontext-paramgt
- ltparam-namegtsupport-emaillt/param-namegt
- ltparam-valuegtblackhole_at_mycompany.comlt/param-value
gt - lt/context-paramgt
- ltservletgt
- ltservlet-namegtInitTestlt/servlet-namegt
- ltservlet-classgtmyPackage.InitServletlt/servlet-cla
ssgt - ltinit-paramgt
- ltparam-namegtparam1lt/param-namegt
- ltparam-valuegtValue 1lt/param-valuegt
- lt/init-paramgt
- ltinit-paramgt
- ltparam-namegtparam2lt/param-namegt
- ltparam-valuegt2lt/param-valuegt
- lt/init-paramgt
- lt/servletgt
55Servlet-ek betöltése
- servlet elem
- load-on-startup
- ltservletgt
- ltservlet-namegtSearchlt/servlet-namegt
- ltservlet-classgtmyPackage.SearchServletlt/servlet-c
lassgt - ltload-on-startupgt1lt/load-on-startupgt
- lt/servletgt
- ltservletgt
- ltservlet-namegtResultslt/servlet-namegt
- ltjsp-filegt/results/index.jsplt/jsp-filegt
- ltload-on-startupgt2lt/load-on-startupgt
- lt/servletgt
56Szurok definiálása
- a szurok módosíthatják a kérés és válasz
objektumot - mielott egy JSP vagy servlet oldal a kérés
objektumhoz jutna az elso szuro doFilter metódusa
lefut - itt kell meghívni a FilterChain objektum doFilter
metódusát amely továbbadja a kérés objektumot
vagy egy másik szuronek vagy a megfelelo
servlet-nek
57Szurok használata
- Azonosítás
- Naplózás
- Kép konvertálás
- Tömörítés
- Titkosítás
- Darabolás
- XML konverzió
58Szuro példa
- import java.io.
- import javax.servlet.
- import javax.servlet.http.
- import java.util.
- public class ReportFilter implements Filter
- public void doFilter(ServletRequest
request,ServletResponse response, - FilterChain chain) throws ServletException,
IOException - HttpServletRequest req (HttpServletRequest)reque
st - System.out.println(req.getRemoteHost() " tried
to access " - req.getRequestURL() " on " new Date() ".")
- chain.doFilter(request,response)
-
- public void init(FilterConfig config)
- throws ServletException
-
- public void destroy()
-
Szuro
59Szuro definiálása a web.xml fájlban
- a servlet elemek elott kell lennie
- filter elem
- filter-name, filter-class
- filter-mapping
- filter-name
- servlet-name
60Példa
- ltfiltergt
- ltfilter-namegtReporterlt/filter-namegt
- ltfilter-classgtmoreservlets.ReportFilterlt/filter-c
lassgt - lt/filtergt
- ltfilter-mappinggt
- ltfilter-namegtReporterlt/filter-namegt
- ltservlet-namegtSomeServletNamelt/servlet-namegt
- lt/filter-mappinggt
- ltfilter-mappinggt
- ltfilter-namegtReporterlt/filter-namegt
- lturl-patterngt/lt/url-patterngt
- lt/filter-mappinggt
- ltservletgt
- ltservlet-namegtSomeServletNamelt/servlet-namegt
- ltjsp-filegt/TestPage.jsplt/jsp-filegt
- lt/servletgt
61Üdvözlo oldalak beállítása
- akkor fontos amikor a kliens nem egy pontos
útvonalat, hanem csak egy könyvtárat ad meg - welcome-file-list elem
- welcome-file
- ltwelcome-file-listgt
- ltwelcome-filegtindex.jsplt/welcome-filegt
- ltwelcome-filegtindex.htmllt/welcome-filegt
- lt/welcome-file-listgt
62Hiba oldalak
- error-page elem
- error-code, exception-type
- lterror-pagegt
- lterror-codegt404lt/error-codegt
- ltlocationgt/NotFound.jsplt/locationgt
- lt/error-pagegt
- lterror-pagegt
- ltexception-typegtpackageName.classNamelt/exception-
typegt - ltlocationgt/SomeURLlt/locationgt
- lt/error-pagegt
63Probléma a Java Servlet-tel
- MVC ?
- Println(ltHTMLgtlt/HTMLgt)
- Nem különülnek el a feladatok
- HTML tervezo
- Felhasználói interfész logika fejleszto
- Üzleti logika fejleszto
- Komponens fejleszto
- Alkalmazás tervezo
- A fejleszto hozzáfér a teljes Servlet API-hoz
(html programoz is !) - Nehézkes RAD eszözöket vagy WYSIWYG eszközöket
alkalmazni
64Megoldások
- Template engine-k használata
- Magasabb szintu funkciók
- Bovítheto építoelem készlet
- Népszerubb template motorok-k
- JSP
- Velocity
- FreeMarker
-
- Ezekre épülo keretrendszerek
- Java Server Faces
- Struts
- Turbine
65JSP 1.0
- lthtmlgt
- ltheadgtlttitlegtHellolt/titlegtlt/headgt
- ltbodygt
- lth1gt
- lt
- if (request.getParameter("name") null)
- out.println("Hello World")
-
- else
- out.println("Hello, " request.getParameter("n
ame")) -
- gt
- lt/h1gt
- lt/bodygtlt/htmlgt
66Velocity
- lthtmlgt
- ltheadgtlttitlegtHellolt/titlegtlt/headgt
- ltbodygt
- lth1gt
- if (request.getParameter("name") null)
Hello World - else Hello, request.getParameter("name")
- end lt/h1gt
- lt/bodygt
- lt/htmlgt
67A JSP áttekintése
- Bármilyen XML oldalon lehet
- XML szintakszis
- Elvileg megvalósíthatja az MVC-t vagy Model
2-architektúrát - Model Java Bean
- View JSP
- Controler Servlet
- Azonban tipikusan Model 1 architekúra
- Az üzleti logika és a megjelenítés nincs
szeparálva
68Elemei
- Oldal direktíva
- lt_at_ page contentType"text/html charsetUTF-8"
gt - Akció elem direktíva
- lt_at_ taglib urihttp//java.sun.com/jsp/jstl/core
prefix"c" gt - Akció elemek
- ltjspuseBean id"locales" scope"application
class"mypkg.MyLocales"/gt - JSP elemek (Expression Language)
- ltcset var"selectedFlag value"!empty
selectedLocaleString" /gt - Szkript elemek
- ltjava kódgt
69Példa
70A JSP oldal életciklusa
- Konvertálás Servletté
- Fordítás
- Futtatás
- Bufferelés
71Objektumok
- Implicit
- A tároló hozza létre oket
- Request,
- Alkalmazás specifikus
- Tipikusan Java Bean-ben tárolódnak
- Megosztott objektumok
- Szálak között (I/N)
- Kötodhetnek
- Laphoz pageContext
- Alkalmazáshoz - servletContext
- Viszonyhoz session
- Kéréshez request
- Válaszhoz response
72Java Bean-nek használata
- ltjspuseBean id" bookDB scope"application
class"mypkg. bookDB "/gt - ltcset var"bid" value"param.bookId"/gt
- ltjspsetProperty name"bookDB" property"bookId
value"bid" /gt - ltjspsetProperty name"bookDB" property/gt
- bookDB.bookDetails.title
- ltjspgetProperty name"beanName"
property"propName"/gt
73Java Server Pages Standard Tag Library
- Standard, gyakran használt elemek összegyujtve
- Típusai
- Alap (c)
- Változó támogatás
- Folyam vezérlés
- URL manipulálás
- Egyéb
- XML (x)
- Alap
- Folyam vezérlés
- Transzformáció
- I18n (fmt)
- Lokalitás
- Üzenet formázás
- Szám, dátum formázás
- Adatbázis (sql)
- SQL
- Egyébb (fn)
- Gyujtemény hossz
74Példák
- Core
- ltcset var"foo" scope"session" value"..."/gt
- ltcforEach var"item" items"sessionScope.cart.i
tems"gt - ...
- lttrgt
- lttd align"right" bgcolor"ffffff"gt
- item.quantity
- lt/tdgt
- ...
- lt/cforEachgt
- URL
- ltacmetransformgt
- ltjspinclude page"/exec/employeesList"/gt
- ltacmetransform/gt
- ltcimport url"/books.xml" var"xml" /gt
- ltxparse doc"xml" var"booklist"
- scope"application" /gt
- SQL
- ltcset var"bid" value"param.Add"/gt
75Saját Elem Könyvtár
- Újrahasznosítható komponensek
- Felhasználó által definiált JSP komponens
- Könyvtárakba gyujtik a hasonló funkciókat,
egy-egy funkciót megvalósító kód az elem kezelo
(Tag Handler) - Logika/Megjelenítés elkülönül
- Lehetoségek
- Paraméterek átadása
- Értékek visszaadása
- Minden objektumot elér a JSP oldalon
- Kommunikálhatnak egymással
- Egymásba ágyazhatóak
- Két típus
- Egyszeru (Nem lehet benne szkript elem)
- Klasszikus
- Tag fájl JSP vagy Java kód, a tároló fordítja le
76Attribútumok
- Elem attribútumok
- Egyszeru
- ltpeldap attr érték/gt
- ltpeldap attr object.Value/gt
- Darab (Fragment) egy JSP kód darabot kap
attribútumként - ltsccatalog bookDB "bookDB" color"cccccc"gt
- ltjspattribute name"normalPrice"gt
- ltfmtformatNumber value"price"
type"currency"/gt - lt/jspattributegt
- ltjspattribute name"onSale"gt
- ltstrikegtltfmtformatNumber value"price
type"currency"/gtlt/strikegtltbr/gt - ltfont color"red"gtltfmtformatNumber
value"salePrice type"currency"/gtlt/fontgt - lt/jspattributegt
- lt/sccataloggt
- Dinamikus
- Nincs specifikálva, menet közben derül ki
77Törzs (Body)
- Egy elem más elemeket és HTML tartalmat is
tartalmazhat - ltcif test"param.Clear"gt
- ltfont color"ff0000" size"2"gtltstronggt
- You just cleared your shopping cart!
- lt/stronggtltbrgtnbspltbrgtlt/fontgt
- lt/cifgt
- jspbody
78Elemek közötti kommunikáció
- Megosztott objektumok segítségével kommunikálnak
(oldal környezet) - ltcset var"aVariable" value"aValue" /gt
- ltttanotherTag attr1"aVariable" /gt
- Az egymásba ágyazott elemek a privát változókat
is használhatják
79Példa
- Tag fájl
- JSP kódot tartalmaz (WEB-INF/tags, WEB-INF/lib)
- lt_at_ attribute name"greeting" required"true" gt
- lt_at_ attribute name"name" required"true" gt
- lth2gtltfont color"black"gtgreeting,
name!lt/fontgtlt/h2gt - Használata
- lt_at_ taglib tagdir"/WEB-INF/tags" prefix"h" gt
- lthtmlgt
- ltheadgtlttitlegtHellolt/titlegtlt/headgt
- ltbody bgcolor"white"gt
- ltcset var"greeting" value"Hello" /gt
- ltform method"get"gt
- ltinput type"text" name"username" size"25"gt
- ltpgtlt/pgt
- ltinput type"submit" value"Submit"gt
- ltinput type"reset" value"Reset"gt
- lt/formgt
- lthresponse greeting"greeting
name"param.username"/gt
80Tag Library Descriptor
- Amennyiben Java-ban írjuk meg az elemkészletünket
akkor szükséges - Információt tartalmaz az elem gyujteményrol és az
elemekrol is - lttaggt
- ltnamegtpresentlt/namegt
- lttag-classgtcondpkg.IfSimpleTaglt/tag-classgt
- ltbody-contentgtscriptlesslt/body-contentgt
- ...
- ltattributegt
- ltnamegttestlt/namegt
- ltrequiredgttruelt/requiredgt
- ltrtexprvaluegttruelt/rtexprvaluegt
- lt/attributegt
- ...
- lt/taggt
81Java Tag
- SimpleTag, interfészt kell megvalósítani
- doTag
- get/set
- javax.servlet.jsp.JspContext
- getJspBody()
-
- public HelloWorldSimpleTag extends
SimpleTagSupport - public void doTag() throws JspException,
IOException - getJspContext().getOut().write("Hello, world.")
-
-
- public class SimpleWriter extends
SimpleTagSupport - public void doTag() throws JspException,
IOException - StringWriter sw new StringWriter()
- jspBody.invoke(sw)
- jspContext().
- getOut().println(sw.toString().toUpperCase())
-
82Iterátor Tag
- lt_at_ taglib uri"/tlt" prefix"tlt" gt
- lthtmlgt
- ltheadgt
- lttitlegtDepartmentslt/titlegt
- lt/headgt
- ltbody bgcolor"white"gt
- ltjspuseBean id"myorg" class"myorg.Organization
"/gt - lttable border2 cellspacing3 cellpadding3gt
- lttrgt
- lttdgtltbgtDepartmentslt/bgtlt/tdgt
- lt/trgt
- lttltiterator var"departmentName"
type"java.lang.String" - group"myorg.departmentNames"gt
- lttrgt
- lttdgtlta href"list.jsp?deptNamedepartmentName
"gt - departmentNamelt/agtlt/tdgt
- lt/trgt
- lt/tltiteratorgt
- lt/tablegt
83Iterátor Tag
- public void doTag() throws JspException,
IOException - if (iterator null)
- return
- while (iterator.hasNext())
- getJspContext().setAttribute(var,
iterator.next()) - getJspBody().invoke(null)
-
-
- public void setVar(String var)
- this.var var
-
- public void setGroup(Collection group)
- this.group group
- if(group.size() gt 0)
- iterator group.iterator()
-
84Szkriptek használata
- JSP oldalakon Java kódot is használhatunk
- Nem célszeru használnunk mert eléggé
átláthatatlan lesz az oldal - Biztonsági kockázata is van (a servlet
kontextushoz is hozzáférhet mindenki) - lt!
- private BookDBAO bookDBAO
- public void jspInit()
- bookDBAO
- (BookDBAO)getServletContext().getAttribute("bookD
B") - if (bookDBAO null)
- System.out.println("Couldnt get database.")
-
- gt
- lt!
- public void jspDestroy()
- bookDBAO null
-
- gt
85Cél
86Java Server Faces
- Szerver oldali web komponens felhasználói
felületek létrehozására - Model 2, MVC
- A logika és a megjelenítés elkülönül
- Hasonló lehetoségeket biztosít a fejlesztoknek
mint a Desktop GUI fejlesztése - A Servlet API-ra épül -gt független a JSP-tol
87JSF
- Elemei
- API az UI komponensek reprezentálására és
állapotuk kezelésére, validálásra, navigációra,
- JSP Elem könyvtárak
- Segítségével
- A felhasználói eseményeket a szerver oldali
kódhoz köthetjük - Az UI komponensek adatait szerver oldali
adattárolókhoz köthetjük - UI készítés újrafelhasználható elemekkel
- UI állapot elmentése és betöltése
- Folyamatokat definiálhatunk
88Komponens modell
- UIComponent-ek (UIComponentBase) melyek leírják
az UI komponensek állapotát és viselkedését - Renderelo modell mely leírja a megjelenését
- Kódolás, Dekódolás
- Esemény kezelo (JavaBean tervezési mintát követi)
- ActionEvent
- ValueChangedEvent
- Konverziós modell
- Validációs modell (egy vagy több üzenetet
gyártanak) - lthinputText id"userNo value"UserNumberBean.u
serNumber validator_length minimum6
maximum'10 /gt
89Hogyan muködik
90Kérés feldolgozási életciklus
91Tipikus JSF alkalmazás
- Java Bean-ek
- Esménykezelok
- Validátorok
- JSP oldalak
- Szerver oldali segéd osztályok
- Facesconfig.xml
92Példa
93Navigáció definiálása
- ltnavigation-rulegt
- ltfrom-view-idgt/greeting.jsplt/from-view-idgt
- ltnavigation-casegt
- ltfrom-outcomegtsuccesslt/from-outcomegt
- ltto-view-idgt/response.jsplt/to-view-idgt
- lt/navigation-casegt
- lt/navigation-rulegt
- ltnavigation-rulegt
- ltfrom-view-idgt/response.jsplt/from-view-idgt
- ltnavigation-casegt
- ltfrom-outcomegtsuccesslt/from-outcomegt
- ltto-view-idgt/greeting.jsplt/to-view-idgt
- lt/navigation-casegt
- lt/navigation-rulegt
- lthcommandButton id"submit" action"success"
- value"Submit" /gt
94Támogató Bean
- Feladata az oldalon lévo elemek adatainak
tárolása és az eseménykezelok, validálók,
megvalósítása - Integer userNumber null
- ...
- public void setUserNumber(Integer user_number)
- userNumber user_number
-
- public Integer getUserNumber()
- return userNumber
-
- public String getResponse()
- if(userNumber ! null
- userNumber.compareTo(randomInt) 0)
- return "Yay! You got it!"
- else
- return "Sorry, "userNumber" is incorrect."
-
-
95Menedzselt Bean
- A támogató babot regisztrálnunk kell
- ltmanaged-beangt
- ltmanaged-bean-namegtUserNumberBeanlt/managed-bean-n
amegt - ltmanaged-bean-classgt
- guessNumber.UserNumberBean
- lt/managed-bean-classgt
- ltmanaged-bean-scopegtsessionlt/managed-bean-scopegt
- ltmanaged-propertygt
- ltproperty-namegtminimumlt/property-namegt
- ltproperty-classgtlonglt/property-classgt
- ltvaluegt0lt/valuegt
- lt/managed-propertygt
- ltmanaged-propertygt
- ltproperty-namegtmaximumlt/property-namegt
- ltproperty-classgtlonglt/property-classgt
- ltvaluegt10lt/valuegt
- lt/managed-propertygt
- lt/managed-beangt
96Fejlesztési lépések
- Modell objektumok fejlesztése
- Ezek hozzárendelése menedzselt babként
- Web oldalak létrehozása UI komponensekkel
- Navigáció definiálása
- Web.xml konfigurálása
97A mai eloadás tartalma
- Probléma a Java Serlettel
- Template eszközök
- Java Server Pages
- Áttekintés
- Elemei
- Életciklusa
- Objektumok
- Java Beanek használata
- Java Standard Tag Library
- Custom Tag Library
- Java Server Faces
- Feladata
- Elemei
- Navigáció
- Támogató Bean
98A következo alkalmazás tartalma
- Alkalmazás szerverek és ezek szolgáltatásai
- EAR állományok
- JMX
- Példák
- Jboss, WebSphere