Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Fejlett Programozási Technikák 2.

Hasonló előadás


Az előadások a következő témára: "Fejlett Programozási Technikák 2."— Előadás másolata:

1 Fejlett Programozási Technikák 2.
14/10

2 Webes szolgáltatások Java Servlet Környezet Tomcat 4.0 server.xml
web.xml

3 Webes szolgáltatások Java WSDP fejlesztői csomag Tomcat + JSDK JSP
Java Servlet Java XML pack Tomcat Ant Tomcat + JSDK

4 Java Servlet Java technológiára épülő web komponens
platform független, bytecode dinamikusan betölthető dinamikus tartalom előá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 (requset, response) lekezelhetőek tartalmazza és menedzseli a servlet-eket egész életfolyamatuk alatt

5 Pé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 megfelelő servlet-et A servlet a kérés paraméterei alapján megállapítja mit szeretne a kliens ennek megfelelően végrehajtja a megfelelő műveleteket. 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

6 A servlet-ek előnyei hatékony kényelmes platform független biztonságos
hagyományos CGI: n hívás n process kényelmes hatékony eszköztár a HTML űrlap 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 szűrni a speciális karaktereket …) buffer túlcsordulás nem léphet fel olcsó Tomcat - ingyenes

7 leggyakrabban használtak
A servlet interfész a servlet interfész megvalósítása vagy öröklése teszi a servlet-et servlet-té GenericServlet ,HttpServlet HttpServletRequest HttpServletResponse kérés kezelő metódusok: service minden kérésnél meghívódik HTTP specifikus kérés kezelő metódusok: doGet doPost doPut doDelete doHead doOptions doTrace leggyakrabban használtak

8 Pé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 = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"; out.println(docType +"<HTML>\n<HEAD><TITLE>Hello</TITLE></HEAD>\n" + "<BODY>\n<H1>Hello WWW</H1>\n</BODY></HTML>"); }

9 Servlet-ek csomagolása
többen is fejleszthetnek egy web portált egy könyvtár használata nem célszerű külön könyvtárat célszerű használni csomagok használata (package) csomagnév.servlet

10 A 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 első sorban kötelező 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 megfelelő doXXX metódust nem célszerű ezt felülírni (használjuk a megfelelő 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, …

11 1. 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) {}

12 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) + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + title + "</H1>"); for(int i=0; i<repeats; i++) { out.println(message + "<BR>"); } out.println("</BODY></HTML>"); 2. rész

13 Egy-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 megfelelő erőforrások zárolására 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 működését !

14 A HTML űrlap által küldött adatok kezelése
GET metódus esetén az URL-ben kódolva jelennek meg az adatok: POST metódus esetén a fejlécben vagy a törzsben helyezkednek el getParameter metódussal mindkettő kezelhető ! 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 betűre getParameterNames - a használható paraméterek listáját adja vissza (Enumeration)

15 Példa: (HTML) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>Collecting Three Parameters</TITLE> </HEAD> <BODY BGCOLOR="#FDF5E6"> <H1 ALIGN="CENTER">Collecting Three Parameters</H1> <FORM ACTION="servlet/ThreeParams"> First Parameter: <INPUT TYPE="TEXT" NAME="param1"><BR> Second Parameter: <INPUT TYPE="TEXT" NAME="param2"><BR> Third Parameter: <INPUT TYPE="TEXT" NAME="param3"><BR> <CENTER> <INPUT TYPE="SUBMIT"> </CENTER> </FORM> </BODY> </HTML>

16 Pé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) +"<BODY BGCOLOR=\"#FDF5E6\">\n<H1 ALIGN=CENTER>" + title + "</H1>\n<UL>\n <LI><B>param1</B>: "+ request.getParameter("param1") + "\n" + " <LI><B>param2</B>: "+ request.getParameter("param2") + "\n" + " <LI><B>param3</B>: "+ request.getParameter("param3") + "\n" +"</UL>\n" + "</BODY></HTML>");} public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

17 A 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

18 Minden 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.nextElement(); out.println("<TR><TD>" + headerName); out.println(" <TD>" + request.getHeader(headerName)); } out.println("</TABLE>\n</BODY></HTML>"); public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);} Minden paraméter kiíratása Minden fejléc kiíratása

19 Weboldalak tömörítése
import java.util.zip.*; public class EncodedPage extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); String encodings = request.getHeader("Accept-Encoding"); String encodeFlag = request.getParameter("encoding"); PrintWriter out; String title; if ((encodings != null) && (encodings.indexOf("gzip") != -1) && !"none".equals(encodeFlag)) { title = "Page Encoded with GZip"; OutputStream out1 = response.getOutputStream(); out = new PrintWriter(new GZIPOutputStream(out1), false); response.setHeader("Content-Encoding", "gzip"); } else { title = "Unencoded Page"; out = response.getWriter(); } out.println( "<head></head><BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + title + "</H1>\n"); String line = "Blah, blah, blah, blah, blah. " + "Yadda, yadda, yadda, yadda."; for(int i=0; i<10000; i++) { out.println(line); } out.println("</BODY></HTML>"); out.close();}} Weboldalak tömörítése Tömörített oldal

20 Válasz objektum magában foglal minden információt a kliens számára
használhatunk buffer-t getBufferSize setBufferSize isCommitted reset resetBuffer – a fejrészet és a státusz kódot nem törli flushBuffer

21 Státusz kezelése response.setStatus(int),
public void sendError(int code, String message) public void sendRedirect(String url) response.sendRedirect(response.encodeURL(url))

22 Képek létrehozása Kép létrehozása: Rajzoljunk a képbe:
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 címen tudunk elérni. try {new GifEncoder(img, out).encode();} catch(IOException ioe) {}

23 Példa alkalmazás

24 Eredmény

25 Viszony követés a HTTP állapotmentes fontos az állapotkövetés:
bevásárló kosár … három megoldás: sütik URL átírás rejtett HTML mezők

26 Sü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ülhető 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)

27 Problémák 4 kbyte, 20 cookie/site, 300 süti összesen
az emberek nem szeretik, ha a kereső 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

28 Sü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

29 Sütik létrehozása sem a neve sem az értéke nem tartalmazhatja a következő karaktereket: [ ] ( ) = , " / : ; a következő 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észő többek között ez alapján állapítja meg kinek mit adhat vissza) setMaxAge() – a süti érvényességének időtartamá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 vihető át setValue() – az értékét adhatjuk meg

30 Sütik létrehozása 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 i=0; i<3; 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.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Setting Cookies"; out.println (”<head></head><BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" + "</BODY></HTML>"); Sütik létrehozása

31 Sütik kiolvasása 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 i=0; i<cookies.length; i++) { cookie = cookies[i]; out.println("<TR>\n" + " <TD>" + cookie.getName() + "\n" + " <TD>" + cookie.getValue()); } out.println("</TABLE></BODY></HTML>"); Sütik kiolvasása

32 URL átírás nem tiltható le

33 HTML rejtett mező <INPUT TYPE="HIDDEN" NAME="session" VALUE="..."> csak akkor működik ha minden oldal dinamikusan generált

34 Egy teljesebb megoldás
HttpSession API magas szintű intefé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

35 Lé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

36 Példa: HttpSession session = request.getSession(true);
ShoppingCart cart = (ShoppingCart)session.getValue("shoppingCart"); if (cart == null) { cart = new ShoppingCart(); session.putValue("shoppingCart", cart); } doSomethingWith(cart);

37 Metó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()

38 Servlet 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

39 Hasznos metódusok inicializáló paraméterek: környezeti paraméterek:
getInitParameter getInitParameterNames környezeti paraméterek: setAttribute getAttribute getAttributeNames removeAttribute erőforrások (HTML, GIF,JPEG) (nem alkalmasak dinamikus tartalom kezelésére pl.: index.jsp): getResource getResourceAsStream

40 A kérés továbbadása RequestDispatcher interfész
a ServletContext objektumból tudjuk előállítani: getRequestDispatcher – a servlet elérési útvonalát adhatjuk meg (a futási környezeten belül /-el kezdődik) 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 mezőit, forward – csak akkor használhatjuk, ha még nem válaszoltunk a kliensnek (nincs adat a bufferben, ezt előbb törölni kell) az esetleges paraméterek elsőbbséget élveznek

41 Példa String path = “/raisons.jsp?orderno=5”;
RequestDispatcher rd = context.getRequestDispatcher(path); rd.include(request, response);

42 Tomcat könyvtár hierarchia
bin -> itt helyezkednek el az indító, leállító szkriptek fájlok log -> log fájlok lib -> jar fájlok conf -> server.xml itt tudunk új környezetet létrehozni webapps -> webes alkalmazások könyvtára

43 server.xml server elem – egy lehet belőle
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.

44 Példa <Server port="8005" shutdown="SHUTDOWN" debug="0">
<Service name="Tomcat-Standalone"> <Connector className="org.apache.catalina.connector.http.HttpConnector" port="8080" minProcessors="5" maxProcessors="75" enableLookups="true" redirectPort="8443" acceptCount="10" debug="0" connectionTimeout="60000"/> <Engine name="Standalone" defaultHost="localhost" debug="0"> <Logger className="org.apache.catalina.logger.FileLogger" prefix="catalina_log." suffix=".txt" timestamp="true"/> <Realm className="org.apache.catalina.realm.MemoryRealm" /> <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common"/> directory="logs" prefix="localhost_log." suffix=".txt" <Context path="/teszt" docBase="teszt" debug="0" privileged="true"> prefix="localhost_examples_log." suffix=".txt" </Context> </Host> </Engine> </Service> </Server> Példa

45 Alkalmazás környezet html, jsp, … WEB-INF
classes – itt helyezkednek el a class fájlaink (jó esetben csomagokban) com.mycompany.mypackage.MyServlet /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

46 web.xml URL-ek testreszabása URL-ek kikapcsolása
Servler-ek inicializálása Servler-ek betöltése előre Szűrők definiálása Hiba, és köszöntő oldalak definiálása

47 URL-ek testreszabása a leggyakrabban használt szolgáltatása
servlet elem servlet-name servlet-class, jsp-file (/ !!!!) servlet-mapping elem url-pattern (/valami, /*.asp)

48 Példa <?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " <web-app> <! > <servlet> <servlet-name>Test</servlet-name> <servlet-class>moreservlets.TestServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/UrlTest</url-pattern> </servlet-mapping> </web-app>

49 Servlet 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 <!-- <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> -->

50 Példa <?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " <web-app> <servlet> <servlet-name>Sorry</servlet-name> <servlet-class>moreservlets.SorryServlet</servlet-class> </servlet> <! > <servlet-mapping> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> </web-app>

51 Servlet-ek inicializálása
init-param elem param-name ,param-value public void init() { ServletConfig config = getServletConfig(); firstName = config.getInitParameter("firstName"); Address = config.getInitParameter(" Address"); } alkalmazás szintű kezdeti paraméterek context-param elem param-name, paramvalue

52 Példa <context-param>
<param-name>support- </param-name> </context-param> <servlet> <servlet-name>InitTest</servlet-name> <servlet-class>myPackage.InitServlet</servlet-class> <init-param> <param-name>param1</param-name> <param-value>Value 1</param-value> </init-param> <param-name>param2</param-name> <param-value>2</param-value> </servlet>

53 Servlet-ek betöltése servlet elem <servlet>
load-on-startup <servlet> <servlet-name>Search</servlet-name> <servlet-class>myPackage.SearchServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-name>Results</servlet-name> <jsp-file>/results/index.jsp</jsp-file> <load-on-startup>2</load-on-startup>

54 Szűrők definiálása a szűrők módosíthatják a kérés és válasz objektumot
mielőtt egy JSP vagy servlet oldal a kérés objektumhoz jutna az első szűrő 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 szűrőnek vagy a megfelelő servlet-nek

55 Szűrő példa import java.io.*; import javax.servlet.*; Szűrő
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)request; 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() {} Szűrő Szűrő példa

56 Szűrő definiálása a web.xml fájlban
a servlet elemek előtt kell lennie filter elem filter-name, filter-class filter-mapping filter-name servlet-name

57 Példa <filter> <filter-name>Reporter</filter-name>
<filter-class>moreservlets.ReportFilter</filter-class> </filter> <filter-mapping> <servlet-name>SomeServletName</servlet-name> </filter-mapping> <url-pattern>/*</url-pattern> <servlet> <jsp-file>/TestPage.jsp</jsp-file> </servlet>

58 Üdvözlő 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 <welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list>

59 Hiba oldalak error-page elem <error-page>
error-code, exception-type <error-page> <error-code>404</error-code> <location>/NotFound.jsp</location> </error-page> <exception-type>packageName.className</exception-type> <location>/SomeURL</location>


Letölteni ppt "Fejlett Programozási Technikák 2."

Hasonló előadás


Google Hirdetések