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

Similar Posts

  • Proiectare Frana 400. Frana cu Doi Saboti

    CUPRINS CAPITOLUL 1 DISPOZITIVE DE FRÂNARE ȘI DE OPRIRE. …………………………………………… 1.1. Rol funcțional. Clasificare. …………………………………………………………………………………………….. 1.2. Frâne cu saboți. ………………………………………………………………………………………………………………….. 1.3. Construcția și funcționarea frânelor cu saboți. ……………………………………………………… 1.4. Ridicătoare de frână. ……………………………………………………………………………………………………….. 1.5. Schema generală de montaj a unei frâne cu doi saboți. …………………………………………………………………………………………………………………….. CAPITOLUL 2 TEHNOLOGIA DE FABRICAȚIE A PIESEI „ȘAIBĂ DE FRÂNA”….

  • Mecatronica

    CAPITOLUL I Introducere Mecatronica tehnologie compatibila cu societatea informationala Exemple de produse si sisteme mecatronice CAPITOLUL II 2.1 Mecatronica in tehnologia auto 2.2 Principalele module care intervin in automobilul modern. 2.2.1 Sistemele ABS (anti-lock brake system) 2.2.2 SBC ( Sensotronic brake control) 2.2.3 Sistemul SAGE(de asistare si gestionare a traiectoriei) 2.2.4. Sistemul ASR(antipatinaj) 2.2.5 Sistemul…

  • Reglarea Temperaturii Intr O Incinta Folosind Energia Solara

    CUPRINS: INTRODUCERE CAPITOLUL I 1.1.Surse de energie regenerabilă 1.2.Energii regenaribile(solară,geotermală,eoliană,etc) 1.2.1.Generalități privind energia 1.2.2.Condiții energetice actuale 1.2.3.Tipuri de energii regenerabile 1.3.Energia solară 1.3.1.Considerații privind radiația solară 1.3.2.Structura chimică 1.3.3.Structura de benzi 1.3.4.Echilibrul termodinamic 1.3.5.Nivelul Fermi 1.4.Conversia energiei solare în energia electrică 1.4.1.Efectul fotovoltaic 1.4.2.Caracteristici ale celulor fotovoltaice 1.4.3.Coeficient masic de aer 1.5.Energie solară.Panouri fotovoltaice și…

  • Proiectarea Unei Sectii Pentru Fabricarea Crenvurstilor cu Adaosuri Proteice Vegetale

    Proiect tehnologia cărnii 1. TEMA PROIECTULUI Să se proiecteze o secție pentru fabricarea a 3t de crenvurștilor cu adaosuri proteice vegetale. Produsul finit se depozitează pentru maxim 24 ore. CUPRINS 1. TEMA PROIECTULUI 2.INTRODUCERE. 2.1 Compoziția chimică 2.2Factorii care influențează compoziția chimică a cărnii 2.3 Analiza chimică a cărnii și a preparatelor de carne 2.OBIECTUL…

  • Calculul Tehnologic al Maturatorului (soaker) Dintr O Instalatie de Reducere de Viscozitate

    PROIECT DE DIPLOMA TEMA: CALCULUL TEHNOLOGIC AL MATURATORULUI (SOAKER) DINTR-O INSTALATIE DE REDUCERE DE VISCOZITATE Cuprins INTRODUCERE CAP.I.DATE DE LITERATURĂ PRIVIND PROCESUL DE REDUCERE DE VȊSCOZITATE I.1. Descrierea procesului de reducere de vȋscozitate I.2. Ecuațiile cinetice globale I.3. Influența parametrilor I.4. Descrierea proceselor industriale I.5. Randamente și caracteristici ale produselor I.6 Realizare industrialǎ CAP.II.ANALIZA TEHNOLOGICĂ…

  • Dispozitive cu 5 Axe

    CUPRINS Capitolul 1 Noțiuni generale 1.1. Definiție – locul și rolul dispozitivelor în sistemele de fabricație 1.2. Clasificarea dispozitivelor 1.3. Structura dispozitivelor 1.4. Algoritmul de proiectare a dispozitivelor Capitolul 2 Caracteristici specifice ale dispozitivelor pe ramuri industriale 2.1. Introducere 2.2. Gradul de dotare cu dispozitive 2.3.Influența gradului de dotare cu dispozitive asupra productivității muncii 2.4….