Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
UNIVERZITET U NOVOM SADU
TEHNIĈKI FAKULTET «MIHAJLO PUPIN»
ZRENJANIN
MASTER STUDIJE
NASTAVNI PREDMET: INTERNET PROGRAMIRANJE
SEMINARSKI RAD
Tema: Softverska podrška evidenciji i praćenju realizacije radnih obaveza
nastavnog osoblja fakulteta
(implementacija: Java programski jezik)
NASTAVNIK: STUDENT:
Prof. dr Dušan Malbaški Ljubica Kazi
Doc. Dr Branko Markoski
Zrenjanin, Jun 2009.
2
SADRŢAJ:
1. UVOD
Zadatak seminarskog rada
Metode i alati korišćeni u realizaciji seminarskog rada
Opis problema
Analiza problema
Modeli poslovnog domena
Reĉnik podataka
2. KONCEPTUALNI MODEL SOFTVERA
Analiza funkcionalnih zahteva programa
Dijagram sluĉajeva korišćenja
Modeli podataka
Višeslojna arhitektura softvera
Dijagram komponenti
Dijagram razmeštaja
Dijagrami klasa
3. DESKTOP APLIKACIJA
OPIS IMPLEMENTIRANOG SOFTVERA
Opis implementacije
Dijagram komponenti
Baza podataka
Dijagrami klasa
Dijagrami sekvenci
KORISNIĈKO UPUTSTVO
Uputstvo za instalaciju
Uputstvo za korišćenje
4. WEB APLIKACIJA
Opis implementacije
Korisniĉko uputstvo
Uputstvo za instalaciju
Uputstvo za korišćenje
5. ZAKLJUĈAK
6. PRILOG
Sadržaj pratećeg CD-a
Listing programskog koda
3
UVOD
ZADATAK SEMINARSKOG RADA
Realizovati program putem kojeg će se ilustrovati elementi programiranja u programskom jeziku Java.
METODE I ALATI KORIŠĆENI U REALIZACIJI SEMINARSKOG RADA
U realizaciji seminarskog rada korišćene su sledeće metode, jezici i alati:
POSLOVNO MODELIRANJE business process model Sybase Power Designer 10
MODELIRANJE SOFTVERA UML Sybase Power Designer 10
MODELIRANJE PODATAKA Konceptualni model
(ER model)
PowerSoft Power Designer 6
Fiziĉki model
(Relacioni model)
PowerSoft Power Designer 6
Sybase Power Designer 10
Objektni model
(za programski jezik Java)
Sybase Power Designer 10
BAZA PODATAKA Relaciona baza podataka MS Access 2000
PROGRAMIRANJE Desktop aplikacija Sun NetBeans IDE 6.5 (Java)
OPIS PROBLEMA
Problem organizacije rada nastavnog osoblja na fakultetu odnosi se pre svega na organizaciju osnovnih i dodatnih aktivnosti
nastavnika i saradnika fakulteta.
Okvirni spisak radnih aktivnosti nastavnog osoblja na fakultetu obuhvata:
1. NASTAVA - Nastavne aktivnosti:
a. Nastavni ĉasovi
b. Ispiti
2. NAUKA - Aktivnosti nauĉno istraživaĉkog rada
a. Projekti
b. Saradnja sa drugim nauĉnim i struĉnim institucijama
c. Uĉešće u radu nauĉnih i struĉnih organizacija i manifestacija
3. TRANSFER - Aktivnosti struĉnog rada
a. Projekti
b. Seminari
4. OSTALE AKTIVNOSTI:
a. Sednice
PROBLEM organizacije rada nastavnog osoblja ogleda se u:
1. mnoštvu zaposlenih
2. mnoštvu radnih uloga koje zaposleni imaju
3. mnoštvu nalogodavaca radnih zadataka
4. mnoštvu obaveza svakog zaposlenog
5. izmenama i dopunama spiska potrebnih aktivnosti
6. razliĉitim nivoima detaljnosti opisa pri zadavanju zadataka
7. razliĉitim osobinama aktivnosti – u smislu frekventnosti-periodiĉnosti itd.
8. istovremenim uĉešćem zaposlenih u više radnih aktivnosti
9. neformalnoj formi zadavanja radnih aktivnosti (usmeno)
ZNAĈAJ programa za evidenciju obaveza nastavnog osoblja fakulteta:
1. potreba da se dokumentuju i prate zaduženja zaposlenih, kao i odgovornosti nalogodavaca (nadreĊenih) i zaposlenih
2. potreba da se upravlja izvršavanjem aktivnosti – da se prati njihovo zadavanje, izvršavanje i kvalitet uraĊenog posla....
3. potreba da se poboljša kvalitet uraĊenog posla sagledavanjem realnog opterećenja nastavnog osoblja radnim obavezama i
pravilnijim rasporeĊivanjem radnih zadataka, u skladu sa opterećenjem, kvalitetom prethodno realizovanih aktivnosti i
kompetentnošću.
4
ANALIZA PROBLEMA
OPŠTI OPIS TOKA IZVRŠAVANJA AKTIVNOSTI
Svaki posao, odnosno poslovni proces može se organizovati kroz projekat, koji prethodno treba da je opisan na uobiĉajeni naĉin za
struktuiranje projekata, meĊu kojima su najvažniji elementi: ciljevi, resursi i aktivnosti. Povodom realizacije projekta, zaposleni
sklapa ugovor o radu kojim se propisuje opis aktivnosti koje treba da obavlja. Pri tom odreĊen je i rukovodilac (nadreĊeni –
zaposleni) koji zadaje radne zadatke i kontroliše njihovo izvršavanje. Radne obaveze mogu biti periodiĉne i kontinuirane tokom cele
godine ili povremene, u skladu sa povremenim dogaĊajima koji ih iniciraju. Radna obaveza je opisana dokumentom koji nadreĊeni
dostavlja zaposlenom, a on je dužan da te obaveze izvršava u predviĊenom terminu, periodiĉnim terminima ili predviĊenom roku i
da o izvršavanju obaveza vodi evidenciju, koju dostavlja na uvid nadreĊenom radi evaluacije izvršenog posla. Po izvršenju obaveza
nadreĊeni izvršava uvid u rezultate realizovanih aktivnosti.
Što se tiĉe obaveza nastavnog osoblja na fakultetu, osnovne aktivnosti opisane su sledećom tabelom:
KLJUĈNI ELEMENTI POSLOVNOG PROCESA
Zaposleni, Rukovodilac (NadreĊeni)
Hijerarhija zaposlenih, pripadnost zaposlenih grupi, Radne uloge zaposlenih, odgovornosti zaposlenih
Obaveza – frekvencija, kategorija (nastava, nauka), podaci o zadavanju, izvršenju i evaluaciji kvaliteta
Znaĉaj obaveze, prioritet obaveze, hijerarhijsko ureĊenje aktivnosti u okviru obaveze, nivo detaljnosti aktivnosti i opisa
aktivnosti
Obaveza, aktivnosti u okviru obaveze, opis aktivnosti (opis radne operacije, rok izrade, frekvencija)
Obaveza kao ugovor, usklaĊenost obaveza koje se izvršavaju istovremeno, prioriteti
Pregled obaveza i aktivnosti, rasporeĊivanje aktivnosti
OBAVEZA FREKVENCIJA RUKOVODILAC
NASTAVA - Nastavne aktivnosti:
b. Nastavni ĉasovi Periodiĉno Nastavnik – asistentu
Sef katedre – nastavniku
Prodekan za nastavu – sefu
katedre
Dekan – prodekanu za
nastavu
c. Ispiti periodiĉno
5. NAUKA - Aktivnosti nauĉno istraživaĉkog rada
a. Projekti Povremeno Rukovodilac projekta –
ucesniku na projektu
Prodekan za nauku –
rukovodiocu na projektu
Dekan – prodekanu za
nauku
b. Saradnja sa drugim nauĉnim i struĉnim
institucijama
Povremeno Opciono – samostalno ili
neposredni rukovodilac
c. Uĉešće u radu nauĉnih i struĉnih organizacija
i manifestacija
Povremeno Opciono – samostalno ili
neposredni rukovodilac
6. TRANSFER - Aktivnosti struĉnog rada
a. Projekti Povremeno
b. Seminari Povremeno Rukovodilac seminara –
predavaĉu na seminaru
7. OSTALE AKTIVNOSTI:
a. Sednice Periodiĉno ŠEF KATEDRE – ĉlanovi
katedre
DEKAN – ĉlanovi
nastavno-nauĉnog veća
5
MODELI POSLOVNOG DOMENA
Modelom poslovnog domena opisujemo poslovni kontekst aktivnosti koje se odvijaju u okviru organizacionog sistema. Postoji vise
pristupa i vrsta modela koji se koriste u oblasti poslovnog modeliranja. U ovom primeru koristimo:
Dijagram klasa - radi opisa kljuĉnih pojmova datog problema najĉešće se već u fazi poslovnog modeliranja izraĊuje
jednostavan dijagram klasa, kojim se predstavljaju kljuĉni entiteti i procesi datog problema.
BPM – business process model - šema BPM modela predstavlja pregledan prikaz kljuĉnih poslovnih aktivnosti, u skladu sa
prethodno datim tekstualnim opisom toka poslovnih aktivnosti.
Pored ovih pristupa, koristi se i dijagram sluĉajeva korišćenja, gde se sluĉajevi korišćenja odnose na atomarne poslovne aktivnosti u
interakciji korisnika i sistema. U ovom radu dijagram sluĉajeva korišćenja se koristi u svrhu predstavljanja softverskih, a ne
poslovnih funkcionalnih jedinica.
DIJAGRAM KLASA – ENTITETI POSLOVNOG DOMENA
0..1
zadaje 0..* 0..1
0..*
prihvata
0..1
0..*
0..1
dobija
0..*
0..10..*
0..1
0..*
0..1
0..*
<<entitet>>
Rukovodilac
<<entitet>>
Zaposleni
<<proces>>
Posao
<<proces>>
Aktivnosti realizacije
<<dokument>>
RadniNalog
<<dokument>>
Ugovor<<dokument>>
Projekat
<<entitet>>
Radni zadatakPoslovna pravila
Razlikujemo nekoliko vrsta entiteta dijagrama klasa:
- ENTITET: rukovodilac, zaposleni, radni zadatak
- PROCES: posao, aktivnosti realizacije
- DOKUMENT: Projekat, Ugovor, Radni nalog
- POSLOVNA PRAVILA
Dokumenti opisuju karakteristike odnosa izmeĊu kljuĉnih entiteta i zato su predstavljeni kao association class – klase koje opisuju
karakteristike veze izmeĊu drugih klasa. Na ovom dijagramu izostavljeni su atributi, a veze izmeĊu entiteta postavljene su
fleksibilno.
Na dijagramu se mogu uoĉiti osnovni elementi BPM modela:
6
1. vertikalni odeljci (organization unit) koji imaju nazive u skladu sa osnovnim radnim ulogama procesa: zaposleni i
rukovodilac. Na ovaj naĉin predstavljena je podela odgovornosti radnih aktivnosti i odgovornosti nad podacima.
2. Ovali (activity) – predstavlja aktivnosti poslovnog procesa.
3. Skladišta podataka (resources) – predstavljaju skupove podataka koji nastaju i koriste se u toku aktivnosti.
4. Tok podataka (flow) – isprekidana linija, koja predstavlja protok podataka u skladiste i iz skladista podataka u toku
izvršavanja aktivnosti
5. Tok aktivnosti - kontinuirana podebljana linija koja prikazuje povezanost poslovnih aktivnosti, u hronološkom redosledu.
ZAPOSLENI RUKOVODILAC
<<podaci o sklapanju ugovora>>
<<novi projekat>>
<<podaci o projektu>>
<<podaci o angazovanju zaposlenog na projektu>>
<<podaci o opisu ugovorenih aktivnosti na projektu>>
<<radni nalog zaposlenog za izvrsenje odredjene aktivnosti>>
<<podaci o radnom nalogu>>
<<podaci o zavrsetku svih aktivnosti radnog naloga>>
<<podaci o izvrsenoj aktivnosti>>
<<podaci o rezultatima aktivnosti RADNOG NALOGA>>
<<podaci o rezultatima rada>>
<<novi izvestaj>>
<<podaci o radnom nalogu>>
<<podaci o radnom nalogu>>
<<podaci o projektu>>
<<Podaci o kvalitetu realizovanog radnog naloga>>
<<podaci o nastavnom osoblju>>
<<podaci o uspesnosti projekta>>
<<podaci o rezultatima aktivnosti RADNOG NALOGA>>
sklapa ugovor UGOVOR
Odredjuje aktivnosti i opis nacina izvrsavanja - definise PROJEKAT
Angazuje zaposlenog za realizaciju aktivnosti PROJEKTAInformise se o aktivnostima na PROJEKTU
Zadaje radne zadatke - otvara RADNI NALOG
Izvrsava radni zadatak i belezi rezultate aktivnosti RADNOG NALOGA
Evidentira zavrsetak svih aktivnosti RADNOG NALOGA
Kontrolise rezultate u toku izrade
Procenjuje kvalitet uradjenih rezultata
PROJEKAT
Radni nalog
REALIZOVANE AKTIVNOSTI
IZVESTAJ O REALIZACIJI PROJEKTA
Izrada izvestaja o realizacij i projekta
ZAPOSLENI
7
REČNIK PODATAKA
U nastavku je dat opis strukture podataka prikazanih elemenata dijagrama «business process modela» opisom kroz navoĊenje
elementarnih podataka. Skup svih elementarnih podataka zajedno sa opisom njihovih meĊusobnih odnosa u sastavu skladišta
podataka i tokova podataka ĉini reĉnik podataka ovog modela. Na ovaj naĉin pripremljen je prikaz informacionih potreba datog
poslovnog procesa, na osnovu ĉega se dalje razvijaju odgovarajući modeli podataka kao njihova podrška.
ELEMENT NAZIV
Skladište podataka Projekat
Ugovor
Zaposleni
Radni nalog
Rezultati rada
Izveštaj o realizaciji projekta
Tok podataka Novi projekat
Podaci o projektu
Podaci o angažovanju zaposlenog na projektu
Podaci o sklapanju ugovora
Podaci o nastavnom osoblju
Podaci o opisu ugovorenih aktivnosti na projektu
Radni nalog zaposlenog za izvršenje odreĊene aktivnosti
Podaci o radnom nalogu
Podaci o završetku svih aktivnosti radnog naloga
Podaci o kvalitetu realizovanog radnog naloga
Podaci o izvršenoj aktivnosti
Podaci o rezultatima rada
Podaci o rezultatima aktivnosti radnog naloga
Podaci o uspesnosti projekta
Novi izveštaj
U nastavku je data struktura navedenih elemenata dijagrama, koju ĉine elementarni podaci:
SKLADIŠTE PODATAKA
PROJEKAT Oznaka projekta, naziv, oblast, opis, datum pocetka, datum planiranog zavrsetka,
rukovodilac, opis realizovanih rezultata, uspesnost zavrsetka, datum zavrsetka, datum
izvestaja, opis izvrsenih aktivnosti, nivo kvaliteta
UGOVOR Oznaka ugovora, Oznaka projekta, JMBG zaposlenog, datum pocetka angazovanja,
datum zavrsetka angazovanja, opis zaduzenja, radna uloga na projektu
ZAPOSLENI JMBG zaposlenog, prezime, ime, radno mesto, zvanje, rukovodeca uloga
RADNI NALOG Oznaka radnog naloga, Oznaka ugovora, JMBG zaposlenog, datum pocetka
angazovanja, datum zavrsetka angazovanja, opis zaduzenja, datum zavrsetka svih
aktivnosti radnog naloga, opis kvaliteta realizacije radnog naloga, nivo kvaliteta
REALIZOVANE
AKTIVNOSTI
Oznaka aktivnosti, Oznaka radnog naloga, datum izvrsenja aktivnosti, opis izvrsene
aktivnosti
IZVESTAJ O
REALIZACIJI PROJEKTA
Oznaka projekta, datum zavrsetka projekta, uspesnost zavrsetka projekta, datum
izvestaja, opis izvrsenih aktivnosti
TOK PODATAKA
Novi projekat Oznaka projekta, naziv, oblast, opis, datum pocetka, datum zavrsetka, rukovodilac
Podaci o projektu Oznaka projekta, naziv, oblast, opis, datum pocetka, datum zavrsetka, rukovodilac
Podaci o angažovanju
zaposlenog na projektu
Oznaka projekta, JMBG zaposlenog, datum pocetka angazovanja, datum zavrsetka
angazovanja, opis zaduzenja, radna uloga na projektu
Podaci o sklapanju ugovora Oznaka ugovora, Oznaka projekta, JMBG zaposlenog
Podaci o nastavnom osoblju JMBG zaposlenog, prezime, ime, radno mesto, zvanje, rukovodeca uloga
Podaci o opisu ugovorenih
aktivnosti na projektu
Oznaka ugovora, Oznaka projekta, JMBG zaposlenog, datum pocetka angazovanja,
datum zavrsetka angazovanja, opis zaduzenja, radna uloga na projektu
Radni nalog zaposlenog za
izvršenje odreĊene
aktivnosti
Oznaka radnog naloga, Oznaka ugovora, JMBG zaposlenog, datum pocetka
angazovanja, datum zavrsetka angazovanja, opis zaduzenja
Podaci o radnom nalogu Oznaka radnog naloga, Oznaka ugovora, JMBG zaposlenog, datum pocetka
angazovanja, datum zavrsetka angazovanja, opis zaduzenja
Podaci o završetku svih
aktivnosti radnog naloga
Oznaka radnog naloga, datum zavrsetka svih aktivnosti radnog naloga
Podaci o kvalitetu Oznaka radnog naloga, opis kvaliteta realizacije radnog naloga, nivo kvaliteta
8
realizovanog radnog naloga
Podaci o izvršenoj
aktivnosti
Oznaka aktivnosti, Oznaka radnog naloga, datum izvrsenja aktivnosti, opis izvrsene
aktivnosti
Podaci o rezultatima rada Oznaka aktivnosti, Oznaka radnog naloga, datum izvrsenja aktivnosti, opis izvrsene
aktivnosti
Podaci o rezultatima
aktivnosti radnog naloga
Oznaka aktivnosti, Oznaka radnog naloga, datum izvrsenja aktivnosti, opis izvrsene
aktivnosti
Podaci o uspesnosti projekta Oznaka projekta, opis realizovanih rezultata, uspesnost zavrsetka, datum zavrsetka,
datum izvestaja, opis izvrsenih aktivnosti, nivo kvaliteta
Novi izveštaj Oznaka projekta, opis realizovanih rezultata, uspesnost zavrsetka, datum zavrsetka, nivo
kvaliteta
U ovom radu su, radi jednostavnosti, izostavljen prikaz strukture toka podataka i skladišta podataka sa stanovišta meĊusobnih
odnosa elementarnih podataka, a takoĊe i opis samih elementarnih podataka (domen vrednosti i druge karakteristike). Detaljan
prikaz osobina elementarnih podataka dat je u odeljku MODELI PODATAKA.
9
KONCEPTUALNI MODEL SOFTVERA
ANALIZA FUNKCIONALNIH ZAHTEVA PROGRAMA
Analizom domena problema i modela poslovnog procesa utvrĊujemo kljuĉne funkcionalne elemente softverskog rešenja:
POSLOVNA AKTIVNOST SOFTVERSKA PODRŠKA – funkcionalni
elementi
UČESNIK
OdreĊivanje aktivnosti i opis naĉina
izvršavanja – definisanje
PROJEKTA
Ažuriranje podataka o projektu Rukovodilac
Angažovanje zaposlenog na projektu Prikaz podataka o zaposlenima
Ažuriranje podataka o angažovanju zaposlenog na
projektu
Rukovodilac
Informisanje o aktivnostima na
projektu
Tabelarni prikaz podataka o projektima na kojima je
zaposleni angažovan
Prikaz opisa pojedinaĉnog projekta
Zaposleni
Sklapanje ugovora Prikaz podataka o opisu obaveza zaposlenog na
projektu
Ažuriranje podataka o prihvatanju uĉešća na projektu
Zaposleni
Štampanje ugovora o uĉešću na projektu Zaposleni – sekretar
projekta
Zadavanje radnih zadataka –
otvaranje RADNOG NALOGA
Tabelarni prijaz podataka o projektima gdje je dati
rukovodilac odgovoran
Prikaz podataka o projektu
Tabelarni prikaz podataka o angažovanim
zaposlenima na projektu
Ažuriranje podataka o radnom nalogu zaposlenog
uĉesnika projekta
Rukovodilac
Štampanje radnog naloga Zaposleni – sekretar
projekta
Izvršava radni zadatak i beleži
rezultate aktivnosti RADNOG
NALOGA
Tabelarni prikaz radnih naloga zaposlenog
Ažuriranje podataka o rezultatu aktivnosti radnog
naloga
Zaposleni
Kontroliše rezultate u toku izrade Prikaz rezultata aktivnosti radnih naloga
Prikaz rezultata zaposlenih
Prikaz rezultata projekta
Rukovodilac
Evidentira završetak svih aktivnosti
RADNOG NALOGA
Ažuriranje podataka o završetku svih aktivnosti
radnog naloga
Zaposleni
Procenjuje kvalitet uraĊenih rezultata Ažuriranje podataka o kvalitetu aktivnosti RADNOG
NALOGA
Rukovodilac
Izrada izveštaja o realizaciji
PROJEKTA
Prikaz podataka o rezultatima radnih naloga za dati
projekat
Ažuriranje podataka o realizaciji projekta
Rukovodilac
Štampanje izveštaja o realizaciji projekta Zaposleni – sekretar
projekta
10
DIJAGRAMI SLUČAJEVA KORIŠĆENJA
U nastavku je dat prikaz dijagrama sluĉajeva korišćenja koji predstavljaju funkcionalne karakteristike budućeg softverskog rešenja.
Sluĉajevi korišćenja su grupisani prema uĉesnicima i na ovaj naĉin su predstavljeni na pojedinaĉnim dijagramima.
Na prvom dijagramu predstavljamo uĉesnike i njihov meĊusobni odnos, u smislu mogućnosti uĉešća u pojedinim sluĉajevima
korišćenja:
Zaposleni
Rukovodilac
Sekretar
Administrator
Dijagram odnosa uĉesnika
Na ovom dijagramu je prikazana hijerarhija uĉesnika, u smislu «nasleĊivanja» raspoloživih funkcionalnih osobina softvera, odnosno
mogućnosti uĉešća u funkcionisanju sistema, korišćenjem raspoloživih opcija. Naime, zaposleni ima najmanje mogućnosti, dok
administrator ima najviše mogućnosti. U nastavku su prikazani sluĉajevi korišćenja koji se odnose redom na sve profile korisnika,
pri ĉemu profil korisnika koji nasleĊuje, dobija mogućnost korišćenja svih opcija prethodnika u ovom nizu nasleĊivanja.
11
<<extend>>
<<extend>>
<<extend>>
<<extend>>
<<extend>><<extend>>
Zaposleni
Tabelarni prikaz podataka o projektima na kojima je zaposleni angazovan
Prikaz opisa pojedinacnog projektaPrikaz podataka o opisu obaveza zaposlenog na projektu
Azuriranje podataka o prihvatanju ucesca na projektu
Tabelarni prikaz radnih naloga zaposlenog
Azuriranje podataka o rezultatu realizacije radnog nalogaAzuriranje podataka o zavrsetku realizacije radnog naloga
Dijagram sluĉajeva korišćenja «Zaposleni»
Sekretar
Stampanje ugovora o ucescu na projektu
Stampanje radnog naloga
Štampanje izveštaja o realizaciji projekta
Stampanje
Dijagram sluĉajeva korišćenja «Sekretar»
12
<<include>>
<<extend>>
<<extend>>
<<extend>>
<<extend>>
<<extend>>
<<extend>>
<<extend>>
<<extend>>
<<extend>>
Rukovodilac
Azuriranje podataka o projektu
Prikaz podataka o zaposlenima
Azuriranje podataka o angazovanju zaposlenog na projektu
Tabelarni prikaz podataka o projektima gde je dati rukovodilac odgovoran
Prikaz podataka o odabranom projektu
Tabelarni prikaz podataka o angazovanim zaposlenima na projektu
Azuriranje podataka o radnom nalogu odabranog zaposlenog
Prikaz rezultata radnog naloga
Prikaz rezultata zaposlenog
Prikaz rezultata projekta
Azuriranje podataka o kvalitetu realizacije radnog naloga
Azuriranje podataka o realizacij i projekta
Dijagram sluĉajeva korišćenja «Rukovodilac»
<<use>>
Administrator
Azuriranje podataka o zaposlenima
Azuriranje podataka o radnim mestima
Azuriranje podataka o hijerarhiji rukovodjenja
Dijagram sluĉajeva korišćenja «Administrator»
13
MODELI PODATAKA
Na osnovu reĉnika podataka poslovnog domena, uraĊen je najpre konceptualni model podataka (odgovara ER modelu podataka), a
zatim i fiziĉki model podataka (odgovara relacionom modelu podataka), koji je automatski generisan u CASE alatu Sybase Power
Designer 10. Na kraju je dat i objektni model podataka koji odgovara navedenom problemu.
rukovodi
pripada
je stepena
je nivoa
je rasporedjen
je realizovana
je elaboriran
je angazovaoje sklopio
je rasporedjen na
ima zvanje
radi na
ZAPOSLENI
JMBG A13
Prezime VA40
Ime VA30
PROJEKAT
OznakaProjekta LI
NazivProjekta VA250
Opis TXT250
DatumPocetkaProjekta D
DatumPlaniranogZavrsetkaProjekta D
OpisRealizovanihRezultata TXT250
OpisIzvrsenihAktivnosti TXT250
DatumZavrsetka D
DatumIzvestaja D
RADNO_MESTO
SifraRM VA10
NazivRM VA50
ZVANJE
sifraZvanja VA10
NazivZvanja VA50
RUKOVODECA_ULOGA
sifraRUloge VA10
NazivRUloge VA50
NASTAVNO_OSOBLJE
datum izbora u zvanje D
za period VA100
RUKOVODILAC
datum izbora na funkciju D
za period VA100
UGOVOR
OznakaUgovora LI
DatumPocetkaAngazovanja D
DatumZavrsetkaAngazovanja D
Opis zaduzenja VA250
RADNI_NALOG
OznakaRadnogNaloga LI
DatumPocetkaAngazovanja D
DatumZavrsetkaAngazovanja D
OpisZaduzenja VA250
DatumZavrsetkaSvihAktivnosti D
OpisKvalitetaRealizacije VA250
REALIZOVANA_AKTIVNOST
OznakaAktivnosti LI
datumIzvrsenjaAktivnosti D
OpisIzvrseneAktivnosti TXT250
RADNA ULOGA
SifraRadneUloge VA10
NazivRadneUloge VA30
NIVO_KVALITETA
sifraNivoKvaliteta VA10
NazivNivoKvaliteta VA30
OBLAST PROJEKTA
SifraOblasti VA10
NazivOblasti VA40
NENASTAVNO_OSOBLJE
po ugovoru BL
Konceptualni model podataka (CDM model, ER model)
JMBG = JMBG
JMBG = JMBGJMBG = JMBG
JMBG = JMBG_RUKOVODIOCA
SIFRAOBLASTI = SIFRAOBLASTI
SIFRANIVOKVALITETA = SIFRANIVOKVALITETA
SIFRANIVOKVALITETA = SIFRANIVOKVALITETA
SIFRARADNEULOGE = SIFRARADNEULOGE
OZNAKAPROJEKTA = OZNAKAPROJEKTA
OZNAKAUGOVORA = OZNAKAUGOVORA
OZNAKARADNOGNALOGA = OZNAKARADNOGNALOGA
OZNAKAPROJEKTA = OZNAKAPROJEKTA
OZNAKAUGOVORA = OZNAKAUGOVORA
OZNAKAPROJEKTA = OZNAKAPROJEKTA
JMBG = JMBG
SIFRARULOGE = SIFRARULOGE
SIFRAZVANJA = SIFRAZVANJA
SIFRARM = SIFRARM
ZAPOSLENI
JMBG Text(13)
SIFRARM Text(10)
PREZIME Text(40)
IME Text(30)
PROJEKAT
OZNAKAPROJEKTA LongInteger
SIFRANIVOKVALITETA Text(10)
SIFRAOBLASTI Text(10)
JMBG_RUKOVODIOCA Text(13)
NAZIVPROJEKTA Text(250)
OPIS Memo
DATUMPOCETKAPROJEKTA DateTime
DATUMPLANIRANOGZAVRSETKAPROJEK DateTime
OPISREALIZOVANIHREZULTATA Memo
OPISIZVRSENIHAKTIVNOSTI Memo
DATUMZAVRSETKA DateTime
DATUMIZVESTAJA DateTime
RADNOMESTO
SIFRARM Text(10)
NAZIVRM Text(50)
ZVANJE
SIFRAZVANJA Text(10)
NAZIVZVANJA Text(50)
RUKOVODECA_ULOGA
SIFRARULOGE Text(10)
NAZIVRULOGE Text(50)
NASTAVNO_OSOBLJE
JMBG Text(13)
SIFRAZVANJA Text(10)
DATUM_IZBORA DateTime
ZA_PERIOD Text(100)
RUKOVODILAC
JMBG Text(13)
SIFRARULOGE Text(10)
DATUM_IZBORA_NA_FUNKCIJU DateTime
ZA_PERIOD Text(100)
UGOVOR
OZNAKAPROJEKTA LongInteger
OZNAKAUGOVORA LongInteger
JMBG Text(13)
SIFRARADNEULOGE Text(10)
DATUMPOCETKAANGAZOVANJA DateTime
DATUMZAVRSETKAANGAZOVANJA DateTime
OPIS_ZADUZENJA Text(250)
RADNI_NALOG
OZNAKAPROJEKTA LongInteger
OZNAKAUGOVORA LongInteger
OZNAKARADNOGNALOGA LongInteger
SIFRANIVOKVALITETA Text(10)
DATUMPOCETKAANGAZOVANJA DateTime
DATUMZAVRSETKAANGAZOVANJA DateTime
OPISZADUZENJA Text(250)
DATUMZAVRSETKASVIHAKTIVNOSTI DateTime
OPISKVALITETAREALIZACIJE Text(250)
REALIZOVANA_AKTIVNOST
OZNAKAPROJEKTA LongInteger
OZNAKAUGOVORA LongInteger
OZNAKARADNOGNALOGA LongInteger
OZNAKAAKTIVNOSTI LongInteger
DATUMIZVRSENJA DateTime
OPISIZVRSENEAKTIVNOSTI Text(250)
RADNA_ULOGA
SIFRARADNEULOGE Text(10)
NAZIVRADNEULOGE Text(30)
NIVO_KVALITETA
SIFRANIVOKVALITETA Text(10)
NAZIVNIVOKVALITETA Text(30)
OBLAST_PROJEKTA
SIFRAOBLASTI Text(10)
NAZIVOBLASTI Text(40)
NENASTAVNO_OSOBLJE
JMBG Text(13)
PO_UGOVORU YesNo
Fiziĉki model podataka (PDM model, Relacioni model podataka)
Izvršeno je automatsko (u okviru CASE alata Sybase Power Designer 10) generisanje OOM modela, odnosno dijagrama klasa, pri
ĉemu je izabran ciljni jezik Java (radi kasnijeg generisanja programskog koda klasa).
14
0..1
radi na
0..n
0..1
ima zvanje
0..n
0..1
je rasporedjen na0..n
0..1
je sklopio0..n
1..1
je angazovao
0..n
1..1
je elaboriran
0..n
1..1
je realizovana
0..n
0..1
je rasporedjen 0..n
0..1
je nivoa
0..n
0..1
je stepena0..n
0..1
pripada
0..n
0..1
rukovodi
0..n
1..1
Inhr_262
0..n
1..1
Inhr_26
0..n
1..1
Inhr_200
0..n
ZAPOSLENI
+
+
+
JMBG
Prezime
Ime
: java.lang.String
: java.lang.String
: java.lang.String
PROJEKAT
+
+
+
+
+
+
+
+
+
OznakaProjekta
NazivProjekta
Opis
DatumPocetkaProjekta
DatumPlaniranogZavrsetkaProjekta
OpisRealizovanihRezultata
OpisIzvrsenihAktivnosti
DatumZavrsetka
DatumIzvestaja
: LongInteger
: java.lang.String
: char
: java.util.Date
: java.util.Date
: char
: char
: java.util.Date
: java.util.Date
RADNO_MESTO
+
+
SifraRM
NazivRM
: java.lang.String
: java.lang.String
ZVANJE
+
+
sifraZvanja
NazivZvanja
: java.lang.String
: java.lang.String
RUKOVODECA_ULOGA
+
+
sifraRUloge
NazivRUloge
: java.lang.String
: java.lang.String
NASTAVNO_OSOBLJE
+
+
datum izbora u zvanje
za period
: java.util.Date
: java.lang.String
RUKOVODILAC
+
+
datum izbora na funkciju
za period
: java.util.Date
: java.lang.String
UGOVOR
+
+
+
+
OznakaUgovora
DatumPocetkaAngazovanja
DatumZavrsetkaAngazovanja
Opis zaduzenja
: LongInteger
: java.util.Date
: java.util.Date
: java.lang.String
RADNI_NALOG
+
+
+
+
+
+
OznakaRadnogNaloga
DatumPocetkaAngazovanja
DatumZavrsetkaAngazovanja
OpisZaduzenja
DatumZavrsetkaSvihAktivnosti
OpisKvalitetaRealizacije
: LongInteger
: java.util.Date
: java.util.Date
: java.lang.String
: java.util.Date
: java.lang.String
REALIZOVANA_AKTIVNOST
+
+
+
OznakaAktivnosti
datumIzvrsenjaAktivnosti
OpisIzvrseneAktivnosti
: LongInteger
: java.util.Date
: char
RADNA ULOGA
+
+
SifraRadneUloge
NazivRadneUloge
: java.lang.String
: java.lang.String
NIVO_KVALITETA
+
+
sifraNivoKvaliteta
NazivNivoKvaliteta
: java.lang.String
: java.lang.String
OBLAST PROJEKTA
+
+
SifraOblasti
NazivOblasti
: java.lang.String
: java.lang.String
NENASTAVNO_OSOBLJE
+ po ugovoru : boolean
Objektni model podataka – generisan u CASE alatu
Prikazane su veze asocijacije i kompozicije. Veze asocijacije i jedan deo veza kompozicije su dobro definisane, meĊutim jedan deo
veza kompozicije je pogrešno postavljen. Naime, veze IS-A hijerarhije (iz CDM, odnosno ER modela) su prevedene kao veze
kompozicije. MeĊutim, ovde je potrebno da te veze budu definisane kao veze nasleĊivanja. Korigovan objektni model dat je u
nastavku:
0..1
radi na0..n
0..1
ima zvanje
0..n
0..1
je rasporedjen na0..n
0..1
je sklopio0..n
1..1
je angazovao
0..n
1..1
je elaboriran
0..n
1..1
je realizovana
0..n
0..1
je rasporedjen 0..n
0..1
je nivoa
0..n
0..1
je stepena0..n
0..1
pripada
0..n
0..1
rukovodi
0..n
ZAPOSLENI
+
+
+
JMBG
Prezime
Ime
: java.lang.String
: java.lang.String
: java.lang.String
PROJEKAT
+
+
+
+
+
+
+
+
+
OznakaProjekta
NazivProjekta
Opis
DatumPocetkaProjekta
DatumPlaniranogZavrsetkaProjekta
OpisRealizovanihRezultata
OpisIzvrsenihAktivnosti
DatumZavrsetka
DatumIzvestaja
: LongInteger
: java.lang.String
: char
: java.util.Date
: java.util.Date
: char
: char
: java.util.Date
: java.util.Date
RADNO_MESTO
+
+
SifraRM
NazivRM
: java.lang.String
: java.lang.String
ZVANJE
+
+
sifraZvanja
NazivZvanja
: java.lang.String
: java.lang.String
RUKOVODECA_ULOGA
+
+
sifraRUloge
NazivRUloge
: java.lang.String
: java.lang.String
NASTAVNO_OSOBLJE
+
+
datum izbora u zvanje
za period
: java.util.Date
: java.lang.String
RUKOVODILAC
+
+
datum izbora na funkciju
za period
: java.util.Date
: java.lang.String
UGOVOR
+
+
+
+
OznakaUgovora
DatumPocetkaAngazovanja
DatumZavrsetkaAngazovanja
Opis zaduzenja
: LongInteger
: java.util.Date
: java.util.Date
: java.lang.String
RADNI_NALOG
+
+
+
+
+
+
OznakaRadnogNaloga
DatumPocetkaAngazovanja
DatumZavrsetkaAngazovanja
OpisZaduzenja
DatumZavrsetkaSvihAktivnosti
OpisKvalitetaRealizacije
: LongInteger
: java.util.Date
: java.util.Date
: java.lang.String
: java.util.Date
: java.lang.String
REALIZOVANA_AKTIVNOST
+
+
+
OznakaAktivnosti
datumIzvrsenjaAktivnosti
OpisIzvrseneAktivnosti
: LongInteger
: java.util.Date
: char
RADNA ULOGA
+
+
SifraRadneUloge
NazivRadneUloge
: java.lang.String
: java.lang.String
NIVO_KVALITETA
+
+
sifraNivoKvaliteta
NazivNivoKvaliteta
: java.lang.String
: java.lang.String
OBLAST PROJEKTA
+
+
SifraOblasti
NazivOblasti
: java.lang.String
: java.lang.String
NENASTAVNO_OSOBLJE
+ po ugovoru : boolean
Korigovan objektni model – korekcija: odnos nasleĊivanja
15
VIŠESLOJNA ARHITEKTURA SOFTVERA
Višeslojna softverska arhitektura, koja predstavlja konceptualni okvir implementacije softvera, opisana je na sledeći naĉin:
SLOJ KARAKTERISTIKE KOMPONENTA
KORISNIĈKI INTERFEJS Ekranske forme sa minimumom koda i vezom ka klasama EvidencijaObavezaDesk.jar
KLASE PREZENTACIONOG
SLOJA (presentation layer)
Klase koje opslužuju pojedine tipove ekranskih formi LibApp.jar
KLASE RADNOG TOKA
(workflow layer)
Klase koje opisuju radne uloge, radne aktivnosti i
ovlašćenja
LibWF.jar
KLASE POSLOVNE LOGIKE
(bussiness logic layer)
Klase koje opisuju poslovne entitete, procese, poslovna
pravila
LibBL.jar
KLASE PODATAKA (data layer) Klase koje odgovaraju tabelama iz baze podataka,
odnosno predstavljaju objektni model podataka za dati
problem
LibEntity.jar
TEHNOLOŠKE KLASE (data
layer technology utility layer)
Tehnološki vezan (za DBMS) kod za osnovne operacije
sa podacima iz baze podataka, univerzalan, nezavisan od
semantike
LibDBAccess.jar
DBMS + baza podataka Baza podataka i sistem za upravljanje bazom podataka Evidencija.mdb
Višeslojni pristup u ovom radu odnosi se na strukturu softverskog rešenja, a ne na fiziĉki raspored komponenti u raĉunarskoj mreži.
DIJAGRAM KOMPONENTI
Dijagram komponenti ĉine komponente - paketi i tipovi fajlova i njihova meĊusobna veza. Ovaj dijagram se može predstaviti sa 2
stanovišta:
1. imlementacija – nazivi paketa i fajlovi izvornog koda koji ga ĉine
2. isporuka – izvršna verzija.
Svi fajlovi koji ĉine navedene komponente – pakete, u obliku izvornog koda imaju ekstenziju *.java, a izvršna kompajlirana verzija
cele biblioteke klasa ima ekstenziju *.jar.
DBMS
LibEntity
LibDBAccess
Evidencija.mdb
LibBL
LibWF
LibApp
EvidencijaObavezaDesk
LibEvidencijaObavezaDesk.jar
LibApp.jar
LibWF.jar
LibBL.jar
LibEntity.jar
LibDBAccess.jar
Korisnicki interfejs
Biblioteke klasa
DBMS
DIJAGRAM KOMPONENTI – aspekt isporuke
16
DIJAGRAM RAZMEŠTAJA
Dijagram razmeštaja odnosi se na prikaz rasporeda komponenti sa aspekta isporuke po ĉvorovima, koje ĉine raĉunari sa aspekta
uloge u raĉunarskoj mreži. S obzirom da je planiran razvoj tzv. desktop aplikacije, razmeštaj se može odnositi na 2 varijante:
1. baza podataka/DBMS i kompletna aplikacija na 1 raĉunaru
2. - baza podataka/DBMS na serveru baze podataka
- aplikacija – korisniĉki interfejs i sve biblioteke klasa – na klijentskom raĉunaru
Server baze podataka
DBMS
baza podataka
Klijent
korisnicki interfejs
biblioteke klasa
DIJAGRAM RAZMEŠTAJA – 2 SLOJNA ARHITEKTURA
DIJAGRAMI KLASA
Objektni model koji je dat u odeljku MODELI PODATAKA potrebno je dopuniti opisom metoda svake klase, a takoĊe je potrebno
dopuniti ovaj model i drugim vrstama klasa. Navedeni objektni model koji je automatski generisan posredstvom CASE alata iz
konceptualnog modela podataka predstavlja samo klase koje opisuju entitete problemskog domena, odnosno po nazivima i strukturi
odgovaraju tabelama relacione baze podataka. MeĊutim u realizaciji softverskog rešenja uĉestvuju i druge klase. Kompletan
dijagram klasa koji predstavlja osnov implementacije softvera dat je u nastavku, po pojedinaĉnim dijagramima koji predstavljaju
klase posebnih slojeva višeslojne arhitekture. Tehnološke klase i klase prezentacionog sloja implementirane su u softverskom
rešenju i opisane su detaljnije u odeljku koji se odnosi na opis implementiranog softvera, dok su klase ostalih slojeva date u
konceptualnom obliku – na dijagramima klasa u ovom odeljku.
KLASE PODATAKA (ENTITY CLASS)
Klase podataka nastale su na osnovu objektnog modela koji odgovara prethodnim konceptualnom i fiziĉkom modelu, odnosno
relacionom modelu baze podataka. Svaka od klasa prethodno definisanog modela je transformisana:
atributi su definisani kao private
dodate su set i get metode za svaki atribut
preciznije su ureĊene osobine veza izmeĊu klasa – naziv uloga, kardinalitet, vidljivost, navigabilnost, tip containera (kod
veze kompozicije, itd.
Na osnovu dijagrama klasa sa korigovanim odnosima nasleĊivanja, u okviru CASE alata Power Designer 10 generisan je JAVA kod
klasa podataka (entity klasa). Na osnovu prevoĊenja elemenata dijagrama klasa u kod, ove klase imaju:
Get i set metode atributa
kao atribute objekte drugih klasa, kod odnosa asocijacije, gde je naziv atributa identiĉan nazivu relacije asocijacije iz
dijagrama
extends kod odnosa nasleĊivanja
ureĊenu listu, odnosno niz [0..n] objekata kao tip atributa kod odnosa kompozicije, gde se navodi tip objekta koji je ĉlan
niza, odnosno liste.
Nad generisanim kodom klasa izvršene su sledeće korekcije:
tip podatka kod svih atributa svih entity klasa postavljen je String,
postavljene su public metode get i set za atribute koji su dobijeni prevodjenjem asocijacije i kompozicije klasa.
ASOCIJACIJA - nazivi atributa koji su dobili naziv na osnovu uloga u vezama klasa, promenjeni su u skladu sa klasom na
koju ukazuju, npr: Projekat pripada Oblasti :
o generisana verzija: Klasa Projekat ima atribut: private Oblast ima;
o korigovana verzija Klasa Projekat ima atribut: private Oblast mOblast;
KOMPOZICIJA - atributi koji treba da budu tipa ArrayList drugih objekata su generisanjem pogresno postavljeni. Npr.
RadniNalog ima atribut:
17
o generisana verzija: private RealizovanaAktivnost jerealizovana[0..n];
o 1. verzija korekcije: private ArrayList<RealizovanaAktivnost> mRealizovaneAktivnosti;
o 2. verzija korekcije: private ListaRealizovanihAktivnosti mListaRealizovanihAktivnosti;
o 3. verzija korekcije: private Lista mListaRealizovanihAktivnosti;
pri ĉemu je ListaRealizovanihAktivnosti nova klasa ĉiji privatni atribut predstavlja ArrayList objekata klase Realizovana Aktivnost.
Taĉnije, napravljena je univerzalna klasa Lista koja za ĉlanove liste ima tip Object. Kljuĉni atribut je definisan na ovaj naĉin:
private ArrayList<Object> mLista;
Asocijacija Kompozicija
Sybase Power Designer 10 – dijalog za definisanje osobina veza izmeĊu klasa
PRIMER GENERISANOG JAVA PROGRAMSKOG KODA KLASE
– ODNOS NASLEĐIVANJA (EXTENDS) I ASOCIJACIJE:
/***********************************************************************
* Module: NastavnoOsoblje.java
* Author: ljubica
* Purpose: Defines the Class NastavnoOsoblje
***********************************************************************/
import java.util.*;
public class NastavnoOsoblje extends Zaposleni // NASLEDJIVANJE
{
private java.util.Date datumIzboraUZvanje;
private java.lang.String zaPeriod;
private Zvanje ima_zvanje; // ASOCIJACIJA
public java.util.Date getDatumIzboraUZvanje()
{
return datumIzboraUZvanje;
}
public void setDatumIzboraUZvanje(java.util.Date newDatumIzboraUZvanje)
{
datumIzboraUZvanje = newDatumIzboraUZvanje;
}
public java.lang.String getZaPeriod()
{
return zaPeriod;
}
public void setZaPeriod(java.lang.String newZaPeriod)
{
zaPeriod = newZaPeriod;
}
}
18
PRIMER JAVA PROGRAMSKOG KODA KLASE
– ODNOS AGREGACIJE
/***********************************************************************
* Module: Ugovor.java
* Author: ljubica
* Purpose: Defines the Class Ugovor
***********************************************************************/
import java.util.*;
public class Ugovor
{
private LongInteger oznakaUgovora;
private java.util.Date datumPocetkaAngazovanja;
private java.util.Date datumZavrsetkaAngazovanja;
private java.lang.String opisZaduzenja;
private Zaposleni je_sklopio;
private RadnaUloga je_rasporedjen; // ASOCIJACIJA
public RadniNalog jeElaboriran[0..n]; // AGREGACIJA
public LongInteger getOznakaUgovora()
{
return oznakaUgovora;
}
public void setOznakaUgovora(LongInteger newOznakaUgovora)
{
oznakaUgovora = newOznakaUgovora;
}
public java.util.Date getDatumPocetkaAngazovanja()
{
return datumPocetkaAngazovanja;
}
public void setDatumPocetkaAngazovanja(java.util.Date newDatumPocetkaAngazovanja)
{
datumPocetkaAngazovanja = newDatumPocetkaAngazovanja;
}
public java.util.Date getDatumZavrsetkaAngazovanja()
{
return datumZavrsetkaAngazovanja;
}
public void setDatumZavrsetkaAngazovanja(java.util.Date newDatumZavrsetkaAngazovanja)
{
datumZavrsetkaAngazovanja = newDatumZavrsetkaAngazovanja;
}
public java.lang.String getOpisZaduzenja()
{
return opisZaduzenja;
}
public void setOpisZaduzenja(java.lang.String newOpisZaduzenja)
{
opisZaduzenja = newOpisZaduzenja;
}
}
Konaĉni oblik dijagrama klasa koji se odnosi na klase podataka sa svim korekcijama dat je u nastavku:
19
Dijagram klasa bez set-get metoda
20
Konaĉan oblik dijagrama klasa – osnov za generisanje JAVA koda klasa
21
KLASE POSLOVNE LOGIKE
Klase poslovne logike opisuju osnovne uĉesnike poslovnog procesa koji se obraĊuje: poslovne entitete (pojmovi, radne uloge,
dokumenti), procese, poslovna pravila.
0..1
zadaje 0..* 0..1
0..*
prihvata
0..1
0..*
0..1
dobija
0..*
0..10..*
0..1
0..*
0..1
0..*
<<entitet>>
Rukovodilac
<<entitet>>
Zaposleni
<<proces>>
Posao
<<proces>>
Aktivnosti realizacije
<<dokument>>
RadniNalog
<<dokument>>
Ugovor<<dokument>>
Projekat
<<entitet>>
Radni zadatakPoslovna pravila
Dijagram klasa – poslovna logika
KLASE RADNOG TOKA
Klase radnog toka opisuju radne uloge, radne aktivnosti i ovlašćenja. Na ovaj naĉin vrši se zaštita pristupa pojedinim funkcionalnim
jedinicama softvera, odnosno pristupa bazi podataka, u skladu sa obuhvatom radnih aktivnosti koje su na raspolaganju
odgovarajućoj radnoj ulozi. U toku izvršavanja radnih aktivnosti uĉestvuju objekti klasa poslovne logike.
RUKOVODILAC
+
+
+
+
+
+
FormirajProjekat ()
Angazuj (ZAPOSLENI Ucesnik, Projekat AktuelniProjekat)
ZadajPosao (ZAPOSLENI ucesnik, Projekat aktivanProjekat)
PregledajAktivnosti (Projekat aktivanProjekat, RealizovanaAktivnost realizovanaAktivnost)
OkoncajProjekat (Projekat aktivanProjekat)
FormirajZavrsniIzvestaj (Projekat aktivanProjekat)
: Projekat
: Ugovor
: RadniNalog
: boolean
: Dokument
SEKRETAR
+ StampajDokument (Dokument DokumentZaStampu)
ZAPOSLENI
+
+
+
+
+
PogledajProjekat (Projekat noviProjekat)
PotpisiUgovor (Ugovor noviUgovor)
PrimiRadniNalog (RadniNalog noviRadniNalog)
RealizujAktivnost (RadniNalog aktivanRadniNalog)
OkoncajRadniNalog (RadniNalog aktivanRadniNalog)
: RealizovanaAktivnost
: boolean
Dokument
Projekat
Ugovor
RadniNalog
RealizovanaAktivnost
PoslovnaPravila
Dijagram klasa – radni tok
22
OPIS IMPLEMENTIRANOG SOFTVERA
OPIS IMPLEMENTACIJE
U odnosu na planiranu višeslojnu arhitekturu, implementirani su samo pojedini slojevi:
SLOJ KARAKTERISTIKE KOMPONENTA
KORISNIĈKI INTERFEJS Ekranske forme sa minimumom koda i vezom ka klasama EvidencijaObavezaDesk.jar
KLASE PREZENTACIONOG
SLOJA (presentation layer)
Klase koje opslužuju pojedine tipove ekranskih formi LibApp.jar
TEHNOLOŠKE KLASE (data
layer technology utility layer)
Tehnološki vezan (za DBMS) kod za osnovne operacije sa
podacima iz baze podataka, univerzalan, nezavisan od
semantike
LibDBAccess.jar
DBMS + baza podataka Baza podataka i sistem za upravljanje bazom podataka Evidencija.mdb
Implementacijom softvera na ovaj naĉin postignuta je univerzalnost programskog koda:
– univerzalne ekranske forme koje se prilagoĊavaju razliĉitoj semantici u skladu sa podešavanjima pratećih klasa
prezentacionog sloja,
– nezavisnost od vrste DBMS-a, naziva baze podataka, tabela i polja, kao i lokacije baze podataka, kod klasa koje su
zadužene univerzalno za preuzimanje podataka iz DBMS-a na osnovu SQL upita i slanje višim slojevima, kao i prijem
podataka i slanje DBMS-u, radi ažuriranja.
i na taj naĉin obezbeĊena:
1. višestruka upotrebljivost koda – u okviru iste aplikacije koriste se iste klase i ekranske forme za razliĉitu semantiku, pri
ĉemu je obezbeĊena i višestruka upotrebljivost i za razvoj drugih aplikacija – nezavisnost od semantike,
2. pouzdaniji razvoj aplikacije – jednom testiran modul-forma-klasa se u drugim sluĉajevima ne mora ponovo testirati
3. brži razvoj aplikacije – zbog višestruke upotrebljivosti i pouzdanosti modula.
Zadavanje semantike dešava se pri podešavanju osobina klasa prezentacionog sloja kod poziva odgovarajućih tipova formi i to se
pre svega odnosi na zadavanje naziva tabela, SQL upita i naziva polja sa kojima se radi. Ovo podešavanje se dešava podešavanjem
vrednosti atributa odgovarajućih klasa prezentacionog sloja neposredno, nezavisno od ispunjenosti uslova koji zavise od poslovnih
pravila ili od nadležnosti radne operacije ili uloge, odnosno poslovnog entiteta. Taj neposredni pristup formama i podacima
predstavlja nedostatak koji se rešava uvoĊenjem dodatnih klasa koje postoje izmeĊu tehnoloških klasa i klasa prezentacionog sloja,
a odnose se na: klase entiteta podataka, poslovne logike i radnog toka.
DIJAGRAM KOMPONENTI
Dijagram komponenti u ovom odeljku prezentuje implementirano rešenje sa odgovarajućim komponentama softverske arhitekture.
DBMS2
LibDBAccess2
Evidencija2.mdb
LibApp2
EvidencijaObavezaDesk2
LibEvidencijaObavezaDesk2.jar
LibApp2.jar
LibDBAccess2.jar
Korisnicki interfejs2
Biblioteke klasa2
DBMS2
23
BAZA PODATAKA
U ovom programu generisana je MS Access 2000 baza podataka u okviru CASE alata PowerSoft PowerDesigner 6.
Struktura baze podataka data je na sledećem dijagramu:
U odnosu na model podataka izvršene su korekcije:
1. Sve vrednosti polja u tabelama su tipa Text
2. Tabele sa pomocnim vrednostima (šifarnici) u nazivu su dobile prefiks «tip»
3. Tabele sa podacima koji opisuju dati poslovni domen u nazivu su dobile prefiks «a»
Tabele koje imaju prefiks «tip» su van domena problema koji se rešava u ovom radu, tako da neće biti obraĊene u softveru u smislu
softverske podrške ažuriranju podataka. Ovi podaci će biti dostupni samo u smislu prikaza podataka, dok ažuriranje podataka u
šifarnicima se pretpostavlja da se vrši iz odgovarajuće aplikacije koja pokriva rad kadrovske službe i dekanata fakulteta. Iz tog
razloga, za ovaj rad podaci u šifarnicima su direktno uneti u bazu podataka.
Dakle, u smislu ažuriranja podataka biće razvijena softverska podrška ažuriranju sledećih tabela:
1. aProjekat
2. aUgovor
3. aRadni_Nalog
4. aRealizovana_Aktivnost
DIJAGRAMI KLASA
TEHNOLOŠKE KLASE
Univerzalne klase koje omogućuju osnovne operacije sa podacima, nezavisno od konkretne tabele baze podataka na koju se odnose.
Ovim klasama se prosleĊuje kao parametar naziv tabele i sql upiti putem kojih se izvršavaju odgovarajuće operacije ažuriranja i
pretrage podataka. Ove klase su tehnološki vezane za konkretan tip baze podataka kroz string konekcije koji obezbeĊuje vezu ka
konkretnom DBMS-u.
ZA potrebe konekcije na MS Access bazu podataka i rad sa osnovnim operacijama sa podacima u tabelama baze podataka razvijena
je biblioteka klasa «LibDBAccess.jar» , koja se sastoji od nekoliko klasa:
NAZIV KLASE NAMENA KLASE
DBConnectionAccess Konekcija do baze podataka
DBTable Rad sa tabelom iz baze podataka
DBResultSet Rad sa resultsetom (memorijska kolekcija podataka) i modelom tabele
DBBTableList Rad sa listom tabela u bazi
DBOutputFile Exportovanje podataka iz tabele, odnosno resultseta u TXT i XML
24
NAZIV KLASE NAZIV METODE NAMENA METODE
DBConnectionAccess openConnection Otvaranje konekcije
closeConnection Zatvaranje konekcije
DBTable saveDataChange Snimanje promena nad podacima; dodavanje, izmena,
brisanje u skladu sa SQL naredbom
getRecords Vraća ResultSet na osnovu SQL naredbe
DBResultSet getRowCount Vraća ukupan broj redova ResultSet-a
getColumnNamesArrayList Vraća ArrayList sa nazivima kolona ResultSet-a
getColumnNames Vraća niz Stringova sa nazivima kolona ResultSet-a
getDataRow Vraća jedan red podataka u odnosu na redni broj reda
getFirstDataRow Vraća prvi red podataka
getTableModel Vraća model tabele potreban za kreiranje grida (JTable)
DBBTableList setTableList Cita nazive tabela iz baze i postavlja u uredjenu listu
addTable Kreira novu tabelu u bazi podataka, a naziv postavlja u listu
deleteTable Briše tabelu iz baze podataka
getTableList Prikazuje spisak naziva tabela iz baze podataka
DBOutputFile TXT Kreira txt fajl na osnovu sadržaja tabele
XML Kreira XML fajl na osnovu sadržaja tabele
writeLine Ispisuje jedan red sadržaja u fajlu
removeExtension Otklanja ekstenziju u nazivu fajla
getTimeStamp OdreĊuje vreme povodom snimanja ovog podatka u fajlu
Pored ovih klasa, formirana je još jedna klasa, koja predstavlja interfejs cele ove biblioteke u odnosu na korišćenje navedenih klasa.
Ova klasa se zove DBInterface. Namena ove klase je da pojednostavi upotrebu pojedinaĉnih klasa, odnosno da skrati i sakrije kod
koji se odnosi na podešavanje osobina preostalih klasa i na taj naĉin obezbedi jednostavniji i brži pristup i korišćenje biblioteke.
Naravno, ova klasa ne mora biti sastavni deo navedene biblioteke klasa, već može biti postavljena u okviru samostalne biblioteke
klasa – interfejs klase – gde bi se izvršilo povezivanje sa prethodno navedenim klasama.
NAZIV KLASE NAZIV METODE NAMENA METODE
DBInterface DajModelTabele Vraća model tabele, potreban za tabelarni prikaz podataka u
korisniĉkom interfejsu
DajPodatke Vraća resultset sa traženim podacima u skladu sa prethodno
datim SQL upitom
Snimi Snima promene u bazi podataka, koje se odnose na SQL
upit koji je prethodno dat – unos, izmenu ili brisanje
podataka
DajBrojSlogova Daje ukupan broj slogova, tj. Redova tabele, odnosno
resultseta koji je definisan na osnovu prethodno
prosledjenog SQL upita
Prethodno navedene klase i njihove veze mogu se predstaviti sledećim dijagramom:
0..1
0..*
0..1
0..*
0..1
0..*
0..1
0..*
0..1
0..*
DBConnectionAccess
DBTableDBResultSet
DBTableList
DBOutputFile
DBInterface
REALIZUJU
Dijagram klasa – tehnološke klase
Na ovom dijagramu izostavljeni su atributi i metode. Odnosi Dbinterface prema ostalim klasama su:
1. Asocijacija – strukturna veza – privatni atributi DBInterface su objekti navedenih ostalih klasa
2. Dependency – u zaglavlju procedura javljaju se kao parametri
25
3. Realizacija – funkcionalnost ovih klasa realizuje deo funkcionalnosti klase DBInterface pozivanjem odgovarajućih metoda
KORISNIĈKI INTERFEJS I KLASE PREZENTACIONOG SLOJA
Na osnovu analize zahteva problema i modela softvera datog u prethodnom odeljku, odreĊena je struktura glavnog menija
aplikacije:
SIFARNICI RUKOVODILAC SEKRETAR ZAPOSLENI PROGRAM
Zaposleni --
>>
Projekat -->> Štampanje ugovora Aktuelni projekat -->> Pomoć
Projekat --
>>
Ugovor -->> Štampanje radnog
naloga
Novi projekat -->> O autoru
Radni nalog -->> Štampanje izveštaja o
realizaciji projekta
Završeni projekat -->> Izlaz
Realizovana aktivnost -->>
-->> stavka menija koja ima podstavke
Kompletan spisak stavki menija sa vrstama ekrana koje otvara je dat u nastavku:
STAVKA PODSTAVKA 1.nivo PODSTAVKA
2. nivo
TIP FORME -
FUNKCIONALNOSTI
ŠIFARNICI ZAPOSLENI Radno mesto Spisak
Zvanje Spisak
Rukovodeca uloga Spisak
Zaposleni Spisak
PROJEKAT Radna uloga na projektu Spisak
Oblast projekta Spisak
Nivo kvaliteta Spisak
RUKOVODILAC PROJEKAT Aktuelni projekti koje vodi Spisak
Prikaz podataka o odabranom projektu Filter, Analiticki prikaz
Unos podataka o novom projektu Unos
Spisak realizovanih naloga odabranog projekta Filter, Spisak
Unos podataka o završetku projekta Filter, Analiticki prikaz,
Izmena
Završeni projekti koje je vodio Spisak
UGOVOR Realizovani nalozi zaposlenog na dosadašnjim
projektima
Filter, Spisak
Angažovani zaposleni na odabranom projektu Filter, Spisak
Unos novog ugovora za odabrani projekat Unos
RADNI NALOG Unos novog radnog naloga Unos
Prikaz rezultata realizacije odabranog radnog naloga Filter, Spisak
Unos podataka o kvalitetu realizacije radnog naloga Filter, Analiticki prikaz,
Izmena
REALIZOVANA
AKTIVNOST
Realizovane aktivnosti odabranog projekta Filter, Spisak
SEKRETAR - Stampanje ugovora NIJE PODRZANO
Stampanje radnog naloga NIJE PODRZANO
Stampanje izvestaja o realizaciji projekta NIJE PODRZANO
ZAPOSLENI AKTUELNI
PROJEKAT
PROJEKAT
Aktuelni projekti zaposlenog Spisak
Prikaz podataka o odabranom projektu Filter, Analiticki prikaz
RADNI NALOG
Opis zaduzenja zaposlenog na odabranom projektu Filter, Analiticki prikaz
Radni nalozi zaposlenog Spisak
Unos podataka o realizaciji aktivnosti Unos
Unos podataka o zavrsetku radnog naloga Filter, Analiticki prikaz,
Izmena
NOVI PROJEKAT Prikaz novih projekata Spisak
Unos podataka o ucescu na projektu Filter, Analiticki prikaz,
Izmena
ZAVRŠENI
PROJEKAT
Prikaz zavrsenih projekata zaposlenog Spisak
26
Tipovi formi i njihov opis dat je u nastavku:
TIP FORME OPIS
Login Forma za prijavu korisnika
Glavna Glavni meni aplikacije
Spisak Tabelarni prikaz – podaci u skladu sa modelom tabele koji se prosleĊuje formi
Analiticki
prikaz
Prikaz podataka jednog reda-sloga tabele ili odabranih polja resultseta, u skladu sa prethodnim filterom
Unos Unos novih podataka
Izmena Pristup vrednostima putem filtera i analitickog prikaza, a zatim unos novih vrednosti.
Filter Naziv polja i vrednost, pokretanje akcije prikaza analiticki ili tabelarno rezultata filtriranja
Analiza ulazno-izlaznih podataka za pojedine tipove formi, kao i njihova meĊuzavisnost prikazana je u nastavku. U nastojanju da se
postigne maksimalna kohezija i minimalna adhezija sa drugim slojevima višeslojnog pristupa, ekranske forme su «osloboĊene
programskog koda» koji se odnosi na konkretnu semantiku problema. Ekranske forme predstavljaju «ljusku» koja se vezuje sa
konkretnim sadržajem.
TIP
FORME
ULAZNI
PODACI
(kod pokretanja)
IZLAZNI PODACI POKREČE
AKCIJE
ULAZNA
FORMA
IZLAZNA FORMA
Login - Korisniĉko ime
Šifra
Definiše (profil)
tekućeg korisnika
Uĉitava glavni meni
- Glavna
Glavna Korisnik Izabrana stavka menija Otvara druge forme Login Druge forme, na osnovu
izbora stavke menija
Spisak
(Tabelarni
prikaz)
Model tabele Selektovan red
(opciono)
Selekcija reda tabele
(opciono)
Glavna forma Analitiĉki prikaz
Tabelarni (filtrirani)
prikaz
(opciono)
Analiticki
prikaz
Niz Polja, Niz
Vrednosti
- Izmena Filter
Tabelarni prikaz
Glavna forma
Unos Niz Polja Niz Vrednosti Snimanje unetih
vrednosti
Glavna forma Glavna forma
Izmena Niz Polja, Niz Starih
vrednosti
Niz Novih vrednosti Snimanje izmenjenih
vrednosti
Glavna forma Glavna forma
Filter Polje kriterijum Vrednost kriterijum Analiticki prikaz
Tabelarni (filtrirani)
prikaz
Glavna forma Analiticki prikaz
Tabelarni (filtrirani)
prikaz
Opis naĉina implementacije pojedinih tipova formi:
Ekranske forme realizovane su kao univerzalne, odnosno nezavisne od konkretne semantike. Potpuna nezavisnost
semantike postignuta je uvoĊenjem pratećih klasa koje se instanciraju zajedno sa pokretanjem formi i omogućavaju ulazna
podešavanja forme, a takoĊe i preuzimanje vrednosti koje su unete na formama.
Na narednom dijagramu prikazana je veza formi i pratećih klasa koje ih opslužuju, odnosno obezbeĊuju mogućnosti ulazno
izlazne operacije i na taj naĉin forme ne zavise od konkretne semantike.
27
Dijagram klasa – forme korisniĉkog interfejsa i klase prezentacionog sloja
28
DIJAGRAMI SEKVENCI
Dijagram sekvenci prikazuje tok izvršavanja pojedinaĉnog sluĉaja korišćenja kroz opis objekata klasa koje uĉestvuju u realizaciji
sluĉaja korišćenja i opis meĊusobnih poziva metoda tih klasa (poruke). Za svaki sluĉaj korišćenja potrebno je prikazati dijagram
sekvenci kojim se ilustruje naĉin implementacije i funkcionisanja klasa u realizaciji zahteva odgovarajućeg sluĉaja korišćenja.
TakoĊe, za jedan sluĉaj korišćenja može biti više dijagrama sekvenci – u odnosu na mogućnost postojanja više scenarija toka
aktivnosti (action steps), odnosno mogućnosti alternativnih (sekundarnih) scenarija naĉina izvršavanja toka aktivnosti sluĉaja
korišćenja. Dakle, preduslov izrade dijagrama sekvenci je:
1. dijagram sluĉajeva korišćenja
2. specifikacija svakog od sluĉaja korišćenja, koja sadrži tok aktivnosti, preduslove, postuslove, taĉke proširenja, obradu
izuzetaka itd. Radi se strukturiranim tekstualnim prikazom uz prateći dijagram aktivnosti (activity dijagram).
3. podskup skupa klasa koje uĉestvuju u implementaciji sluĉaja korišćenja (podšema dijagrama klasa).
U ovom radu izostavićemo specifikaciju sluĉajeva korišćenja. Naravno, zbog velikog obima, neće biti predstavljeni svi sluĉajevi
korišćenja, odnosno svi dijagrami sekvenci, već samo odabrani, kojim se ilustruje korišćenje objekata klasa raznih slojeva, u svrhu
realizacije jednog sluĉaja korišćenja u programu. Na ovaj naĉin, prethodni prikaz dijagrama klasa dobija svoj oblik integracije i
jasniju sliku naĉina meĊusobnih veza i upotrebe u dinamiĉkom smislu – u toku izvršavanja aktivnosti realizacije sluĉaja korišćenja.
Na dijagramima sekvenci je, radi preglednosti, izostavljen prikaz poziva objekata biblioteke klasa LibDBAccess koja neposredno
izvršava operacije sa podacima, posredstvom klase DBInterface. Veza klasa LibApp sa klasama LibAccess je neposredno povezana
radi realizacije svih potrebnih operacija. Naĉin njigove povezanosti može se videti iz listinga programskog koda realizacije klasa
biblioteke klasa LibApp.
Naredni dijagrami sekvenci ilustruju sledeće sluĉajeve korišćenja i scenarija:
EKRANSKA FORMA SLUČAJ KORIŠĆENJA I SCENARIO
Forma - LOGIN prijava na sistem – primarni scenario (regularan rad)
Forma – LOGIN prijava na sistem - sekundarni scenario (nisu uneti korektni podaci)
Forma – TABELARNI PRIKAZ tabelarni prikaz svih podataka, bez filtera
Forma – FILTER
Forma – TABELARNI PRIKAZ
filtriranje podataka i tabelarni prikaz rezultata
Forma – FILTER
Forma – ANALITICKI PRIKAZ
filtriranje podataka i pojedinaĉni (analitiĉki) prikaz rezultata
Forma – UNOS unos novih podataka, scenario: uspešno snimanje
Forma – IZMENA Izmena (dopuna) podataka, scenario: uspešno snimanje
29
Dijagram sekvenci – PRIJAVA NA SISTEM – primarni scenario
30
Dijagram sekvenci – PRIJAVA NA SISTEM – sekundarni scenario (nisu uneti korektni podaci)
31
DIJAGRAM SEKVENCI – tabelarni prikaz podataka
32
DIJAGRAM SEKVENCI – filtriranje podataka i tabelarni prikaz
33
DIJAGRAM SEKVENCI – filtriranje podataka i analitiĉki prikaz
34
DIJAGRAM SEKVENCI – unos novih podataka – scenario: uspešno snimanje
35
DIJAGRAM SEKVENCI – izmena (dopuna) podataka – scenario: uspešno snimanje
36
KORISNIČKO UPUTSTVO
UPUTSTVO ZA INSTALACIJU
Da bi se mogao koristiti program, potrebno je instalirati odgovarajuću softversku podršku. To možemo uĉiniti na jedan od 2
osnovna naĉina:
1. instalacija JRE(Java Runtime) i JDK (Java Development Kit).
2. instalacija Application Servera, koji ukljuĉuje JRE i JDK podršku.
Na pratećem CD-u u okviru foldera «Instalacije» nalaze se odgovarajući EXE fajlovi koji predstavljaju instalaciju programske
podrške za oba navedena pristupa.
UPUTSTVO ZA KORIŠĆENJE
Pokretanje programa, koji predstavlja fajl sa ekstenzijom *jar, može se izvršiti na nekoliko naĉina, koji zavise od odabira naĉina
instalacije softverske podrške.
1. ukoliko je instaliran samo JRE i JDK:
java -jar "c:\Program\EvidencijaObavezaDesk.jar"
Navodimo kompletnu putanju fajla «*.jar» koji se odnosi na korisniĉki interfejs.
2. ukoliko je instaliran Application Server, program se pokreće sa desktopa klikom na odgovarajuću ikonicu (koja predstavlja
preĉicu do fajla «EvidencijaObavezaDesk.jar”), ili duplim klikom na JAR fajl programa iz odgovarajućeg programa fajl menadžera
ili direktno iz foldera gde se jar nalazi (dist podfolder sadrži verziju za distribuciju - isporuku).
Nakon pokretanja dobijamo formu za prijavljivanje korisnika pomoću korisniĉkog imena i šifre.
Ekran za prijavu korisnika
Nakon unosa ispravnih podataka, uĉitava se glavni meni aplikacije, u skladu sa profilom korisnika i njegovim ovlašćenjima.
37
U zavisnosti od profila korisnika stavke menija su vidljive i mogu se koristiti. Struktura glavnog menija i opis svih stavki dat je u
delu rada pod nazivom KORISNICKI INTERFEJS.
U nastavku je dat prikaz pojedinih tipova formi i kratak opis naĉina pokretanja i korišćenja:
1. TABELARNI PRIKAZ (SPISAK) – izborom opcije sa menija otvara se direktno forma sa tabelarnim prikazom podataka
2. FILTER – izborom opcije menija otvara se forma za unos parametra filtera. Nakon izbora opcije prikazi podatke mogu se
podaci prikazati tabelarno ili analiticki, u zavisnosti od datog konteksta.
3. ANALITICKI PRIKAZ – nakon unosa podataka o vrednosti kriterijuma i izbora opcije prikazi podatke, ako je režim rada
analitiĉki prikaz, otvara se forma na kojoj će biti prikazani podaci na analitiĉki (pojedinaĉni red-slog podataka) naĉin.
38
4. UNOS – IZMENA – nakon izbora opcije menija, otvara se forma za unos ili izmenu podataka za odgovarajući kontekst.
Nakon izbora opcije snimi, podaci se snimaju u bazi podataka.
39
WEB APLIKACIJA
OPIS IMPLEMENTACIJE
Razvijena je web aplikacija koja se sastoji iz:
Klasa – prethodno kreirane klase biblioteke DB (tehnoloske klase – univerzalne klase za rad sa
podacima iz baze podataka)
JSP fajlova-stranica
Što se tiĉe mogućnosti koje pruža ova aplikacija, implementirane su sledeće osnovne funkcije:
Za svaku od navedenih osnovnih softverskih funkcija u nastavku je dat deo koda sa pratećim objašnjenjima.
LOGIN
Kljuĉni deo poĉetne stranice «login.jsp» ĉini html deo koda koji se odnosi na formu za unos podataka o sifri i
korisnickom imenu u text boxovima. Da bi se na osnovu ovih vrednosti prosledili parametri fajlu prijava.jsp
koja treba da proveri ove podatke, bitno je napomenuti da se treba postaviti form metod GET.
<FORM METHOD="GET" ACTION ="prijava.jsp">
<table border="0" >
<tr>
<td align="left"><font face="Verdana" size="2">Korisniĉko ime:</font></td>
<td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="UserName"></font></td>
</tr>
<tr>
<td align="left"><font face="Verdana" size="2">Šifra:</font></td>
<td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="Password"></font></td>
</tr>
</table>
<blockquote>
<blockquote>
<font face="Verdana" size="1">
<INPUT TYPE="submit" VALUE="Potvrdi"><INPUT TYPE="reset" VALUE="Ponisti">
</font>
</blockquote>
</blockquote>
</FORM>
Na ovaj naĉin nakon pritiska na taster «Potvrdi» zapravo se poziva:
http://localhost:8080/Obaveze/prijava.jsp?UserName=lkazi,Password=aaa
40
Zadatak fajla prijava.jsp je da proveri podatke o korisniku i preusmeri ucitavanje odgovarajucih stranica.
<%@ page import="DB.DBInterface" %>
<%@ page import="DB.DBResultSet" %>
<%@ page import="java.sql.ResultSet" %>
<html>
<head><title>EVIDENCIJA OBAVEZA - prijava korisnika</title></head>
<META http-equiv=Content-Type content="text/html; charset=windows-1250">
<LINK REL="STYLESHEET" TYPE="TEXT/CSS" HREF="design/style.css">
<%
// CITANJE PROSLEDJENIH VREDNOSTI
String KorisnickoIme = request.getParameter("UserName");
String Sifra=request.getParameter("Password");
// PROVERA DA LI POSTOJI TAKAV KORISNIK
String UPIT="Select * from tipZaposleni where KorisnickoIme='" + KorisnickoIme + "' and Sifra='" + Sifra + "'";
DBInterface objDB = new DBInterface ("c:\\Evidencija.mdb", "tipZaposleni", UPIT);
int brojSlogova=objDB.DajBrojSlogova();
// AKO POSTOJI:
if (brojSlogova>0) {
response.sendRedirect("home.jsp?UserName=" + KorisnickoIme);
}
// AKO NE POSTOJI:
if (brojSlogova==0) { response.sendRedirect("neuspeh.jsp"); } %>
</body>
</html>
Bitan deo koda je importovanje (page import) klasa iz biblioteke DB koje su prethodno postavljene u WEB-
INF/classes folder. TakoĊe, bitan deo koda je ĉitanje prethodno prosleĊenog parametra naredbom
request.getParameter. Nakon toga, na uobiĉajeni naĉin se instanciraju i koriste klase, pa ukoliko postoji
korisnik sa datim podacima u bazi, vrši se redirekt (response.sendRedirect) na odgovarajuću jsp stranicu
home.jsp, odnosno neuspeh.jsp ukoliko je neuspesna prijava korisnika.
GLAVNI MENI
Forma sa glavnim menijem (home.jsp) se sastoji od nekoliko segmenata:
podaci o prijavljenom korisniku ĉitamo sa:
String KorisnickoIme = request.getParameter("UserName");%>
Prikazujemo sa:
<%=KorisnickoIme%>
opcija za odjavu – vraćamo na formu za login <A HREF="login.jsp" border="0"> <img src="design/LogOffBela.jpg" border="0"> </A>
meni – razne segmente stranice ukljuĉujemo iz drugih fajlova opcijom include <%@include file="design/meni.jsp" %>
glavni radni deo – menja se u zavisnosti od aktuelno izabrane opcije menija, na poĉetnoj formi je
dobrodošlica: <%@include file="dobrodoslica.jsp" %>
TABELARNI PRIKAZ – primer SPISAK RADNIH MESTA
1. Sa menija se poziva pojedinaĉna forma-stranica koja ima sliĉnu strukturu kao i glavni meni, s tim da se u
prostoru za prikaz dobrodošlice prikazuju konkretni rezultati obrade podataka. Pozivanje druge jsp stranice
prosleĊivanjem parametra radi se na sledeći naĉin: <A HREF="radnomesto.jsp?UserName=<%=KorisnickoIme%>"> Radno mesto </A>
2. jsp stranica koja predstavlja glavni radni deo obiĉno sadrži:
a. import klasa na poĉetku dokumenta
b.povezivanje sa izvorom podataka preko klase DBInterface DBInterface objDB = new DBInterface ("c:\\Evidencija.mdb", "tipRADNO_MESTO", "select * from tipRADNO_MESTO");
int brSlogova = objDB.DajBrojSlogova();
// PREUZIMANJE PODATAKA OD DB INTERFEJSA
ResultSet rsPodaci = objDB.DajPodatke();
// INICIJALIZACIJA KLASE DBResultSet ZA
// OSNOVNE OPERACIJE SA PODACIMA IZ RESULTSETA
DBResultSet objRs = new DBResultSet();
41
objRs.setResultSet(rsPodaci);
c. izvršavanje odgovarajućih operacija
d.prikaz rezultata // CITANJE ZAGLAVLJA
String[] zaglavlje= objRs.getColumnNames();
// CITANJE PRVOG REDA
String[] prviRed= objRs.getDataRow(0);
%>
<table border=1 align="center" bgcolor="white">
<tr>
<td width=160> <b><% out.println (zaglavlje[0]); %></b> </td>
<td width=170> <b><% out.println (zaglavlje[1]); %></b> </td>
</tr>
</table>
<table border=1 align="center" bgcolor="white">
<tr>
<td width=160> <% out.println (prviRed[0]); %> </td>
<td width=170> <% out.println (prviRed[1]); %> </td>
</tr>
</table>
<%
for (int brojPokusaja =1; brojPokusaja < objRs.getRowCount(); brojPokusaja++ ) {
String[] pomVrednosti=objRs.getDataRow(brojPokusaja);
%>
<table border=1 align="center" bgcolor="white">
<tr>
<td width=160> <% out.println (pomVrednosti[0]); %> </td>
<td width=170> <% out.println (pomVrednosti[1]); %> </td>
</tr>
</table>
FILTER – primer TABELARNI PRIKAZ AKTUELNIH PROJEKATA PRIJAVLJENOG
KORISNIKA
I kod filtriranja podataka koriste se ekranske forme stranica sliĉne strukture (npr. Aktprojekti.jsp). Glavni
radni deo stranice (npr. Spisakaktproj.jsp) izvršava se u okviru odgovarajuće JSP stranice koja se poziva sa
menija uz prosleĊivanje parametra poziva npr. «?UserName=radulov” Ovako prosleĊena vrednost
parametra se koristi u okviru SQL upita kojim se izdvajaju i prikazuju željeni podaci. Naravno, filter se može
zadavati i direktno sa forme, ali u ovom primeru se koristi indirektno prosleĊivanje putem korišćenja
pozivnog parametra.
Kljuĉna razlika izmeĊu tabelarnog prikaza svih podataka i tabelarnog prikaza filtriranih podataka je u
kreiranju SQL upita sa parametrom koji se prosleĊuje klasi DBInterface.
DBInterface objDB = new DBInterface ("c:\\Evidencija.mdb", "aPROJEKAT", "select OZNAKAPROJEKTA, NAZIVPROJEKTA, OPIS from aPROJEKAT,
tipZAPOSLENI WHERE aPROJEKAT.JMBG_RUKOVODIOCA=tipZAPOSLENI.JMBG and tipZAPOSLENI.KorisnickoIme='" + KorisnickoIme + "' AND
NOT(aPROJEKAT.DATUMZAVRSETKA<>NULL)");
Ovde treba napomenuti da je jsp stranica glavnog dela ekrana zapravo sastavni deo celine (koristi se include
file) tako da je promenljiva KorisnickoIme vec poznata sa glavne forme koja sadrži ovu radnu JSP stranicu,
tako da nema potrebe za dodatnim ĉitanjem parametra i uvoĊenjem novih promenljivih, već se koriste iste
promenljive.
ANALITIČKI PRIKAZ
Na primeru stranice filterproj.jsp koja predstavlja glavnu radnu stranicu za prikaz podataka o odabranom
projektu, koristi se istovremeni tabelarni prikaz svih podataka, forma sa mogućnošću unosa kriterijuma
filtriranja, a nakon izbora tastera Potvrdi prikazuje se u okviru iste stranice na dnu rezultat filtriranja – u ovom
sluĉaju to je samo jedan slog koji se može prikazati tabelarno, ali je preglednije – analitiĉki (vetikalni prikaz
pojedinaĉih labela sa nazivima polja i vrednostima pored).
<h2>Unesite oznaku projekta:</h2>
<form method="get">
<input type="text" name="oznakaprojekta" size="25">
<p></p>
<input type="submit" value="Potvrdi">
42
<input type="reset" value="Odustani">
</form>
<%
String IDprojekta = request.getParameter("oznakaprojekta");
if ( IDprojekta != null && IDprojekta.length() > 0 ) {
%>
<h2><font color="black">Uneta oznaka projekta: <%=IDprojekta%></font></h2>
<%
DBInterface objDB1 = new DBInterface ("c:\\Evidencija.mdb", "aPROJEKAT", "select OZNAKAPROJEKTA, NAZIVPROJEKTA, OPIS,
DATUMPOCETKAPROJEKTA, DATUMPLANIRANOGZAVRSETKA from aPROJEKAT where OZNAKAPROJEKTA='" + IDprojekta + "'");
ANALITIĈKI PRIKAZ PODATAKA: <font color="white"><b> ANALITIĈKI PRIKAZ </b></font>
<table border=1>
<tr><td width=160> <% out.println (zaglavlje1[0]);%></td> <td> <%out.println (prviRed1[0]); %> </td></tr>
<tr><td width=170> <% out.println (zaglavlje1[1]);%></td> <td> <% out.println (prviRed1[1]); %> </td></tr>
<tr><td width=170> <% out.println (zaglavlje1[2]);%></td> <td> <% out.println (prviRed1[2]); %> </td></tr>
<tr><td width=210> <% out.println (zaglavlje1[3]);%></td> <td> <% out.println (prviRed1[3]); %> </td></tr>
<tr><td width=250> <% out.println (zaglavlje1[4]);%></td> <td> <% out.println (prviRed1[4]); %> </td></tr>
</table>
UNOS
Kod realizacije unosa koriste se na primeru unosa novog projekta 4 JSP fajla:
1. unosprojekat.jsp – forma za unos podataka.
2. snimiprojekat.jsp – snimanje podataka u bazu i redirect na formu za obavestenje o uspesnosti
3. uspeh.jsp – ekran za obavestenje o uspesnosti, sadrzi uspehNoviProjekat.jsp kao deo
4. uspehNoviProjekat.jsp – deo ekrana za obavestenje o uspesnosti sa tekstom poruke
unosprojekat.jsp - Najvažniji deo koda je: <FORM METHOD="GET" ACTION ="snimiprojekat.jsp">
<table border="0" width="100%">
<tr>
<td align="left"><font face="Verdana" size="2"> Oznaka:</font></td>
<td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="Oznaka"></font></td>
</tr>
<tr>
<td align="left"><font face="Verdana" size="2"> Šifra oblasti:</font></td>
<td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="SifraOblasti"></font></td>
</tr>
<tr>
<td align="left"><font face="Verdana" size="2"> JMBG rukovodioca:</font></td>
<td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="JMBGrukovodioca"></font></td>
</tr>
<tr>
<td align="left"><font face="Verdana" size="2"> Naziv projekta:</font></td>
<td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="Nazivprojekta"></font></td>
</tr>
<tr>
<td align="left"><font face="Verdana" size="2"> Opis:</font></td>
<td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="Opis"></font></td>
</tr>
<tr>
<td align="left"><font face="Verdana" size="2"> Datum pocetka:</font></td>
<td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="DatumPocetka"></font></td>
</tr>
<tr>
<td align="left"><font face="Verdana" size="2"> Datum planiranog završetka:</font></td>
<td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="DatumPlaniranogZavrsetka"></font></td>
</tr>
<tr>
<td align="left"></td>
<td ><font face="Verdana" size="2"><INPUT TYPE="hidden" SIZE=21 NAME="KorisnickoIme" value=<%=KorisnickoIme%>></font></td>
</tr>
</table>
U ovom kodu je važno istaći da je realizovano oĉitavanje podataka o prijavljenom korisniku koje je potrebno
zbog kasnijeg rada sa korisniĉkim interfejsom nakon uspešnog snimanja podataka. Koristimo input type=
hidden jer se vrednost ne ĉita sa korisniĉkog interfejsa, već se oĉitava iz promenljive koja je prethodno dobila
vrednost.
43
Snimiprojekat.jsp – najvažniji deo koda:
PREUZIMANJE VREDNOSTI PROSLEDJENIH PARAMETARA
<% // preuzimanje vrednosti
String KorisnickoIme=request.getParameter("KorisnickoIme");
String Oznaka = request.getParameter("Oznaka");
String SifraOblasti = request.getParameter("SifraOblasti");
String JMBGrukovodioca = request.getParameter("JMBGrukovodioca");
String NazivProjekta = request.getParameter("Nazivprojekta");
String Opis = request.getParameter("Opis");
String DatumPocetka = request.getParameter("DatumPocetka");
String DatumPlaniranogZavrsetka = request.getParameter("DatumPlaniranogZavrsetka");
%>
REALIZACIJA UNOSA POSREDSTVOM KLASE DBINTERFACE
<%
String UPIT="INSERT INTO aPROJEKAT (OZNAKAPROJEKTA, SIFRAOBLASTI, JMBG_RUKOVODIOCA, NAZIVPROJEKTA, OPIS,
DATUMPOCETKAPROJEKTA, DATUMPLANIRANOGZAVRSETKA,
SIFRANIVOKVALITETA) VALUES ('" + Oznaka + "','" + SifraOblasti + "','" + JMBGrukovodioca + "','" + NazivProjekta + "','" + Opis + "','" + DatumPocetka +
"','" + DatumPlaniranogZavrsetka + "','NEP')";
DBInterface objDB = new DBInterface ("c:\\Evidencija.mdb", "aPROJEKAT", UPIT);
objDB.Snimi();
PROSLEDJIVANJE REDIRECT NA EKRAN USPEH RADI PRIKAZA PORUKE O USPESNOSTI
response.sendRedirect("uspeh.jsp?UserName=" + KorisnickoIme);
KORISNIČKO UPUTSTVO
U nastavku je dat opis uputstva za instalaciju i korišćenje implementirane web aplikacije.
UPUTSTVO ZA INSTALACIJU
Da bi se ova aplikacija mogla koristiti, potrebno je instalirati Web server koji omogućava izvršavanje JSP
stranica. Postupak instalacije i pripreme fajlova je sledeći:
1. Instalira se JRE
2. Instalira se JDK
3. Instalira se Apache Web server Tomcat
4. U folder webapps kreira se podfolder Obaveze
5. U root ovog foldera prekopiraju se JSP fajlovi
6. U okviru ovog foldera kreiraju se podfolderi i kopiraju odgovarajući fajlovi:
a. Design – sadrži CSS fajl, fajlove slika i pomoćnih menija
b. META-INF – sadrži fajl MANIFEST.MF
c. WEB-INF – sadrži podfolder classes, u kojem se nalazi podfolder sa nazivom paketa gde
pripadaju klase koje se koriste, a u okviru ovog podfoldera se nalaze fajlovi sa ekstenzijom
class, koji ĉine klase koje se koriste u realizaciji funkcionalnosti JSP stranica
UPUTSTVO ZA KORIŠĆENJE
Ukoliko je instaliran Web server, aplikacija se sa lokalnog raĉunara može pokrenuti iz Internet browsera, npr.
Internet Explorera pomoću sledeće URL adrese: http://localhost:8080/Obaveze/login.jsp, odnosno sa URL
adrese fakulteta http://www.tf.zr.ac.yu/Obaveze/login.jsp.
Nakon pokretanja JSP stranice dobijamo sledeći ekran:
44
Nakon prijave korisnika vrsi se provera korisnickog imena i sifre.
Ako je neuspesna prijava, sledeci ekran:
Ako je uspesno prijavljen korisnik, dobijamo sledeci ekran sa glavnim menijem:
45
Na glavnom meniju se nalaze podaci o prijavljenom korisniku, opcija za odjavu (LogOff – vraća na ekran za
prijavu korisnika) i stavke menija, kao linkovi ka preostalim delovima programa.
Izborom stavke menija „ŠIFARNICI” dobijamo sledeći ekran:
gde izborom podstavke menija koja se odnosi na konkretni šifarnik (u ovom sluĉaju „Radna mesta”) dobijamo
tabelarni prikaz podataka navedenog šifarnika:
46
Nakon izbora opcije: „RUKOVODILAC”, dobijamo sledeći ekran:
Izborom stavke menija „Aktuelni projekti” dobijamo aktuelne projekte prijavljenog korisnika u smislu
rukovoĊenja, tj. projekte na kojima je prijavljeni korisnik u ulozi rukovodioca.
47
Nakon izbora opcije „Odabrani projekat”, dobijamo sledeći ekran, sa spiskom svih projekata:
Nakon unosa oznake projekta, izdvajaju se podaci o izabranom projektu.
48
Nakon izbora opcije „Novi projekat” dobijamo formu za unos podataka o novom projektu:
49
Nakon unosa podataka, izbora opcije „Potvrdi” i snimanja podataka, prikazuje se sledeci ekran, sa porukom o
uspesnosti snimanja novih podataka.
50
ZAKLJUČAK
U ovom radu je obraĊen problem evidencije i praćenja realizacije obaveza, odnosno aktivnosti nastavnog
osoblja fakulteta, sa stanovišta modelovanja i implementacije softverske podrške. Razvijena je desktop
aplikacija višeslojne softverske arhitekture, pri ĉemu je korišćen alat NetBeans 6.5 kao razvojno okruženje.
Korišćena je MS Access2000 baza podataka. TakoĊe, razvijena je i web aplikacija, koristeći klase koje su
razvijene u toku implementacije desktop aplikacije.
Budući pravci razvoja obuhvataju:
1. kreiranje i konektovanje na MySQL i druge baze podataka
2. realizaciju generisanja reporta, radi omogućavanja štampe dokumenata (npr. Korišćenjem freeeware
alata «iReport» ili formiranjem html dokumenta koji bi se štampao iz browsera).
PRILOG
SADRŢAJ PRATEĆEG CD-a
FOLDER FAJL-FOLDER ALAT-FORMAT NAMENA
- Seminarski rad.doc MSWord 2002 Dokument seminarskog rada
Java Windows aplikacija Dijagrami Power Designer 6
Sybase Power Designer 10 UML dijagrami
Generisani kod Java Generisan Java kod entity klasa iz
Power Designera
Implementacija Java
Install exe Instalacija razvojnog okruženja i
potrebnih runtime biblioteka klasa
Materijal Pdf eBooks
Java Web aplikacija Install Instalacija Web servera i potrebnih
runtime biblioteka klasa
JSP aplikacija Java Klase i jsp fajlovi
51
LISTING PROGRAMSKOG KODA
U nastavku je dat listing programskog koda:
Biblioteka klasa LibDBAccess
Biblioteka klasa LibApp
Korisniĉki interfejs aplikacije «EvidencijaObavezaApp» (izostavljen je automatski generisan kod)
Programski kod najvažnijih JSP fajlova web aplikacije «Obaveze»
PROGRAMSKI KOD BIBLIOTEKE «LibDBAccess» package DB; /** * * @author ljubica */ import javax.swing.table.DefaultTableModel; import java.sql.ResultSet; public class DBInterface { private DBConnectionAccess konekcija; private DBTable tabela; private DBResultSet DBrs; private String nazivTabele; private String SQLUpit; // konstruktor public DBInterface (String putanjaBaze, String pomNazivTabele, String pomSQLUpit) throws Exception { nazivTabele = pomNazivTabele; SQLUpit = pomSQLUpit; konekcija = new DBConnectionAccess(putanjaBaze,"", ""); konekcija.openConnection(); tabela = new DBTable(nazivTabele, konekcija.getConnection()); // DBrs= new DBResultSet(); } public DefaultTableModel DajModelTabele() throws Exception { DBrs.setResultSet(tabela.getRecords(SQLUpit)); return DBrs.getTableModel(); } public ResultSet DajPodatke() throws Exception { return tabela.getRecords(SQLUpit); } public void Snimi() throws Exception { tabela.saveDataChange(SQLUpit); } public int DajBrojSlogova() throws Exception { ResultSet rs = this.DajPodatke(); DBrs.setResultSet(rs); int brSlogova=DBrs.getRowCount(); return brSlogova; } } // ----------------------------------------------------------------------------------------------------------------------- package DB; /** * * @author ljubica */ import java.sql.Connection; import java.sql.DriverManager; public class DBConnectionAccess { private static String strDriver = ""; private static String strUserName=""; private static String strPassWord=""; private static Connection databaseConnection=null; // konstruktor public DBConnectionAccess(String putanjaBaze, String pomUserName, String pomPassWord) { strDriver = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + putanjaBaze ; // npr: "c:\\baza.mdb" strUserName=pomUserName; strPassWord=pomPassWord; }
52
public boolean openConnection () throws Exception { boolean zatvorena = true; boolean otvorena= false; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //ucitavanje drajvera za pristup bazi preko ODBC databaseConnection = DriverManager.getConnection(strDriver, strUserName, strPassWord); } catch (Exception ex) { System.out.println("Greska getConnection je:" + ex); } zatvorena = databaseConnection.isClosed(); otvorena= !zatvorena; return otvorena; } public Connection getConnection() throws Exception { return databaseConnection; } public boolean closeConnection() throws Exception { databaseConnection.close(); return databaseConnection.isClosed(); } } // ----------------------------------------------------------------------------------------------------------------------- package DB; /** * * @author ljubica */ import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; public class DBTable { private String strTableName = ""; private Connection databaseConnection; // constructor public DBTable (String pomTable, Connection pomConnection) { this.strTableName = pomTable; this.databaseConnection = pomConnection; } public void saveDataChange (String strActiveSQL) throws Exception // izvrsava aktivne sql upite tipa insert, update i delete { Statement s = databaseConnection.createStatement(); s.execute(strActiveSQL); // aktivan SQL tipa insert, update ili delete s.close(); } public ResultSet getRecords (String SQLselect) throws Exception // = DajPodatke,izdaje rezultat u obliku resultseta na osnovu sql select naredbe { ResultSet pomRez; Statement Izraz; Izraz =databaseConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); // // podesavamo osobine resultseta, da bismo mogli da radimo sa dobijenim podacima fleksibilno pomRez= Izraz.executeQuery(SQLselect); return pomRez; } } // ---------------------------------------------------------------------------------------------------------------- package DB; /** * * @author ljubica */ import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.ArrayList; import javax.swing.table.DefaultTableModel; public class DBResultSet { private ResultSet rs; public void setResultSet(ResultSet pomRS) { rs = pomRS; } public int getRowCount() throws Exception { int pomBR=0; boolean uspeh;
53
// // pozicioniramo se na prvi red uspeh=rs.first(); // sad smo na prvom, pa se moze raditi if (uspeh==true) { pomBR=1; // ukupan broj slogova je 1, kada je na prvom while (rs.isLast()==false) { pomBR++; rs.next(); } } else { pomBR=0; // ako je uspeh=false, znaci nema slogova, prazan je! }; return pomBR; } public ArrayList<String> getColumnNamesArrayList() throws Exception { // iz resultseta izdvaja zaglavlje, tj. nazive kolona i stavlja u ArrayList stringova ResultSetMetaData metaData; ArrayList<String> ALista = new ArrayList<String>(); String nazivKolone=""; int i,max; metaData = rs.getMetaData(); max = metaData.getColumnCount(); //get the column names for(i=0;i<max;i++) { nazivKolone=metaData.getColumnLabel(i+1); //adjust for meta data index start at 1 ALista.add(nazivKolone); } return ALista; } public String[] getColumnNames() throws Exception { ResultSetMetaData metaData; String[] pomListaNaziva =null; String nazivKolone=""; String naziviKolona=""; String strIzmedju = ":"; // simbol koji se koristi da odvoji string konstante, // a kasnije se koristi u split int i,max; //boolean uslov; // metaData = rs.getMetaData(); max = metaData.getColumnCount(); //get the column names for(i=0;i<max;i++) { nazivKolone=metaData.getColumnLabel(i+1); //adjust for meta data index start at 1 naziviKolona= naziviKolona + nazivKolone; naziviKolona= naziviKolona + strIzmedju; } // napravljeni string kojem su delovi odvojeni sa : sada se od njega pravi String[] pomListaNaziva= naziviKolona.split(strIzmedju); return pomListaNaziva; } // ------------------------------------------------ // CITANJE I PRIPREMA PODATAKA IZ resultseta // ------------------------------------------------ public String[] getDataRow(int RBSloga) throws Exception { String ceoRow=""; String[] vrednostiRow = null; boolean uspeh=false; int pomRBSloga=0; boolean nadjen=false; // pozicioniramo se na prvi red uspeh=rs.first(); // sad smo na prvom, pa se moze raditi pomRBSloga=0; // prvi rb sloga je nulti // if (RBSloga!=0) { while ((rs.isLast()==false) && (nadjen==false)){ if (pomRBSloga==RBSloga) { nadjen=true; } else { pomRBSloga++; rs.next(); } } }
54
// preuzimamo zaglavlja resultseta, tj. nazive kolona String[] NaziviKolona =getColumnNames(); int brojKolona =NaziviKolona.length; // // preuzimamo vrednosti iz tekuceg reda String vrednost=""; int i; String nazivKolone; for (i=0; i<brojKolona; i++) { nazivKolone=NaziviKolona[i]; vrednost=rs.getString(nazivKolone); ceoRow= ceoRow + vrednost + ":"; } // izdvajamo niz stringova[] vrednostiRow = ceoRow.split(":"); // return vrednostiRow; } public Object[][] getFirstDataRow() throws Exception { String[] pomVrednosti1= getDataRow(0); Object[][] pomObj= {pomVrednosti1}; return pomObj; } public DefaultTableModel getTableModel() throws Exception { String[] pomS=this.getColumnNames(); Object[][] dataSM= this.getFirstDataRow(); // prvi red je 0 DefaultTableModel model = new DefaultTableModel(dataSM, pomS); int brojSlogova=this.getRowCount(); // if (brojSlogova>1) { for (int brojPokusaja =1; brojPokusaja < this.getRowCount(); brojPokusaja++ ) { String[] pomVrednosti=this.getDataRow(brojPokusaja); model.insertRow(brojPokusaja,pomVrednosti); } } return model; } } // ---------------------------------------------------------------------------------------------------------------- package DB; /** * * @author ljubica */ import java.sql.Connection; import java.sql.ResultSet; import java.sql.DatabaseMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.Vector; public class DBTableList { private Vector vecTables = new Vector(); private Connection databaseConnection; public DBTableList (Connection databaseConnection) throws SQLException { this.databaseConnection = databaseConnection; } public void setTableList () throws SQLException { ResultSet rsList; DatabaseMetaData dmd = databaseConnection.getMetaData(); rsList = dmd.getTables(null, null, "%", null); while (rsList.next()) { if (rsList.getString(4).equalsIgnoreCase("TABLE")) { vecTables.addElement(rsList.getString(3)); } } } public void addTable (String strTableName, String SQLcreateTable) throws Exception { try { Statement s = databaseConnection.createStatement(); s.execute(SQLcreateTable); // sql izraz tipa "create table..."
55
s.close(); vecTables.addElement(strTableName); } catch (SQLException ex) { throw new Exception("Greska kreiranja tabele: " + strTableName); } } public void deleteTable (String strTableName) throws Exception { try { Statement s = databaseConnection.createStatement(); s.execute("drop table " + strTableName); s.close(); vecTables.removeElement(strTableName); } catch (SQLException ex) { throw new Exception("Greska brisanja tabele: " + strTableName); } } public String[] getTableList () { String [] strTemp = new String[1]; strTemp[0] = "---"; if (vecTables.size() == 0) { return strTemp; } String[] strList = new String[vecTables.size()]; for (int i = 0; i < vecTables.size(); i++) { strList[i] = (String)vecTables.elementAt(i); } return strList; } } // ---------------------------------------------------------------------------------------------------------------------------- package DB; /** * * @author ljubica */ import java.sql.ResultSet; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import javax.swing.JOptionPane; import java.util.Calendar; import java.text.DecimalFormat; public class DBOutputFile { public static void TXT (ResultSet rsList, String strFile) throws Exception { strFile = removeExtension(strFile, ".txt"); try { BufferedWriter createDocument = new BufferedWriter(new FileWriter(strFile + ".txt")); String strLine = ""; int counter = 1; strLine = "Records from table: " + strFile; writeLine(strLine, createDocument); strLine = getTimeStamp(); writeLine(strLine, createDocument); createDocument.newLine(); while (rsList.next()) { strLine = "(" + counter + ") " + rsList.getString(1) + " [" + rsList.getInt(2) + "]"; writeLine(strLine, createDocument); counter++; } createDocument.close(); JOptionPane.showMessageDialog(null, "Records written successfully to\n" + System.getProperty("user.dir") + "\\" + strFile + ".txt", "Save", JOptionPane.INFORMATION_MESSAGE); } catch (IOException ex) { throw new Exception("Error writing file " + System.getProperty("user.dir") + "\\" + strFile + ".txt\nPlease check file permissions"); }
56
} public static void XML (ResultSet rsList, String strFile) throws Exception { strFile = removeExtension(strFile, ".xml"); try { BufferedWriter createDocument = new BufferedWriter(new FileWriter(strFile + ".xml")); String strLine = ""; int counter = 1; strLine = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"; writeLine(strLine, createDocument); createDocument.newLine(); strLine = "<!DOCTYPE conversions["; writeLine(strLine, createDocument); createDocument.newLine(); strLine = "\t<!ELEMENT " + strFile + " (title, year)>"; writeLine(strLine, createDocument); strLine = "\t\t<!ELEMENT title (#PCDATA)>"; writeLine(strLine, createDocument); strLine = "\t\t<!ELEMENT year (#PCDATA)>"; writeLine(strLine, createDocument); createDocument.newLine(); strLine = "]>"; writeLine(strLine, createDocument); createDocument.newLine(); strLine = "<!-- " + getTimeStamp() + " -->"; writeLine(strLine, createDocument); createDocument.newLine(); strLine = "<" + strFile + ">"; writeLine(strLine, createDocument); createDocument.newLine(); while (rsList.next()) { strLine = "\t<index>" + counter + "</index>"; writeLine(strLine, createDocument); strLine = "\t<title>" + rsList.getString(1) + "</title>"; writeLine(strLine, createDocument); strLine = "\t<year>" + rsList.getInt(2) + "</year>"; writeLine(strLine, createDocument); createDocument.newLine(); counter++; } strLine = "</" + strFile + ">"; writeLine(strLine, createDocument); createDocument.close(); JOptionPane.showMessageDialog(null, "Records written successfully to\n" + System.getProperty("user.dir") + "\\" + strFile + ".xml", "Save", JOptionPane.INFORMATION_MESSAGE); } catch (IOException ex) { throw new Exception("Error writing file " + System.getProperty("user.dir") + "\\" + strFile + ".xml\nPlease check file permissions"); } } private static void writeLine (String strLine, BufferedWriter createDocument) throws IOException { createDocument.write(strLine, 0, strLine.length()); createDocument.newLine(); } private static String removeExtension (String strFile, String strExt) { if (strFile.toLowerCase().endsWith(strExt.toLowerCase())) { strFile = strFile.substring(0, strFile.length() - 4); } return strFile; } private static String getTimeStamp () { Calendar calNow = Calendar.getInstance(); DecimalFormat decFormat = new DecimalFormat("00"); return "Last Updated " + decFormat.format(calNow.get(Calendar.DAY_OF_MONTH)) + "\\" + decFormat.format((calNow.get(Calendar.MONTH) + 1)) + "\\" + calNow.get(Calendar.YEAR) + " at " + decFormat.format(calNow.get(Calendar.HOUR_OF_DAY)) + ":" + decFormat.format(calNow.get(Calendar.MINUTE)); } }
PROGRAMSKI KOD BIBLIOTEKE «LibApp» package LApp;
57
/** * * @author ljubica */ public class AppHandler { //public static String putanja="c:\\Evidencija.mdb"; private String putanjaBaze="c:\\Evidencija.mdb"; public void setPutanjaBaze (String novaPutanja) { putanjaBaze=novaPutanja; } public String getPutanjaBaze() { return putanjaBaze; } } /*********************************************************************** * Module: Korisnik.java * Author: ljubica * Purpose: Defines the Class Korisnik ***********************************************************************/ package LApp; import DB.DBInterface; import java.sql.ResultSet; public class Korisnik { private java.lang.String JMBG; private java.lang.String Prezime; private java.lang.String Ime; private java.lang.String KorisnickoIme; private java.lang.String StatusUProgramu; public Korisnik(AppHandler app, String jmbg) { if (jmbg !="") { this.JMBG=jmbg; // preuzima iz tabele zaposleni ostala polja String NazivTabele="tipZaposleni"; String SQLUpit="select * from tipZaposleni where JMBG='" + jmbg + "'"; try { // trazimo da li postoji bar jedan zaposleni sa navedenim osobinama DBInterface dbinterfejs = new DBInterface(app.getPutanjaBaze(), NazivTabele, SQLUpit); int brojZaposlenih=dbinterfejs.DajBrojSlogova(); if (brojZaposlenih>0) { ResultSet rs= dbinterfejs.DajPodatke(); rs.first(); Prezime=rs.getString("PREZIME"); Ime=rs.getString("IME"); KorisnickoIme=rs.getString("KorisnickoIme"); StatusUProgramu=rs.getString("StatusUProgramu"); } else { }; } catch (Exception ex) { }; } else{ JMBG=""; Prezime=""; Ime=""; KorisnickoIme=""; StatusUProgramu=""; } } public java.lang.String getJMBG() { return JMBG; } //public void setJMBG(java.lang.String newJMBG) //{ // JMBG = newJMBG; //} public java.lang.String getPrezime() { return Prezime;
58
} //public void setPrezime(java.lang.String newPrezime) //{ // Prezime = newPrezime; //} public java.lang.String getIme() { return Ime; } //public void setIme(java.lang.String newIme) //{ // Ime = newIme; //} public java.lang.String getKorisnickoIme() { return KorisnickoIme; } //public void setKorisnickoIme(java.lang.String newKorisnickoIme) //{ // KorisnickoIme = newKorisnickoIme; //} public java.lang.String getStatusUProgramu() { return StatusUProgramu; } //public void setStatusUProgramu(java.lang.String newStatusUProgramu) //{ // StatusUProgramu = newStatusUProgramu; //} } /*********************************************************************** * Module: clsAnalitickiPrikaz.java * Author: ljubica * Purpose: Defines the Class clsAnalitickiPrikaz ***********************************************************************/ package LApp; import java.util.*; public class clsAnalitickiPrikaz { private int brojElemenata; private String[] nizPolja; private String[] nizVrednosti; private String naslov; public int getBrojElemenata() { return brojElemenata; } public void setBrojElemenata(int newBrojElemenata) { brojElemenata=newBrojElemenata; } public String[] getnizPolja() { return nizPolja; } ublic void setnizPolja(String[] newNizPolja) { nizPolja = newNizPolja; } public String[] getnizVrednosti() { return nizVrednosti; } public void setnizVrednosti(String[] newNizVrednosti) { nizVrednosti = newNizVrednosti; } public String getNaslov() { return naslov; } public void setNaslov (String newNaslov) { naslov= newNaslov; } } /*********************************************************************** * Module: clsFilter.java * Author: ljubica * Purpose: Defines the Class clsFilter ***********************************************************************/ package LApp;
59
import DB.DBInterface; import java.sql.ResultSet; public class clsFilter { private java.lang.String poljeKriterijum; private java.lang.String vrednostKriterijum; private String naslov; private String tipRezultata; private String nazivTabele; private String osnovniSQLUpit; private String natpisKriterijum; private String poljaRezultat; private int brojPolja; private String slozenUpit; private AppHandler app = new AppHandler(); public clsFilter(AppHandler app) { this.app=app; } public java.lang.String getPoljeKriterijum() { return poljeKriterijum; } public void setpoljeKriterijum(java.lang.String newPoljeKriterijum) { poljeKriterijum = newPoljeKriterijum; } public java.lang.String getVrednostKriterijum() { return vrednostKriterijum; } public void setvrednostKriterijum(java.lang.String newVrednostKriterijum) { vrednostKriterijum = newVrednostKriterijum; } public String getNaslov() { return naslov; } public void setNaslov(String newNaslov) { naslov= newNaslov; } public String getTipRezultata() { return tipRezultata; } public void setTipRezultata(String newTipRezultata) { tipRezultata= newTipRezultata; } public String getNazivTabele() { return nazivTabele; } public void setNazivTabele(String newNazivTabele) { nazivTabele= newNazivTabele; } public String getOsnovniSQLUpit() { return osnovniSQLUpit; } public void setOsnovniSQLUpit(String newOsnovniSQLUpit) { osnovniSQLUpit= newOsnovniSQLUpit; } public String getNatpisKriterijum() { return natpisKriterijum; } public void setNatpisKriterijum(String newnatpisKriterijum) { natpisKriterijum= newnatpisKriterijum; } public String getPoljaRezultat() { return poljaRezultat; } public void setPoljaRezultat(String newPoljaRezultat) { poljaRezultat= newPoljaRezultat;
60
} public int getBrojPolja() { return brojPolja; } public void setbrojPolja(int newbrojPolja) { brojPolja= newbrojPolja; } public String getSlozenUpit() { return slozenUpit; } public void setSlozenupit(String newSlozenUpit) { slozenUpit= newSlozenUpit; } public clsAnalitickiPrikaz DajAnalitickePodatke() { clsAnalitickiPrikaz objAnalitika=new clsAnalitickiPrikaz(); objAnalitika.setBrojElemenata(this.getBrojPolja()); // upis vrednosti u niz POLJA radi prikaza u labeli String[] NizPolja = new String[this.getBrojPolja()]; if (this.getPoljaRezultat().contains("*")) { // obraditi ovaj slucaj! // ne bi trebalo ni da se radi, jer onda uzima: prva 4 // ili prosledjuje na tabelarni prikaz - ne obradjuje analiticki } else { String strIzmedju=","; NizPolja= this.getPoljaRezultat().split(strIzmedju); } // upis vrednosti u niz vrednosti radi prikaza u text boxu String[] NizVrednosti = new String[this.getBrojPolja()]; String vrednost; String SQLfilter=this.getOsnovniSQLUpit(); if (slozenUpit.compareTo("DA")==0) { SQLfilter=this.getOsnovniSQLUpit() + " and " + this.getPoljeKriterijum() + "='" + this.getVrednostKriterijum() + "'"; } if (slozenUpit.compareTo("NE")==0) { SQLfilter=this.getOsnovniSQLUpit() + " where " + this.getPoljeKriterijum() + "='" + this.getVrednostKriterijum() + "'"; } try{ DBInterface pomDBInterfejs = new DBInterface(app.getPutanjaBaze(), nazivTabele, SQLfilter); ResultSet pomrs=pomDBInterfejs.DajPodatke(); pomrs.next(); for (int i=0; i<this.getBrojPolja(); i++) { vrednost = pomrs.getString(NizPolja[i]); NizVrednosti[i]= vrednost; } } catch (Exception ex) { } // objAnalitika.setnizPolja(NizPolja); objAnalitika.setnizVrednosti(NizVrednosti); objAnalitika.setNaslov(this.getNaslov()); return objAnalitika; } public clsTabelarniPrikaz DajTabelarnePodatke () { String SQLfilter=this.getOsnovniSQLUpit(); if (slozenUpit.compareTo("DA")==0) { SQLfilter=this.getOsnovniSQLUpit() + " and " + this.getPoljeKriterijum() + "='" + this.getVrednostKriterijum() + "'"; } else { SQLfilter =this.getOsnovniSQLUpit() + " where " + this.getPoljeKriterijum() + "='" + this.getVrednostKriterijum() + "'"; } clsTabelarniPrikaz objTabelarniPodaci = new clsTabelarniPrikaz(this.app, this.getNazivTabele(), SQLfilter); objTabelarniPodaci.setNaslov(this.getNaslov()); return objTabelarniPodaci; } } /*********************************************************************** * Module: clsIzmena.java * Author: ljubica * Purpose: Defines the Class clsIzmena ***********************************************************************/ package LApp; import DB.DBInterface; public class clsIzmena { private String[] nizPolja;
61
private String[] nizNazivaPolja; private String[] nizNovihVrednosti; private String[] nizStarihVrednosti; private String NazivTabele; private AppHandler app = new AppHandler(); // private String[] poljaKriterijum; private String[] vrednostiKriterijum; private int BrojPoljaKriterijum; public clsIzmena(AppHandler app, String nazivTabele) { this.app= app; this.NazivTabele= nazivTabele; } public String[] getPoljaKriterijum() { return poljaKriterijum; } public void setpoljaKriterijum(String[] newPoljaKriterijum) { poljaKriterijum = newPoljaKriterijum; } public String[] getVrednostiKriterijum() { return vrednostiKriterijum; } public void setvrednostiKriterijum(String[] newVrednostKriterijum) { vrednostiKriterijum = newVrednostKriterijum; } public int getBrojPoljaKriterijum() { return BrojPoljaKriterijum; } public void setBrojPoljaKriterijum(int newBrojPoljaKriterijum) { BrojPoljaKriterijum=newBrojPoljaKriterijum; } public String[] getnizPolja() { return nizPolja; } public void setnizPolja(String[] newNizPolja) { nizPolja = newNizPolja; } public String[] getnizNazivaPolja() { return nizNazivaPolja; } public void setnizNazivaPolja(String[] newNizNazivaPolja) { nizNazivaPolja = newNizNazivaPolja; } public String[] getnizStarihVrednosti() { return nizStarihVrednosti; } public void setnizStarihVrednosti(String[] newNizStarihVrednosti) { nizStarihVrednosti = newNizStarihVrednosti; } public String[] getnizNovihVrednosti() { return nizNovihVrednosti; } public void setnizNovihVrednosti(String[] newNizNovihVrednosti) { nizNovihVrednosti = newNizNovihVrednosti; } public boolean Snimi() { String SQLUpit=""; boolean uspeh=false; try { String kriterijum=""; String uslov=""; // for (int brojPokusaja =0; brojPokusaja <BrojPoljaKriterijum; brojPokusaja++ ) { uslov = poljaKriterijum[brojPokusaja] + "='" + vrednostiKriterijum[brojPokusaja] + "'"; if (brojPokusaja==0) { kriterijum = uslov; } else { if ((BrojPoljaKriterijum>1) & (brojPokusaja>0) & (brojPokusaja<BrojPoljaKriterijum)) {
62
kriterijum = kriterijum + " and " + uslov; } } System.out.println("uslov:" + uslov); System.out.println("kriterijum:" + kriterijum); } // // SQLUpit="UPDATE " + NazivTabele + " SET " + nizPolja[0] + "='" + nizNovihVrednosti[0] + "', " + nizPolja[1] + "='" + nizNovihVrednosti[1] + "', " + nizPolja[2] + "='" + nizNovihVrednosti[2] + "', " + nizPolja[3] + "='" + nizNovihVrednosti[3] + "', " + nizPolja[4] + "='" + nizNovihVrednosti[4] + "' where " + kriterijum; System.out.println("update upit:" + SQLUpit); DBInterface dbinterfejs = new DBInterface(app.getPutanjaBaze(),NazivTabele, SQLUpit); dbinterfejs.Snimi(); uspeh=true; } catch (Exception ex) { uspeh=false; } return uspeh; } } /*********************************************************************** * Module: clsLogin.java * Author: ljubica * Purpose: Defines the Class clsLogin ***********************************************************************/ package LApp; import DB.DBInterface; import java.sql.ResultSet; public class clsLogin { private java.lang.String KorisnickoIme; private java.lang.String Sifra; private AppHandler app = new AppHandler(); public clsLogin(AppHandler app) { this.app= app; } public java.lang.String getKorisnickoIme() { return KorisnickoIme; } public void setKorisnickoIme(java.lang.String newKorisnickoIme) { KorisnickoIme = newKorisnickoIme; } public java.lang.String getSifra() { return Sifra; } public void setSifra(java.lang.String newSifra) { Sifra = newSifra; } public boolean Prijava () { boolean uspeh= false; String NazivTabele="tipZaposleni"; String SQLUpit="select * from tipZaposleni where KorisnickoIme='" + KorisnickoIme + "' and Sifra='" + Sifra + "'"; try { // trazimo da li postoji bar jedan zaposleni sa navedenim osobinama DBInterface dbinterfejs = new DBInterface(app.getPutanjaBaze(), NazivTabele, SQLUpit); int brojZaposlenih=dbinterfejs.DajBrojSlogova(); if (brojZaposlenih>0) { //ResultSet rs= dbinterfejs.DajPodatke(); //rs.first(); //JMBGprijavljeni = rs.getString("JMBG"); //menuBar.setVisible(true); //mainPanel.setVisible(false); uspeh=true; } else { uspeh=false; }; } catch (Exception ex) { uspeh=false; }; return uspeh;
63
} public Korisnik DajKorisnika() { Korisnik aktivanKorisnik = null; // // citanje vrednosti iz baze String NazivTabele="tipZaposleni"; String SQLUpit="select * from tipZaposleni where KorisnickoIme='" + KorisnickoIme + "' and Sifra='" + Sifra + "'"; try { // trazimo da li postoji bar jedan zaposleni sa navedenim osobinama DBInterface dbinterfejs = new DBInterface(app.getPutanjaBaze(), NazivTabele, SQLUpit); int brojZaposlenih=dbinterfejs.DajBrojSlogova(); if (brojZaposlenih>0) { ResultSet rs= dbinterfejs.DajPodatke(); rs.first(); // instanciramo korisnika, da bude na raspolaganju aktivanKorisnik = new Korisnik(app, rs.getString("JMBG")); // za ostala polja osim JMBG je odgovoran Korisnik da ih obezbedi iz tabele Zaposleni // to je njegova interna stvar } else { }; } catch (Exception ex) { }; return aktivanKorisnik; } } /*********************************************************************** * Module: clsTabelarniPrikaz.java * Author: ljubica * Purpose: Defines the Class clsTabelarniPrikaz ***********************************************************************/ package LApp; import javax.swing.table.DefaultTableModel; import DB.DBInterface; public class clsTabelarniPrikaz { private DefaultTableModel model; private String naslov; private String nazivTabele; private String SQLUpit; //opciono private int selektovanired; private AppHandler app = new AppHandler(); // konstruktori public clsTabelarniPrikaz() { } public clsTabelarniPrikaz(AppHandler app, String nazivTabele, String SQLUpit) { this.app= app; this.nazivTabele= nazivTabele; this.SQLUpit= SQLUpit; FormirajModel(); } private void FormirajModel() { try { DBInterface pomDBInterfejs = new DBInterface(app.getPutanjaBaze(), nazivTabele, SQLUpit); model = pomDBInterfejs.DajModelTabele() ; } catch (Exception ex) { } } public DefaultTableModel getmodel() { return model; } public void setmodel(DefaultTableModel newModel) { model = newModel; } public int getselektovanired() { return selektovanired;
64
} public void setselektovanired(int newSelektovanired) { selektovanired = newSelektovanired; } public String getNaslov() { return naslov; } public void setNaslov(String newNaslov) { naslov=newNaslov; } public String getNazivTabele() { return nazivTabele; } public void setNazivTabele(String newNazivTabele) { nazivTabele=newNazivTabele; } public String getSQLUpit() { return SQLUpit; } public void setSQLUpit (String newSQLUpit) { SQLUpit= newSQLUpit; } public DefaultTableModel DajModelTabele (){ try { DBInterface pomDBInterfejs = new DBInterface(app.getPutanjaBaze(), nazivTabele, SQLUpit); model = pomDBInterfejs.DajModelTabele() ; } catch (Exception ex) { } return model; } } /*********************************************************************** * Module: clsUnos.java * Author: ljubica * Purpose: Defines the Class clsUnos ***********************************************************************/ package LApp; import DB.DBInterface; public class clsUnos { private String[] nizPolja; private String[] nizNazivaPolja; private String[] nizVrednosti; private String NazivTabele; private AppHandler app = new AppHandler(); public clsUnos(AppHandler app, String nazivTabele) { this.app= app; this.NazivTabele= nazivTabele; } public String[] getnizPolja() { return nizPolja; } public void setnizPolja(String[] newNizPolja) { nizPolja = newNizPolja; } public String[] getnizNazivaPolja() { return nizNazivaPolja; } public void setnizNazivaPolja(String[] newNizNazivaPolja) { nizNazivaPolja = newNizNazivaPolja; } public String[] getnizVrednosti() { return nizVrednosti; } public void setnizVrednosti(String[] newNizVrednosti) { nizVrednosti = newNizVrednosti; }
65
public boolean Snimi() { String SQLUpit=""; boolean uspeh=false; try { SQLUpit = "INSERT INTO " + NazivTabele + "(" + nizPolja[0] + "," + nizPolja[1] + "," + nizPolja[2] + "," + nizPolja[3] + "," + nizPolja[4] + "," + nizPolja[5] + "," + nizPolja[6] + ") VALUES ('"+ nizVrednosti[0] + "','" + nizVrednosti[1]+ "','" + nizVrednosti[2] + "','" + nizVrednosti[3] + "','" + nizVrednosti[4] + "','" + nizVrednosti[5] + "','" + nizVrednosti[6] + "')"; DBInterface dbinterfejs = new DBInterface(app.getPutanjaBaze(),NazivTabele, SQLUpit); dbinterfejs.Snimi(); uspeh=true; } catch (Exception ex) { uspeh=false; } return uspeh; } }
PROGRAMSKI KOD KORISNIČKOG INTERFEJSA APLIKACIJE «EvidencijaObavezaDesk»
/* * EvidencijaObavezaDeskApp.java */ package evidencijaobavezadesk; import org.jdesktop.application.Application; import org.jdesktop.application.SingleFrameApplication; import LApp.AppHandler; /** * The main class of the application. */ public class EvidencijaObavezaDeskApp extends SingleFrameApplication { /** * At startup create and show the main frame of the application. */ @Override protected void startup() { show(new EvidencijaObavezaDeskView(this)); // } /** * This method is to initialize the specified window by injecting resources. * Windows shown in our application come fully initialized from the GUI * builder, so this additional configuration is not needed. */ @Override protected void configureWindow(java.awt.Window root) { } /** * A convenient static getter for the application instance. * @return the instance of EvidencijaObavezaDeskApp */ public static EvidencijaObavezaDeskApp getApplication() { return Application.getInstance(EvidencijaObavezaDeskApp.class); } /** * Main method launching the application. */ public static void main(String[] args) { launch(EvidencijaObavezaDeskApp.class, args); } } // -------------------------------------------------------------------------------------------------------------------------------
66
/* * EvidencijaObavezaDeskView.java */ package evidencijaobavezadesk; import org.jdesktop.application.ResourceMap; import org.jdesktop.application.SingleFrameApplication; import org.jdesktop.application.FrameView; import org.jdesktop.application.TaskMonitor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Timer; import javax.swing.Icon; import java.awt.Color; // import LApp.AppHandler; import LApp.clsLogin; import LApp.Korisnik; import LApp.clsTabelarniPrikaz; import LApp.clsFilter; import LApp.clsUnos; import LApp.clsIzmena; /** * The application's main frame. */ public class EvidencijaObavezaDeskView extends FrameView { // globalna konstanta public AppHandler app= new AppHandler(); private Korisnik aktivanKorisnik=null; public String putanjaBaze=app.getPutanjaBaze(); public clsLogin objLogin = new clsLogin(app); public String JMBGprijavljeni = ""; // public EvidencijaObavezaDeskView(SingleFrameApplication app) { super(app); initComponents(); menuBar.setVisible(false); mainPanel.setVisible(true); } private void PrikaziMeni(String status){ if (status.compareTo("rukovodilac")==0) { jMenuSifarnici.setVisible(true); jMenuRukovodilac.setVisible(true); jMenuSekretar.setVisible(false); jMenuZaposleni.setVisible(true); } if (status.compareTo("sekretar")==0) { jMenuSifarnici.setVisible(false); jMenuRukovodilac.setVisible(false); jMenuSekretar.setVisible(true); jMenuZaposleni.setVisible(true); } if (status.compareTo("zaposleni")==0) { jMenuSifarnici.setVisible(false); jMenuRukovodilac.setVisible(false); jMenuSekretar.setVisible(false); jMenuZaposleni.setVisible(true); } } private void PrikaziFormuGrid (String naslov, String nazivTabele, String SQLUpit) { FormTabelarniPrikaz formaGrid; clsTabelarniPrikaz clsTabela= new clsTabelarniPrikaz(app,nazivTabele,SQLUpit); clsTabela.setNaslov(naslov); formaGrid=new FormTabelarniPrikaz(clsTabela); formaGrid.setVisible(true); } private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { FormAbout formaOAutoru; formaOAutoru=new FormAbout(); formaOAutoru.setTitle("O AUTORU"); formaOAutoru.setLocation(400, 200); formaOAutoru.setVisible(true); formaOAutoru.setBackground(Color.blue); } private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) { FormHelp formaPomoc; formaPomoc=new FormHelp(); formaPomoc.setTitle("O AUTORU"); formaPomoc.setLocation(400, 200); formaPomoc.setVisible(true); formaPomoc.setBackground(Color.BLUE);
67
} private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) { PrikaziFormuGrid ("TABELARNI PRIKAZ PODATAKA: radno mesto", "tipRADNO_MESTO", "select * from tipRADNO_MESTO"); } private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) { PrikaziFormuGrid("TABELARNI PRIKAZ PODATAKA: zvanje","tipZVANJE","select * from tipZVANJE"); } private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) { PrikaziFormuGrid("TABELARNI PRIKAZ PODATAKA: rukovodeca uloga","tipRUKOVODECA_ULOGA","select * from tipRUKOVODECA_ULOGA"); } private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) { PrikaziFormuGrid("TABELARNI PRIKAZ PODATAKA: zaposleni","tipZAPOSLENI","select * from tipZAPOSLENI"); } private void jMenuItem7ActionPerformed(java.awt.event.ActionEvent evt) { PrikaziFormuGrid("TABELARNI PRIKAZ PODATAKA: radna uloga","tipRADNA_ULOGA","select * from tipRADNA_ULOGA"); } private void jMenuItem8ActionPerformed(java.awt.event.ActionEvent evt) { PrikaziFormuGrid("TABELARNI PRIKAZ PODATAKA: oblast projekta","tipOBLAST_PROJEKTA","select * from tipOBLAST_PROJEKTA"); } private void jMenuItem9ActionPerformed(java.awt.event.ActionEvent evt) { PrikaziFormuGrid("TABELARNI PRIKAZ PODATAKA: nivo kvaliteta","tipNIVO_KVALITETA","select * from tipNIVO_KVALITETA" ); } private void jMenuItem14ActionPerformed(java.awt.event.ActionEvent evt) { String sqlUpit="select nazivprojekta, datumpocetkaprojekta, datumzavrsetka from aProjekat, aUgovor, tipZaposleni where tipZaposleni.JMBG=aUgovor.JMBG and aProjekat.oznakaprojekta=aUgovor.oznakaprojekta and not (datumzavrsetka<>null) and aUgovor.JMBG='" + aktivanKorisnik.getJMBG() + "';"; PrikaziFormuGrid("Aktuelni projekti zaposlenog:" + aktivanKorisnik.getPrezime() + " " + aktivanKorisnik.getIme(),"aPROJEKAT",sqlUpit); } private void jMenuItem34ActionPerformed(java.awt.event.ActionEvent evt) { PrikaziFormuGrid("Aktuelni projekti rukovodioca:" + aktivanKorisnik.getPrezime() + " " + aktivanKorisnik.getIme(),"aPROJEKAT","select NAZIVPROJEKTA, OPIS, DATUMPOCETKAPROJEKTA, DATUMPLANIRANOGZAVRSETKA from aPROJEKAT where JMBG_RUKOVODIOCA='" + aktivanKorisnik.getJMBG() + "' and not( DATUMZAVRSETKA<>null)"); } private void jMenuItem26ActionPerformed(java.awt.event.ActionEvent evt) { PrikaziFormuGrid("Zavrseni projekti rukovodioca:" + aktivanKorisnik.getPrezime() + " " + aktivanKorisnik.getIme(),"aPROJEKAT","select NAZIVPROJEKTA, OPIS, DATUMPOCETKAPROJEKTA, DATUMPLANIRANOGZAVRSETKA from aPROJEKAT where JMBG_RUKOVODIOCA='" + aktivanKorisnik.getJMBG() + "' and ( DATUMZAVRSETKA<>null)"); } private void jMenuItem35ActionPerformed(java.awt.event.ActionEvent evt) { // TABELARNI PRIKAZ //clsFilter objFilter= new clsFilter(app); //objFilter.setpoljeKriterijum("OZNAKAPROJEKTA"); //objFilter.setNatpisKriterijum("OZNAKA PROJEKTA"); //objFilter.setNaslov("PROJEKAT"); //objFilter.setTipRezultata("tabelarno"); //objFilter.setPoljaRezultat("*"); //objFilter.setbrojPolja(0); //objFilter.setNazivTabele("aPROJEKAT"); //objFilter.setOsnovniSQLUpit("select * from aPROJEKAT"); // // ANALITICKI PRIKAZ clsFilter objFilter= new clsFilter(app); objFilter.setSlozenupit("NE"); objFilter.setpoljeKriterijum("OZNAKAPROJEKTA"); objFilter.setNatpisKriterijum("OZNAKA PROJEKTA"); objFilter.setNaslov("PROJEKAT"); objFilter.setTipRezultata("analiticki"); objFilter.setPoljaRezultat("OZNAKAPROJEKTA,NAZIVPROJEKTA,OPIS,DATUMPOCETKAPROJEKTA"); objFilter.setbrojPolja(4); objFilter.setNazivTabele("aPROJEKAT"); objFilter.setOsnovniSQLUpit("select * from aPROJEKAT"); FormFilter formaFilter= new FormFilter(objFilter); formaFilter.setVisible(true); } private void jMenuItem13ActionPerformed(java.awt.event.ActionEvent evt) { clsUnos objUnos = new clsUnos(app, "aPROJEKAT"); String[] ListaPolja= new String[8]; String poljaStr="OZNAKAPROJEKTA,NAZIVPROJEKTA,OPIS,DATUMPOCETKAPROJEKTA,DATUMPLANIRANOGZAVRSETKA,SIFRAOBLASTI,JMBG_RUKOVODIOCA"; String strIzmedju=","; ListaPolja= poljaStr.split(strIzmedju); objUnos.setnizPolja(ListaPolja); // poljaStr="OZNAKA PROJEKTA,NAZIV PROJEKTA,OPIS,DATUM POCETKA PROJEKTA,DATUM PLANIRANOG ZAVRSETKA,SIFRA OBLASTI,JMBG RUKOVODIOCA"; ListaPolja= poljaStr.split(strIzmedju); objUnos.setnizNazivaPolja(ListaPolja); // FormUnos formaUnos = new FormUnos(objUnos); formaUnos.setTitle("UNOS PODATAKA - PROJEKAT");
68
formaUnos.setLocation(400, 200); formaUnos.setVisible(true); formaUnos.setBackground(Color.BLUE); } private void jMenuItem32ActionPerformed(java.awt.event.ActionEvent evt) { // clsFilter objFilter= new clsFilter(app); objFilter.setpoljeKriterijum("OZNAKAPROJEKTA"); objFilter.setNatpisKriterijum("OZNAKA PROJEKTA"); objFilter.setNaslov("ANGAZOVANO OSOBLJE NA PROJEKTU"); objFilter.setTipRezultata("tabelarno"); objFilter.setPoljaRezultat("*"); objFilter.setbrojPolja(0); objFilter.setNazivTabele("aUGOVOR"); objFilter.setSlozenupit("DA"); objFilter.setOsnovniSQLUpit("select aUGOVOR.OZNAKAPROJEKTA,tipZAPOSLENI.JMBG, tipZAPOSLENI.PREZIME, tipZAPOSLENI.IME, aUGOVOR.OPIS_ZADUZENJA,aUGOVOR.DATUMPOCETKAANGAZOVANJA from aUGOVOR,tipZAPOSLENI WHERE aUGOVOR.JMBG=tipZAPOSLENI.JMBG"); FormFilter formaFilter= new FormFilter(objFilter); formaFilter.setVisible(true); } private void jMenuItem36ActionPerformed(java.awt.event.ActionEvent evt) { // TABELARNI PRIKAZ clsFilter objFilter= new clsFilter(app); objFilter.setSlozenupit("NE"); objFilter.setpoljeKriterijum("OZNAKAPROJEKTA"); objFilter.setNatpisKriterijum("OZNAKA PROJEKTA"); objFilter.setNaslov("REALIZOVANI RADNI NALOZI PROJEKTA"); objFilter.setTipRezultata("tabelarno"); objFilter.setPoljaRezultat("*"); objFilter.setbrojPolja(0); objFilter.setNazivTabele("aRADNI_NALOG"); objFilter.setOsnovniSQLUpit("select OZNAKAPROJEKTA, OZNAKARADNOGNALOGA,OZNAKAUGOVORA,OPISZADUZENJA, DATUMZAVRSETKASVIHAKTIVNOSTI from aRADNI_NALOG"); // FormFilter formaFilter= new FormFilter(objFilter); formaFilter.setVisible(true); } private void jMenuItem29ActionPerformed(java.awt.event.ActionEvent evt) { clsIzmena objIzmena = new clsIzmena(app, "aPROJEKAT"); String[] ListaPolja= new String[8]; String poljaStr="OZNAKAPROJEKTA,SIFRANIVOKVALITETA,OPISREALIZOVANIHREZULTATA,OPISIZVRSENIHAKTIVNOSTI,DATUMZAVRSETKA"; String strIzmedju=","; ListaPolja= poljaStr.split(strIzmedju); objIzmena.setnizPolja(ListaPolja); // poljaStr="OZNAKA PROJEKTA,SIFRA NIVO KVALITETA,OPIS REALIZOVANIH REZULTATA,OPIS IZVRSENIH AKTIVNOSTI,DATUM ZAVRSETKA"; ListaPolja= poljaStr.split(strIzmedju); objIzmena.setnizNazivaPolja(ListaPolja); // String[] ListaStarihVrednosti; String vrednosti="-,-,-,-,-"; ListaStarihVrednosti= vrednosti.split(strIzmedju); objIzmena.setnizStarihVrednosti(ListaStarihVrednosti); // objIzmena.setBrojPoljaKriterijum(1); // String[] ListaPoljaKrit=new String[1]; ListaPoljaKrit[0]= "OZNAKAPROJEKTA"; objIzmena.setpoljaKriterijum(ListaPoljaKrit); // FormIzmena formaIzmena = new FormIzmena(objIzmena); formaIzmena.setTitle("UNOS PODATAKA - ZAVRSETAK PROJEKTA"); formaIzmena.setLocation(400, 200); formaIzmena.setVisible(true); formaIzmena.setBackground(Color.BLUE); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { objLogin.setKorisnickoIme(jKorisnickoIme.getText()); objLogin.setSifra(jSifra.getText()); boolean uspeh=objLogin.Prijava(); if (uspeh==true) { aktivanKorisnik= objLogin.DajKorisnika(); JMBGprijavljeni=aktivanKorisnik.getJMBG(); // u zavisnosti od statusa u programu,stavke menija se menjaju // odnosno nisu dostupne String status =aktivanKorisnik.getStatusUProgramu(); // privatna metoda PrikaziMeni(status); menuBar.setVisible(true);
69
mainPanel.setVisible(false); jTextStatus.setText("Uspesno prijavljen korisnik!"); } else { // ne prikazuje statusnu liniju jTextStatus.setText("Neuspesno prijavljivanje korisnika - nisu uneti korektni podaci!"); } } private void jMenuItem27ActionPerformed(java.awt.event.ActionEvent evt) { aktivanKorisnik=null; jKorisnickoIme.setText(""); jSifra.setText(""); menuBar.setVisible(false); mainPanel.setVisible(true); jTextStatus.setText(""); } private void jMenuItem22ActionPerformed(java.awt.event.ActionEvent evt) { String sqlUpit="select nazivprojekta, datumpocetkaprojekta, datumzavrsetka from aProjekat, aUgovor, tipZaposleni where tipZaposleni.JMBG=aUgovor.JMBG and aProjekat.oznakaprojekta=aUgovor.oznakaprojekta and (datumzavrsetka<>null) and aUGOVOR.JMBG='" + aktivanKorisnik.getJMBG() + "';"; PrikaziFormuGrid("Zavrseni projekti zaposlenog:" + aktivanKorisnik.getPrezime() + " " + aktivanKorisnik.getIme(),"aPROJEKAT",sqlUpit); } private void jMenuItem15ActionPerformed(java.awt.event.ActionEvent evt) { String sqlUpit="select nazivprojekta, aRadni_nalog.DatumPocetkaAngazovanja, aRadni_Nalog.OpisZaduzenja from aProjekat, aUgovor, aRadni_Nalog where aProjekat.OznakaProjekta=aUgovor.OznakaProjekta and aUgovor.OznakaUgovora=aRadni_nalog.Oznakaugovora and aUgovor.JMBG='" + aktivanKorisnik.getJMBG() + "'"; PrikaziFormuGrid("Radni nalozi zaposlenog:" + aktivanKorisnik.getPrezime() + " " + aktivanKorisnik.getIme(),"aPROJEKAT", sqlUpit); } private void jMenuItem21ActionPerformed(java.awt.event.ActionEvent evt) { String sqlUpit="select nazivprojekta, DATUMPOCETKAPROJEKTA, OPIS_ZADUZENJA from aProjekat, aUgovor where aProjekat.OznakaProjekta=aUgovor.OznakaProjekta and aUgovor.JMBG='" + aktivanKorisnik.getJMBG()+ "' and ((aUgovor.prihvaceno='NE') or not (aUgovor.prihvaceno<>null)) "; PrikaziFormuGrid("Potencijalni novi projekti zaposlenog:" + aktivanKorisnik.getPrezime() + " " + aktivanKorisnik.getIme(),"aPROJEKAT", sqlUpit); } private void jMenuItem33ActionPerformed(java.awt.event.ActionEvent evt) { clsFilter objFilter= new clsFilter(app); objFilter.setpoljeKriterijum("aUGOVOR.JMBG"); objFilter.setNatpisKriterijum("JMBG zaposlenog"); objFilter.setNaslov("DOSADASNJE ANGAZOVANJE ZAPOSLENOG"); objFilter.setTipRezultata("tabelarno"); objFilter.setPoljaRezultat("*"); objFilter.setbrojPolja(0); objFilter.setNazivTabele("aRADNI_NALOG"); objFilter.setSlozenupit("DA"); objFilter.setOsnovniSQLUpit("select aRADNI_NALOG.OZNAKAPROJEKTA, aRADNI_NALOG.OZNAKAUGOVORA, aRADNI_NALOG.OZNAKARADNOGNALOGA, aRADNI_NALOG.DATUMPOCETKAANGAZOVANJA, aRADNI_NALOG.DATUMZAVRSETKAANGAZOVANJA, aRADNI_NALOG.OPISZADUZENJA from aRADNI_NALOG, aUGOVOR WHERE aRADNI_NALOG.OZNAKAPROJEKTA=aUGOVOR.OZNAKAPROJEKTA and aRADNI_NALOG.OZNAKAUGOVORA=aUGOVOR.OZNAKAUGOVORA and realizovan='DA'"); FormFilter formaFilter= new FormFilter(objFilter); formaFilter.setVisible(true); } private void jMenuItem31ActionPerformed(java.awt.event.ActionEvent evt) { clsFilter objFilter= new clsFilter(app); objFilter.setpoljeKriterijum("OZNAKARADNOGNALOGA"); objFilter.setNatpisKriterijum("OZNAKA RADNOG NALOGA"); objFilter.setNaslov("REALIZOVANE AKTIVNOSTI RADNOG NALOGA"); objFilter.setTipRezultata("tabelarno"); objFilter.setPoljaRezultat("*"); objFilter.setbrojPolja(0); objFilter.setNazivTabele("aREALIZOVANA_AKTIVNOST"); objFilter.setSlozenupit("NE"); objFilter.setOsnovniSQLUpit("select DATUMIZVRSENJA, OPISIZVRSENEAKTIVNOSTI from aREALIZOVANA_AKTIVNOST"); FormFilter formaFilter= new FormFilter(objFilter); formaFilter.setVisible(true); } private void jMenuItem12ActionPerformed(java.awt.event.ActionEvent evt) { clsFilter objFilter= new clsFilter(app); objFilter.setpoljeKriterijum("OZNAKAPROJEKTA"); objFilter.setNatpisKriterijum("OZNAKA PROJEKTA"); objFilter.setNaslov("REALIZOVANE AKTIVNOSTI PROJEKTA"); objFilter.setTipRezultata("tabelarno"); objFilter.setPoljaRezultat("*"); objFilter.setbrojPolja(0); objFilter.setNazivTabele("aREALIZOVANA_AKTIVNOST"); objFilter.setSlozenupit("NE"); objFilter.setOsnovniSQLUpit("select DATUMIZVRSENJA, OPISIZVRSENEAKTIVNOSTI from aREALIZOVANA_AKTIVNOST"); FormFilter formaFilter= new FormFilter(objFilter); formaFilter.setVisible(true); }
70
private void jMenuItem16ActionPerformed(java.awt.event.ActionEvent evt) { clsFilter objFilter= new clsFilter(app); objFilter.setSlozenupit("NE"); objFilter.setpoljeKriterijum("OZNAKAPROJEKTA"); objFilter.setNatpisKriterijum("OZNAKA PROJEKTA"); objFilter.setNaslov("PROJEKAT"); objFilter.setTipRezultata("analiticki"); objFilter.setPoljaRezultat("OZNAKAPROJEKTA,NAZIVPROJEKTA,OPIS,DATUMPOCETKAPROJEKTA"); objFilter.setbrojPolja(4); objFilter.setNazivTabele("aPROJEKAT"); objFilter.setOsnovniSQLUpit("select * from aPROJEKAT"); FormFilter formaFilter= new FormFilter(objFilter); formaFilter.setVisible(true); } private void jMenuItem17ActionPerformed(java.awt.event.ActionEvent evt) { clsFilter objFilter= new clsFilter(app); objFilter.setpoljeKriterijum("OZNAKAPROJEKTA"); objFilter.setNatpisKriterijum("OZNAKA PROJEKTA"); objFilter.setNaslov("ZADUZENJA ZAPOSLENOG PO UGOVORU"); objFilter.setTipRezultata("analiticki"); objFilter.setSlozenupit("DA"); objFilter.setPoljaRezultat("JMBG,NAZIVRADNEULOGE,DATUMPOCETKAANGAZOVANJA,OPIS_ZADUZENJA"); objFilter.setbrojPolja(4); objFilter.setNazivTabele("aUGOVOR"); objFilter.setOsnovniSQLUpit("select JMBG,NAZIVRADNEULOGE,DATUMPOCETKAANGAZOVANJA,OPIS_ZADUZENJA from aUGOVOR, tipRADNA_ULOGA WHERE aUGOVOR.SIFRARADNEULOGE=tipRADNA_ULOGA.SIFRARADNEULOGE AND JMBG='" + aktivanKorisnik.getJMBG() + "'"); FormFilter formaFilter= new FormFilter(objFilter); formaFilter.setVisible(true); } private void jMenuItem10ActionPerformed(java.awt.event.ActionEvent evt) { clsUnos objUnos = new clsUnos(app, "aUGOVOR"); String[] ListaPolja= new String[8]; String poljaStr="OZNAKAPROJEKTA,OZNAKAUGOVORA,JMBG,SIFRARADNEULOGE,DATUMPOCETKAANGAZOVANJA,DATUMZAVRSETKAANGAZOVANJA,OPIS_ZADUZENJA"; String strIzmedju=","; ListaPolja= poljaStr.split(strIzmedju); objUnos.setnizPolja(ListaPolja); // poljaStr="OZNAKA PROJEKTA,OZNAKA UGOVORA,JMBG RADNIKA,SIFRA RADNE ULOGE,DATUM POCETKA ANGAZOVANJA,DATUM ZAVRSETKA ANGAZOVANJA,OPIS ZADUZENJA"; ListaPolja= poljaStr.split(strIzmedju); objUnos.setnizNazivaPolja(ListaPolja); // FormUnos formaUnos = new FormUnos(objUnos); formaUnos.setTitle("UNOS PODATAKA - UGOVOR"); formaUnos.setLocation(400, 200); formaUnos.setVisible(true); formaUnos.setBackground(Color.BLUE); } private void jMenuItem11ActionPerformed(java.awt.event.ActionEvent evt) { clsUnos objUnos = new clsUnos(app, "aRADNI_NALOG"); String[] ListaPolja= new String[8]; String poljaStr="OZNAKAPROJEKTA,OZNAKAUGOVORA,OZNAKARADNOGNALOGA, DATUMPOCETKAANGAZOVANJA, DATUMZAVRSETKAANGAZOVANJA, OPISZADUZENJA, REALIZOVAN"; String strIzmedju=","; ListaPolja= poljaStr.split(strIzmedju); objUnos.setnizPolja(ListaPolja); // poljaStr="OZNAKA PROJEKTA,OZNAKA UGOVORA,OZNAKA RADNOG NALOGA, DATUM POCETKA ANGAZOVANJA, DATUM ZAVRSETKA ANGAZOVANJA, OPIS ZADUZENJA, REALIZOVAN"; ListaPolja= poljaStr.split(strIzmedju); objUnos.setnizNazivaPolja(ListaPolja); // FormUnos formaUnos = new FormUnos(objUnos); formaUnos.setTitle("UNOS PODATAKA - RADNI NALOG"); formaUnos.setLocation(400, 200); formaUnos.setVisible(true); formaUnos.setBackground(Color.BLUE); } private void jMenuItem19ActionPerformed(java.awt.event.ActionEvent evt) { clsUnos objUnos = new clsUnos(app, "aREALIZOVANA_AKTIVNOST"); String[] ListaPolja= new String[8]; String poljaStr="OZNAKAPROJEKTA,OZNAKAUGOVORA,OZNAKARADNOGNALOGA,OZNAKAAKTIVNOSTI,DATUMIZVRSENJA,OPISIZVRSENEAKTIVNOSTI,IZVRSENA"; String strIzmedju=","; ListaPolja= poljaStr.split(strIzmedju); objUnos.setnizPolja(ListaPolja); //
71
poljaStr="OZNAKA PROJEKTA,OZNAKA UGOVORA,OZNAKA RADNOG NALOGA,OZNAKA AKTIVNOSTI,DATUM IZVRSENJA,OPIS IZVRSENE AKTIVNOSTI,IZVRSENA"; ListaPolja= poljaStr.split(strIzmedju); objUnos.setnizNazivaPolja(ListaPolja); // FormUnos formaUnos = new FormUnos(objUnos); formaUnos.setTitle("UNOS PODATAKA - IZVRSENA AKTIVNOST"); formaUnos.setLocation(400, 200); formaUnos.setVisible(true); formaUnos.setBackground(Color.BLUE); } private void jMenuItem30ActionPerformed(java.awt.event.ActionEvent evt) { clsIzmena objIzmena = new clsIzmena(app, "aRADNI_NALOG"); String[] ListaPolja= new String[8]; String poljaStr="OZNAKAPROJEKTA,OZNAKAUGOVORA,OZNAKARADNOGNALOGA,SIFRANIVOKVALITETA,OPISKVALITETAREALIZACIJE"; String strIzmedju=","; ListaPolja= poljaStr.split(strIzmedju); objIzmena.setnizPolja(ListaPolja); // poljaStr="OZNAKA PROJEKTA,OZNAKA UGOVORA,OZNAKA RADNOG NALOGA,SIFRA NIVO KVALITETA,OPIS KVALITETA REALIZACIJE"; ListaPolja= poljaStr.split(strIzmedju); objIzmena.setnizNazivaPolja(ListaPolja); // String[] ListaStarihVrednosti; String vrednosti="-,-,-,-,-"; ListaStarihVrednosti= vrednosti.split(strIzmedju); objIzmena.setnizStarihVrednosti(ListaStarihVrednosti); // // objIzmena.setBrojPoljaKriterijum(3); // String[] ListaPoljaKrit; String poljaKrit="OZNAKAPROJEKTA,OZNAKAUGOVORA,OZNAKARADNOGNALOGA"; ListaPoljaKrit= poljaKrit.split(strIzmedju); objIzmena.setpoljaKriterijum(ListaPoljaKrit); // FormIzmena formaIzmena = new FormIzmena(objIzmena); formaIzmena.setTitle("UNOS PODATAKA - KVALITET ZAVRSENOG RADNOG NALOGA"); formaIzmena.setLocation(400, 200); formaIzmena.setVisible(true); formaIzmena.setBackground(Color.BLUE); } private void jMenuItem18ActionPerformed(java.awt.event.ActionEvent evt) { clsIzmena objIzmena = new clsIzmena(app, "aUGOVOR"); String[] ListaPolja= new String[8]; String poljaStr="OZNAKAPROJEKTA,OZNAKAUGOVORA,JMBG,SIFRARADNEULOGE,PRIHVACENO"; String strIzmedju=","; ListaPolja= poljaStr.split(strIzmedju); objIzmena.setnizPolja(ListaPolja); // poljaStr="OZNAKA PROJEKTA,OZNAKA UGOVORA,JMBG,SIFRA RADNE ULOGE,PRIHVACENO"; ListaPolja= poljaStr.split(strIzmedju); objIzmena.setnizNazivaPolja(ListaPolja); // String[] ListaStarihVrednosti; String vrednosti="-,-,-,-,-"; ListaStarihVrednosti= vrednosti.split(strIzmedju); objIzmena.setnizStarihVrednosti(ListaStarihVrednosti); // // objIzmena.setBrojPoljaKriterijum(2); // String[] ListaPoljaKrit; String poljaKrit="OZNAKAPROJEKTA,OZNAKAUGOVORA"; ListaPoljaKrit= poljaKrit.split(strIzmedju); objIzmena.setpoljaKriterijum(ListaPoljaKrit); // FormIzmena formaIzmena = new FormIzmena(objIzmena); formaIzmena.setTitle("UNOS PODATAKA - UCESCE NA PROJEKTU"); formaIzmena.setLocation(400, 200); formaIzmena.setVisible(true); formaIzmena.setBackground(Color.BLUE); } private void jMenuItem20ActionPerformed(java.awt.event.ActionEvent evt) { clsIzmena objIzmena = new clsIzmena(app, "aRADNI_NALOG"); String[] ListaPolja= new String[8]; String poljaStr="OZNAKAPROJEKTA,OZNAKAUGOVORA,OZNAKARADNOGNALOGA,DATUMZAVRSETKASVIHAKTIVNOSTI,REALIZOVAN"; String strIzmedju=",";
72
ListaPolja= poljaStr.split(strIzmedju); objIzmena.setnizPolja(ListaPolja); // poljaStr="OZNAKA PROJEKTA,OZNAKA UGOVORA,OZNAKA RADNOG NALOGA,DATUM ZAVRSETKA SVIH AKTIVNOSTI,REALIZOVAN"; ListaPolja= poljaStr.split(strIzmedju); objIzmena.setnizNazivaPolja(ListaPolja); // String[] ListaStarihVrednosti; String vrednosti="-,-,-,-,-"; ListaStarihVrednosti= vrednosti.split(strIzmedju); objIzmena.setnizStarihVrednosti(ListaStarihVrednosti); // // objIzmena.setBrojPoljaKriterijum(3); // String[] ListaPoljaKrit; String poljaKrit="OZNAKAPROJEKTA,OZNAKAUGOVORA,OZNAKARADNOGNALOGA"; ListaPoljaKrit= poljaKrit.split(strIzmedju); objIzmena.setpoljaKriterijum(ListaPoljaKrit); // FormIzmena formaIzmena = new FormIzmena(objIzmena); formaIzmena.setTitle("UNOS PODATAKA - ZAVRSETAK RADNOG NALOGA"); formaIzmena.setLocation(400, 200); formaIzmena.setVisible(true); formaIzmena.setBackground(Color.BLUE); } // -------------------------------------------------------------------------------------------------------------------------
/* * FormAbout.java * * Created on 28.03.2009., 18.58.28 */ package evidencijaobavezadesk; /** * * @author ljubica */ public class FormAbout extends javax.swing.JFrame { /** Creates new form FormAbout */ public FormAbout() { initComponents(); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { this.dispose(); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new FormAbout().setVisible(true); } }); } // -------------------------------------------------------------------------------------------------------------------------------
73
/* * FormAnalitika.java * * Created on 06.04.2009., 15.44.32 */ package evidencijaobavezadesk; /** * * @author ljubica */ import javax.swing.JLabel; import LApp.clsAnalitickiPrikaz; public class FormAnalitika extends javax.swing.JFrame { /** Creates new form FormAnalitika */ public FormAnalitika(clsAnalitickiPrikaz objAnalitika) { //, String[] nazivpolja, String[] vrednost initComponents(); // nazivi polja na labelama jLabel1.setText(objAnalitika.getnizPolja()[0].toString()); jLabel2.setText(objAnalitika.getnizPolja()[1].toString()); jLabel3.setText(objAnalitika.getnizPolja()[2].toString()); jLabel4.setText(objAnalitika.getnizPolja()[3].toString()); // // vrednosti na text boxu // jTextArea1.setText(objAnalitika.getnizVrednosti()[0].toString()); jTextArea2.setText(objAnalitika.getnizVrednosti()[1].toString()); jTextArea3.setText(objAnalitika.getnizVrednosti()[2].toString()); jTextArea4.setText(objAnalitika.getnizVrednosti()[3].toString()); this.setTitle(objAnalitika.getNaslov()); this.setLocation(400, 200); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new FormAnalitika(null).setVisible(true); } }); } } // ---------------------------------------------------------------------------------
/* * FormFilter.java
74
* * Created on 30.03.2009., 12.29.31 */ package evidencijaobavezadesk; /** * * @author ljubica */ import LApp.clsFilter; public class FormFilter extends javax.swing.JFrame { /** Creates new form FormFilter */ private clsFilter objFilter; public FormFilter(clsFilter objFilter) { this.objFilter=objFilter; initComponents(); jTextFilter.setText(""); jNazivPolja.setText(objFilter.getNatpisKriterijum()); this.setTitle("FILTER PODATAKA:" + objFilter.getNaslov()); this.setLocation(400, 200); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // OCITAVANJE VREDNOSTI objFilter.setvrednostKriterijum(jTextFilter.getText()); // PRIKAZ if (objFilter.getTipRezultata().compareTo("tabelarno")==0) { // prikazuje formu sa tabelarnim podacima FormTabelarniPrikaz frmTabela = new FormTabelarniPrikaz (objFilter.DajTabelarnePodatke()); frmTabela.setVisible(true); } if (objFilter.getTipRezultata().compareTo("analiticki")==0) { // prikazuje formu sa pojedinacnim podacima - analiticki FormAnalitika frmTabela = new FormAnalitika (objFilter.DajAnalitickePodatke()); frmTabela.setVisible(true); } } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { this.dispose(); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new FormFilter(null).setVisible(true); } }); } // ---------------------------------------------------------------------------------------------------------
/* * FormHelp.java * * Created on 29.03.2009., 09.09.48 */ package evidencijaobavezadesk; /** * * @author ljubica */ public class FormHelp extends javax.swing.JFrame { /** Creates new form FormHelp */ public FormHelp() { initComponents(); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
75
this.dispose(); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new FormHelp().setVisible(true); } }); } } // -----------------------------------------------------------------------------------------------------------------
/ * FormIzmena.java * * Created on 22.04.2009., 13.25.48 */ package evidencijaobavezadesk; /** * * @author ljubica */ import LApp.clsIzmena; public class FormIzmena extends javax.swing.JFrame { private clsIzmena objIzmena; private void PrikaziNazivePolja() { jPolje1Label.setText(objIzmena.getnizNazivaPolja()[0]); jPolje2Label.setText(objIzmena.getnizNazivaPolja()[1]); jPolje3Label.setText(objIzmena.getnizNazivaPolja()[2]); jPolje4Label.setText(objIzmena.getnizNazivaPolja()[3]); jPolje5Label.setText(objIzmena.getnizNazivaPolja()[4]); } private void PrikaziStareVrednosti() { jTextPolje1.setText(objIzmena.getnizStarihVrednosti()[0]); jTextPolje2.setText(objIzmena.getnizStarihVrednosti()[1]); jTextPolje3.setText(objIzmena.getnizStarihVrednosti()[2]); jTextPolje4.setText(objIzmena.getnizStarihVrednosti()[3]); jTextPolje5.setText(objIzmena.getnizStarihVrednosti()[4]); } /** Creates new form FormIzmena */ public FormIzmena(clsIzmena objIzmena) { this.objIzmena=objIzmena; initComponents(); PrikaziNazivePolja(); PrikaziStareVrednosti(); } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { this.dispose(); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // // preuzimanje vrednosti iz text boxova String[] nizVrednosti= new String[8]; nizVrednosti[0]=jTextPolje1.getText(); nizVrednosti[1]=jTextPolje2.getText(); nizVrednosti[2]=jTextPolje3.getText();
76
nizVrednosti[3]=jTextPolje4.getText(); nizVrednosti[4]=jTextPolje5.getText(); // // kriterijum za pristupanje slogu String[] nizVrednostiKriterijum= new String[8]; // for (int brojPokusaja =0; brojPokusaja <objIzmena.getBrojPoljaKriterijum(); brojPokusaja++ ) { nizVrednostiKriterijum[brojPokusaja]=nizVrednosti[brojPokusaja]; } // objIzmena.setvrednostiKriterijum(nizVrednostiKriterijum); // // objIzmena.setnizNovihVrednosti(nizVrednosti); boolean uspeh=objIzmena.Snimi(); if (uspeh==true) { MsgBox poruka= new MsgBox("OBAVESTENJE","Uspesno snimanje unetih podataka!"); poruka.setLocation(400, 200); poruka.setVisible(true); } else { MsgBox poruka= new MsgBox("OBAVESTENJE","Neuspesno snimanje unetih podataka!"); poruka.setLocation(400, 200); poruka.setVisible(true); } } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new FormIzmena(null).setVisible(true); } }); } } // ----------------------------------------------------------------------------------------------------------
/* * FormTabelarniPrikaz.java * * Created on 28.03.2009., 18.54.13 */ package evidencijaobavezadesk; /** * * @author ljubica */ import java.awt.BorderLayout; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import java.awt.Color; import LApp.clsTabelarniPrikaz; // public class FormTabelarniPrikaz extends javax.swing.JFrame { private JTable table ; /** Creates new form FormTabelarniPrikaz */ // konstruktor public FormTabelarniPrikaz(clsTabelarniPrikaz clsTabela) { // inicijalizacija try { table = new JTable(clsTabela.getmodel()); getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
77
pack(); table.setVisible(true); table.setBackground(Color.WHITE); table.setAutoResizeMode(5); // DA MOZE DA SE URADI RESIZE ZA SVE KOLONE } catch (Exception ex) { } initComponents(); this.setTitle(clsTabela.getNaslov()); this.setLocation(400, 200); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { this.dispose(); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new FormTabelarniPrikaz(null).setVisible(true); } }); } } // ----------------------------------------------------------------------------------------------------
/* * FormUnos.java * * Created on 31.03.2009., 13.52.53 */ package evidencijaobavezadesk; /** * * @author ljubica */ import LApp.clsUnos; public class FormUnos extends javax.swing.JFrame { /** Creates new form FormUnos */ private clsUnos objUnos; private void PrikaziNazivePolja() { jPolje1Label.setText(objUnos.getnizNazivaPolja()[0]); jPolje2Label.setText(objUnos.getnizNazivaPolja()[1]); jPolje3Label.setText(objUnos.getnizNazivaPolja()[2]); jPolje4Label.setText(objUnos.getnizNazivaPolja()[3]); jPolje5Label.setText(objUnos.getnizNazivaPolja()[4]); jPolje6Label.setText(objUnos.getnizNazivaPolja()[5]); jPolje7Label.setText(objUnos.getnizNazivaPolja()[6]); } public FormUnos(clsUnos objUnos) { initComponents(); this.objUnos=objUnos; PrikaziNazivePolja(); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { this.dispose(); } private void jButtonSnimiActionPerformed(java.awt.event.ActionEvent evt) { String[] nizVrednosti= new String[8]; nizVrednosti[0]=jTextPolje1.getText();
78
nizVrednosti[1]=jTextPolje2.getText(); nizVrednosti[2]=jTextPolje3.getText(); nizVrednosti[3]=jTextPolje4.getText(); nizVrednosti[4]=jTextPolje5.getText(); nizVrednosti[5]=jTextPolje6.getText(); nizVrednosti[6]=jTextPolje7.getText(); objUnos.setnizVrednosti(nizVrednosti); boolean uspeh=objUnos.Snimi(); if (uspeh==true) { MsgBox poruka= new MsgBox("OBAVESTENJE","Uspesno snimanje unetih podataka!"); poruka.setLocation(400, 200); poruka.setVisible(true); } else { MsgBox poruka= new MsgBox("OBAVESTENJE","Neuspesno snimanje unetih podataka!"); poruka.setLocation(400, 200); poruka.setVisible(true); } } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new FormUnos(null).setVisible(true); } }); } } // ---------------------------------------------------------------------------------------------------------------
/* * MsgBox.java * * Created on 21.04.2009., 17.55.19 */ package evidencijaobavezadesk; /** * * @author ljubica */ public class MsgBox extends javax.swing.JFrame { /** Creates new form MsgBox */ public MsgBox(String naslov, String poruka) { initComponents(); this.setTitle(naslov); jPorukaLabel.setText(poruka); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { this.dispose(); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MsgBox(null, null).setVisible(true); } }); } }
79
Programski kod web aplikacije «Obaveze»
(najvažniji deo) LOGIN.JSP <html> <head><title>EVIDENCIJA OBAVEZA - prijava korisnika</title></head> <META http-equiv=Content-Type content="text/html; charset=windows-1250"> <LINK REL="STYLESHEET" TYPE="TEXT/CSS" HREF="design/style.css"> <table border="0" align="center" height=10%> <tr> <td> </td> </tr> </table> <table border="0" bgcolor="white" align="center"> <tr> <td align="left"> <%@include file="design/zaglavlje.jsp" %> </td> <td > </td> </tr> <tr> <td><img src="design/linija.jpg"></td> <td></td> </tr> <tr> <td><img src="design/linija1.jpg"></td> <td></td> </tr> <tr> <td> <table border="0" bgcolor="white" align="center"> <tr><td> </td> <tr><td><font face="Verdana" size="2">PRIJAVA KORISNIKA:</font></td> <tr><td> </td> <tr><td> <FORM METHOD="GET" ACTION ="prijava.jsp"> <table border="0" > <tr> <td align="left"><font face="Verdana" size="2">Korisničko ime:</font></td> <td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="UserName"></font></td> </tr> <tr> <td align="left"><font face="Verdana" size="2">Šifra:</font></td> <td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="Password"></font></td> </tr> </table> <blockquote> <blockquote> <font face="Verdana" size="1"> <INPUT TYPE="submit" VALUE="Potvrdi"><INPUT TYPE="reset" VALUE="Ponisti"> </font> </blockquote> </blockquote> </FORM> </td> </tr> </table> </td> <td> </td> </tr> <tr> <td><img src="design/linija.jpg"></td> <td></td> </tr> <tr> <td><img src="design/linija1.jpg"></td> <td></td> </tr> </table> </body> </html>
80
PRIJAVA.JSP <%@ page import="DB.DBInterface" %> <%@ page import="DB.DBResultSet" %> <%@ page import="java.sql.ResultSet" %> <html> <head><title>EVIDENCIJA OBAVEZA - prijava korisnika</title></head> <META http-equiv=Content-Type content="text/html; charset=windows-1250"> <LINK REL="STYLESHEET" TYPE="TEXT/CSS" HREF="design/style.css"> <% // CITANJE PROSLEDJENIH VREDNOSTI String KorisnickoIme = request.getParameter("UserName"); String Sifra=request.getParameter("Password"); // PROVERA DA LI POSTOJI TAKAV KORISNIK String UPIT="Select * from tipZaposleni where KorisnickoIme='" + KorisnickoIme + "' and Sifra='" + Sifra + "'"; DBInterface objDB = new DBInterface ("c:\\Evidencija.mdb", "tipZaposleni", UPIT); int brojSlogova=objDB.DajBrojSlogova(); // AKO POSTOJI: if (brojSlogova>0) { response.sendRedirect("home.jsp?UserName=" + KorisnickoIme); } // AKO NE POSTOJI: if (brojSlogova==0) { response.sendRedirect("neuspeh.jsp"); } %> </body> </html> HOME.JSP <html> <head><title>EVIDENCIJA OBAVEZA - glavni meni</title></head> <META http-equiv=Content-Type content="text/html; charset=windows-1250"> <LINK REL="STYLESHEET" TYPE="TEXT/CSS" HREF="design/style.css"> <% // CITANJE PROSLEDJENIH VREDNOSTI String KorisnickoIme = request.getParameter("UserName");%> <table border="0" align="center" width=50%> <tr><td> <table border="0" align="center" width=95%> <tr> <td align="right" width=100%> <b> <font face="Verdana" color="#ADDAF1" size="2">Korisnik: <%=KorisnickoIme%></b></font> </td> <td> <A HREF="login.jsp" border="0"> <img src="design/LogOffBela.jpg" border="0"> </A> </td> </tr> </table> </td></tr> <tr><td> <%@include file="design/zaglavljeAll.jsp" %></td></tr> <tr><td> <table border="0" align="left" width=100%> <tr><td width=15%><%@include file="design/meni.jsp" %> </td> <td width=60% bgcolor=""white"> <%@include file="dobrodoslica.jsp" %></td></tr> </table> </td> </tr> </table> </body> </html> RADNOMESTO.JSP <html> <head><title>EVIDENCIJA OBAVEZA - šifarnici </title></head> <META http-equiv=Content-Type content="text/html; charset=windows-1250"> <LINK REL="STYLESHEET" TYPE="TEXT/CSS" HREF="design/style.css"> <% // CITANJE PROSLEDJENIH VREDNOSTI String KorisnickoIme = request.getParameter("UserName");%> <table border="0" align="center" width=50%> <tr><td> <table border="0" align="center" width=95%> <tr> <td align="right" width=100%> <b> <font face="Verdana" color="#ADDAF1" size="2">Korisnik: <%=KorisnickoIme%></b></font> </td> <td> <A HREF="login.jsp" border="0"> <img src="design/LogOffBela.jpg" border="0"> </A> </td> </tr> </table> </td></tr> <tr><td> <%@include file="design/zaglavljeAll.jsp" %></td></tr> <tr><td> <table border="0" align="left" width=100%>
81
<tr><td width=15%><%@include file="design/meniSifarnici.jsp" %> </td> <td width=60% bgcolor=""white"> <%@include file="spisakrm.jsp" %></td></tr> </table> </td> </tr> </table> </body> </html> SPISAKRM.JSP <%@ page import="DB.DBInterface" %> <%@ page import="DB.DBResultSet" %> <%@ page import="java.sql.ResultSet" %> <html> <head><title>EVIDENCIJA OBAVEZA</title></head> <META http-equiv=Content-Type content="text/html; charset=windows-1250"> <LINK REL="STYLESHEET" TYPE="TEXT/CSS" HREF="design/style.css"> <body bgcolor="white"> <table border="0" align="center" width=100% height=100% > <tr> <td> </td> </tr> <tr> <td ALIGN="center"> <font face="Verdana" color="WHITE" size="3"> <b>ŠIFARNIK RADNIH MESTA</B> </font> </td> </tr> <tr> </table> <% // ----------prikaz svih vrednosti------------------ %> <% DBInterface objDB = new DBInterface ("c:\\Evidencija.mdb", "tipRADNO_MESTO", "select * from tipRADNO_MESTO"); int brSlogova = objDB.DajBrojSlogova(); %> <% // PREUZIMANJE PODATAKA OD DB INTERFEJSA ResultSet rsPodaci = objDB.DajPodatke(); // INICIJALIZACIJA KLASE DBResultSet ZA // OSNOVNE OPERACIJE SA PODACIMA IZ RESULTSETA DBResultSet objRs = new DBResultSet(); objRs.setResultSet(rsPodaci); // CITANJE ZAGLAVLJA String[] zaglavlje= objRs.getColumnNames(); // CITANJE PRVOG REDA String[] prviRed= objRs.getDataRow(0); %> <table border=1 align="center" bgcolor="white"> <tr> <td width=160> <b><% out.println (zaglavlje[0]); %></b> </td> <td width=170> <b><% out.println (zaglavlje[1]); %></b> </td> </tr> </table> <table border=1 align="center" bgcolor="white"> <tr> <td width=160> <% out.println (prviRed[0]); %> </td> <td width=170> <% out.println (prviRed[1]); %> </td> </tr> </table> <% for (int brojPokusaja =1; brojPokusaja < objRs.getRowCount(); brojPokusaja++ ) { String[] pomVrednosti=objRs.getDataRow(brojPokusaja); %> <table border=1 align="center" bgcolor="white"> <tr> <td width=160> <% out.println (pomVrednosti[0]); %> </td> <td width=170> <% out.println (pomVrednosti[1]); %> </td> </tr> </table> <% } %> <table align="center"> <tr> <td> <b><% out.println ("Ukupno:" + brSlogova);%> </b> </td> </tr> </table> </body> </html>
82
UNOSPROJEKAT.JSP <html> <head><title>UNOS PODATAKA O NOVOM PROJEKTU</title></head> <body bgcolor="white"> <table border="0" bgcolor="white" align="center"> <tr> <td> </td> </tr> <tr> <td> <B><font face="Verdana" size="2"> UNOS NOVOG PROJEKTA</FONT></B> </td> </tr> <tr> <td> </td> </tr> <tr> <td> <FORM METHOD="GET" ACTION ="snimiprojekat.jsp"> <table border="0" width="100%"> <tr> <td align="left"><font face="Verdana" size="2"> Oznaka:</font></td> <td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="Oznaka"></font></td> </tr> <tr> <td align="left"><font face="Verdana" size="2"> Šifra oblasti:</font></td> <td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="SifraOblasti"></font></td> </tr> <tr> <td align="left"><font face="Verdana" size="2"> JMBG rukovodioca:</font></td> <td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="JMBGrukovodioca"></font></td> </tr> <tr> <td align="left"><font face="Verdana" size="2"> Naziv projekta:</font></td> <td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="Nazivprojekta"></font></td> </tr> <tr> <td align="left"><font face="Verdana" size="2"> Opis:</font></td> <td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="Opis"></font></td> </tr> <tr> <td align="left"><font face="Verdana" size="2"> Datum pocetka:</font></td> <td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="DatumPocetka"></font></td> </tr> <tr> <td align="left"><font face="Verdana" size="2"> Datum planiranog završetka:</font></td> <td ><font face="Verdana" size="2"><INPUT TYPE="text" SIZE=21 NAME="DatumPlaniranogZavrsetka"></font></td> </tr> <tr> <td align="left"></td> <td ><font face="Verdana" size="2"><INPUT TYPE="hidden" SIZE=21 NAME="KorisnickoIme" value=<%=KorisnickoIme%>></font></td> </tr> </table> <blockquote> <blockquote> <font face="Verdana" size="1"> <INPUT TYPE="submit" VALUE="Potvrdi"><INPUT TYPE="reset" VALUE="Ponisti"> </font> </blockquote> </blockquote> </FORM> </td> </tr> </table> </body> </html> SNIMIPROJEKAT.JSP <%@ page import="DB.DBInterface" %> <%@ page import="DB.DBResultSet" %> <%@ page import="java.sql.ResultSet" %> <html> <head><title>SNIMANJE UNETIH PODATAKA</title></head>
83
<body bgcolor="white"> <% // preuzimanje vrednosti String KorisnickoIme=request.getParameter("KorisnickoIme"); String Oznaka = request.getParameter("Oznaka"); String SifraOblasti = request.getParameter("SifraOblasti"); String JMBGrukovodioca = request.getParameter("JMBGrukovodioca"); String NazivProjekta = request.getParameter("Nazivprojekta"); String Opis = request.getParameter("Opis"); String DatumPocetka = request.getParameter("DatumPocetka"); String DatumPlaniranogZavrsetka = request.getParameter("DatumPlaniranogZavrsetka"); %> <% String UPIT="INSERT INTO aPROJEKAT (OZNAKAPROJEKTA, SIFRAOBLASTI, JMBG_RUKOVODIOCA, NAZIVPROJEKTA, OPIS, DATUMPOCETKAPROJEKTA, DATUMPLANIRANOGZAVRSETKA, SIFRANIVOKVALITETA) VALUES ('" + Oznaka + "','" + SifraOblasti + "','" + JMBGrukovodioca + "','" + NazivProjekta + "','" + Opis + "','" + DatumPocetka + "','" + DatumPlaniranogZavrsetka + "','NEP')"; DBInterface objDB = new DBInterface ("c:\\Evidencija.mdb", "aPROJEKAT", UPIT); objDB.Snimi(); response.sendRedirect("uspeh.jsp?UserName=" + KorisnickoIme); %> </body> </html> SPISAKAKTPROJ.JSP <%@ page import="DB.DBInterface" %> <%@ page import="DB.DBResultSet" %> <%@ page import="java.sql.ResultSet" %> <html> <head><title>EVIDENCIJA OBAVEZA</title></head> <META http-equiv=Content-Type content="text/html; charset=windows-1250"> <LINK REL="STYLESHEET" TYPE="TEXT/CSS" HREF="design/style.css"> <body bgcolor="white"> <table border="0" align="center" width=100% height=100% > <tr> <td> </td> </tr> <tr> <td ALIGN="center"> <font face="Verdana" color="WHITE" size="3"> <b>AKTUELNI PROJEKTI RUKOVODIOCA: <%=KorisnickoIme%></B> </font> </td> </tr> <tr> </table> <% // ----------prikaz svih vrednosti------------------ %> <% DBInterface objDB = new DBInterface ("c:\\Evidencija.mdb", "aPROJEKAT", "select OZNAKAPROJEKTA, NAZIVPROJEKTA, OPIS from aPROJEKAT, tipZAPOSLENI WHERE aPROJEKAT.JMBG_RUKOVODIOCA=tipZAPOSLENI.JMBG and tipZAPOSLENI.KorisnickoIme='" + KorisnickoIme + "' AND NOT(aPROJEKAT.DATUMZAVRSETKA<>NULL)"); int brSlogova = objDB.DajBrojSlogova(); %> <% // PREUZIMANJE PODATAKA OD DB INTERFEJSA ResultSet rsPodaci = objDB.DajPodatke(); // INICIJALIZACIJA KLASE DBResultSet ZA // OSNOVNE OPERACIJE SA PODACIMA IZ RESULTSETA DBResultSet objRs = new DBResultSet(); objRs.setResultSet(rsPodaci); // CITANJE ZAGLAVLJA String[] zaglavlje= objRs.getColumnNames(); // CITANJE PRVOG REDA String[] prviRed= objRs.getDataRow(0); %> <table border=1 align="center" bgcolor="white"> <tr> <td width=160> <b><% out.println (zaglavlje[0]); %></b> </td> <td width=170> <b><% out.println (zaglavlje[1]); %></b> </td> <td width=170> <b><% out.println (zaglavlje[2]); %></b> </td> </tr> </table> <table border=1 align="center" bgcolor="white"> <tr> <td width=160> <% out.println (prviRed[0]); %> </td> <td width=170> <% out.println (prviRed[1]); %> </td> <td width=170> <% out.println (prviRed[2]); %> </td> </tr> </table> <% for (int brojPokusaja =1; brojPokusaja < objRs.getRowCount(); brojPokusaja++ ) { String[] pomVrednosti=objRs.getDataRow(brojPokusaja); %>
84
<table border=1 align="center" bgcolor="white"> <tr> <td width=160> <% out.println (pomVrednosti[0]); %> </td> <td width=170> <% out.println (pomVrednosti[1]); %> </td> <td width=170> <% out.println (pomVrednosti[2]); %> </td> </tr> </table> <% } %> <table align="center"> <tr> <td> <b><% out.println ("Ukupno:" + brSlogova);%> </b> </td> </tr> </table> </body> </html>