Aplicatie Pentru Gestiunea Unei Case de Pariuri
Cuprins
Introducere
In aceasta lucrare de licența voi prezenta o aplicație pentru gestiunea unei case de pariuri. Dar ce sunt pariurile sportive? Pariurile sportive reprezintă activitatea de a prezice rezultatele dintr-un eveniment sportiv si pe care se pariază o anumita miza pe deznodământul acelui eveniment. Pariuri exista in toate sporturile: fotbal, baschet, handbal, rugby dar si in curse de cai sau de câini. Primele pariuri au avut loc acum mii de ani in Grecia antica când oamenii simpli si săraci alergau pentru a câștiga un ban iar oamenii bogați stăteau sus si pariau. Competiții de atletism erau ținute in Corint, Nemea sau Olympus. Principalele competiții care erau la vremea aceea erau: alergatul, aruncarea discului, săritura in lungime, wrestlingul, boxul. Aceste jocuri strângeau numeroși spectatori care pariau si toata averea lor. Despre pariuri s-a menționat si in Roma Antica.
In zilele noastre oamenii pariază din plăcere, din pasiune, de plictiseala sau pur si simplu sa se îmbogățească de azi pe mâine. Exista la tot pasul cate o casa de pariuri gata sa iți ia banii. Dar ce înseamnă mai exact sa pariezi? Pentru un parior acest in spatele unui pronostic pot sta sute de calcule si de ecuații, majoritatea probabilităților in pariuri se calculează folosind legea lui Poisson.
Cum se pariază? Luăm un eveniment sportiv, de exemplu România – Anglia, casele de pariuri oferă o anumita cotă daca bate România, o anumită cotă daca bate Anglia si o anumită cotă dacă se termina egal. Câștigul celui care pariază este suma pariată înmulțită cu cota pronosticului ales. Cine oferă aceste cote? Casele de pariuri au angajați bookmakeri, persoane care calculează evenimentele sportive si pârtile participante si in funcție de poziție in clasament, forma, istoric oferă o anumita cota unui eveniment.
Unde putem paria? Sunt 2 tipuri de case de pariuri, case de pariuri offline si cele online. In Romania in ultimii ani s-a dezvoltat foarte mult aceasta industrie a pariurilor, găsind peste tot, cel puțin o casa de pariuri. Conform legislației din Romania pentru o casa de pariuri offline la pariere, se oprește un comision de administrare 5% din suma pariata, iar pentru câștigurile ce depășesc 600 de lei, suma ce depășește se impozitează cu 24%. Nu același lucru se întâmpla si pentru casele de pariuri online. Plasarea pariurilor la aceste case nu este taxata cu nici un comision de administrare. De asemenea nici câștigurile nu sunt impozitate, singurele comisioane ce pot fi întâlnite sunt cele la depunere si la retragerea banilor din cont.
Aplicația mea este pentru o casa de pariuri offline, unde pariorul are toate meciurile, rezultatele, cotele, clasamentele la un click distanta, totul intr-un site foarte ușor si simplu de utilizat
Am ales aceasta aplicație prin simplul fapt ca sunt un parior înrăit, si pentru a scăpa de cozile interminabile de la o casa offline m-am gândit sa creez un site in care pariorul sa aibă la dispoziție toate la un singur click distanta
Aplicația se adresează pentru cele 2 tipuri de oameni pariori:
Pariorul, unde poate sa își creeze bilet, sa vadă rezultate
Bookmakerul, cel care creează cote pentru evenimentele sportive
Tehnologii folosite
Java
Cine este Java?
Java a fost lansata de către compania Sun Microsystems in anul 1995 si este un limbaj de programare foarte complex si utilizat. Exista o mulțime de aplicații si site-uri care nu rulează daca nu ai Java instalat si încă se mai crează pe zi ce trece. Este rapid si sigur. De la laptopuri la servere, de la console de jocuri la calculatoare, de la super calculatoarele științifice pana la telefoanele mobile, Java este peste tot.
De ce Java?
Java se remarca prin câteva caracteristici care l-au făcut unul din cel mai folosit limbaj de programare in crearea oricărui tip de aplicație indiferent de domeniu sau complexitatea lui. Acestea sunt:
Simplitate – se elimina moștenirea multipla, supraîncărcarea operatorilor si toate „uneltele” fapt ce ducea la crearea un cod confuz
Ușurința in dezvoltarea aplicațiilor complexe ce au la baza lucrul cu rețelele, fire de execuție, interfața grafica, bazele de date etc.
Robustețe – elimina cele mai frecvente surse de erori care apar in programare prin renunțare la pointeri, administrarea automata a memoriei si eliminarea pierderilor de memorie printr-o funcție de colectare a obiectelor care numai au referința, ce rulează in spate si se numește „garbage collector”
Numai orientat pe obiecte – se elimina definitiv si complet stilul de programare procedural
Securitate – este un limbaj foarte sigur ce oferă mecanisme stricte de securitate a programelor prin: versionarea codului pentru a depista secvențele periculoase, reguli stricte pentru rularea proceselor la distanta, etc.
Portabilitate – Java este independent de platforma care rulează, aceeași aplicație putând fi rulata fără modificare si fără recompilarea ei pe sisteme diferite cum ar fi Windows, Linux, MacOs ceea ce este pe placul firmelor ce oferă soft pe toate platformele
Este modelat după C si C++, ceea ce înseamnă ca se poate trece ușor la Java daca ai cunoștințe in aceste 2 limbaje
Toate intr-un limbaj de programare complet gratuit si disponibil pentru descărcare pe adresa : https://www.java.com/en/download/.
Combinarea interpretării si compilării
In funcție de execuția aplicațiilor, limbajele de programare se împart in 2 categorii:
Interpretate – programul este citit linie cu line de interpretor si traduse in instrucțiuni mașina.
Avantaj: portabilitatea, deoarece se interpretează direct sursa programului
Dezavantaj: viteza de execuție redusa
Cel mai cunoscut limbaj de programare interpretat este Basic
Compilate – codul sursa al programului este rescris de compilator intr-un cod ce este executat direct de către procesor, numit cod mașina
Avantaj: execuția se face extrem de rapid
Dezavantaj: lipsa portabilității, codul ce a fost compilat poate fi executat doar pe platforma de lucru care a fost compilat
In schimb programele scrise in Java, sunt compilate si interpretate. Java pune la dispoziție un compilator care transforma codul scris în cod de octeți si un interpretor care executa codul de octeți.
Codurile de octeți sunt instrucțiuni care sunt asemănătoare cu codul scris in limbajul de asamblare si sunt generate de compilator independent de mediul de lucru ceea ce îl face superior codului mașina ce poate fi executat doar de procesorul platformei in care a fost compilat. Codul de octeți poate fi rulat pe orice platforma in care este instalata mediul de execuție Java
Realizarea primului program
Pentru a crea o aplicație in Java, trebuie efectuați următorii pași:
Scrierea codului sursa
public class PrimulProgram {
public static void main(String[] args) {
System.out.println("Primul Program!!");
}
}
Aplicațiile Java conțin o clasa principala în care trebuie se existe o metoda de rulare numita „main”. Clasele aplicație se pot afla intr-un unul sau mai multe fișiere
Salvarea fișierelor sursa
Toate fișierele Java trebuie obligatoriu sa aibă extensia „Java”, orice alta extensie nefiind acceptata. Este recomandat ca fișierul care conține codul sursa sa aibă același nume ca cel al clasei, dar nu este obligatoriu. Presupunem ca am salvat programul in directorul: C:\java\PrimulProgram.java
Compilarea aplicației
Pentru a compila aplicația se folosește compilatorul javac. Pentru compilare se poate scrie direct in linia de comanda: „javac <<Numele Clasei.java>>. Majoritatea programatorilor folosesc IDE-urile. IDE este un mediu de dezvoltare ce vine cu unelte folositoare in scrierea codului sursa. Compilatorul creează cate un fișier separat pentru fiecare clasa a programului. Acestea au extensia: „.class” si sunt plasate in același director cu fișierele sursa sau in directoare speciale create de IDE-uri. Pentru programul de mai sus vom folosi comanda: „ javac PrimulProgram.java”
In cazul in care compilarea s-a realizat cu succes, compilatorul va genera fișierul PrimulProgram.class
Personal eu folosesc Netbeans, un IDE gratis si foarte util si este disponibil pentru descărcare la adresa: https://netbeans.org/downloads/
Rularea aplicației
Pentru rularea aplicației se folosește interpretorul Java, care trebuie apelat pentru clasa principala a programului. Interpretorul are ca argument numele clasei principale si nu numele fișierului. Pentru apelare din linia de comanda se poziționează in directorul fișierului si apelează comanda: „Java PrimulProgram”. Rularea acestei aplicații se face intr-o fereastra de sistem (Figura 3.1)
Figura 1.1
Prin intermediul IDE-ului rularea aplicației făcându-se mult mai simplu, prin apăsarea unui singur buton (Figura 1.2) si rezultatul intr-o consola (Figura 1.3)
Figura 1.2
Figura 1.3
Sintaxa de baza a limbajului Java
Când facem referire la un o aplicație Java, el poate fi definit ca o colecție de obiecte care comunica intre ele prin invocarea metodelor. Dar ce înseamnă aceste obiecte, metode, clase si variabile:
Obiectul – obiectele au proprietati si comportamente. De exemplu: Un câine are ca proprietati: nume, culoare, rasa si de asemenea comportamente precum: alergatul, lătratul, muscatul. Un obiect este o instanța a unei clase.
Clasa – clasa poate fi definita ca un șablon care descrie proprietățile si comportamentele pe care un obiect le poate avea
Metodele – o metoda este in principiu un comportament. O clasa poate conține mai multe metode. Ce este in metoda unde logica este scrisa, datele sunt manipulate si toate acțiunile sunt executate
Instanțe ale variabilelor – Fiecare obiect are un set de instanțe ale variabilelor. Proprietățile unui obiect sunt create de valori asignate acestor instanțe ale variabilelor
Pentru a scrie un program Java, trebuie sa ținem minte următoarele reguli
Numele claselor trebuie sa înceapă cu litera mare, daca este format din mai multe cuvinte atunci fiecare cuvânt in parte trebuie scris cu litera mare
Exemple de nume de clase: Program, PrimulMeuProgram
Numele metodelor trebuie sa înceapă cu litera mica, iar daca este format din mai multe cuvinte, atunci fiecare cuvânt trebuie sa înceapă cu litere mari
Exemple de metode: metoda(), metodaMea(), getPretTotal().
Cuvinte cheie
Cuvintele cheie intr-un limbaj de programare sunt acele cuvinte rezervate care au o semnificație predefinita in program si nu pot fi folosite in alte scopuri in scriere programului : nume de metode, nume de clase, variabile etc.
Cuvintele cheie in Java sunt, cu câteva excepții, la fel ca in limbajul C++ si sunt enumerate in următorul tabel (Tabel 1.1)
Tabel 1.1
Cuvintele marcate prin * sunt rezervate dar nu sunt folosite
Identificatori
Toate componentele Java trebuie obligatoriu denumite. Denumirile folosite pentru clase, variabile si metode sunt numite identificatori. In Java, sunt câteva puncte pe care trebuie sa le ținem minte pentru identificatori:
Toți identificatorii trebuie sa înceapă cu: o litera(A la Z sau a la z), caracter pentru moneda($) sau underline( _ ).
După primul caracter, identificatori pot avea orice combinație de caractere
Un cuvânt cheie nu poate fi folosit ca identificator
Exemplu de identificatori valabili: culoarea, $salariu, _varsta
Exemplu de identificatori nevalabili: 123abc, -salariu
Modificatori de acces
Modificatorii de acces reprezintă modalitați prin care un programator poate controla accesul la metodele si atributele dintr-o clasa. Unul din motivele pentru care se utilizează acești identificatori este conceptul numit încapsulare. Cele 4 nivele de acces sunt:
Implicit – este vizibil in toate clasele din pachet. Nu necesita nici un modificator de acces. Exemplu:
boolean isCumparat(){
return this.cumparat;
}
Privat – este vizibil doar in interiorul clasei. Modificatorul de acces pentru acest tip este „private”. Exemplu:
private boolean isCumparat(){
return this.cumparat;
}
Public – este vizibil pentru toata lumea. Modificatorul de acces pentru acest tip este „public”. e componentele Java trebuie obligatoriu denumite. Denumirile folosite pentru clase, variabile si metode sunt numite identificatori. In Java, sunt câteva puncte pe care trebuie sa le ținem minte pentru identificatori:
Toți identificatorii trebuie sa înceapă cu: o litera(A la Z sau a la z), caracter pentru moneda($) sau underline( _ ).
După primul caracter, identificatori pot avea orice combinație de caractere
Un cuvânt cheie nu poate fi folosit ca identificator
Exemplu de identificatori valabili: culoarea, $salariu, _varsta
Exemplu de identificatori nevalabili: 123abc, -salariu
Modificatori de acces
Modificatorii de acces reprezintă modalitați prin care un programator poate controla accesul la metodele si atributele dintr-o clasa. Unul din motivele pentru care se utilizează acești identificatori este conceptul numit încapsulare. Cele 4 nivele de acces sunt:
Implicit – este vizibil in toate clasele din pachet. Nu necesita nici un modificator de acces. Exemplu:
boolean isCumparat(){
return this.cumparat;
}
Privat – este vizibil doar in interiorul clasei. Modificatorul de acces pentru acest tip este „private”. Exemplu:
private boolean isCumparat(){
return this.cumparat;
}
Public – este vizibil pentru toata lumea. Modificatorul de acces pentru acest tip este „public”. Exemplu:
public boolean isCumparat(){
return this.cumparat;
}
Protejat – este vizibil doar pentru clasele din pachet si in subclase. Modificatorul de acces pentru acest tip este „protected”. Exemplu:
protected boolean isCumparat(){
return this.cumparat;
}
Operatori
Operatorii din limbajul Java sunt cu mici deosebiri la fel ca cei din C++. Cei mai importanți operatori sunt:
Atribuirea: „=”; Exemplu: boolean x=true; int i=154;
Operatori matematici: „ + ”, „ – ”, „ * ”, „ / ”, „ % ”, „++”, „–”.
Este permisa notația prescurtata. Exemplu:
x=x+2 echivalent cu x+=2;
Exista operatori pentru autoincrementare si autodecrementare(post si pre). Exemplu:
x++, y–, ++n, –n,
Operatori logici: „ && ”(and), „ | | ”(or), „ ! ”(not)
Operatori relaționali: „ < ”, „ <= ”, „ > ”, „<= ”, „ == ”,
„ != ”
Operatori de translație: „ << ”, „ >> ”, „ >>> ”(shiftare la dreapta fără semn)
Operatorul if-else(if inline): expresie-logica? Valoare-true: valoare-false;
Operatorul „ , ” folosit pentru evaluarea secvențiala a operațiilor. Exemplu:
int x=0, y=2, z=3;
Operatorul „ + ” pentru concatenarea șirurilor Exemplu:
String s=”Ana” + ”are 2 ”+”mere”;
*Pentru optimizare la concatenarea șirurilor este recomandat sa se folosească clasa StringBuilder
Operatorul pentru conversii (cast) tip_de_data. Exemplu:
int i=30;
long l=(long) i;
Comentarii
In Java exista trei tipuri de comentarii
Comentarii pe mai multe linii, cuprinse intre „ /* ” si „*\ ”
Comentarii pe mai multe linii ,care sunt transformate in documentație de către generatorul automat de documentație javadoc, sunt cuprinse intre „ /** ” si „ *\ ”
Comentarii pe o singura linie, care încep cu „ // ”
Variabile si tipuri de date
Variabile
Variabilele sunt de 2 tipuri: primitive si referința la obiecte. Pentru a fi folosite variabilele trebuie declarate si inițializate sau instanțiate.
Pentru declararea variabilelor se folosește următoarea sintaxa:
tip numeVariabila; Exemplu int i;
Putem deasemenea sa declaram mai multe variabile de același tip intr-o singura instrucțiune:
tip numeVariabila1, numeVariabila2; Exemplu int i, j, k;
Pentru inițializarea se folosește sintaxa:
tip numeVariabila=valoare; Exemplu int i=0
Instanțierea unei variabile se face prin apelarea constructorului:
tip numeVariabila =new tip(); Exemplu Echipa e= new Echipa();
Exista o convenție in privința numelor variabilelor dintr-un program Java, acestea trebuie scrise „CamelCase” adică prima litera trebuie sa fie neapărat litera mica. Daca numele este format mai multe cuvinte prima litera din numele variabilei se scrie cu litera mica iar la fiecare cuvânt prima litera este cu litera mare. Exemple de nume de variabila:
Echipa echipa ; String numeEchipa; int celMaiMareDivizorComun;
Mai exista si variabilele de tip final care nu pot fi modificate in timpul programului si trebuie inițializate la declarare. Prin convenție numele variabilelor finale se scrie cu majuscule si daca sunt mai multe cuvinte se folosește underline. Pentru a declara o variabila de tip final se folosește cuvântul cheie „final”:
final tip variabila=valoare; Exemplu final int MAXIM=10; final String NUME_ECHIPA = ”FC STEAUA”
In funcție de locul in care sunt declarate variabilele se împart in mai multe categorii:
Variabile membre sau proprietati, care se declara in interiorul unei clase, vizibile pentru toate metodele clasei respective cat si pentru alte clase in funcție de modificatorul de acces
Parametrii metodelor; care sunt vizibili doar in interiorul metodelor
Variabile locale care sunt declarate in interiorul unei metode, si sunt vizibile doar in metoda respectiva
Variabile locale care sunt declarate intr-un bloc de instrucțiuni si sunt vizibile doar in blocul respectiv
Parametrii de la tratarea excepțiilor
Exemplu care îmbracă toate variabilele enumerate mai sus
class Program{
int a; //variabila membru
public void metoda(int b){//b este variabila parametru
int c=0;//variabila locala in metoda
try{
int d=10;//variabila locala in bloc de intructiuni
// vizibil in blocul try
a=d/c;
}catch(ArithmeticException e){//variabila parametru exceptiie
System.out.println(e.getMessage());
}
}
}
Tipuri de date
Cum am specificat la variabile exista 2 tipuri de date: tipul de data primitiv si tipul de date referința. In Java ideea de baza este că „orice este un obiect”, așadar fiecare tip de date ar trebui sa fie definit de o clasa si ar trebuie sa fie instanțe ale acesteia. Însă exista si tipuri de date primitive care fac lucrul mai ușor in programe de tip main. Acestea sunt:
Aritmetice
Întregi : byte(1 octet), short(2), int(4), long(8)
Reale: float(4), double(8)
Caracter: char(2 octeți)
Logic : boolean(true și false)
Orice tip de dată primitiv are o clasă, un obiect care îmbracă acel tip de dată și poate fi folosit ca obiect. Exemplu: int Integer, boolean Boolean, long Long
Trecerea de la o dată primitivă la o dată de tip obiect se face folosind proprietățile ale obiectului respective evitând astfel auto-boxingul. Exemplu:
Integer i= Integer.valueOf(3);
int m=i.intValue();
Integer b=Integer.valueOf(m);
În alte limbaje de programare formatul și dimensiunea tipurilor primitive pot depinde de platforma pe care rulează. La Java în spre exemplu acest lucru numai este valabil, Java fiind independent de platforma de lucru
Vectorii , clasele și interfețele sunt tipuri referința. Valoarea unei variabile de acest tip este o adresă de memorie către valoarea sau mulțimea de valori reprezentate de variabila respectivă.
Instrucțiuni ale limbajului
Instrucțiunile Java sunt foarte asemănătoare ale limbajului C și se împart în următoarele categorii:
Instrucțiuni de decizie: if-else, switch – case
Instrucțiuni repetitive: for, while, do-while
Instrucțiuni pentru tratarea excepțiilor: try-catch-finally, throw
Alte instrucțiuni: break, continue, return, label
Instrucțiuni de decizie
Instrucțiunea If – else
if(expresie logica){
//instrucțiuni
}
if(expresie logica){
//instrucțiuni
}else {
//alte instrucțiuni
}
Instrucțiunea Switch – case
switch(variabilă){
case valoare1://instrucțiuni
break;
case valoare2://instrucțiuni
break;
default: //instrucțiuni
}
Variabilele care pot fi testate folosind instrucțiunea switch trebuie sa fie de tip primitiv.
Instrucțiuni repetitive
Instrucțiunile repetitive se executa atâta timp cat se îndeplinește o condiție, pana se îndeplinește o condiție, sau cu un număr fix de pași
Instrucțiunea for(instrucțiune cu număr fix de pași):
for(inițializare; expresie-logica; pas-iterație){
//instrucțiuni
}
Instrucțiunea while(instrucțiune ce se execută cat timp este adevărata o condiție)
while(condiție){
//instrucțiuni
}
Instrucțiunea do-while(instrucțiune ce se executa pana când se îndeplinește o condiție)
do{
//instrucțiuni
}
while(condiție)
Instrucțiuni pentru tratarea excepțiilor
Se folosesc aceste instrucțiuni când se lucrează cu clase care pot genera anumite excepții și trebuiesc tratate corespunzător
try{
//instrucțiuni ce pot genera o excepție
}catch(Exception e){
//tratăm excepția
}finally{
//instrucțiuni ce se executa indiferent daca se generează excepții sau nu
//exemple: închiderea unor resurse
Alte instrucțiuni
break – părăsește forțat corpul unei instrucțiuni repetitive
continue – părăsește ciclul curent și trece la următorul ciclu
return [valoare] – termina o metoda și returnează o valoare
label – definește o etichetă
Deși în Java nu există funcția goto label, se pot definii etichete(label) prin care se poate controla punctul de ieșire dintr-o instrucțiune repetitivă. Etichetele se declară: numeEtichetă: și pentru a folosi o etichetă se folosesc instrucțiunile break și continue. Exemplu:
eticheta:
break eticheta;
continue eticheta,
Obiecte și clase
Ciclul de viață al unui obiect
Crearea obiectelor
Ca în orice limbaj de programare, și în Java crearea obiectelor se realizează prin instanțierea unei clase și trebuie executate următorii pași:
Declararea: Presupune specificarea tipului de obiect care vrem sa fie tipul variabilei pe care vrem să o declarăm. Exemplu
NumeClasa numeObiect;
Echipa echipa;
Instanțierea: Pentru a instanția( crearea efectiva a obiectului prin alocarea spațiului de memorie corespunzător) se face cu ajutorul operatorului new. Exemplu:
numeObiect= new NumeClasa();
echipa = new Echipa();
Inițializarea: Se realizează prin intermediul constructorului clasei respective sau setându-i fiecărei proprietăți în parte după instanțierea obiectului
Prin constructorul unui clasei se înțelege o metoda care se apelează la instanțierea unui obiect al clasei respective. În constructor putem inițializa anumite proprietăți ale obiectului. Exemplu de clasa cu constructor
public class Echipa{
String numeEchipa;
public Echipa(){
}
public Echipa(String numeEchipa){
this.numeEchipa= numeEchipa;
}
}
Exemple de apelarea a acestei clase:
Echipa e = new Echipa();
System.out.println(e.numeEchipa);//va afisa la consola stringul
//vid
Echipa e1=new Echipa(”Fc Steaua”);
System.out.println(e1.numeEchipa);//va afisa la consola
//stringul Fc Steaua
Spațiul de memorie nu este prealocat la declararea unui obiect. Alocarea de memorie se face doar la instanțiere. Exemplu:
Echipa e;
Echipa e1=new Echipa();
System.out.println(e.numeEchipa);//va genera excepție
//NullPointerException
System.out.println(e1.numeEchipa);//va afisa numele echipei
Folosirea obiectelor
După ce obiectul a fost creat , el poate fi utilizat în mai multe acțiuni: aflarea unor proprietăți despre obiect, setarea proprietăților sau executarea unor acțiuni. Aceste lucruri se realizează prin aflarea sau schimbarea variabilelor ce reprezintă proprietăți a obiectului
Pentru a face referire a unei proprietăți a unui obiect se face prin apelul obiect.proprietate sau prin apelare de metodă ce va reprezenta afișarea proprietății.
Accesul la proprietăți depinde de drepturile de acces prin care se oferă la proprietățile clasei.
Pentru clasele care au variabile declarate „private” se generează metode de acces pentru proprietățile acelea(getteri și setteri). Exemplu:
public class Echipa{
private String numeEchipa;
public Echipa(){
}
public Echipa(String numeEchipa){
this.numeEchipa= numeEchipa;
}
public getNumeEchipa(){
return this.numeEchipa;
}
public setNumeEchipa(String numeEchipa){
this.numeEchipa= numeEchipa;
}
}
Pentru a avea acces la proprietatea echipa se folosesc metodele create. Exemplu:
Echipa e=new Echipa(”FC STEAUA”);
System.out.println(e.getNumeEchipa());//va afisa FC STEAUA
e.setNumeEchipa(”R. Madrid”);
System.out.println(e.getNumeEchipa());//va afisa R. Madrid
Aceste metode se numesc metode de accesare și prin convenție se denumesc astfel: getNumeVariabila, setNumeVariabila. Programarea orientata pe obiecte încurajează folosirea acestor metode și declararea proprietăților „private” deoarece prin accesul direct, obiectul poate fi adus în stări inconsistente.
Distrugerea Obiectelor
În multe limbaje de programare programatorul trebuie sa țină evidența obiectelor create și să le distrugă în mod explicit când nu mai are nevoie de ele,fiind una din principalele practici ce duce la o funcționare defectuoasa a programelor .
În Java programatorul nu mai are aceasta responsabilitate deoarece simultan cu interpretorul Java rulează și un proces care se ocupa cu distrugerea obiectelor care nu mai sunt folosite. Acest proces se numește „garbage collector” în traducere colector de gunoi și se prescurtează „gc”.
Un obiect este eliminat din memorie atunci când numai exista nici o referinta la acesta. Referințele(variabilele) sunt distruse în 2 moduri:
Natural – atunci când variabila iese din domeniul ei de vizibilitate, exemplu la ieșirea din metoda în care a fost declarata
Explicit – atunci când setam variabila null ;
Garbage collector-ul este un proces de prioritate scăzută care se apelează periodic și scaneaza dinamic memoria ocupata de programul Java și marchează toate obiectele care au referință. După parcurgerea tuturor obiectelor, cele nemarcate sunt eliminate automat din memorie
Înainte ca obiectul sa fie eliminat, gc-ul apelează metoda de finalizare a acelui obiect. O metoda de finalizare pentru un obiect trebuie precedata de cuvântul cheie „finalize”
Crearea claselor
Declararea claselor
Clasele reprezintă o modalitate de a introduce noi tipuri de date intr-o aplicație Java. Mai exista o alta modalitate de a introduce tipuri de date, prin intermediul interfetei. Declararea unei clase trebuie sa respecte următorul format general:
[public] [abstract] [final] class NumeClasa
[extends NumeSuperClasa]//pentru mostenire
[implements Interfata1[,Interfata2]//implementare interfața(e)
{
// Corpul Clasei
}
Prima parte o ocupa modificatorii clasei. Aceștia sunt :
public – clasa declarata astfel poate fi folosita din orice alta clasa indiferent de pachetul care se găsește
abstract – o clasa abstracta nu poate fi instanțiată, ea având scopul de a crea un model comun pentru o serie de subclase
final – o clasa declarat astfel, nu poate avea subclase.
Extinderea claselor
Spre deosebire de alte limbaje orientate pe obiecte, Java permite doar moștenirea simpla, ceea ce înseamnă ca o clasă poate avea un singur părinte(superclasa) . O clasa poate mai multe subclase, ceea ce putem vedea toate clasele Java ca un arbore care are părintele clasa Object. Clasa Object este singura clasa care nu are părinte și este cea mai importanta clasa din Java. Extinderea unei clase se realizează folosind cuvântul cheie „extends”. Exemplu:
class B extends A{
//corpul clasei
}
//A este superclasa clasei B
//B este o subclasa a clasei A
O subclasa moștenește toate variabilele și metodele care nu sunt private de la părintele său
Implementarea unei interfețe
O interfața este o clasa Java în care se declara metode fără a fi implementate. Toate metodele dintr-o interfața trebuie sa fie publice. Toate metodele dintr-o interfața, exceptând cele abstracte, trebuie sa fie implementate în clasa care implementează interfața
Definirea unei interfețe se face prin cuvântul cheie interface:
[public] interface NumeInterfata
[extends SuperInterfata1,SuperInterfata2..]
{
//Corpul interfetei
}
Corpul interfeței poate contine:
Constante – toate constantele unei interfețe trebuie inițializate și sunt declarate publice, orice alta declarare va genera eroare la compilare.
Metode fără implementare – acestea trebuie declarate cu modificatorul „public” orice alt modificator nefiind permis
Implementarea unei interfețe se face prin cuvântul cheie „implements”, și o data implementata o clasa trebuie sa implementeze cod pentru toate metodele interfeței. Clasa care implementează poate sa aibă și alte metode care nu aparțin interfeței. Exemplu:
public interface InterfataMea{
public void metoda1();
}
public ClasaMea implements InterfataMea{
public void metoda1(){
//este obligatoriu declararea acestei metode
}
}
Corpul unei clase
Corpul unei clase urmează imediat după declararea clasei și este cuprins intre acolade. Conținutul acestuia este format din:
Declararea și eventual inițializarea variabilelor de instanța și de clasa cunoscute și ca variabile membre
Declararea și implementarea constructorilor
Declararea și implementarea metodelor de instanța și de clasa
Declararea unor clase imbricate(interne)
this și super
Sunt variabile predefinite care fac referința, în cadrul unui obiect, la obiectul propriu-zis (this) sau la instanța părintelui(super). Sunt folosite pentru a rezolva eventualele conflicte de nu prin referirea explicita a variabilelor sau a metodelor membre. Utilizate sub forma de metode au rolul de a apela constructorii corespunzători ca argumente ai clasei sau ai superclasei
class A{
int x;
A(){
this(0);
}
A(int x){
this.x=x;
}
void metoda(){
x++;
}
}
Class B{
B(){
this(0);
}
B(int x){
super(x);//apelează constructorul din superclasa
}
void metoda(){
super.metoda();//apelează metoada din superclasa
}
}
De ce am ales Java?
Am ales Java din prisma faptului ca a fost primul limbaj de programare învățat de mine în facultate. Java vine cu o mulțime de clase ajutătoare ușurându-mi astfel munca cu bazele de date și comunicarea web
Servlet
Ce este un servlet?
Servletul este o clasa a limbajului de programare Java folosit pentru a extinde capabilitățile serverilor care găzduiesc aplicații prin modelul de programare cerere-răspuns. Servletul este capabil sa răspundă oricărui tip de cerere, însă sunt cel mai frecvent folosiți în aplicațiile de tip Web. Pentru acest tip de aplicații, Servleții Java definesc o tehnologie HTTP specifice claselor de servlet
Pachete javax.servlet și javax.servlet.http sunt cele care furnizează interfețe și clase pentru a scrie servleți. Toti servletii trebuie sa implementeze interfața Servlet care definește metode ale ciclului de viața. Clasa HttpServlet furnizează metode precum doGet și doPost pentru a manevra seviciile HTTP specifice
Ciclul de viața a unui servlet
Ciclul de viața al servletului este controlat de container în care servletul a fost lansat. Când o cerere este adresata unui servlet. Container-ul face următorii pași:
Daca nu exista o instanța a servletului, container-ul web
Încarcă clasa servletului
Creează o instanța a servletului
Inițializează o instanța a servletului apelând metoda init
Apelează metoda service în care manevrează parametrii cererii și ai răspunsului
Daca este nevoie de eliminarea servletului, container-ul finalizeaza servletul prin apelarea metodei destroy.
Putem monitoriza și reacționa la evenimente în ciclul de viața al servletului, prin definirea de obiecte ascultător ale căror metode sunt invocate când evenimente ale ciclului de viața apar. Pentru a face astea trebuie definita și specificata o clasa ascultător.
Pentru a defini o clasa ascultător trebuie ca aceasta clasa sa implementeze o interfața de ascultător. Tabelul 1.2 conține evenimentele care pot fi monitorizate și interfața corespunzătoare care trebuie implementata. Când un o metoda a unui ascultător este invocata, este incărcat un eveniment ce conține informații utile. De exemplu metodele din interfața HttpSessionListener sunt incărcate intr-un HttpSessionEvent care conține sesiunea HttpSession
Tabel 1.2
Utilizare
Componentele web, la fel ca majoritatea obiectelor, de obicei lucrează cu alte obiecte pentru a-și îndeplini treaba. Componentele web folosesc Ș
Obiecte ajutătoare (JavaBean-uri)
Folosesc baze de date
Apelează alte resurse web
Pentru a crea o clasa de tip servlet, trebuie definita ca componenta în aplicatia web. Sunt 2 tipuri prin care se poate defini un servlet:
Prin adnotatii – folosind @WebServlet(”path-ul”)
Prin maparea lui în fișierul web.xml. Exemplu:
Declararea servletului;
<servlet>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>servlet.LogoutServlet</servlet-class>
</servlet>
Maparea servletului la o adresa web
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/LogoutServlet</url-pattern>
</servlet-mapping>
Modul de lucru cu servleti: Se evaluează parametrii de pe cerere, în caz ca exista iar apoi se obține outputStream-ul pentru răspuns, se completează headerul cu informații corespunzătoare iar apoi se setează pe outputStream răspunsul dorit. Se poate folosi un PrintWriter pentru a trimite date.
Comunicarea intre client server este fără stare, ceea ce înseamnă ca pentru a stoca informații, obiecte, se foloseseste o sesiune(HttpSession) . Mai exact se setează ca atribut orice obiect serializabil pe aceasta sesiune și se poate folosi oricând
De ce am ales Servleti?
Am ales servlet pentru a invalida sesiunea in care se afla administratorul casei de pariuri, extrăgând din cerere sesiunea și daca exista sesiune o invalidez folosind metoda invalidate(). După ce am invalidat sesiunea, creez una noua în care nu va exista atributul user, fapt ce determina ca exista administrator autentificat.
Mai folosesc servletul pentru a reda informațiile dintr-un fișier pdf intr-o pagina web la dispoziția utilizatorului
Filtre
Ce este un filtru?
Filtrul este tot o clasa Java care are rolul, după cum ii zice și numele, de a filtra cererea și răspunsul. Prin filtru putem modela headerele și continutul. Nu este recomandat ca printr-un filtru sa se creeze cereri și raspunsuri web.
Funcțiile unui filtru
Principalele funcții prin care un filtru poate sa le execute sunt:
Verifica cererea și executa metode dorite
Poate bloca cererea și răspunsul de a ajunge la o pagina nedorita
Sa interacționeze cu alte resurse externe
Sa modifice headerele și conținutul pentru cerere și răspuns
Pentru o aplicație putem configura unu sau mai multe filtre intr-o ordine pe care o dorim. Filtrele sunt instanțiate și încărcate de către container-ul web.
Utilizare
Pentru utilizare, se creează clasa Filter pentru care avem noi nevoie și apoi pentru a putea fi funcțională, aceasta va trebui mapată pentru paginile la care dorim să aplicăm filtrul creat. Acesta se declara în fișierul web.xml unde sunt declarati și servleti de altfel. Exemplu de mapare:
<!– declararea filtrului –>
<filter>
<filter-name>SecurityFilter</filter-name>
<filter-class>servlet.SecurityFilter</filter-class>
</filter>
<!–maparea filtrului–>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
/* – înseamnă că se mapează pe toate requesturile
De ce am ales Filtru
Aplicatia este imparțita în 2 parti: partea de admin, și partea de utilizator public. Pentru a restrictiona utilizatorul public să aibă acces la partea de admin fără sa se autentifice, am creat un filtru prin care verific daca requestul se duce către o pagina de admin, daca se intampla asta verific daca pe sesiune se afla un obiect utilizator care se pune doar atunci când un utilizator se autentifică.
JSF
Ce este JSF
JSF(Java Server Faces) este un framework bazat pe conceptul MVC (Model-View-Controller), pentru realizarea și dezvoltarea aplicațiilor web. JSF folosește conceptul de lucru cu componentele. Face parte din platforma Java EE(Enterprise Edition).
Este un API care vine în ajutorul programatorului cu componente pentru interfața și administrarea starii lor, tratarea evenimentelor, convertire și validarea datelor, internaționalizare.
Ciclul de viața JSF
JSF are un ciclu de viața bine definit și care se efectuează la fiecare cerere. Acesta începe când un client face o cerere HTTP pentru o pagina și se termina cu când partea de server răspunde cu pagina, translatată în HTML.
Ciclul de viața poate fi impartit în 2 faze principale: execuția și randarea. În aceasta faza de executie datele sunt convertite și validate apoi trimise către clasele ajutătoare si evenimentele sunt manevrate. O pagina JSF este reprezentata ca un arbore de componente numit „view”. La fiecare cerere arborele de componente este refacut în faza de randare.
Multe implementari ale JSF-ului sunt open-source și sunt disponibile pentru orice programator. Acestea sunt : ICEFaces, JBoss RichFaces, Apache MyFaces, PrimeFaces și altele.
PrimeFaces
API-ul PrimeFaces conține o varietate de componente JSF dezvoltate pentru o utilizare mai usoara a lor.
Pentru utilizarea lor este de ajuns doar un singur fișier jar care conține toate informațiile dorite. El poate fi obtinut descarcandu-l manual de pe site: http://www.primefaces.org/downloads.html sau folosind Maven, folosind codul:
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>versiune</version>
</dependency>
În aplicație am folosit versiunea 4 de primefaces.
Componente PrimeFaces
În continuare voi prezenta cateva din cele mai importante componente primefaces:
Componenta pentru tabel
<p:dataTable atribute>
<p:column >valoare</p:column>
</p:dataTable>
Este folosit pentru a randa un tabel cu diferite informații.
Figura 3.1
Adaugand diferite atribute, pentru acest tabel putem avea paginator, editare pe rand, sortare, filtrare și chiar selectie pe rand.
Componenta pentru butoane
<p:commandButton text=”textul de pe buton” action=”metoda de executie”/>
Este folosit pentru a efectua diferite operatii. La apasarea unui buton se executa o cerere.
Figura 3.5
Componenta pentru camp
<p:inputText value=”valoarea” />
Este folosit pentru a atribui o valoare unei proprietăți. Pe durata unui ciclu de viața se va apela setter-ul și getter-ul acele proprietăți din bean-ul Java
Figura 3.6
Componenta pentru grafic.
<p:pieChart model=”modelul care va conține valorile”/>
Este folosit pentru a afisa un grafic cu diferite valori.
Figura 3.7
Desigur sunt numeroase componente de care dispune PrimeFaces-ul, accesați http://www.primefaces.org/showcase/index.xhtml pentru a le vizualiza pe toate și pentru documentație
De ce am ales JSF?
Am ales JSF și PrimeFaces deoarece conține numeroase componente prietenoase și este foarte ușor de utilizat, având cunoștințe minime despre HTML/CS
Spring
Cine este Spring?
Framework-ul Spring este o platforma pentru dezvoltarea și rularea de aplicații care include suport pentru tranzacții, mesagerie, acces la distanta, servicii web, persistenta, lucrul cu bazele de date și multe altele. Anul de apariție este 2002.
Platforma Spring este foarte vastă și conține o multitudine de componente și funcționalități și va voi prezenta în continuare doar funcționalitățile folosite în aplicație.
Bean-urile Spring
Bean-urile Spring sunt clase Java care se ocupa cu funcționalitățile și logica din spatele unei aplicații. Bean-urile Spring se pot declara fie prin adnotatii, fie declarate intr-un fișier xml.
Scopurile Bean-urilor
Când declaram un bean, putem crea mai multe instanțe a unui singur bean declarat, în funcție de scopul lui. Frameworkul Spring suporta 6 scopuri dintre care 4 sunt valabile doar în aplicațiile web. Scopurile sunt:
Singleton – este scopul implicit, înseamnă ca se folosește o singura instanța
Prototype – o singura declararea a unui bean dar mai multe instanțe.
Request – este disponibil doar în aplicațiile web, și se creează de fiecare data cate o instanța la fiecare ciclu de viața a unei cereri HTTP.
Session – este disponibil doar în aplicațiile web, și se creează o instanța a bean-ului pe un întreg ciclu de viața a unei sesiuni web.
Global-Session – este disponibil doar în aplicațiile web, și se creeaza o instanța pe toata durata de viața a unei sesiuni HTTP globale.
Application – este disponibil doar în aplicațiile web și se crează o instanța pe un ciclu de viața al unui ServletContext.
Pentru a respecta modul de programare MVC este recomandat ca bean-urile care fac parte din Controller sa fie singleton iar cele care aparțin view-ului sa fie session.
Lucrul cu baza de date.
JdbcTemplate și NamedParameterJdbcTemplate
Pentru lucrul cu bazele de date, framework-ul Spring vine în ajutorul programatorului cu 2 clase ajutătoare: JdbcTemplate și NamedParameterJdbcTemplate. Avantajele folosirii acestor clase:
NU necesita închiderea resurselor.
Este ușor de folosit.
Conține o multitudine de metode pentru prelucrarea datelor din baza.
Este ușor de trimis parametrii către query.
Inițializarea se face foarte simplu, având nevoie doar de dataSource:
JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
if(jdbcTemplate==null){
this.jdbcTemplate=new JdbcTemplate(getDataSource());
}
return jdbcTemplate;
}
NamedParameterJdbcTemplate npjt;
public NamedParameterJdbcTemplate getNpjt() {
if(npjt ==null){
this.npjt =new NamedParameterJdbcTemplate(getDataSource());
}
return npjt;
}
Exemple de metode utile care se găsesc în aceste clase:
public Echipa getEchipa(int id) {
return (Echipa) getJdbcTemplate().query("select * from echipe where id_echipa=? ", new Object[]{id}, new RowMapper<Echipa>() {
@Override
public Echipa mapRow(ResultSet rs, int i) throws SQLException {
if (rs.next()) {
Echipa e = new Echipa();
e.setIdEchipa(rs.getInt(1));
e.setNumeEchipa(rs.getString(2));
return e;
}
Echipa echipa = new Echipa();
return echipa;
}
});
}
public int stergeEchipa(int id) {
return getJdbcTemplate().update("delete from echipe where id_echipa=?", id);
}
Pentru NamedParameterJdbcTemplate trimiterea de parametri în sql se face cu ajutorul unui Map, iar în sql se pune cheia cu „:” în fata. Exemplu:
public Echipa getEchipa(int id) {
Map<String,Object> param =new HashMap<>();
param.put(“id”,id);
return (Echipa) npjt.query("select id_echipa, nume from echipe where id_echipa=:id ",param, new RowMapper<Echipa>() {
@Override
public Echipa mapRow(ResultSet rs, int i) throws SQLException {
if (rs.next()) {
Echipa e = new Echipa();
e.setIdEchipa(rs.getInt(1));
e.setNumeEchipa(rs.getString(2));
return e;
}
return null;
}
});
}
Hibernate
Hibernate este un framework pentru limbajul Java utilizat pentru maparea obiectelor Java după tabelele bazelor de date, cat și a tipurilor de date din Java în tipuri de date SQL. Hibernate pune la dispozitie posibilitatea redactarii query-ului folosind un limbaj propriu numit HQL(Hibernate query language).
Maparea obiectelor se pot face în 2 feluri, prin adnotatii sau prin declararea intr-un fișier XML. Exemplu de mapare prin adnotatii:
@Entity
@Table(name = "ECHIPE")
public class Echipa implements Serializable {
@Id
@Column(name = "id_echipa")
int idEchipa;
@Column(name="nume_echipa")
String numeEchipa;
public Echipa() {
}
//gettere și settere
}
Pentru a folosi Hibernate și HQL trebuie configurat un SessionFactory pentru a crea tranzacționalitate în lucrul cu baza de date. Un obiect de tip SessionFactory este thread-safe și este folosit pentru a crea instanțe de sesiuni Hibernate. Sesiunile Hibernate nu sunt thread-safe și este recomandat ca la fiecare folosire sa se creeze o noua instanța. Exemplu de folosire Hibernate:
public Utilizatori getUtilizator(String username) {
Session session = getSessionFactory().openSession();
Query query = session.createQuery(" from Utilizatori as u where u.username=:username ");
query.setParameter("username", username);
return (Utilizatori) query.uniqueResult();
}
Observam ca sintaxa de HQL este foarte asemănătoare cu cea de SQL, diferența fiind ca se aplica asupra obiectelor mapate.
De ce am ales Spring?
Am ales acest framework pentru a lega partea de controller de parte de view, și pentru a manevra mult mai ușor datele din baza folosind uneltele din framework
JasperReports
Ce este Jasper Reports?
JasperReports este cel mai popular framework open-source de creare a rapoartelor scris în totalitate în Java. Poate folosi orice fel de data de intrare, și poate produce documente ce pot fi vizualizate, printate sau exportate în diferite formate: HTML, PDF, Excel sau Word. Bazele acestui framework au fost puse de către un român în 2001 Theodor Danciu.
Utilizare
Pentru a crea un raport Jasper mult mai ușor, trebuie instalat un soft utilitar, spre exemplu am folosit IReports, care ajută la crearea raportului folosind tehnologia „drag and drop”. Practic după efectuarea design-ului raportului, acesta va fi stocat intr-un fișier JRXML specific pentru JasperReport, care trebuie compilat în fișier .jasper. Acesta este folosit pentru generarea raportului.
Pentru a genera raportul putem trimite ResultSet-ul către jasper sau doar parametrii și query-ul pentru raport sa fie pastrat în jasper.
De ce am ales JasperReports?
Am ales acest framework pentru a genera un bilet virtual care cu ajutorul unui servlet l-am transpus în browserul utilizatorului. Toate datele pentru crearea raportului meciurilor alese sunt luate din baza de date.
Dezvoltarea aplicației
De ce am ales aceasta aplicație?
Am ales să dezvolt această aplicație deoarece am cunoștințe în acest domeniu al pariurilor, este ca o pasiune pentru mine și m-am gândit sa o și pun în practică prin implementarea acestei aplicații.
Descrierea bazei de date
Pentru baza de date am ales să o implementez în platforma Oracle deoarece cunosc cel mai bine sintaxa. Baza de date este formata din 6 tabele, dintre care una este independentă față celelalte. Tabela de utilizatori, unde sunt stocați administratorii site-ului. Tabela cu rezultatele meciurilor conține informații despre rezultatele dintre echipele din România din ultimii 3 ani, tabela ce am populat-o folosind un crawler implementat de mine, cu informații de pe site-ul http://www.liga1.ro
Diagrama bazei de date este:
Descrierea tabelelor
Tabela Utilizatori – este tabela unde sunt stocați administratorii site-ului. Este formată din id_utilizator, username care trebuie sa fie unic și pe baza căruia se va autentifica pe site și parola
Tabela Echipe – este tabela unde sunt stocate toate echipele care participă la un eveniment. Este formată din id_echipa și nume_echipa.
Tabela Rezultate – este tabela unde sunt stocate toate rezultatele echipelor precum și sezonul când s-au întâlnit. Este formată din id_rezultat, echipa_1, echipa_2, scor_1, scor_2, sezon. Câmpurile echipa_1 și echipa_2 sunt chei străine care fac referire către tabela Echipe
Tabela Meciuri – este tabela unde sunt stocate meciurile care încă nu s-au disputat. Este formată din id_meci, echipa_1, echipa_2, sezon. Câmpurile echipa_1 și echipa_2 sunt chei străine care fac referire către tabela Echipe
Tabela Meciuri_Programate – este tabela unde sunt stocate toate meciurile care au o data de disputare programata precum și cotele la pariuri pentru evenimentul respectiv. Are ca atribute id_meci, data_disputare precum și toate cotele pentru meciul respectiv. Id_meci este cheie străina către tabela Meciuri
Tabela Bilete_Virtuale – este tabela unde sunt stocate selectia meciurilor pe care un utilizator public le-a ales de pe interfața. Pentru fiecare utilizator se va genera un sir de caractere random ce se va identifica.
Descrierea implementării în Java
Pentru implementare am ales modelul arhitectural MVC(Model-View-Controller) pentru a separa logica de business de componentele de pe interfața. Dacă oricând voi schimba partea de View a aplicației, voi putea folosi același model și aceeași logica de business.
Modelul este reprezentat de către baza de date unde sunt stocate toate informațiile necesare
View este reprezentat de către JSF, PrimeFaces și clasele Java care sunt folosite pentru funcții. Aceste clase se mai numesc și „Backing Bean” și numele acestor clase se termin intodeauna cu „BB”. Exemplu: AdminBB, EchipeBB etc…
Controllerul este reprezentat de partea de service. În aplicația implementată este reprezentata de interfața MeciuriService care are ca implementare clasa MeciuriServiceImpl și care conține o multitudine de metode de care se folosește partea de View.
Diagrama UML
UML este un limbaj standard pentru descrierea de specificații și modele pentru aplicații. Este folosit pentru reprezentarea complexității a programelor orientate pe obiecte prin structurarea claselor și a obiectelor.
Aceasta este diagrama de clase a aplicației:
Interfața grafică a aplicației
Utilizarea șabloanelor
Pentru a realiza interfața grafică a aplicației am folosit 2 șabloane: unul pentru partea de admin și unul pentru partea publică la care au acces toți utilizatorii.
Mai exact, un șablon reprezintă partea interfeței care este aceeasi oriunde ai naviga. Acestea pot fi antetul, subsolul meniul etc.
Figura 2.4
Figura 4.4 reprezintă șablonul pentru partea publică. În orice pagină o să navigăm, partea de sus și lateralele nu se vor schimba.
Utilizarea de șabloane se folosește pentru a nu duplica codul pe fiecare pagină și pur și simplu există o siguranța ca acele parți sunt la fel pe toate paginile pe care navigăm.
Schimbarea temei
Primefaces-ul pune la dispoziție o unealta prin care putem implementa site-ului schimbarea temei site-ului, o unealta care nu o găsești pe multe site-uri.
Când creezi interfața grafica a unui site, este greu să mulțumești toți utilizatorii deoarece fiecare are preferințele lui în privința culorilor site-ului. În aplicația prezentata, acest lucru este schimbat deoarece utilizatorul are posibilitatea să își schimbe tema site-ului după placul lui, doar selectând intr-o lista tema dorita. PrimeFaces-ul pune la dispoziție o mulțime de teme care pot fi incluse în aplicație doar printr-un singur fișier de tip „.jar”. Exemplu:
Figura 2.5
Figura 2.6
Figura 2.7
Figura 2.8
Figura 2.9
Utilizarea aplicației
Partea de administrare
Autentificare
Pentru a avea acces la aplicație un administrator trebuie să aibă un cont înregistrat în baza de date. Aplicația este livrata clientului cu un utilizator implicit cu username-ul „admin” și parola „admin”. Pentru a împiedica un utilizator public să intre în partea de administrare a aplicației, am creat un filtru care verifică daca este setat pe sesiune un obiect de tip Utilizator, lucru ce se întâmpla doar în momentul autentificării. Daca un utilizator va avea adresa de navigare către partea de administrare și nu este autentificat, el este redirecționat automat către partea de autentificare.
Figura 3.10
După autentificare, daca autentificarea este cu succes atunci administratorul este redirecționat către partea de gestionare a echipelor.
Gestionarea administratorilor
După prima autentificare în aplicație, este recomandat ca administratorul aplicației sa șteargă contul implicit pentru a împiedica eventualele autentificări ale utilizatorilor nedoriți.
Figura 3.11
În aceasta parte a aplicației, administratorul are posibilitatea de a șterge din baza de date un administrator. Pentru prevenirea ștergerilor accidentale sau nedorite, înainte de ștergere administratorului i se afișează un dialog de confirmare, iar după aceea se efectuează operația de ștergere din baza de date.
La apăsarea butonului „Sterge”, administratorul este șters definitiv din baza de date și nu se va mai putea autentifica în aplicație
La apăsarea butonului „Renunta” se revine la aplicație fără nici o modificare în baza de date.
Administratorul mai poate să adauge un nou cont de administrator, apăsând butonul „Adauga admin”. După apăsare, se va afișa o caseta de dialog conținând 2 câmpuri, pentru username și pentru parola administratorului
Username-ul trebuie sa fie unic, altfel nu se va putea introduce în baza de date. După completarea câmpurilor se va introduce în tabela „Utilizatori”, o noua înregistrare care va conține informațiile despre noul cont înregistrat.
Gestionarea echipelor
Administratorul are posibilitatea să modifice, adauge și să stearga echipele din baza de date.
La adaugarea unei noi echipe se urmează aceeasi pași ca la adaugarea unui nou cont de administrare
La ștergere unei echipe, se va putea efectua numai daca aceea echipa nu este implicata în nici un eveniment fie el în desfasurare sau terminat.
Modificarea numelui unei echipe se face foarte simplu apăsând un singur buton și apoi scriind numele echipei pe care dorim sa il utilizam în aplicație
La apăsarea butonului „Modifica” se va modifica în baza de date numele echipei selectate.
Programarea meciurilor
În această parte a aplicației administratorul poate programa și configura cotele pentru un eveniment selectat.
Aceasta operatie se realizează pe fiecare rand în parte, selectând randul din tabel dorit și apăsând butonul de editare. În acel moment toate campurile de pe randul respectiv se rescriu în câmpuri editabile
Înainte de editare:
După apăsarea butonul de editare:
La apăsarea butonului „ok” se actualizează rândul selectat în baza de date după datele modificate de către utilizator și se iese din starea de editare.
La apăsarea butonului „Renunță” se iese din starea de editare și se resetează toate câmpurile cu valorile din înainte de editare
Vizualizarea meciurilor programate
În aceasta pagina administratorul poate sa vizualizeze toate meciurile și să vadă daca un meci este programat și data la care se va disputa.
Administratorul are posibilitatea sa sorteze meciurile după echipa gazdă sau oaspete, sau după data disputării, apăsând pe capul coloanei dorite.
Partea publică a aplicației.
Accesul la această parte a aplicației se face doar accesând adresa site-ului, neavând nevoie de vreo autentificare în prealabil.
Pagina „acasă”
Este pagina unde utilizatorul este redirecționat la accesarea adresei web.
Ca orice organizație modernă, trebuie sa aibă o pagină de facebook, un utilizator poate sa aprecieze aceasta pagină de facebook de pe prima pagină a aplicației.
Meniul din stanga, mai exact cele cu oferte pe zile, este un meniu dinamic în care apar zilele care sunt meciuri programate. Daca intr-o zi peste ziua curenta nu este nici un meci atunci acea dată nu va apărea. La apăsarea oricărei date din meniu(Figura 3.11) utilizatorul va fi direcționat către pagina cu meciurile din ziua respectiva.
Meciurile din ofertă
După ce un utilizator alege ziua în care vrea sa vadă meciurile din oferta acesta va vizualiza un tabel cu detaliile despre meciurile din data respectivă.
La apăsarea unei date din meniu(Figura 3.11), se setează pe sesiune data respectiva iar în tabel sunt aduse din baza de date toate meciurile din data respectivă.
Dacă utilizatorul dorește sa vadă meciurile de „Astazi”, și astăzi nu se disputa nici un meci, va apărea un tabel fără date, cu un mesaj de atenționare.
Detaliere meci
După alegerea datei de disputare, și vizualizarea cotelor, un parior adevărat trebuie sa ia o decizie ce cota sa parieze. Pentru asta, pe fiecare meci, un utilizator are acces la statistici despre meciul respectiv, care sa il ajute sa ia o decizie pentru meciul respectiv. Pentru a vedea detalierea unui meci trebuie sa acceseze adresa formată de cele 2 echipe(Figura 3.13)
Figura 3.22
Utilizatorul va naviga astfel spre pagina de detaliere meci unde va putea vizualiza mai în detaliu cotele evenimentului dorit.
Figura 3.23
Statisticile despre meciul dorit sunt sub forma unor grafice de tip plăcintă și conțin informații despre:
Situația câștigătorului în întâlnirile directe
Statistica privind golurile marcate în meciurile directe
Crearea biletului virtual
În partea dreapta a ecranului, avem un tabel ce conține selecția meciurilor utilizatorului. În momentul în care utilizatorul și-a ales un meci, pentru a paria este nevoie doar de a accesa link-ul format de cota meciului respectiv iar acesta va fi automat adăugat în biletul virtual(Figura 3.17)
Figura 3.26
Pe un bilet se poate paria același meci de 2 ori, daca se apasă la același meci pe o altă cotă, cota din bilet va fi automat înlocuită. Se poate adăuga în biletul virtual și din pagina de detaliere meci, apăsând butonul cu cota dorită.
După ce alegem evenimentele dorite, pentru a genera biletul virtual, trebuie să stabilim suma pe care vrem să o pariem. Implicit este suma de 2 RON. Nu se poate paria o suma mai mică decât această sumă. Dacă se va tasta o sumă mai mică atunci butonul de generare bilet nu va mai fi randat și se va afișa un mesaj de atenționare.
După ce am ales evenimentele și am stabilit suma de pariere, apăsând pe butonul „Generare cod agentie” se va afișa un raport în format pdf (Figura 3.18), cu detalierea asupra meciurilor alese, castigul, și un cod generat random ce se poate utiliza sa pariezi meciurile la agentia respectiva.
Concluzie
Bibliografie
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Aplicatie Pentru Gestiunea Unei Case de Pariuri (ID: 161902)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
