Program felépítése, alapvető nyelvi elemek, osztályok, interfészek Java alapok Program felépítése, alapvető nyelvi elemek, osztályok, interfészek
Java alapok Program felépítése Nyelvi alapok Osztályok Öröklés/Interfész/Polimorfizmus Alapvető osztályok #TOC 1
Java alapelvek Kialakulása Tervezési célok Kiadások 1996 SUN Microsystems 2009 Oracle Tervezési célok Objektum-orientált Robusztus Biztonságos Architektúrafüggetlen Kiadások ME – Micro Edition SE – Standard Edition EE – Enterprise Edition
Végrehajtás Byte kód Java Virtuális Gép A Java programokat (általában) nem natív gépi kódra fordítjuk, hanem egy Java byte kódot hozunk létre Ez biztosítja a platformfüggetlenséget Java Virtuális Gép Mivel nem létezik byte kódot közvetlenül futtató processzor, ezt emulálni kell Erre szolgál a JVM (Java Virtual Machine), ami futtatni tudja Főbb elemei execution engine class loader garbage collector Legtöbb operációs rendszerre van JVM implementáció
Program belépési pont Main függvény Desktop program indítása public static void main(String[] args) Ilyen szignatúrájú függvény lehet a program belépési pontja Az args tömb megadja az indítási paramétereket Desktop program indítása A virtuális gép indításakor egy osztály nevet kell megadni Ebben az osztálybak kell lennie main függvénynek Ez fog elsőként elindulni Enterprise program indítása Egy alkalmazásszervert indítunk Telepítjük a szükséges komponenseket Az alkalmazásszerver példányosítja szükség esetén az objektumokat
Java alapok Program felépítése Nyelvi alapok Osztályok Öröklés/Interfész/Polimorfizmus Alapvető osztályok #TOC 2
Alapvető típusok Primitív típusok Csomagolóosztályok szerepe Primitív típus objektumként kezelése (pl. gyűjteményeknél) Alapvető műveletek az adott típussal kapcsolatban Primitív típus Csomagoló osztály Leírás boolean Boolean Logikai típus (true/false) char Character 16 bites UNICODE byte Byte 8 bites előjeles egész short Short 16 bites előjeles egész int Integer 32 bites előjeles egész long Long 64 bites előjeles egész float Float 32 bites lebegőpontos szám double Double 64 bites lebegőpontos szám
Tömbök Tömbök deklarációja Tömb létrehozása Tömb használata típus[ ] név; Tömb létrehozása név = new típus[méret]; Tömb használata név[index] Indexelés mindig 0-tól indul Többdimenziós tömb Tömbök tömbje hozható csak létre Ez persze lehet fűrészfogas is Tömb méretének lekérdezése név.length
Alapvető operátorok Operátor precedencia Operátor felülírás nincs Művelet Operátor Posztfix kif++ kif–- Unáris ++kif --kif +kif -kif ~ ! Multiplikatív * / % Additív + - Shift << >> >>> Relációs < > <= >= instanceof Egyenlőség vizsgálat == != Bitenkénti ÉS & Bitkitenkénti kizáró VAGY ^ Bitenkénti megengedő VAGY | Logikai ÉS && Logikai VAGY || Ternáris ? : Értékadás = += -= *= /= %= &= ^= |= <<= >>= >>>=
Vezérlési szerkezetek Szekvencia Blokkok képzése { } jelekkel lehetséges Elágazás Kétirányú if (kifejezés) utasítás; [else utasítás;] Többirányú switch(kifejezés) { case eset1: utasítások; [break;] case eset2: utasítások; [break;] [default: utasítások;] }
Vezérlési szerkezetek (2) Ciklusok Elöltesztelő while (logikai_feltétel) utasítás; Hátultesztelő do utasítás; while (logikai_feltétel) Számláló for(kezdőérték;feltétel;módosítás) utasítás; Bejárás for(változó : gyűjtemény) utasítás; Kilépési lehetőségek break continue
Java alapok Program felépítése Nyelvi alapok Osztályok Öröklés/Interfész/Polimorfizmus Alapvető osztályok #TOC 3
Osztály definíció Osztály létrehozása Hozzáférési módosító class név { } segítségével Publikus osztálynak mindig azonos nevű .java fájlban kell lennie Hozzáférési módosító public – az osztály minden más osztály számára látható jelzés nélkül – az osztály csak csomagon belül látható Egyéb módosítók abstract – Absztrakt osztály jelzése, nem példányosítható final – Lezárt osztály jelzése, nem lehet származtatni belőle Példányosítás new osztálynév([konstruktor paraméterek]);
Mezők definiálása Mező definiálása Hozzáférési módosító [módosítók] típus név [= kezdőérték]; Hozzáférési módosító Egyéb módosítók final – mező értéke nem változtatható (csak inicializálható) static – statikus mező transient – nem szerializálandó volatile – központi memóriában tárolandó osztály csomag leszármazott egyéb public protected jelzés nélkül private
Metódusok definiálása Metódus definíció [módosítók] [típus] [név]([paraméterek]) { } Visszatérési érték lehet void bármilyen egyéb típus (return kulcsszóval adható meg a visszatérési érték) Módosítók Hozzáférési szintek: ua. mint mezőknél final – leszármazottban nem definiálható felül static – statikus metódus native – a metódus nem Java nyelven íródott abstract – absztrakt metódus synchronized – a metódus egyidőben csak egyszer futhat
Konstruktorok Konstruktorok Inicializáló blokk Destruktor Neve ugyanaz mint az osztály neve Nincs visszatérési értéke Ha nem írunk konstruktort, automatikusan létrejön egy paraméter nélküli, üres implicit konstruktor Inicializáló blokk Jelölése az osztályon belül { és } között Konstruktor előtt lefut Statikus inicializáló blokk is készíthető: static { } Destruktor Destruktor nincs Helyette felüldefiniálható egy finalize() nevű metódus
JavaBean Szabvány, ami többek között az alábbiakat várja el Tulajdonságok lenti formájú használata Paraméter nélküli konstruktor megléte Szerializálhatóság Tulajdonság jelzése Szám/szöveg mezők: Kiolvasás: <típus> get<név>() Módosítás: void set<név>(<típus> value) Logikai mezők: Kiolvasás: <típus> is<név>() Indexelt mezők: Kiolvasás: <típus> get<név>(int index) Módosítás: void set<név>(int index, <típus> value)
Csomagok Csomagok használata Csomagok elhelyezése Csomagok készítése package csomagnév; Csomagok importálása import csomag.osztály; import csomag.*; Csomagok elhelyezése A csomagnévnek igazodnia kell a könyvtár struktúrához Forráskód esetén (.java állományok) Futtatás esetén (.class állományok) JVM paraméter CLASSPATH környezeti változó Csomag tárolható .zip/.jar fájlban
Java alapok Program felépítése Nyelvi alapok Osztályok Öröklés/Interfész/Polimorfizmus Alapvető osztályok #TOC 4
Öröklés Öröklés használata Konstruktorok szerepe Java egyszeri öröklést engedélyez class osztálynév extends ősosztály { } Leszármazottban a super kulcsszó segítségével lehet elérni az ős metódusait, pl. super.metódus(…) Konstruktorok szerepe Konstruktorok nem öröklődnek Leszármazott meghívhatja az ős konstruktorát a saját konstruktorának első sorába írt super(paraméterek) formával Szabályok Minden leszármazottnak meg kell hívnia az ős valamely konstruktorát Amennyiben ez nem történik meg, alapból meghívódik az ős paraméter nélküli konstruktora
Object ősosztály java.lang.Object Metódusai Java esetében minden osztálynak az őse Metódusai protected Object clone() boolean equals(Object obj) void finalize() Class<?> getClass() int hashCode() void notify() void notifyAll() String toString() void wait()
Interfészek Interfész definiálása Interfész implementálása interface név { } segítségével Tartalmazhat Metódus szignatúrákat Konstansokat Interfész implementálása class osztálynév implements interfész1, interfész2 { } Az osztálynak implementálnia kell az interfészek metódusait Vagy absztrakt metódusként kell megadni Interfészek kiterjesztése interface név extends interfacenév1, interfacenév2
Java alapok Program felépítése Nyelvi alapok Osztályok Öröklés/Interfész/Polimorfizmus Alapvető osztályok #TOC 5
Alapvető csomagok Csomag Tartalma javax.applet Appletek java.awt Vizuális felület java.beans Javabeans létrehozás/kezelés java.io Kommunikáció java.lang Alapvető nyelvi elemek java.math Matematikai osztályok java.net Hálózatok Java.nio Új kommunikáció java.rmi Távoli metódushívás java.security Biztonságpolitika Java.text Szövegkezelés java.sql Adatbáziskezelés java.util Segédosztályok
Csomagolóosztályok java.lang.Integer java.lang.Double public Integer(int value) Integer objektum létrehozása public int intValue() Integer objektumból a szám érték kiolvasása public static String toString(int i) Egész szám átalakítása szöveggé public int parseInt(String s) Szöveg átalakítása számmá public static final int MIN_VALUE java.lang.Double java.lang.Character java.lang.Boolean
Szövegek kezelése java.lang.String java.lang.StringBuilder Szöveges literálok ("valami") String objektumot hoznak létre equals(object anObject) Egyenlőségvizsgálat (mivel a == nincs felülírva!) compareTo(String anotherString) Két String összehasonlítása (eredmény lehet, =0, <0, >0) format(String format, Object… args) String.format("%1$d szó: %2$s", 10, "Valami"); eredménye: „10. szó: Valami” length() char charAt(int index) String substring(int beginIndex, int endIndex) java.lang.StringBuilder
Matematikai műveletek java.lang.Math public static final double PI public static double sin(double a) public static double sqrt(double a) public static double ceil(double a) public static double floor(double a) public static int round(float a) public static double pow(double a, double b) public static double random() public static int abs(int a) public static int max(int a, int b) …
Collection Framework TreeSet : RBTree Szinkronizáció (https://www.javatpoint.com/collections-in-java) TreeSet : RBTree Szinkronizáció
Alapvető gyűjtemények java.util.ArrayList<E> public boolean add(E e) public void add(int index, E element) public E remove(int index) public boolean remove(Object o) public E get(int index) public E set(int index, E element) java.util.HashMap<K,V> public V put(K key, V value) public V get(Object key) public V remove(Object key) public boolean containsKey(Object key) …
Kivételkezelés Kivétel eldobása Nem ellenőrzött kivételek throw kivételobjektum; try – catch – finally blokkok használata Nem ellenőrzött kivételek RuntimeException osztály leszármazottai Nem kötelező őket ellenőrizni Ellenőrzött kivételek Exception osztály leszármazottai Ezeket vagy Catch blokkban ellenőrizzük Metódus fejlécénél megadott throws kivételnév formával specifikáljuk. Ez esetben az ellenőrzés felelőssége a hívóra hárul #SAVE Java_alapok
Streamek, Szűrők, Szerializáció, TCP/IP kapcsolat kezelése I/O Stream Streamek, Szűrők, Szerializáció, TCP/IP kapcsolat kezelése
I/O Stream Stream fogalma Stream megvalósítások Szűrők szerepe Szerializáció TCP/IP kapcsolat kliens oldalon TCP/IP kapcsolat szerver oldalon #TOC 1
Hagyományos I/O kezelés (Pascal/Delphi) Filekezelés Alap filekezelés – Pascal eljárások AssignFile/Reset/Rewrite/Append/CloseFile eljárás Read/ReadLn/Write/WriteLn eljárás TZipFile komponens Open/Close metódus Read metódus TCP/IP kezelés TClientSocket komponens Host/Address tulajdonság DoActivate metódus OnConnect/OnRead eseménykezelő Titkosítás, CRC, …
Stream fogalma Stream: egy adatforrást, vagy -célt reprezentál Elrejti a tényleges megvalósítást, csak műveleteket nyújt Megnyitás Írás/olvasás Lezárás A háttérben egy fizikai forrás/cél hajtja ezeket végre File Hálózati kapcsolat Csatolt eszközök Tömb a memóriában Más programok Standard I/O stb. Adatforrás Input stream Program 10100110 | 10110111 | 10101110 Adatforrás Output stream Program 10100110 | 10110111 | 10101110
Stream életciklusa Streamek irányítottsága Egy stream életciklusa Írható és olvasható streamek (pl. C#) Csak írható vagy csak olvasható streamek (pl. Java) Egy stream életciklusa Megnyitás A példányosításkor automatikusan megnyitott streamet kapunk A konstuktor tartalmazza az elérni kívánt adatfolyam adatait file esetén filenév hálózati kapcsolat esetén hostnév/portszám stb. Írás/olvasás A stream megfelelő műveletei segítségével Bezárás A stream objektum megfelelő metódusával
Java stream ősosztályok Ősosztályok szerepe Minden stream ezek leszármazottja lesz Alapvető műveleteket meghatározzák Byte szervezésű streamek Legkisebb írható/olvasható egység a byte Ősosztályok java.io.InputStream java.io.OutputStream Karakter szervezésű streamek Legkisebb írható/olvasható egység a Unicode karakter Működésük során figyelembe veszik a kódolási különbségeket java.io.Reader java.io.Writer
Byte szervezésű stream műveletei Megnyitás: konstruktor hívással Byte(ok) írása (OutputStream) write(int a) throws IOException write(byte b[]) throws IOException Byte(ok) olvasása (InputStream) int read() throws IOException Visszatérési értéke -1 ha vége az adatfolyamnak Ha nincs adat, akkor a program futását blokkolja int read(byte b[]) throws IOException Visszatérési értéke a beolvasott elemek száma Lezárás close() Puffer bármikor üríthető a flush() metódus segítségével Mindig le kell zárni (tipikusan finally blokkban) Ellenőrzött kivételek szerepe Flush szerepe (log, hálózat)
Karakter szervezésű stream műveletei Megnyitás: konstruktor hívással Karakter(ek) írása (Writer) write(int c) throws IOException write(char c[]) throws IOException Byte(ok) olvasása (Reader) int read() throws IOException Visszatérési értéke -1 ha vége az adatfolyamnak Ha nincs adat, akkor a program futását blokkolja int read(char c[]) throws IOException Visszatérési értéke a beolvasott elemek száma Lezárás close() Puffer bármikor üríthető a flush() metódus segítségével
I/O Stream Stream fogalma Stream megvalósítások Szűrők szerepe Szerializáció TCP/IP kapcsolat kliens oldalon TCP/IP kapcsolat szerver oldalon #TOC 2
File alapú megvalósítások és konstruktoraik Byte szervezésű java.io.FileInputStream FileInputStream(String filename) throws FileNotFoundException FileInputStream(File file) throws FileNotFoundException FileInputStream(FileDescriptor fd) java.io.FileOutputStream FileOutputStream(String filename) throws FileNotFoundException FileOutputStream(String filename, bool append) throws FileNotFoundExc… … Karakter szervezésű java.io.FileReader Konstruktorok hasonlóak java.io.FileWriter
Egyéb stream megvalósítások Csövekre leképező osztályok PipedInputStream/PipedOutputStream PipedReader/PipedWriter Tömbökre leképező osztályok ByteArrayInputStream/ByteArrayOutputStream CharArrayReader/CharArrayWriter Stringre leképező osztály StringReader/StringWriter
java.io csomag Stream kezelés File kezelés Ősosztályok InputStream OutputStream Reader Writer File megvalósítások FileInputStream stb. Technikai megvalósítások StringReader Szűrők File kezelés File osztály http://quarkphysics.ca/ICS4U1/unit2-FileIO/OReilly_fileIO.html
Stream alapú adatcsere A módszer előnyei Objektumorientált Jól strukturált osztály hierarchia Ugyanazokkal a metódusokkal kezelhető minden fizikai megvalósítás Az egyes stream megvalósítások könnyen cserélhetők A módszer hátrányai Elsőre bonyolultnak tűnhet Csak alacsony szintű kommunikációt tesz lehetővé byteok írása/olvasása karakterek írása/olvasása
I/O Stream Stream fogalma Stream megvalósítások Szűrők szerepe Szerializáció TCP/IP kapcsolat kliens oldalon TCP/IP kapcsolat szerver oldalon #TOC 3
Szűrők alapvető szerepe Alap streamek hiányosságai Tetszőleges típus írása/olvasása int, float, double, objektumok, stb. Kiegészítő szolgáltatások tömörítés, titkosítás, CRC, stb. Szűrők szerepe Tetszőleges streamhez kapcsolódnak, ezzel egy magasabb szintű kezelést biztosítanak az adatfolyamhoz Adatforrás Input stream Input szűrő Program 10100110 | 10110111 | 10101110 3.57 | 43.43 | 11.321 | 43.12 | … Adatforrás Output stream Output szűrő Program 10100110 | 10110111 | 10101110 3.57 | 43.43 | 11.321 | 43.12 | …
Szűrők használata Szűrő ősosztályok Szűrő létrehozása Szűrő használata FilterOutputStream/FilterInputStream FilterWriter/FilterReader Szűrő létrehozása Szűrő objektum példányosításával hozható létre A konstruktorban kell megadni a hozzárendelt streamet Szűrő használata A szűrők saját speciális metódusain keresztül A szűrő kezeli a mögöttes streamet Szűrő lezárása A szűrő close() metódusának segítségével (flush() is használható) A szűrő lezárásakor lezárja a mögöttes streamet is Közvetlenül a streamhez nem is célszerű hozzáférni
java.io.PrintWriter szűrő használata Feladata: Java alaptípusok írása szöveges formában Életciklusa Szűrő létrehozása: PrintWriter(Writer out) PrintWriter(Writer out, boolean autoFlush) … Alapvető típusok írása public void print(int v) throws IOException public void print(float v) throws IOException Alapvető típusok írása sortöréssel public void println(int v) throws IOException Lezárás void close()
Java alaptípusok írása/olvasása java.io.DataOutputStream Feladata: Java alaptípusok írása byte típusú streambe Alapvető műveletei public void writeInt(int v) throws IOException public void writeFloat(float v) throws IOException public void writeChar(char v) throws IOException ... java.io.DataInputStream Feladata: Java alaptípusok olvasása byte típusú streamből public int readInt() throws IOException public float readFloat() throws IOException public char readChar() throws IOException Stream vége után olvasva egy EOFException kivételt dob
Pufferelt olvasás Szerepe Byte alapon Karakter alapon Gyakran nem hatékony a byteonként/karakterenkénti I/O Célszerű ilyenkor nagyobb egységeket írni/olvasni (pufferelés) Erre a célra szolgálnak az alábbi szűrők Byte alapon BufferedInputStream/BufferedOutputStream Metódusai hasonlóak a normál streameknél látottakhoz Karakter alapon BufferedReader String readLine() Érdemes ezt külön kiemelni, mivel ezzel tudunk hatékonyan olvasni egy szöveges fájlból sorokat BufferedWriter
További szűrők Tömörítés Ellenőrzött átvitel Titkosítás ZipInputStream/ZipOutputStream GZIPInputStream/GZIPOutputStream Ellenőrzött átvitel CheckedInputStream/CheckedOutputStream Titkosítás CipherInputStream/CipherOutputStream Objektumok továbbítása (szerializálás) ObjectInputStream/ObjectOutputStream Szöveges forrásból sorok számolása LineNumberReader
Szűrők összekapcsolása Minden szűrő stream is egyben A szűrők a stream osztályok leszármazottai Így paraméterként átadhatóak egy másik szűrő konstruktorának Szűrők láncolása Összekapcsolva több szűrőt, egy láncolt alkothatunk Íráskor/olvasáskor ugyanazt a láncolt fordítva célszerű kiépíteni Ezzel a szűrők egyedi szolgáltatásait összeláncolhatjuk pl. konverzió + tömörítés + titkosítás + CRC ellenőrzés Adatforrás Output stream Output szűrő 1 Output szűrő 2 Program 10100110 | 10110111 3.57 | 43.43 | 11.321 A | B | C Adatforrás Input stream Input szűrő 1 Input szűrő 2 Program 10100110 | 10110111 3.57 | 43.43 | 11.321 A | B | C
Byte/karakter streamek összekapcsolása Streamek szervezése Minden stream/szűrő byte vagy karakter alapú Előfordul, hogy byte streamünk van (pl. OutputStream), viszont karakteres szűrőt szeretnénk rákapcsolni (pl. PrintWriter) Az összekapcsoláshoz (átalakításhoz) léteznek szűrők Byte csatorna feletti karakter csatorna létrehozása Osztályok InputStreamReader/OutputStreamWriter Használatuk A konstruktorban egy byte alapú streamet kell megadni Ők maguk pedig karakteres streamként használhatók Ha szükséges, a konstruktorban meg lehet adni kódtáblát is
I/O Stream Stream fogalma Stream megvalósítások Szűrők szerepe Szerializáció TCP/IP kapcsolat kliens oldalon TCP/IP kapcsolat szerver oldalon #TOC 4
Szerializáció fogalma Egy olyan művelet, amelynek bemenete egy objektum, a kimenete pedig egy azt reprezentáló byte sorozatot Ez alapján elő lehet állítani az eredeti objektum másolatát Marshalling: objektum továbbítása egyik rendszerből egy másikba (viszont ez már a kódbázisra is vonatkozik) Szerepe Objektumok eltárolásakor (pl. fileban/adatbázisban) Objektumok továbbításakor (pl. távoli metódushívás) Egyéb (naplózás, undo funkció, stb.) A művelet platformfüggetlen pl. Windowsból szerializált Java objektum deszerializálható Linux rendszereken
Bemenetre vonatkozó követelmények java.io.Serializable interfész Csak azon osztályok példányai szerializálhatók, amelyek megvalósítják ezt az interfészt Csak jelölő interfész, nem ír elő metódust/tulajdonságot Mezőkre vonatkozó megkötések Minden mezőnek szerializálhatónak kell lennie transient kulcsszó jelöli, ha egy mezőt nem kell/lehet szerializálni Statikus mezők nem vesznek részt a szerializációban Verziószám static final long serialVersionUID = 1L; minden szerializálható osztálynak célszerű adni egy verziószámot ez mutatja, hogy az eltárolt és az aktuálisan betöltött osztálydefiníció azonos-e
Bináris szerializáció Jellemzői A byte folyam tömör bináris adatokat tartalmaz Ember által nem (nehezen) olvasható Szerializáció Osztály: ObjectOutputStream void writeObject(Object x) throws IOException Deszerializáció Osztály: ObjectInputStream Object readObject() throws IOException, ClassNotFoundException A streamben tárolt adatok alapján létrehoz egy objektumot Object a visszatérési érték, tehát ezt kasztolni kell a megfelelő típusra Ellenőrzi a serialVersionUID-et, ha nem egyezik, kivételt dob
JAXB felépítése JAXB – Java Architecture for XML Binding JAXB tartalma Java SE1.6 óta használható Előzmények XmlEncoder/XStream SAX, DOM parserek használata JAXB tartalma Annotációk XML tárolásra szánt osztályok annotációja Ezek mezőinek annotációi XML marshalling/unmarshalling Java objektumból XML létrehozása XML-ből Java objektum létrehozása Binding XML séma alapján Java kód generálása (nem tárgyaljuk) xjc segédprogram
JAXB osztály előkészítés Osztály szintű annotáció @XmlRootElement XML gyökérelem meghatározása Neve alapesetben az osztály neve lesz, de ez felülírható a name attribútummal @XmlAccessorType(XmlAccessType.FIELD) Ez megadja, hogy a mezőket, és ne a gettereket akarja szerializálni Mezőszintű annotációk @XmlElement Ezzel kell megjelölni azokat a mezőket, amelyeket szeretnénk az XML fájlba írni Mező helyett a getter metódusokat is meg lehet jelölni @XmlTransient Az így megjelölt mező nem vesz részt az XML leképezésben JavaBean szabvány Az osztálynak kell, hogy legyen paraméter nélküli konstruktora
JAXB kontextus JAXB kontextus létrehozása Belépési pontot hoz létre a JAXB API-hoz static JAXBContext newInstance(Class... classesToBeBound) throws JAXBException Ez a statikus metódus létrehoz egy kontextust Paraméterként meg kell adni a használni kívánt osztályokat A megadott osztályok által hivatkozott további osztályokat nem kell megadni Leszármazottakat azonban meg kell adni Példa hívás: JAXBContext jaxbContext = JAXBContext.newInstance(Company.class); A létrehozott kontextuson át érhetők el a JAXB funkciók createMarshaller()/createUnmarshaller() generateSchema(SchemaOutputResolver outputResolver) createBinder()
JAXB XML szerializáció/deszerializáció Marshalling Interfész: javax.xml.bind.Marshaller Hozzáférés: <<kontextus>>.createMarshaller(); XML írás void marshal(Object jaxbElement, OutputStream os) void marshal(Object jaxbElement, Writer writer) void marshal(Object jaxbElement, File output) Unmarshalling Interfész: javax.xml.bind.Unmarshaller Példányosítás: <<kontextus>>.createUnmarshaller(); XML olvasás Object unmarshal(InputStream is) … Beolvasás után kasztolni kell
I/O Stream Stream fogalma Stream megvalósítások Szűrők szerepe Szerializáció TCP/IP kapcsolat kliens oldalon TCP/IP kapcsolat szerver oldalon #TOC 5
TCP/IP kapcsolat Socket Szerepek Kommunikáció IP alapú kommunikációban a hálózati folyam végpontja Címe: IP-cím (gazdagép) és portszám (alkalmazás) Szerepek Kliens Kapcsolatot kezdeményező Aktív szereplő (megnyitja a kapcsolatot) Szerver Kapcsolatot fogadó Passzív szereplő (várakozik a bejövő kapcsolatokra) Kommunikáció A kliens és szerver csak a kapcsolatfelvételkor különbözik Az adatátvitel szempontjából ugyanúgy működnek
Hálózati kommunikáció Javaban java.net csomag URL kezelés TCP kapcsolat kezelése UDP kapcsolat kezelése (nem tárgyaljuk) java.net.Socket osztály Kliens oldalon ezzel tudjuk kezdeményezni a kapcsolatot Mind a kliens, mind a szerver oldalon ezen keresztül tudjuk a kapcsolatot kezelni (küldés/fogadás/lezárás/stb.) Szerver IP:15.6.8.6 port: 4520 port: 6621 Kliens IP:12.2.6.5 port: 4521 port: 6622 port: 4522 Socket port: 6623 Socket InputStream InputStream OutputStream OutputStream port: 4523 port: 6624
Kliens oldalon kapcsolat felépítése A konstruktor meghívásakor történik az átadott paraméterek szerint Socket(String host, int port) throws UnknownHostException, IOException Cím meghatározása IP alapján „193.224.41.159” Név alapján „www.uni-obuda.hu” A portszám egy egész szám 1 és 65535 között Kapcsolat megnyitása Ha a Socket példány létrejött, akkor már él a hálózati kapcsolat Nincs szükség külön megnyitás műveletre
Hálózati kapcsolat adatainak lekérdezése A létrehozott kapcsolat adatai lekérdezhetőek Távoli és helyi gép címe InetAddress getInetAddress() InetAddress getLocalAddress() Távoli és helyi gépen nyitott port száma int getPort() int getLocalPort() A kapcsolat állapotával kapcsolatos adatok boolean isConnected() boolean isClosed() boolean isInputShutdown() boolean isOutputShutdown()
Kommunikáció socketen keresztül Kimeneti és bemeneti stream A Socket objektum metódusain keresztül lehet hozzáférni a bemeneti és a kimeneti streamhez InputStream getInputStream() throws IOException OutputStream getOutputStream() throws IOException A kommunikáció ezeken keresztül zajlik Mind a kliens, mind a szerver oldalon van egy-egy Socket objektum Amit a kliens ír a kimenetre, azt látja a szerver a bemeneten Amit a szerver ír a kimenetre, azt látja a kliens a bemeneten Kommunikáció lezárása Csatornák lezárása a már látott módon flush(), close() Maga a Socket is lezárható a close() metódussal
I/O Stream Stream fogalma Stream megvalósítások Szűrők szerepe Szerializáció TCP/IP kapcsolat kliens oldalon TCP/IP kapcsolat szerver oldalon #TOC 6
ServerSocket létrehozása Kommunikáció során Kommunikáció során nincs különbség a kliens és szerver között Csak a kapcsolat felépítésekor Szerver oldali feladatok Egy megadott porton kell várakozni a kliens kérésekre Ha ez megtörtént, akkor példányosítani kell egy Socket objektumot a szerver oldalon java.net.ServerSocket ServerSocket(int port) throws IOException A konstruktorában megadott portszámon fog majd figyelni a bejövő kérésekre void close() throws IOException Ezzel a metódussal lehet lezárni az objektumot
ServerSocket használata Várakozás indítása A példányosított ServerSocket objektum még nem kezdi el a figyelést, ehhez meg kell hívni annak accept() metódusát Socket accept() throws IOException A metódus meghívását követően a program futása blokkolódik Várakozás eredménye Amennyiben befut egy kliens kérés, akkor az accept() metódus visszatérési értékkén egy Socket objektumot ad, amely kapcsolatban áll a klienssel Újabb kliens kiszolgálásához újra meg kell hívni az accept() metódust, különben nem tudjuk fogadni a kérést Célszerű a kiszolgálást egy külön szálon végezni
Protokoll tervezése Protokoll Egy szabályrendszer, amely megadja, hogy a kapcsolat résztvevői miképp tudnak egymással kommunikálni Amit küld a kliens, azt olvasnia kell a szervernek. Amit pedig a szerver küld, annak a fogadására fel kell készülnie a kliensnek Célszerű rögzíteni az írások/olvasások Időbeni sorrendjét Irányát Adatok típusát, értelmezési módját A protokoll ismeretében a kliens és a szerver implementációja egymástól független
Egyszerű protokoll Esettanulmány Készítsünk kliens/szerver alkalmazást, ahol a kliens átküld a szervernek néhány Stringet, majd a szerver ezek közül visszaküldi a kliens számára a leghosszabbat! Kliens oldalon Szerver oldalon 1. A kapcsolat felépítése 1. Várakozás a következő kliensre 2. Stringek darabszámának átküldése egész számként az output streamen 2. A Stringek darabszámát tartalmazó egész szám beolvasása (N) az input streamről 3. A Stringek átküldése egyenként az output streamen 3. N darab String beolvasása az input streamről 4. Az eredmény kiolvasása az input streamről 4. A leghosszabb String átküldése az output streamen 5. A kapcsolat lezárása 6. goto 1 #SAVE Java_stream
HTTP, Szervletek, HTML Formok feldolgozása, JSP
Szervletek HTTP működése Szervletek alapjai HTML formok feldolgozása JSP #TOC 1
Hypertext Transfer Protocol TCP alapú alkalmazásszintű protokoll WWW központi protokollja Hypertext dokumentumok letöltésére fejlesztették ki Ezzel a protokollal kommunikálnak egymással a HTTP szerverek (webszerver) és HTTP kliensek (böngésző) Protokoll verziói 1996 – HTTP 1.0 [RFC1945] 1999 – HTTP 1.1 [RFC2616] 2015 – HTTP 2.0 [RFC7540]
Kérés-válasz protokoll Statikus kérés lépései Kliens kezdeményezi a kapcsolatot Kérés küldése Szerver megkeresi a kért dokumentumot Válasz küldése Kapcsolat lezárása Kliens Szerver Cím megadás Kérés elküldés Kérés fogadás Dokumentum keresés Válasz összeállítás Válasz fogadás Válasz elküldés Megjelenítés
HTTP kérés részei Használt HTTP protokoll verziószám Végrehajtandó parancs GET – erőforrás letöltése HEAD – erőforrás fejlécének letöltése POST – erőforrás módosítás … Az erőforrás azonosító Erőforrás, amin az előbbi parancsot végre kell hajtani Tipikusan egy URL Fejlécmezők (nem kötelező) Törzsadat (nem kötelező)
HTTP kérés fejlécmezők Médiumra vonatkozó igények Accept Azon médiatípusok listája, amelyeket a kliens fogadni képes Accept-Language Azon nyelvek listája, amelyeket a kliens fogadni képes Kliens azonosítása User-Agent A kliens oldalon használt alkalmazás neve, verziószáma Authorization Szerverrel szembeni jogosultság igazolások Cookie Sütik tartalma …
HTTP válasz részei Használt HTTP protokoll verziószám Válaszkód 2?? – kérés sikeres 3?? – hivatkozott erőforrást mást helyre telepítették 4?? – szerver nem tudja végrehajtani a kérést 400 – hibás kérés 401 – azonosítási hiba 404 – erőforrás nem található 5?? – kiszolgáló hiba Fejlécmezők (nem kötelező) Törzsadat (nem kötelező)
HTTP válasz fejlécmezők Törzsadat meta adatok Content-Type – a HTTP törzsadat MIME típusa Content-Encoding – használt kódolási mód megnevezése Content-Length – HTTP törzsadat hossza Érvényességi adatok Date – válasz ideje Expires – lejárat ideje Last-Modified – utolsó módosítás időpontja Technikai adatok Location – az erőforrást áttelepítették, annak helye Cache-Control – gyorsítótárazással kapcsolatos adatok …
Példa kapcsolat
Szervletek HTTP működése Szervletek alapjai HTML formok feldolgozása JSP #TOC 2
Dinamikus oldalgenerálás Az URL nem egy fájlt, hanem egy szolgáltatást azonosít A szerver nem fájlt ad vissza, hanem ennek eredményét Megvalósítások CGI, szervlet, egyéb Kliens Szerver Cím megadás Kérés elküldés Kérés fogadás Alkalmazás keresés Alkalmazás meghívás Válasz összeállítás Válasz fogadás Válasz elküldés Megjelenítés
Java szervlet A szervletek olyan osztályok, amelyeket egy web szerver működtet, és kéréseket szolgának ki Enterprise környezetben működnek Megvalósítják a javax.servlet.Servlet interfészt, aminek alapvető műveletei init(ServletConfig config) Inicializálás a megadott beállításokkal service(ServletRequest req, ServletResponse res) Kérés kiszolgálása, ahol req: tartalmazza a kérés adatait res : tartalmazza a válasz adatait destroy() Leállítás
Szervlet életciklusa A szervletet a webkonténer kezeli példányosítja meghívja a metódusait (eseménykezeléshez hasonló módon) megszünteti Egy szervlet példány egymást követően több kérést is kiszolgálhat szervlet indítása Osztály betöltés Példányosítás init() metódus service() metódus kérések kiszolgálása service() metódus szervlet leállítása Felszabadítás destroy() metódus
HttpServlet osztály Kimondottan weben beérkező HTTP alapú kérések kiszolgálására szolgál Specialitásai Az általános service() metódus helyett a HTTP parancsokra specializált metódusokat tartalmaz doGet(…) – GET parancs kiszolgálása doPost(…) – POST parancs kiszolgálása … A fenti metódusok kimondottan HTTP kérésekre specializált paraméter objektumokat kapnak HttpServletRequest – kérés adatai HttpServletResponse – válasz adatai Többi szervlet metódus is elérhető (init, stb.)
HttpServlet indítása/leállítása Szervlet inicializálása A webkonténer létrehozza az objektumot Ezt követően meghívja az inicializáló metódust void init(ServletConfig config) throws ServletException; itt célszerű inicializálni a szervletet a ServletConfig objektum tartalmazza a környezeti paramétereket amennyiben nem sikerült inicializálni a szervletet, kivételt kell dobnia Szervlet leállítása A webkonténer bármikor leállíthatja a szervletet Ez előtt még biztosan meghívja a destroy metódust void destroy(); itt lehet felszabadítani a szervlet erőforrásait
Kérések kiszolgálása Beérkező kéréskor meghívódik a megfelelő metódus void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException Feladatuk, hogy kiszolgálják a megfelelő kérés típust A kérés adatai (paraméterei) a req objektumból olvashatók ki fejlécmezők paraméterek törzsadat kapcsolat jellemzők A választ a resp objektumon keresztül lehet megadni
HttpServletRequest törzsadat hozzáférés Törzsadat jellemzői public String getCharacterEncoding() A kliens által használt karakter kódolási mód public int getContentLength() Küldött törzsadat hossza public String getContentType() A kliens által küldött adat MIME típusa Törzsadathoz való hozzáférés public ServletInputStream getInputStream() Byte alapú stream a küldött adatok kiolvasásáshoz public BufferedReader getReader() Karakter alapú stream a küldött adatok kiolvasásához
HttpServletRequest technikai adatok Kapcsolat adatai public String getRemoteHost() Kliens gép IP címe public String getLocalName() Szerver IP címe public StringBuffer getRequestURL() A kéréshez tartozó URL Fejlécmezők adatai public String getHeader(String name) Megadott nevű fejlécmező kiolvasása public Enumeration getHeaders(String name) Több értéket tartalmazó fejlécmező esetén az értékeket tartalmazó String bejáró
HttpServletResponse törzsadat küldése Metaadatok beállítása public void setContentType(String type) Paramétere egy MIME típus (pl. „text/html”) public void setContentLength(int len) Válasz hossza (nem kötelező megadni) Válasz elküldési lehetőségei public ServletOutputStream getOutputStream() throws IOException Byte alapú adatok visszaküldésére szolgáló streamet ad vissza (pl. ha a válasz nem egy HTML oldal, hanem egy kép) public PrintWriter getWriter() throws IOException Szöveges adat visszaküldésére szolgáló streamet ad vissza
HttpServletResponse technikai adatok public void setStatus(int sc) Válasz státuszkód megadása (404, stb.) public void sendRedirect(String location) throws IOException Átirányítási kérelem megadása Válasz fejlécmezők megadása public void addHeader(String name, String value) Új szöveges típusú válasz fejlécmező felvétele public void addIntHeader(String name, int value) Új egész szám típusú fejlécmező felvétele public void addDateHeader(String name, long value) Új dátum típusú fejlécmező felvétele
Szervletek HTTP működése Szervletek alapjai HTML formok feldolgozása JSP #TOC 3
HTTP paraméterek Paraméterek használata Kliens oldalon Szerver oldalon Egy kéréskor van lehetőség paraméterek megadására Ezekkel lehet befolyásolni a kérést Kliens oldalon Paraméterek megadhatók direkt módon URL-ben fejlécek között Paraméterek érkezhetnek HTML formból szövegmező checkbox stb. Szerver oldalon A szervlet a HttpServletRequest objektumból látja a paramétereket, ezekre tud reagálni
HTML űrlap HTML űrlap <form> attribútumai action – cél URL Mi esetünkben egy szervlet azonosítója method – adatok elküldésének módja GET a böngésző HTTP GET parancsot küld a form adatai az URL részeként lesznek elküldve POST a böngésző HTTP POST parancsot küld a form adatai a törzsadatok között adódnak át Űrlapot elküldő <submit> gomb attribútumai name – továbbküldendő paraméter neve value – a paraméter értéke Egyéb gombok: <reset>, <button> Biztonság: látható-e Cache: GET cachelt Bookmarkolás Adatok mennyisége Adatok típusa GET csak ascii
Egyszerű szövegbevitel (<input>) A type attribútumtól függően text – egyszerű szövegmező password – jelszó megadó mező hidden – rejtett mező További attribútumai name – paraméter neve maxlength – beírható szöveg maximális hossza value – kezdeti érték readonly, disabled, stb. Továbbított adat: „name=value” Többsoros szövegmező: <textarea>
Alternatív választás (<input>) A type attribútumtól függően checkbox – egymástól független mezők radio – egymástól függő mezők További attribútumai name – paraméter neve radio gomb esetében az azonos nevű gombok egymást kizáróan működnek value – paraméter értéke (alapesetben „on”) checked – alapértelmezett érték („checked” ha igaz) Továbbított adat Ha be van jelölve: „name=value” Ha nincs bejelölve: semmi
Listából választás Lista (<select>) attribútumai name – paraméter neve multiple – egyszerre több elem is kiválasztható-e? rows – megjelenő sorok száma ha 1, akkor combobox-ként jelenik meg Lista lehetséges értékeinek (<options>) attribútumai value – az elküldendő érték selected – alapértelmezetten kiválasztott-e Továbbított adat Egy elem kiválasztása: „name=value” Több elem kiválasztása: „name=value1&name=value2” Nincs kiválasztva egy elem se: semmi Biztonság: látható-e Cache: GET cachelt Bookmarkolás Adatok mennyisége Adatok típusa GET csak ascii
Paraméterek a szerver oldalon HttpServletRequest objektumból kiolvashatók Mindegy, hogy honnan származik (URL, form, stb.) Egy paraméter többször is szerepelhet Mindkét esetben használhatók az alábbiak public String getParameter(String name) Visszaadja a megadott nevű paraméter értékét. Ha nincs ilyen, akkor az értéke null public String[] getParameterValues(String name) Visszaadja a megadott nevű paraméterhez tartozó értékeket (pl. lista esetében) public Enumeration getParameterNames() A felsorolás tartalmazza a böngésző által elküldött összes paraméter nevét
Szervletek HTTP működése Szervletek alapjai HTML formok feldolgozása JSP #TOC 4
JSP oldalak Szervlet hátrányai Java Server Pages Végrehajtás menete Keveredik a Java és HTML kód A HTML kód Stringekben jelenik meg HTML szerkesztővel nem kezelhető Java Server Pages Tulajdonképpen egy szervlet „kifordítva” HTML kódot írunk Java betétekkel Végrehajtás menete A JSP is szerver oldalon fut le Nem keverendő a kliens oldali módszerekkel A konténer a háttérben minden JSP-ből egy szervletet készít
JSP lehetőségek Java kód (scriptlet) Globális változó deklaráció Jelölése: <% … %> Tartalma lehet Lokális változó deklaráció Objektumok létrehozása Primitív típusokkal, objektumokkal kapcsolatos műveletek Ciklus/elágazás Elérhetőek különféle környezeti objektumok Globális változó deklaráció Jelölése: <%! … %> Kifejezés értékének kiírása Jelölése: <%= kifejezés %>
Scriptletek által elérhető objektumok Kommunikáció HttpServletRequest request A már megismert, kérési adatokat tartalmazó objektum HttpServletResponse response A már megismert, a válasz adatait tartalmazó objektum JspWriter out Közvetlenül a kimenet írására használható Környezet ServletContext application A konténer paramétereihez enged hozzáférést PageContext pageContext Az oldal adataihoz enged hozzáférést HttpSession session Menetkövetés
JSP direktívák Általános formája Például a page direktíva lehetőségei <%@direktíva attribútum=”érték” %> JSP oldal működésének befolyásolható velük Például a page direktíva lehetőségei <%@page contentType=“...” %> kimenet típusának meghatározása <%@page import=“...” %> névterek importálása <%@page session=“...” %> session objektum létrejöjjön-e automatikusan („true”) <%@page errorPage=“...” %> hibakezelő oldal meghatározása
Néhány további tag <%@include file=“URL” %> Még a fordítás előtt, mint statikus állományt beszúrja a megadott állományt a JSP oldalba Beszúrható másik JSP oldal(részlet) is, ilyenkor a fordításkor a két kód együtt fordítódik le <jsp:include page=“URL” > <param name=“paraméter” value=“érték” /> </jsp:include> Futás közben „hívás” <jsp:forward page=“URL” /> A kérés továbbítása egy másik erőforrás irányába #SAVE Java_szervlet
Kérés, munkamenet, alkalmazás idejű tárolás Állapotfenntartás Kérés, munkamenet, alkalmazás idejű tárolás
Állapotfentartás Kérés idejű tárolás Munkamenet idejű tárolás Alkalmazás idejű tárolás #TOC 1
Kérés menete Egy szervlet esetében Több szervlet esetén Kliens Szerver Cím megadás Kérés elküldés Kérés fogadás Szervlet/JSP Válasz fogadás Válasz elküldés Megjelenítés Kliens Szerver Cím megadás Kérés elküldés Kérés fogadás Szervlet/JSP Szervlet/JSP Válasz fogadás Válasz elküldés Megjelenítés
Kérés továbbítása Request dispatching Erőforráshoz való hozzáférés Egy szervlet a feldolgozás közben kérést küldhet egy másik erőforrás felé (szervlet, JSP, HTML oldal, stb.) A meghívott szervletnek át lehet továbbítani a meglévő request/response objektumokat, de akár másokat is Erőforráshoz való hozzáférés ServletContext objektumon keresztül public RequestDispatcher getRequestDispatcher(String path) URL alapján keresés (abszolút útvonallal) public RequestDispatcher getNamedDispatcher(String name) Név alapján keresés (szervlet név tulajdonság alapján) ServletRequest objektumon keresztül public RequestDispatcher getRequestDispatcher(String path) URL alapján keresés (relatív útvonallal)
RequestDispatcher interfész Ezen keresztül lehet továbbítani a kérést Két metódust határoz meg public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException A kérést továbbítja a meghívott erőforrásnak A kérés teljes további feldolgozása erre hárul (nem tér vissza) public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException A kérést továbbítja a meghívott erőforrásnak, és annak kimenetét beilleszti a meglévő kimenetbe Egy híváshoz hasonlóan visszatér, és a hívó folytathatja a feldolgozást
Kérés idejű tárolás (request scope) Csak egy kérés idejére szükséges adatok tárolása Egy szervlet esetében A service metódus lokális változóiban Kérés idején létrehozott objektumokban A szervlet példányváltozóiban nem Több szervlet esetén HTTPServletRequest objektum támogatja az átvitelt void setAttribute(string name, Object o) Tetszőleges adat eltárolása egy kulcs megadásával Object getAttribute(string name) Adat lekérdezése kulcs alapján A paraméterek értékeit is módosíthatja a szervlet Csak azonos kontextuson belüli szerverek esetén működik
Állapotfentartás Kérés idejű tárolás Munkamenet idejű tárolás Alkalmazás idejű tárolás #TOC 2
Munkamenet fogalma Munkamenet (session): egy kliens a „weboldalon” történő tartózkodása Kliens Egyidőben több kliens külön-külön munkameneteket kap Egy gépen több böngésző külön kliensnek minősül Egy böngésző több füle viszont egynek Weboldal Nem csak egy szerver, hanem az azonos kontextusban lévő további szervereket/JSP oldalakat is ide értjük Tartózkodás Egymást követő kérések egy munkamenetnek minősülnek Megadható egy lejárati idő, amikor a munkamenet véget ér
Munkamenet követés megvalósítása Webfejlesztői oldalról a cél Minden új kliens kérése új munkamenetet hozzon létre Egy már munkamenettel rendelkező kliens újabb kérése ugyanahhoz a munkamenethez tartozzon Magában a munkamenetben lehessen eltárolni adatokat Alapvető megvalósítási lépések Minden új kliens kap egy egyedi véletlen azonosítót (kulcs) A menetkövetési adatokat ezzel az egyedi azonosítóval eltároljuk egy hasító táblázatban Kilépéskor, vagy egy idő után a kulcsot érvénytelenítjük Azt kell megoldanunk, hogy a kliens minden kérésekor maga küldje el nekünk ezt a kulcsot IP cím, portszám nem működik
Rejtett űrlapmező/URL felülírás Rejtett űrlapmezővel Minden HTML formba rakunk egy rejtett szövegbeviteli mezőt, ebbe beírjuk a kulcsot Amikor a submit gombbal elküldi a form adatai, visszakapjuk a kulcsot is URL felülírással Minden linkbe kiegészítő paraméterként elhelyezzük a kulcsot is A linkre kattintva visszakapjuk a kulcsot is GET metódus esetén működik
Cookiek használata Cookie fogalma Menetkövetés megvalósítása A böngészők az egyes weboldalakhoz el tudnak tárolni egy rövid szöveget, ez a cookie A szerver tudja ez a válasz részeként elküldeni A böngészű ugyanehhez a szerverhez a későbbi kérésekkor mindig elküldi ez a cookiet is Menetkövetés megvalósítása Ha a kliens nem küldött cookie-t, akkor generálunk neki egy kulcsot és ezt visszaküldjük Ezt követően a kliens mindig küldeni fogja a kulcsot, ez alapján tudjuk őt azonosítani Kilépéskor, vagy a cookie lejártakor a kulcs törlődik
Java Session API Java Session API Adatok eltárolása Gyorsan, egyszerűen lehet a klienseket azonosítani vele A menetkövetést a konténer segíti A háttérben a megismert három módszert használja, de a technikai részleteket elrejti Ha a kliens gépen engedélyezett a cookie, akkor azt használja, ha nem, akkor a másik két módszert Adatok eltárolása Az adatok eltárolását is a konténer végzi Így nincs szükség a kliens felé oda-vissza másolásra Nem csak szövegeket, hanem objektumokat tárol
Session objektum Objektum igénylése Letiltott cookiek esetén public HttpSession getSession() Visszaad egy HttpSession objektumot Ha a munkamenethez még nem tartozik ilyen, akkor újat hoz létre Ha már van, akkor pedig azt adja vissza public HttpSession getSession(boolean create) Csak akkor hoz létre újat, ha a create paraméter értéke igaz Gyorsan, egyszerűen lehet a klienseket azonosítani vele Letiltott cookiek esetén public String encodeURL(String url) Ez a HttpServletResponse objektum egy metódusa Paraméterként át kell adni a navigáláshoz használni kívánt linket Ezt szükség esetén kiegészíti a sessionkezelés paramétereivel Ugyanez használható a form tag action attribútumára is
Adatok tárolása a HttpSession-ben Adatok tárolása/módosítása public void setAttribute(String name, Object value) A megadott objektumot hozzákapcsolja a menetobjektumhoz az első paraméterben megadott néven. Ha már létezett ilyen kötés, akkor kicseréli az előző objektumot a most átadottra public void removeAttribute(String name) Törli a megadott névhez tartozó kötést Attribútumok kiolvasása Adatok kiolvasása public Object getAttribute(String name) Az előző metódussal eltárolt objektumokat lehet lekérdezni név alapján. Ha nincs ilyen név, visszatérési értéke null
HttpSession egyéb metódusai Lejárati idő kezelése public void setMaxInactiveInterval(int secs) Lejárati idő megadása. Negatív érték esetén nincs ilyen public int getMaxInactiveInterval() Visszaadja az aktuálisan érvényes lejárati időt Egyéb metódusok public String getID() Folyamathoz tartozó technikai azonosító public void invalidate() Menet érvénytelenítése (pl. kilépéskor) public long getCreationTime() public long getLastAccessedTime()
Állapotfentartás Kérés idejű tárolás Munkamenet idejű tárolás Alkalmazás idejű tárolás #TOC 3
Alkalmazás idejű tárolás lehetőségei Szervlet objektum példányváltozóiban Nem garantálható, hogy egy szervlet nem indul újra Egyidőben akár több azonos szervlet is létezhet Statikus változókban Egy kontextus objektumai egy virtuális gépben vannak A statikus változók tehát mindig egyediek lesznek ServletContext public void setAttribute(String name, Object o) public Object getAttribute(String name) Singleton pattern Adatbázis #SAVE Java_allapot