• Nie Znaleziono Wyników

Wykład 14Serializacja obiektów – zapis i odczyt aplikacji do/z plikuPrzykład 1 – Serializacja aplikacji w dwóch strumieniach – utrata powiązań między danymi

N/A
N/A
Protected

Academic year: 2021

Share "Wykład 14Serializacja obiektów – zapis i odczyt aplikacji do/z plikuPrzykład 1 – Serializacja aplikacji w dwóch strumieniach – utrata powiązań między danymi"

Copied!
17
0
0

Pełen tekst

(1)

Wykład 14

Serializacja obiektów – zapis i odczyt aplikacji do/z pliku

Przykład 1 – Serializacja aplikacji w dwóch strumieniach – utrata powiązań między danymi

import java.io.*;

import java.util.*;

class TProdukt1 implements Serializable { protected String nazwa = "";

protected float cena = 0;

public TProdukt1 (String anazwa, float acena ) { super ();

nazwa = anazwa;

cena = acena;

}

public String toString()

{ StringBuffer sb = new StringBuffer ();

sb.append (" nazwa : " );

sb.append ( nazwa );

sb.append (" cena : " );

sb.append ( Podaj_cene());

return sb.toString ();

}

public boolean equals ( Object pom)

{ TProdukt1 aTProdukt1=(TProdukt1)pom;

if ( aTProdukt1 == null ) return false;

boolean bStatus = true;

if ( this.Podaj_typ() != aTProdukt1.Podaj_typ() ) bStatus = false;

else if ( !nazwa.equals(aTProdukt1.nazwa)) bStatus = false;

else if (this.Podaj_cene()!=aTProdukt1.Podaj_cene()) bStatus = false;

return bStatus;

}

public int Podaj_typ () {return 0; }

public float Podaj_cene () { return cena+Czesc_brutto(); } public String Podaj_nazwe () { return nazwa;}

public void Nadaj_nazwe (String anazwa) { nazwa =anazwa;}

public float Czesc_brutto () { return 0; }

public void Wyswietl ()

{ System.out.println(toString()); }

}

(2)

import java.io.*;

import java.util.*;

public class TAplikacja implements Serializable

{

private Vector Produkty = new Vector();

private Vector Rachunki = new Vector();

public void Wstaw_zakup (int nr, int ile, TProdukt1 produkt1) { TRachunek pom;

TProdukt1 p;

if ((pom=Szukaj_rachunek(nr))!=null) if ((p=Szukaj_produkt(produkt1))!=null) pom.Dodaj_zakup(new TZakup(ile,p)); }

public TRachunek Szukaj_rachunek (int nr) { TRachunek pom;

Iterator it = Rachunki.iterator();

while (it.hasNext())

{ pom = (TRachunek)it.next();

if (pom.equals(nr)) return pom;}

return null; }

public float Podaj_wartosc (int nr) { TRachunek pom;

pom = Szukaj_rachunek(nr);

if (pom!=null)

return pom.Podaj_wartosc();

return 0;

}

public TProdukt1 Szukaj_produkt (TProdukt1 produkt) { TProdukt1 pom;

if (Produkty.contains(produkt))

{pom=(TProdukt1)Produkty.get((Produkty.indexOf(produkt)));

return pom;}

return null;

}

public void Dodaj_produkt (TProdukt1 pom) { if (Szukaj_produkt(pom)==null)

Produkty.add(pom);

}

public void Wstaw_rachunek (int nr) { TRachunek pom=new TRachunek(nr);

if (Szukaj_rachunek(nr)==null) Rachunki.add(pom);

}

public void Wyswietl() { TProdukt1 pom;

Iterator it = Produkty.iterator();

while (it.hasNext())

{ pom=(TProdukt1)it.next();

System.out.println(pom.toString()); } }

(3)

void Zapiszobiektydopliku() {

try

{ FileOutputStream plikobiektow = new FileOutputStream ("Wiadomosc1.obj");

ObjectOutputStream strumienobiektow =

new ObjectOutputStream (plikobiektow);

strumienobiektow.writeObject(this.Produkty);

strumienobiektow.close();

System.out.println("Obiekt Produkty zostal zapisany do pliku");

plikobiektow = new FileOutputStream ("Wiadomosc2.obj");

strumienobiektow = new ObjectOutputStream (plikobiektow);

strumienobiektow.writeObject(this.Rachunki);

strumienobiektow.close();

System.out.println("Obiekt Rachunki zostal zapisany do pliku");

} catch (IOException e)

{ System.out.println ("Blad zapisu pliku obiektowego"+e);}

}

TAplikacja Odczytajobiektyzpliku()

{ TAplikacja ap = new TAplikacja();

Vector produkty, rachunki;

try

{ FileInputStream plikobiektow = new FileInputStream ("Wiadomosc1.obj");

ObjectInputStream strumienobiektow =

new ObjectInputStream (plikobiektow);

produkty = (Vector)strumienobiektow.readObject();

System.out.println("Obiekt Produkty zostal odczytany z pliku");

strumienobiektow.close();

plikobiektow = new FileInputStream ("Wiadomosc2.obj");

strumienobiektow = new ObjectInputStream (plikobiektow);

rachunki = (Vector)strumienobiektow.readObject();

System.out.println("Obiekt Rachunki zostal odczytany z pliku");

strumienobiektow.close();

ap.Produkty=produkty;

ap.Rachunki=rachunki;

} catch (Exception e)

{ System.out.println ("Blad odczytu pliku obiektowego"+e);

return null; } return ap;

}

(4)

public static void main(String args[]) { TAplikacja app=new TAplikacja();

TProdukt1 p1=new TProdukt1("1",1);

app.Dodaj_produkt(p1);

TProdukt1 p2=new TProdukt1("2",2);

app.Dodaj_produkt(p2);

TProdukt1 p3=new TProdukt1("1",1);

app.Dodaj_produkt(p3);

TProdukt2 p4=new TProdukt2("1",1,22);

app.Dodaj_produkt(p4);

TProdukt2 p5=new TProdukt2("2",2,10);

app.Dodaj_produkt(p5);

TProdukt2 p6=new TProdukt2("1",1,22);

app.Dodaj_produkt(p6);

TProdukt3 p7=new TProdukt3("1",1,22);

app.Dodaj_produkt(p7);

TProdukt3 p8=new TProdukt3("2",2,10);

app.Dodaj_produkt(p8);

TProdukt3 p9=new TProdukt3("1",1,22);

app.Dodaj_produkt(p9);

System.out.println("\nProdukty\n");

app.Wyswietl();

app.Wstaw_rachunek(1);

app.Wstaw_rachunek(1);

app.Wstaw_rachunek(2);

app.Wstaw_zakup(1,1,new TProdukt1("1",1));

app.Wstaw_zakup(1,2,new TProdukt2("1",1,22));

app.Wstaw_zakup(1,1,new TProdukt3("1",1,22));

app.Wstaw_zakup(1,4,new TProdukt3("1",1,22));

app.Wstaw_zakup(1,1,new TProdukt2("2",1,22));

app.Wstaw_zakup(2,1,new TProdukt1("1",1));

app.Wstaw_zakup(2,2,new TProdukt2("1",1,22));

app.Wstaw_zakup(2,1,new TProdukt3("1",1,22));

app.Wstaw_zakup(2,4,new TProdukt3("1",1,22));

app.Wstaw_zakup(2,1,new TProdukt2("2",1,22));

TRachunek pom;

if (( pom= app.Szukaj_rachunek(1))!=null) { System.out.println("\nRachunek 1\n");

pom.Wyswietl();

System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc());

}

if (( pom= app.Szukaj_rachunek(2))!=null) { System.out.println("\nRachunek 2\n");

pom.Wyswietl();

System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc()+"\n");

}

app.Zapiszobiektydopliku();

app=app.Odczytajobiektyzpliku();

if(app==null) return;

app.Wyswietl();

if (( pom= app.Szukaj_rachunek(1))!=null) { System.out.println("\nRachunek 1\n");

pom.Wyswietl();

System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc());

}

(5)

if (( pom= app.Szukaj_rachunek(2))!=null) { System.out.println("\nRachunek 2\n");

pom.Wyswietl();

System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc()+"\n");

}

TProdukt1 p=new TProdukt1("1",1); //test powiązania if ((p=app.Szukaj_produkt(p))!=null)

{ p.Nadaj_nazwe ("11");

}

app.Wyswietl();

if (( pom= app.Szukaj_rachunek(1))!=null) { System.out.println("\nRachunek 1\n");

pom.Wyswietl();

System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc());

}

if (( pom= app.Szukaj_rachunek(2))!=null) { System.out.println("\nRachunek 2\n");

pom.Wyswietl();

System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc()+"\n");

}

}

}

(6)
(7)

Przykład 2 – Serializacja aplikacji w dwóch strumieniach – utrata powiązań między danymi

import java.util.*;

import java.io.*;

public class TAplikacja implements Serializable { private Vector Tytuly = new Vector(2,3);

private Vector Ksiazki = new Vector(2,3);

public TAplikacja() { super(); }

public final Vector getTTytulVector () { return Tytuly ; }

public final Vector getTKsiazkaVector () { return Ksiazki; }

public final void removeTTytul (TTytul aTTytul) throws Exception { Tytuly.removeElement(aTTytul) ; }

public final void removeAllTTytul (TTytul aTTytul) throws Exception { Tytuly.removeAllElements() ;}

TTytul Szukaj (TTytul aTTytul) { Iterator iterator = Tytuly.iterator();

TTytul pom;

while (iterator.hasNext()) { pom=(TTytul)iterator.next();

if (pom.equals(aTTytul)) return pom;}

return null;

}

void Wstaw_tytul(String a, String b, String c) {//wyszukiwanie sekwencyjne z kolekcji TKol1 TTytul aTTytul = new TTytul(a,b,c,Ksiazki);

if (Szukaj(aTTytul)==null) Tytuly.add(aTTytul); } void Wyswietl_tytuly() {String s;

Iterator iterator = Tytuly.iterator();

while(iterator.hasNext())

{s=((TTytul)iterator.next()).toString();

System.out.println(s);}

}

void Zwieksz_zasob(String a, String b, String c, int numer) { TTytul aTTytul=new TTytul(a,b,c,Ksiazki);

if ((aTTytul=Szukaj(aTTytul))!=null) aTTytul.Wstaw_pozycje(numer);

else System.out.println("\nNie znaleziono ksiazki o tytule "+a);

}

void Wyswietl_ksiazki() {String s;

Iterator iterator = Ksiazki.iterator();

while(iterator.hasNext())

{s=((TKsiazka)iterator.next()).toString();

System.out.println(s); } }

(8)

void Zmien_tytul(String nnazwa, String nazwa, String autor, String ISBN ) { TTytul tytul, stytul= new TTytul(nazwa, autor, ISBN, Ksiazki);

Iterator iterator = Tytuly.iterator();

while(iterator.hasNext())

{ tytul=(TTytul)iterator.next();

if (tytul.equals(stytul))

{ tytul.setTytul(nnazwa); break; } }

}

void Zapiszobiektydopliku() { try

{ FileOutputStream plikobiektow = new FileOutputStream ("Wiadomosc1.obj");

ObjectOutputStream strumienobiektow =

new ObjectOutputStream (plikobiektow);

strumienobiektow.writeObject(this.Tytuly);

strumienobiektow.close();

System.out.println("Obiekt tytuly zostal zapisany do pliku");

plikobiektow = new FileOutputStream ("Wiadomosc2.obj");

strumienobiektow = new ObjectOutputStream (plikobiektow);

strumienobiektow.writeObject(this.Ksiazki);

strumienobiektow.close();

System.out.println("Obiekt ksiazki zostal zapisany do pliku");

}

catch (IOException e)

{ System.out.println ("Blad zapisu pliku obiektowego"+e);}

}

TAplikacja Odczytajobiektyzpliku() { TAplikacja ap = new TAplikacja();

Vector tytuly, ksiazki;

try

{ FileInputStream plikobiektow = new FileInputStream ("Wiadomosc1.obj");

ObjectInputStream strumienobiektow =

new ObjectInputStream (plikobiektow);

tytuly = (Vector)strumienobiektow.readObject();

System.out.println("Obiekt tytuly zostal odczytany z pliku");

strumienobiektow.close();

plikobiektow = new FileInputStream ("Wiadomosc2.obj");

strumienobiektow = new ObjectInputStream (plikobiektow);

ksiazki = (Vector)strumienobiektow.readObject();

System.out.println("Obiekt ksiazki zostal odczytany z pliku");

strumienobiektow.close();

ap.Tytuly=tytuly;

ap.Ksiazki=ksiazki;

} catch (Exception e)

{ System.out.println ("Blad odczytu pliku obiektowego"+e);

return null; }

return ap; } }

(9)

import java.io.*;

public class Program {

public static void main(String args[]) { TAplikacja aplikacja = new TAplikacja();

aplikacja.Wstaw_tytul("Tytul1","1","1");

aplikacja.Wstaw_tytul("Tytul4","4","4");

aplikacja.Wstaw_tytul("Tytul1","1","1");

aplikacja.Wstaw_tytul("Tytul3","3","3");

aplikacja.Wstaw_tytul("Tytul2","2","2");

aplikacja.Wyswietl_tytuly();

aplikacja.Zwieksz_zasob("Tytul1","1","1",1);

aplikacja.Zwieksz_zasob("Tytul2","2","2",2);

aplikacja.Zwieksz_zasob("Tytul3","3","3",3);

aplikacja.Zwieksz_zasob("Tytul4","4","4",4);

aplikacja.Zwieksz_zasob("Tytul1","1","1",5);

aplikacja.Wyswietl_ksiazki();

aplikacja.Zapiszobiektydopliku();

aplikacja=aplikacja.Odczytajobiektyzpliku();

aplikacja.Wyswietl_tytuly();

aplikacja.Wyswietl_ksiazki();

aplikacja.Zmien_tytul("11","Tytul1","1","1"); //test powiązania aplikacja.Wyswietl_tytuly();

aplikacja.Wyswietl_ksiazki();

}

}

(10)
(11)

Przykład 3 – Zapisywanie aplikacji w jednym strumieniu – zachowanie powiązań między danymi (patrz przykład 1)

import java.io.*;

import java.util.*;

public class TAplikacja implements Serializable { private Vector Produkty = new Vector();

private Vector Rachunki = new Vector();

public void Wstaw_zakup (int nr, int ile, TProdukt1 produkt1) { TRachunek pom;

TProdukt1 p;

if ((pom=Szukaj_rachunek(nr))!=null) if ((p=Szukaj_produkt(produkt1))!=null) pom.Dodaj_zakup(new TZakup(ile,p));

}

public TRachunek Szukaj_rachunek (int nr) { TRachunek pom;

Iterator it = Rachunki.iterator();

while (it.hasNext())

{ pom = (TRachunek)it.next();

if (pom.equals(nr)) return pom;}

return null;

}

public float Podaj_wartosc (int nr) { TRachunek pom;

pom = Szukaj_rachunek(nr);

if (pom!=null)

return pom.Podaj_wartosc();

return 0;

}

public TProdukt1 Szukaj_produkt (TProdukt1 produkt) { TProdukt1 pom;

if (Produkty.contains(produkt))

{pom=(TProdukt1)Produkty.get((Produkty.indexOf(produkt)));

return pom;}

return null;

}

public void Dodaj_produkt (TProdukt1 pom) { if (Szukaj_produkt(pom)==null)

Produkty.add(pom);

}

public void Wstaw_rachunek (int nr) { TRachunek pom=new TRachunek(nr);

if (Szukaj_rachunek(nr)==null) Rachunki.add(pom);

}

public void Wyswietl() { TProdukt1 pom;

Iterator it = Produkty.iterator();

while (it.hasNext())

{ pom=(TProdukt1)it.next();

System.out.println(pom.toString());

} }

(12)

void Zapiszobiektydopliku() { try

{ FileOutputStream plikobiektow = new FileOutputStream ("Wiadomosc.obj");

ObjectOutputStream strumienobiektow =

new ObjectOutputStream (plikobiektow);

strumienobiektow.writeObject(this);

strum ienobiektow.close();

System.out.println("Obiekt aplikacja zostal zapisany do pliku");

} catch (IOException e)

{ System.out.println ("Blad zapisu pliku obiektowego"+e);}

}

TAplikacja Odczytajobiektyzpliku() { TAplikacja ap;

try

{ FileInputStream plikobiektow = new FileInputStream ("Wiadomosc.obj");

ObjectInputStream strumienobiektow =

new ObjectInputStream (plikobiektow);

ap = (TAplikacja)strumienobiektow.readObject();

System.out.println("Obiekt aplikacja zostal odczytany z pliku");

strumienobiektow.close();

} catch (Exception e)

{ System.out.println ("Blad odczytu pliku obiektowego"+e);

return null; } return ap;

}

public static void main(String args[]) { TAplikacja app=new TAplikacja();

TProdukt1 p1=new TProdukt1("1",1);

app.Dodaj_produkt(p1);

TProdukt1 p2=new TProdukt1("2",2);

app.Dodaj_produkt(p2);

TProdukt1 p3=new TProdukt1("1",1);

app.Dodaj_produkt(p3);

TProdukt2 p4=new TProdukt2("1",1,22);

app.Dodaj_produkt(p4);

TProdukt2 p5=new TProdukt2("2",2,10);

app.Dodaj_produkt(p5);

TProdukt2 p6=new TProdukt2("1",1,22);

app.Dodaj_produkt(p6);

TProdukt3 p7=new TProdukt3("1",1,22);

app.Dodaj_produkt(p7);

TProdukt3 p8=new TProdukt3("2",2,10);

app.Dodaj_produkt(p8);

TProdukt3 p9=new TProdukt3("1",1,22);

app.Dodaj_produkt(p9);

System.out.println("\nProdukty\n");

(13)

app.Wyswietl();

app.Wstaw_rachunek(1);

app.Wstaw_rachunek(1);

app.Wstaw_rachunek(2);

app.Wstaw_zakup(1,1,new TProdukt1("1",1));

app.Wstaw_zakup(1,2,new TProdukt2("1",1,22));

app.Wstaw_zakup(1,1,new TProdukt3("1",1,22));

app.Wstaw_zakup(1,4,new TProdukt3("1",1,22));

app.Wstaw_zakup(1,1,new TProdukt2("2",1,22));

app.Wstaw_zakup(2,1,new TProdukt1("1",1));

app.Wstaw_zakup(2,2,new TProdukt2("1",1,22));

app.Wstaw_zakup(2,1,new TProdukt3("1",1,22));

app.Wstaw_zakup(2,4,new TProdukt3("1",1,22));

app.Wstaw_zakup(2,1,new TProdukt2("2",1,22));

TRachunek pom;

if (( pom= app.Szukaj_rachunek(1))!=null) { System.out.println("\nRachunek 1\n");

pom.Wyswietl();

System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc());

}

if (( pom= app.Szukaj_rachunek(2))!=null) { System.out.println("\nRachunek 2\n");

pom.Wyswietl();

System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc()+"\n");

}

app.Zapiszobiektydopliku();

app=app.Odczytajobiektyzpliku();

if(app==null) return;

app.Wyswietl()

if (( pom= app.Szukaj_rachunek(1))!=null) { System.out.println("\nRachunek 1\n");

pom.Wyswietl();

System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc());

}

if (( pom= app.Szukaj_rachunek(2))!=null) { System.out.println("\nRachunek 2\n");

pom.Wyswietl();

System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc()+"\n");

}

TProdukt1 p=new TProdukt1("1",1);

if ((p=app.Szukaj_produkt(p))!=null) //test powiązania { p.Nadaj_nazwe ("11"); }

app.Wyswietl();

if (( pom= app.Szukaj_rachunek(1))!=null) { System.out.println("\nRachunek 1\n");

pom.Wyswietl();

System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc());

}

if (( pom= app.Szukaj_rachunek(2))!=null) { System.out.println("\nRachunek 2\n");

pom.Wyswietl();

System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc()+"\n");

}

}

}

(14)
(15)

Przykład 4 – Zapisywanie aplikacji w jednym strumieniu – zachowanie powiązań między danymi (patrz przykład 2)

import java.util.*;

import java.io.*;

public class TAplikacja implements Serializable { private Vector Tytuly = new Vector(2,3);

private Vector Ksiazki = new Vector(2,3);

public TAplikacja() { super(); }

public final Vector getTTytulVector () { return Tytuly ;}

public final Vector getTKsiazkaVector () { return Ksiazki; }

public final void removeTTytul (TTytul aTTytul) throws Exception { Tytuly.removeElement(aTTytul) ; }

public final void removeAllTTytul (TTytul aTTytul) throws Exception { Tytuly.removeAllElements() ; }

TTytul Szukaj (TTytul aTTytul) { Iterator iterator = Tytuly.iterator();

TTytul pom;

while (iterator.hasNext()) {pom=(TTytul)iterator.next();

if (pom.equals(aTTytul)) return pom;}

return null;

}

void Wstaw_tytul(String a, String b, String c) {//wyszukiwanie sekwencyjne z kolekcji TKol1 TTytul aTTytul = new TTytul(a,b,c,Ksiazki);

if (Szukaj(aTTytul)==null) Tytuly.add(aTTytul);

}

void Wyswietl_tytuly() {String s;

Iterator iterator = Tytuly.iterator();

while(iterator.hasNext())

{s=((TTytul)iterator.next()).toString();

System.out.println(s);}

}

void Zwieksz_zasob(String a, String b, String c, int numer) { TTytul aTTytul=new TTytul(a,b,c,Ksiazki);

if ((aTTytul=Szukaj(aTTytul))!=null) aTTytul.Wstaw_pozycje(numer);

else System.out.println("\nNie znaleziono ksiazki o tytule "+a);

}

(16)

void Wyswietl_ksiazki() {String s;

Iterator iterator = Ksiazki.iterator();

while(iterator.hasNext())

{s=((TKsiazka)iterator.next()).toString();

System.out.println(s);

} }

void Zmien_tytul(String nnazwa, String nazwa, String autor, String ISBN ) {TTytul tytul,stytul= new TTytul(nazwa, autor, ISBN, Ksiazki);

Iterator iterator = Tytuly.iterator();

while(iterator.hasNext()) { tytul=(TTytul)iterator.next();

if (tytul.equals(stytul)) { tytul.setTytul(nnazwa);

break; } }

}

void Zapiszobiektydopliku() {

try

{ FileOutputStream plikobiektow = new FileOutputStream ("Wiadomosc.obj");

ObjectOutputStream strumienobiektow =

new ObjectOutputStream (plikobiektow);

strumienobiektow.writeObject(this);

strumienobiektow.close();

System.out.println("Obiekt aplikacja zostal zapisany do pliku");

} catch (IOException e)

{ System.out.println ("Blad zapisu pliku obiektowego"+e);}

}

TAplikacja Odczytajobiektyzpliku() { TAplikacja ap;

try

{ FileInputStream plikobiektow = new FileInputStream ("Wiadomosc.obj");

ObjectInputStream strumienobiektow =

new ObjectInputStream (plikobiektow);

ap = (TAplikacja)strumienobiektow.readObject();

System.out.println("Obiekt aplikacja zostal odczytany z pliku");

strumienobiektow.close();

} catch (Exception e)

{ System.out.println ("Blad odczytu pliku obiektowego"+e);

return null; } return ap;

}

}

(17)

Cytaty

Powiązane dokumenty

Wtedy nie ma problemu z przecinkiem jako separatorem (czy separator dziesiętny czy separator

Do wszystkich klas definiujących stopnie, czyli do klasy bazowej Stopien_walu oraz do klas pochodnych StopienFazaZLewej, StopienFazaZPrawej dodamy metodę XMLZapisz –

Mapa aplikacji – kolekcja formatów zapisu i odczytu z pliku,}. odtwarzanie obiektów wraz

Jest to możliwe, jeśli klient (program klienta) zna adres komputera sieciowego, na którym jest wykonywany serwer oraz numer portu, do którego serwer jest dołączony

25) long readLong() – czyta 8 bajtów z pliku i zwraca wartość typu long 26) short readShort() – czyta 2 bajty z pliku i zwraca wartość typu short 27) Po zapisie i

 Program serwera wykonywany na konkretnej maszynie ma przypisane do pewnego numeru portu gniazdo (typu ServerSocket), poprzez które "nasłuchuje" za pomocą metody accept

Działanie atrybutu required="true" oraz requiredMessage dla pól bez wartości domyślnej Działanie domyślnego konwertera typu Integer jako typu przypisanego do

Dla każdego duszka utwórz oddzielny skrypt (opis obu skryptów poniżej). a) Na początku każdego skryptu ustaw odpowiednio pozycję startową duszka, korzystając ze