Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Aplicatie Servlet - Librarie virtuala
Aplicatia implementeaza o librarie virtuala. Optiunile pe care utilizatorul le are in aceasta librarie sunt :
poate sa consulte catalogul de carti: se poate alege o carte care sa fie introdusa in cosul lui virtual (CatalogServlet)
poate sa verifice ce carti are in cosul sau (ArataCosulServlet)
poate sa plateasca cartile aflate in cosul propriu (PlatesteServlet)
poate sa se inscrie intr-o lista de email-uri pentru a fi anuntati de noile aparitii in librarie (ListaServlet).
Accesarea acestei librarii este contorizata (ContorServlet).
In continuare am listat codurile sursa pentru clasele folosite impreuna cu o scurta descriere. Codurile sunt grupate in pachete, astfel incat am trei pachete: librarie, contor, lista.
1. LibrarieServlet
Aceasta clasa extinde interfata HttpServlet suprascriind metoda service() pentru a returna o pagina Web.
Practic se creeza un obiect de tip RequestDispatcher care preia cererea si o transmite catre o alta resursa (in acest caz o pagina Web). Daca pagina WEB specificata exista atunci se creaza sau se obtine sesiunea curenta cu metoda getSession() iar apoi se trimite cererea catre pagina HTML specificata (/librarie.shtml).
Codul sursa al clasei LIbrarieServlet.java este urmatorul:
package librarie;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LibrarieServlet extends HttpServlet else
}
public String getServletInfo()
2. Pagina HTML librarie.shtml
<html>
<head><title>Librarie</title></head>
<body bgcolor='#f8f8f8'>
<hr>
<br>
<h1>
<font size='+2' color='blue'>Librarie</font>
<br>
<hr>
</h1>
<p><font size='+1'><a href='/servlet/Catalog'>Catalog</a></font><br>
Consultati lista de carti existenta in librarie
<p><font size='+1'><a href='/servlet/ArataCosul'>Cosul de Cumparaturi</a></font><br>
Uitati-va la cosul dumneavoastra de cumparaturi
<p><font size='+1'><a href='/servlet/Plateste'>Cumparati-va cartile</a></font><br>
Platiti cartile pe care le aveti in cos
<p><font size='+1'><a href='/servlet/Lista'>Inregistrati-va</a></font><br>
Puteti sa va inregistrati in lista clientilor pentru a fi notificati de noile aparitii
<hr>
<br>
<font size='+1'>
<SERVLET CODE=contor> </SERVLET>
</font>
</body>
</html>
Pagina va arata asa:
3. Clasa DetaliiCarte
In aceasta clasa am definit structura pentru "baza de date" pe care o voi folosi in aplicatie. Atributele bazei de date sunt: idCarte, titlu, nume, prenume, pret, an, coperta, descriere.
Constructorul clasei initializeaza un obiect cu valorile pentru atributele sale.
Clasa defineste apoi metode pentru obtinerea atributelor.
Codul sursa pentru aceasta clasa este listat in continuare:
package librarie;
public class DetaliiCarte
public String obtineTitlu()
public float obtinePret()
public int obtineAn()
public String obtineDescriere()
public String obtineCoperta()
public String obtineIdCarte()
public String obtineNume()
public String obtinePrenume()
4. Clasa DetaliiCarteServlet
Acest servlet este folosit pentru a afisa informatii despre o anumita carte specificata prin parametrul idcarte. In metoda init() se initializeaza un obiect de tip ObtineCarti, iar apoi in metoda Get se obtine sesiunea, iar apoi cosul asociat acestei sesiuni, dupa care se afiseaza informatiile despre cartea specificata (titlu, autor, an, coperta, scurta descriere).
package librarie;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DetaliiCarteServlet extends HttpServlet
}
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
response.setContentType('text/html');
PrintWriter out = response.getWriter();
out.println('<html>' +
'<head><title>Descrierea Cartii</title></head>' +
'<body bgcolor=a'#f8f8f8a'>' +
'<hr>' +
'<br> ' +
'<h1>' +
'<font size=a'+2a' color=a'bluea'>Librarie </font>' +
'<br> ' +
'<hr>' +
'</h1>');
String idCarte = request.getParameter('idCarte');
if (idCarte != null)
out.println('</body></html>');
out.close();
}
public String getServletInfo()
5. Clasa SeteazaCarti
Aceasta clasa introduce date in baza de date. Baza de date este de fapt o tabela Hash (structura de date care permite cautarea elementelor stocate utilizand chei asociate). Baza mea de date are 10 inregistrari. Baza de date este tinuta de asemenea si intr-un vector pentru parcurgerea lor secventiala.
Codul sursa al acestei clase este SeteazaCarti.java:
package librarie;
import java.util.*;
class SeteazaCarti
DetaliiCarte obtineDetaliiCarte(String carteId)
DetaliiCartest obtineCartiSortateTitlu()
int obtineNumarulDeCarti()
6. Clasa ObtineCarti
Aceasta clasa este folosita pentru a obtine informatii din baza mea de date. Pentru a avea o singura instanta a acestei clase am folosit variabila onlyInstance si metoda instance, ambele statice.
Metoda Init() declanseaza initierea bazei de date. Metoda destroy seteaza variabila carti la null pentru a se putea aplica mecanismul de garbage collection.
package librarie;
import java.io.*;
public class ObtineCarti
public static ObtineCarti instance ()
public void init()
public void destroy()
public DetaliiCarte obtineDetaliiCarte(String idCarte)
public DetaliiCartest obtineCartiSortateTitlu()
public int obtineNumarulDeCarti()
7. Clasa CatalogServlet
Aceasta clasa este un
servlet care raspunde la cereri Get. In metoda init() se initializeaza un obiect de tip ObtineCarti in cazul in
care acesta nu a fost deja initializat.
In aplicatie acest servlet poate sa nu aiba parametrii sau poate sa aiba parametru Cumpara care indica ultima carte introdusa in cos.
In metoda GET se obtine sesiunea si cosul utilizatorului. Daca nu are un cos, atunci se creeaza unul. Se seteaza tipul continutului pentru pagina HTML care va fi raspunsul cererii respective.
Daca parametrul Cumpara nu este null atunci inainte de a afisa lista cu carti din baza de date afisam si ultima carte adaugata in cosul utilizatorului. Daca parametrul este null atunci se va afisa lista cu cartile.
Lista cu cartile se fa afisa cu un for stiindu-se numarul de carti din baza de date.
Codul sursa pentru aceasta clasa este CatalogServlet.java:
package librarie;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class CatalogServlet extends HttpServlet
}
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
response.setContentType('text/html');
PrintWriter out = response.getWriter();
out.println('<html>' +
'<head><title> Catalog de carti </title></head>' +
'<body bgcolor=a'#f8f8f8a'>' +
'<hr>' +
'<br> ' +
'<h1>' +
'<font size=a'+2a' color=a'bluea'>Librarie </font>' +
'<br> ' +
'<hr>' +
'</h1>');
ObtineCarti frontEnd =
(ObtineCarti)getServletContext().getAttribute(
'librarie.ObtineCarti');
String carteDeAdaugat = request.getParameter('Cumpara');
if (carteDeAdaugat != null)
if (cos.obtineNumarDeExemplare() > 0)
out.println('<br> ' +
'<h3>Va rugam alegeti din oferta noastra</h3>' +
'<center> <table>');
DetaliiCartest carti = frontEnd.obtineCartiSortateTitlu();
int numCarti = frontEnd.obtineNumarulDeCarti();
for(int i=0; i < numCarti; i++)
out.println('</table></center>' +
'<p><a href=a'' +
'/servlet/librarie' +
'a'>Inapoi la pagina principala</a></p>' +
'</body></html>');
out.close();
}
public String getServletInfo()
8. Clasa CarteIntrodusa
Aceasta clasa pastreaza informatii despre cartile introduse in cos. Defineste cate o metoda pentru operatiile de incrementare si decrementare a numarului de carti din cosul utilizatorului.
Defineste o metoda pentru aflarea numarului de exemplare din cos al unui anumit exemplar de carte, si o metoda pentru intoarcerea unui anumit exmplar.
Codul sursa pentru aceasta clasa este CarteIntrodusa.java :
package librarie;
public class CarteIntrodusa
public void incrementeazaCantitatea()
public void decrementeazaCantitatea()
public Object obtineExemplar()
public int obtineCantitatea()
9. Clasa ArataCosulServlet
Aceasta clasa afiseaza continutul cosului de cumparaturi al unui utilizator. Aceasta clasa extinde interfata HttpServlet rescriind metoda doGet().
In metoda init() se initializeaza daca nu era
deja un obiect de tip ObtineCarti.
In metoda Get, mai intai se obtine sesiunea curenta, iar apoi se obtine valoarea cosului din sesiunea curenta.
Se seteaza tipul continutului pentru pagina HTML care va fi trimisa catre client.
Daca servletul are parametrul Sterge nenull atunci se va sterge din cosul de cumparaturi cartea care are identificatorul egal cu valoarea parametrului Sterge.
Daca servletul are parametrul Goleste nenull atunci din cos se vor sterge toate exemplarele si se va afisa un mesaj corespunzator.
Apoi se face o afisare a cosului, facandu-se si un total al sumei ce trebuie platite de catre utilizator
package librarie;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ArataCosulServlet extends HttpServlet
}
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
response.setContentType('text/html');
PrintWriter out = response.getWriter();
out.println('<html>' +
'<head><title>Cosul dumneavoastra de cumparaturi</title></head>' +
'<body bgcolor=a'#f8f8f8a'>' +
'<hr>' +
'<br> ' +
'<h1>' +
'<font size=a'+2a' color=a'bluea'>Librarie </font>' +
'<br> ' +
'<hr>' +
'</h1>');
String idCarte = request.getParameter('Sterge');
if (idCarte != null) else if (request.getParameter('Goleste') != null)
int num = cos.obtineNumarDeExemplare();
if (num > 0)
Plateste plateste = new Plateste(cos);
out.println('<tr><td colspan=a'5a' >' +
'<br></td></tr>' +
'<tr>' +
'<td colspan=a'2a' align=a'righta'' +
'bgcolor=a'#f8f8f8a'>' +
'Subtotal:</td>' +
'<td bgcolor=a'#dddddda' align=a'righta'>' +
plateste.format(plateste.obtineFaraTVA()) + '</td>' +
'</td><td><br></td></tr>' +
'<tr>' +
'<td colspan=a'2a' align=a'righta'' +
'bgcolor=a'#f8f8f8a'>' +
'TVA:</td>' +
'<td bgcolor=a'#dddddda' align=a'righta'>' +
plateste.format(plateste.obtineTVA()) + '</td>' +
'</td><td><br></td></tr>' +
'<tr>' +
'<td colspan=a'2a' align=a'righta'' +
'bgcolor=a'#f8f8f8a'>' +
'<font color=a'ff0000a'>' +
'<strong>Total:</strong></font></td>' +
'<td bgcolor=a'#dddddda' align=a'righta'>' +
plateste.format(plateste.obtineTotal()) + '</td>' +
'</td><td><br></td></tr>' +
'</table>');
out.println('<p> <p><a href=a'' +
'/servlet/Catalog' +
'a'>Consultati catalogul</a> ' +
'<a href=a'' +
'/servlet/Plateste' +
'a'>Verifica suma de platit!</a> ' +
'<a href=a'' +
'/servlet/ArataCosul?Goleste=goleste' +
'a'>Goleste cosul</a>');
} else
out.println('</body> </html>');
out.close();
}
public String getServletInfo()
10. Clasa CosulDeCumparaturi
Aceasta clasa pastreaza intr-o tabela Hash cartile introduse in cos.
Sunt definte metode pentru adaugare de carte in cos, pentru a sterge o carte din cos, pentru obtinerea unui obiect de tip Enumeration cu cartile din cos, pentru a obtine numarul de exemplare si pentru a curata complet cosul.
package librarie;
import java.util.*;
public class CosulDeCumparaturi
public void adauga(String idCarte, DetaliiCarte carte) else
numarDeExemplare++;
}
public void sterge(String idCarte)
}
public Enumeration obtineExemplare()
protected void finalize() throws Throwable
public int obtineNumarDeExemplare()
public void clear()
11. Clasa Plateste
Aceasta clasa este folosita pentru a calcula suma care trebuie platita pentru cartile din cosul de cumparaturi.
Sunt definite metode pentru aflarea sumei de platit fara si cu TVA, metode pentru afisarea sumei de platit.
package librarie;
import java.io.*;
import java.util.*;
import java.text.*;
public class Plateste
public double obtineFaraTVA()
return rotunjeste(suma);
}
public double obtineTVA()
public double obtineTotal()
private double rotunjeste(double x)
public static String format(double d)
12. Clasa PlatesteServlet
Acest servlet se
foloseste pentru a da posibilitatea utilizatorului de a-si plati cartile alese.
package librarie;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PlatesteServlet extends HttpServlet
response.setContentType('text/html');
PrintWriter out = response.getWriter();
out.println('<html>' +
'<head><title> Plata </title></head>' +
'<body bgcolor=a'#f8f8f8a'>' +
'<hr>' +
'<br> ' +
'<h1>' +
'<font size=a'+2a' color=a'bluea'>Librarie </font>' +
'<br> ' +
'<hr>' +
'</h1>');
Plateste plateste = new Plateste(cos);
double total = plateste.obtineTotal();
out.println('<p>Suma fara TVA este: ' +
'<strong>' + plateste.format(total) + '</strong>' +
'<p>Pentru a plati ceea ce aveti in cos ' +
'va rugam sa ne furnizati urmatoarele informatii:' +
'<form action=a'' +
'/servlet/Primeste' +
'a' method=a'posta'>' +
'<table>' +
'<tr>' +
'<td><strong>Nume:</strong></td>' +
'<td><input type=a'texta' name=a'cardnamea'' +
'value=a'Patrascu Georgea' size=a'19a'></td>' +
'</tr>' +
'<tr>' +
'<td><strong>Numar carte credit:</strong></td>' +
'<td>' +
'<input type=a'texta' name=a'cardnuma' ' +
'value=a'xxxx xxxx xxxx xxxxa' size=a'19a'></td>' +
'</tr>' +
'<tr>' +
'<td></td>' +
'<td><input type=a'submita'' +
'value=a'Inregistreaza informatiia'></td>' +
'</tr>' +
'</table>' +
'</form>' +
'<p><a href=a'' +
'/servlet/Catalog' +
'a'>Inapoi la catalog</a></p>' +
'</body>' +
'</html>');
out.close();
}
public String getServletInfo()
13. Clasa PrimesteServlet
Acest servlet face sesiunea curenta invalida si afiseaza un mesaj de revedere pentru utilizatorul curent.
package librarie;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PrimesteServlet extends HttpServlet
session.invalidate();
response.setContentType('text/html');
PrintWriter out = response.getWriter();
out.println('<html>' +
'<head><title> Primeste </title>' +
'<meta http-equiv=a'refresha' content=a'4; url=' +
'https://' + request.getHeader('Host') +
'/servlet/librarie;a'>' +
'</head>' +
'<body bgcolor=a'#f8f8f8a'>' +
'<hr>' +
'<br> ' +
'<h1>' +
'<font size=a'+2a' color=a'bluea'>Librarie </font>' +
'<br> ' +
'<hr>' +
'</h1>');
out.println('<h3>Multumim ca ati facut cumparaturi de la noi ' +
request.getParameter('cardname') +
'<p>Va rugam sa reveniti in curand la noi!</h3>' +
'<p><i>Aceasta pagina se va reseta automat</i>' +
'</body></html>');
out.close();
}
public String getServletInfo()
14. Clasa ListaServlet
Acest servlet este folosit pentru a pastra o lista de email-uri cu clientii acestei "librarii".
In metoda init() se obtine numele fisierului in care va fi pastrata lista, iar apoi daca nu sunt probleme se deschide acest fisier pentru citire si scriere.
Metoda doGet() afiseaza lista cu clientii care au fost deja inscrisi, si descrie o forma in care se pot introduce noi adrese de email pentru a fi inscrise sau pentru a fi scoase din lista.
In metoda doPost() se testeaza parametrii email, action, si in functie de acestia se adauga sau nu email-ul in lista
package lista;
import java.util.Vector;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ListaServlet extends HttpServlet
catch(FileNotFoundException e)
catch(Exception e)
}
protected void doGet(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException
protected void doPost(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException
if(req.getParameter('action').equals('inscrie') || req.getParameter('action') == null )
}
else
}
res.setContentType('text/html');
res.setHeader('pragma', 'no-cache');
PrintWriter out = res.getWriter();
out.println('<html>' +
'<head><title> Lista Clienti </title></head>' +
'<body bgcolor=a'#f8f8f8a'>' +
'<hr>' +
'<br> ' +
'<h1>' +
'<font size=a'+2a' color=a'bluea'>Librarie</font>' +
'<br> ' +
'<hr>' +
'</h1>');
out.println('<font size=a'+2a'>' + msg + '</font>');
out.print('<HR><A HREF=a'');
out.print(req.getRequestURI());
out.print('a'>Arata Lista</A>');
out.print('<center>' +
'<p><a href=a'' +
'/servlet/librarie' +
'a'>Intoarceti-va la pagina principala</a></p>' +
'</center>');
out.print('</BODY></HTML>');
out.close();
}
public String getServletInfo()
private synchronized boolean subscribe(String email) throws IOException
private synchronized boolean unsubscribe(String email) throws IOException
private void save() throws IOException
15. Clasa PersistentHttpServlet
Aceasta clasa abstracta furnizeaza cadrul pentru persistenta starii servletului; de asemenea furnizeza o facilitate de a salva periodic si automat starea servletului.
Aceasta clasa extinde interfata HttpServlet. Am suprascris metoda init() si destroy() pentru a suporta salvarea starii. si definit metodele obtineCaleaStarii si creazaStare() care trebuie implementate de o subclasa pentru a specifica unde este pastrata starea si pentru a crea o stare initiala.
Metoda init() va fi apelata atunci cand servletul este initializat de catre server.
package contor;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public abstract class PersistentHttpServlet extends HttpServlet
public void init (ServletConfig config) throws ServletException
protected Serializable stare;
protected Thread salvare;
protected int perioadaSalvare;
protected void init (ServletConfig config, int perioadaSalvare)
throws ServletException
catch (FileNotFoundException ex)
catch (IOException ex)
catch (ClassNotFoundException ex)
if ((perioadaSalvare > 0) && (obtineCaleaStarii () != null))
};
salvare.start ();
}
protected String obtineCaleaStarii()
protected abstract Serializable creazaStare();
protected int NrStare;
void salvareAutomata()
objectOut.close();
log('stare salvata');
stareSalvata = stareNoua;
}
}
}
catch (InterruptedException ignored)
catch (IOException ex)
protected void schimbareaStarii()
public void destroy ()
catch (InterruptedException ignored)
}
if (obtineCaleaStarii() != null)
catch (IOException ex)
}
super.destroy();
16. Clasa Contor
Am definit clasa Contor care contine campurile contor si dataNasterii care reflecteaza de cate ori servletul a fost accesat si data la care a fost creat.
package contor;
import java.io.*;
import java.util.*;
class Contor implements Serializable
synchronized void contorizeaza ()
public String toString ()
17. Clasa ContorServlet
Acest servlet numara de cate ori servletul a fost accesat. Aceasta numaratoare, impreuna cu un obiect de tip Date care marcheaza timpul cand starea persistenta a fost creata, este pastrata intr-un fisier atata timp cand servletul nu este in memorie. Clasa ContorServlet extinde clasa abstracta PersistentHttpServlet. Implementez metoda creazaStare() si suprascriu metoda doGet().
package contor;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ContorServlet extends PersistentHttpServlet
protected Serializable creazaStare()
protected void doGet (HttpServletRequest request, HttpServletResponse response)
throws IOException
Copyright © 2024 - Toate drepturile rezervate