30
VEŽBA 9: BAZE PODATAKA I SERVLETI 1. CILJ VEŽBE Cilj devete vežbe je da studenti upoznaju osnovne operacije sa bazama podataka u programskom jeziku Java i kako funkcioniše posebna vrsta Java programa - servleti. Pomoću ove vežbe studenti treba da nauče da kreiraju novu tabelu u okviru baze podataka, upisuju nove podatke u kreiranu tabelu i da obavljaju promenu postojećih podataka, kao i neke efikasnije metode za ove operacije. Takođe, u okviru ove vežbe studenti se upoznaju sa strukturom i osnovnim operacijama vezanim za servlete. Pomoću ove vrste Java programa uspostaviće se veza tipa HTML klijent - Web server, pri čemu će se na serveru izvršavati Java servleti. 2. OPIS VEŽBE U okviru ove vežbe potrebno je da studenti pišu Java programe pomoću kojih treba da uoče primere osnovnih operacija sa bazama podataka i način funkcionisanja servleta. Vežba se sastoji iz četiri aktivnosti: I aktivnost: Kreiranje nove tabele u okviru određene baze podataka II aktivnost: Upis podataka u postojećoj tabeli III aktivnost: Promena unetih podataka IV aktivnost: Rad sa servletima Da bi se realizovale nabrojane aktivnosti potrebno je u proizvoljnom tekst editoru napisati Java program, snimiti program i zatim ga kompajlirati. U okviru prve tri aktivnosti obavljaju se operacije nad bazom podataka, pa je potrebno pre izvršavanja aktivnosti kreirati proizvoljnu bazu podataka. Za rad sa servletima potreban je Web server da bi se uspostavila komunikacija sa klijentskim mašinama. Zato se u daljem tekstu daje uputstvo za kreiranje baze i podešavanje drajvera u Windows operativnim sistemima, pa uputstvo za rad sa Jakarta Tomcat Web serverom. Nakon toga sledi opis svih aktivnosti sa

Java Baze 2 Sevleti

Embed Size (px)

DESCRIPTION

Java Baze 2 Sevleti

Citation preview

Page 1: Java Baze 2 Sevleti

VEŽBA 9: BAZE PODATAKA I SERVLETI

1. CILJ VEŽBE

Cilj devete vežbe je da studenti upoznaju osnovne operacije sa bazama podataka u programskom jeziku Java i kako funkcioniše posebna vrsta Java programa - servleti. Pomoću ove vežbe studenti treba da nauče da kreiraju novu tabelu u okviru baze podataka, upisuju nove podatke u kreiranu tabelu i da obavljaju promenu postojećih podataka, kao i neke efikasnije metode za ove operacije. Takođe, u okviru ove vežbe studenti se upoznaju sa strukturom i osnovnim operacijama vezanim za servlete. Pomoću ove vrste Java programa uspostaviće se veza tipa HTML klijent - Web server, pri čemu će se na serveru izvršavati Java servleti.

2. OPIS VEŽBE

U okviru ove vežbe potrebno je da studenti pišu Java programe pomoću kojih treba da uoče primere osnovnih operacija sa bazama podataka i način funkcionisanja servleta. Vežba se sastoji iz četiri aktivnosti:

I aktivnost: Kreiranje nove tabele u okviru određene baze podatakaII aktivnost: Upis podataka u postojećoj tabeli

III aktivnost: Promena unetih podatakaIV aktivnost: Rad sa servletima

Da bi se realizovale nabrojane aktivnosti potrebno je u proizvoljnom tekst editoru napisati Java program, snimiti program i zatim ga kompajlirati. U okviru prve tri aktivnosti obavljaju se operacije nad bazom podataka, pa je potrebno pre izvršavanja aktivnosti kreirati proizvoljnu bazu podataka. Za rad sa servletima potreban je Web server da bi se uspostavila komunikacija sa klijentskim mašinama. Zato se u daljem tekstu daje uputstvo za kreiranje baze i podešavanje drajvera u Windows operativnim sistemima, pa uputstvo za rad sa Jakarta Tomcat Web serverom. Nakon toga sledi opis svih aktivnosti sa zadacima za rad u laboratoriji i zadacima za samostalan rad. Uputstvo za pisanje, kompajliranje i izvršavanje Java programa dato je u ranijim vežbama.Pri radu sa Jakarta Tomcat Web serverom pretpostavlja se da je ovaj server instaliran na korisničkoj mašini. Sve informacije i besplatna instalacija servera nalaze se na Internet adresi http://jakarta.apache.org.

Uputstvo za kreiranje baze podataka i podešavanje drajvera

U ovom delu teksta prikazuje se korisničko uputstvo za kreiranje baze podataka i podešavanje potrebnih drajvera. Posmatraće se baza podataka MS Access u okruženju Windows operativnog sistema.Da bi se kreirala baza podataka potrebno je pokrenuti program Microsoft Access, koji se nalazi na listi programa koja se dobija aktiviranjem opcija Start sa statusne linije, pa

Page 2: Java Baze 2 Sevleti

Programs. Na početnom ekranu programa Microsoft Access potrebno je čekirati opciju »Blank Access Database« i pritisnuti dugme OK (slika 1).

Slika 1. Početni ekran programa Microsoft Access

Zatim se pojavljuje novi prozor na kome treba definisati ime baze podataka i direktorijum gde će se baza nalaziti.Kada je baza podataka kreirana potrebno je podesiti drajver za kreiranu bazu. U okviru ove vežbe koristiće se ODBC Data Source drajver. ODBC Data Source je programski interfejs koji omogućava aplikacijama da pristupaju podacima u okviru baze podataka. Podacima se pristupa pomoću standarda Structured Query Language (SQL). ODBC Data Source drajver omogućava aplikcijama da koriste osobine ODBC Data Source. Na status liniji pokrenuti opciju Start, zatim opciju Settings (slika 2).

Slika 2. Control Panel ekran

Page 3: Java Baze 2 Sevleti

Na ovom ekranu treba izabrati opciju ODBC Data Sources (kod nekih verzija operativnog sistema Windows ova opcija se nalazi u okviru Administrative Tools). Tada se dobija ekran sa slike 3.

Slika 3. Pokrenuta opcija ODBC Data Sources

Na ovom ekranu treba pokrenuti tab System DSN i pritisnuti dugme Add. Na listi koja se pojavi treba izabrati Microsoft Access Driver i pritisnuti dugme Finish. Tada se pojavi ekran sa slike 4. U tekst polje Data Source Name treba upisati ime drajvera, a za ovu vežbu potrebno je upisati VetsDri. Zatim pritisnuti dugme OK.Ovim postupkom je instaliran drajver za Microsoft Access bazu podataka.

Slika 4. Definisanje vrste i ime drajvera

Uputstvo za rad sa Jakarta Tomcat Web serveromU ovom delu teksta razmatra se postavljanje potrebnih fajlova i pokretanje aplikacija preko Jakarta Tomcat Web servera. Web server nam je potreban da bi uspostavili komunikaciju

Page 4: Java Baze 2 Sevleti

između klijentske mašine i mašine na kojoj se nalazi naša aplikacija. U okviru ove vežbe klijentski deo aplikacije i Web server će se fizički nalaziti na istoj mašini, ali se u samom radu ništa ne menja iako se oni nalaze na različitim mašinama.Da bi se pokrenuo ovaj Web server potrebno je na statusnoj liniji pokrenuti opciju Start, zatim izabrati opciju Programs, pa opciju Tomcat Jakarta i na kraju Start Tomcat Jakarta.Provera da je Web server startovan može se izvršiti tako što se startuje web browser a u adresnu liniju treba upisati sledeću adresu http://localhost:8080. Ukoliko se proverava Web server sa drugog računara, a ne sa onog gde se Web server izvršava, onda umesto imena localhost treba upisati ime računara sa Web serverom. Ako je sve u redu dobiće se pozdravni ekran ovog Web servera (slika 5).

Slika 5. Pozdravni ekran Tomcat Jakarta Web servera

Aplikacija koja se izvršava na ovom Web serveru treba da ispuni određene uslove. U daljem tekstu će se opisti jedan od načina da se realizovana aplikacija instalira na Tomcat Jakarta Web server.U poddirektorijumu webapps nalaze se sve aplikacije instalirane na tom serveru. Kada se neka aplikacija želi instalirati na server u webapps treba napraviti poddirektorijum sa imenom aplikacije (na primer Ime_Aplikacije). U ovom direktorijumu treba da postoji direktorijum WEB-INF, a u okviru njega classes. Znači na našem primeru treba da postoje direktorijumi Ime_Aplikacije\WEB-INF i Ime_Aplikacije\WEB-INF\classes. U osnovnom direktorijumu treba da se nalaze HTML, JavaScript i JSP stranice, znači one stranice koje se izvršavaju na klijentskoj strani aplikacije. U poddirektorijumu WEB-INF treba da se nalazi fajl web.xml. To je fajl koji Web serveru definiše sadržaj i strukturu aplikacije. U poddirektorijumu classes nalaze se Java fajlovi i Java servleti, znači serverski deo aplikacije.Kada se ovako formatirana aplikacija postavi u webapps poddirektorijum, pre njenog izvršavanja potrebno je restartovati Tomcat. Kada se aplikacija instalira na sistem definiše se putanja do aplikacije. Na primer ako je definisana putanja /Ime_Aplikacije, tada pozivni URI glasi /Ime_Aplikacije/index.html i izvršavaće se index.html sa document roota aplikacije.Znači vrste stranica i direktorijumi koji se koriste u okviru izvršavanja jedne Java Internet aplikacije su sledeći:

*.html, *.jsp, itd. - HTML i JSP stranice zajedno sa ostalim fajlovima koji se koriste na klijentskoj strani (kao što su JavaScript i stylesheet fajlovi) smeštaju se u osnovni

Page 5: Java Baze 2 Sevleti

direktorijum. Kod većih aplikacija mogu se napraviti poddirektorijumi i nova hijerarhija.

WEB-INF/web.xml - Web Application Deployment Descriptor - Ovo je XML fajl koji opisuje servlete i druge komponente koje čine aplikaciju, zajedno sa bilo kojim inicijalizacionim parametrima i različitim oblicima zaštite.

WEB-INF/classes/ - U ovaj direktorijum smeštaju se sve Java klase koje se koriste u aplikaciji, uključujući i servlet i ne-servlet klase.

WEB-INF/lib/ - U ovaj direktorijum smeštaju se svi JAR fajlovi potrebni za izvršavanje aplikacije (kao što su na primer JDBC drajveri).

Pored ovakve instalacije jedna od mogućnosti je i distribucija Web aplikacije u obliku fajla Web ARchive, ili WAR fajla, koji predstavlja standardni format za većinu servera. Treba naglasiti da klase koje služe za pisanje servleta ne predstavljaju standardni deo Java Development Kita. Umesto toga ovaj API mora se instalirati odvojeno. On je dostupan za download na Internet adresi www.java.sun.com. Fajl koji predstavlja servlet API zove se servlet.jar i kada se snimi na lokalni računar moramo navesti putanju do njega, editovanjem fajla autoexec.bat (Win95/98) ili postavljanjem environment varijable classpath (WinNT/2K). Na primer:

Set CLASSPATH=.;c:\jdk1.2.2\lib\tools.jar; c:\jdk1.2.2\lib\servlet.jar

I aktivnost: Kreiranje nove tabele u okviru određene baze podataka

U okviru ove aktivnosti opisuje se osnovna operacija bazom podataka a to je kreiranje nove tabele. Koristi se kreirana baza podataka i drajver instaliran na način opisan u prethodnom delu teksta ove vežbe. JDBC je JAVA API za baze podataka bazirane na SQL jeziku. JDBC je predstavljen u obliku na nivou poziva SQL interface za Javu. Znači, pomoću klasa iz ovog paketa mogu se izvršavati SQL naredbe i manipulisati rezultatima dobijenim na osnovu ovih naredbi.JDBC API sadrži niz apstraktnih Java interfejsa koji dozvoljavaju programeru da ostvari konekciju sa određenom bazom podataka, izvrši SQL naredbe i obradi dobijene rezultate.java.sql.DriverManager klasa sprovodi učitavanje drajvera baze podataka i omogućava podršku za kreiranje nove konekcije.JDBC URL ima sledeću strukturu: jdbc:<subprotocol>:<subname> gde je subprotocol ime određene vrste mehanizma pristupa bazi podataka koji može biti podržan od jednog ili više drajvera. Sadržaj i sintaksa dela subname zavisi od subprotocola.JDBC management nivo mora da zna koji drajver je raspoloživ i koji drajver se koristi.

Zadatak 1. U Notepadu ukucati sledeći program i snimiti ga pod imenom Vez9Zad1.java. Iskompajlirati napisani program i pokrenuti ga pomoću Java programskog jezika.

import java.sql.*;public class Vez9Zad1 {

public static void main(String[] args) {// 1. korak: ucitavanje drajvera// u ovom slucaju se koristi JDBC-ODBC drajver// baza podataka mora biti prijavljena kao ODBC Data sourcetry {

Page 6: Java Baze 2 Sevleti

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // 2. korak: pravljenje konekcije sa bazom podataka

String url = "jdbc:odbc:VetsDri" ;//VetsDri je ime ODBC data sourcea String myLogin = "proba" ; // korisnicko ime u bazi podataka String myPassword = "proba" ; // password u bazi podataka try {

Connection con = DriverManager.getConnection( url, myLogin, myPassword );String createTableCoffees = "CREATE TABLE COFFEES " +

"(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " +"SALES INTEGER, TOTAL INTEGER)";

/*3. korak: pravljenje JDBC Statement objekta. Statement objekt salje SQL komandu bazi podataka. Ovaj postupak podrazumeva kreiranje Statement objekta, a zatim i njegovo izvrsavanje odgovarajucom execute metodom koja kao parametar prihvata SQL komandu u obliku Stringa. Za SELECT komande upotrebljava se metoda executeQuery. Za DDL komande i akcione upite upotrebljava se metoda executeUpdate. */

Statement stmt = con.createStatement();stmt.executeUpdate(createTableCoffees);System.out.println("Table successfully created");con.close();

} catch ( SQLException e ) {System.err.println( e ); }}catch ( ClassNotFoundException e) { System.out.println("Error : " + e ); }

}}

Koja promena se desila u kreiranoj bazi podataka nakon izvršavanja ovog programa?

II aktivnost: Upis podataka u postojećoj tabeli

U okviru ove aktivnosti opisuje se osnovna operacija sa bazom podataka, a to je upis podataka u postojećoj tabeli. Koristi se kreirana baza podataka i drajver instaliran na način opisan u prethodnom delu teksta ove vežbe. Takođe, podaci se upisuju u tabelu koja je kreirana u prethodnoj aktivnosti.Klasa java.sql.Connection predstavlja konekciju sa određenom bazom podataka.Klasa java.sql.Statement izvršava se u obliku containera za izvršavanje SQL naredbi u okviru uspostavljene konekcije

Zadatak 1. U Notepadu ukucati sledeći program i snimiti ga pod imenom Vez9Zad2.java. Iskompajlirati napisani program i pokrenuti ga pomoću Java programskog jezika.

import java.sql.*;public class Vez9Zad2 {

public static void main(String[] args) {try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

try {Connection con = DriverManager.getConnection( "jdbc:odbc:VetsDri", "proba", "proba" );Statement stmt = con.createStatement();String updateTableCoffees = "INSERT INTO COFFEES VALUES ('Colombian', 101, 7.99, 0, 0)" ;stmt.executeUpdate( updateTableCoffees );updateTableCoffees = "INSERT INTO COFFEES VALUES ('French_Roast', 49, 8.99, 0, 0)" ;stmt.executeUpdate( updateTableCoffees );updateTableCoffees = "INSERT INTO COFFEES VALUES ('Espresso', 150, 9.99, 0, 0)" ;stmt.executeUpdate( updateTableCoffees );

Page 7: Java Baze 2 Sevleti

updateTableCoffees = "INSERT INTO COFFEES VALUES ('Colombian_Decaf', 101, 8.99, 0, 0)" ;stmt.executeUpdate( updateTableCoffees );updateTableCoffees = "INSERT INTO COFFEES VALUES ('French_Roast_Decaf', 49, 9.99, 0, 0)" ;stmt.executeUpdate( updateTableCoffees );System.out.println("Table successfully updated");con.close();

} catch ( SQLException e ) { System.err.println( e ); }}catch ( ClassNotFoundException e) { System.out.println("Error : " + e ); }}

}

Koja promena se desila u kreiranoj bazi podataka nakon izvršavanja ovog programa?

III aktivnost: Promena unetih podataka

U okviru ove aktivnosti opisuje se osnovna operacija sa bazom podataka, a to je promena podataka koji su upisani u bazi podataka. Koristi se kreirana baza podataka i drajver instaliran na način opisan u prethodnom delu teksta ove vežbe. Takođe, podaci se selektuju iz tabele koja je kreirana u prethodnim aktivnostima.Klasa java.sql.ResultSet kontroliše pristup rezultatima dobijenim izvršavanjem određene SQL naredbe.Već pomenuta i korišćena klasa java.sql.Statement interface ima i dva važna podtipa:

java.sql.PreparedStatement za izvršavanje prekompajlirane SQL naredbe i java.sql.CallableStatement za izvršavanje poziva stored procedura koje postoje u

okviru baze podataka.

Zadatak 1. U Notepadu ukucati sledeći program i snimiti ga pod imenom Vez9Zad3.java. Iskompajlirati napisani program i pokrenuti ga pomoću Java programskog jezika.

import java.sql.*;public class Vez9Zad3{

public static void main(String[] args) { try {

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");try {Connection con = DriverManager.getConnection( "jdbc:odbc:VetsDri", "proba", "proba" );Statement stmt = con.createStatement();String queryTableCoffees = "SELECT COF_NAME, SUP_ID, PRICE, SALES, TOTAL FROM

COFFEES" ;/* JDBC vraca rezultate upita kroz ResultSet objekt, pa je potrebno deklarisati

instancu klase ResultSet za cuvanje rezultata upita. Sledeci kôd demonstrira deklarisanje ResultSet objekta rs i dodeljivanje rezultata upita rs objektu.

*/ResultSet rs = stmt.executeQuery( queryTableCoffees );while (rs.next()) { String coffeName = rs.getString("COF_NAME"); int supplierId = rs.getInt("SUP_ID"); float price = rs.getFloat("PRICE"); int sales = rs.getInt( 4 ); int total = rs.getInt( 5 );/* JDBC nam pruza mogucnost upotrebe ili imena kolone ili broja kolone u upitu

kao argument getXXX metode*/ System.out.println( coffeName + "\t\t\t" + supplierId + "\t" + price + "\t" +

sales + "\t" + total );}System.out.println("Query successfully finished");

Page 8: Java Baze 2 Sevleti

con.close();} catch ( SQLException e ) { System.err.println( e ); }

} catch ( ClassNotFoundException e) { System.out.println("Error : " + e ); }}

}

Šta je rezultat izvršavanja ovog programa?

Zadatak 2. U Notepadu ukucati sledeći program i snimiti ga pod imenom Vez9Zad4.java. Iskompajlirati napisani program i pokrenuti ga pomoću Java programskog jezika.

/** Ako zelimo da izvrsavamo Statement objekt vise puta, ustedecemo vreme izvrsavanja upotrebom PreparedStatement objekta. */import java.sql.*;public class Vez9Zad4 { public static void main(String[] args) {

try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

try { Connection con = DriverManager.getConnection( "jdbc:odbc:VetsDri", "proba", "proba" ); PreparedStatement updateSalesPrepared = con.prepareStatement( "UPDATE COFFEES SET SALES = ?

WHERE COF_NAME LIKE ?");

int [] salesForWeek = {175, 150, 60, 155, 90}; String [] coffees = {"Colombian", "French_Roast", "Espresso",

"Colombian_Decaf", "French_Roast_Decaf"}; int len = coffees.length; for(int i = 0; i < len; i++) {

updateSalesPrepared.setInt(1, salesForWeek[i]); // postavljanje prvog parametraupdateSalesPrepared.setString(2, coffees[i]); // postavljanje drugog parametraupdateSalesPrepared.executeUpdate(); // izvrsavanje updatea

}

System.out.println("Prepared statement executed successfully"); Statement stmt = con.createStatement(); String queryTableCoffees = "SELECT COF_NAME, SALES FROM COFFEES" ; ResultSet rs = stmt.executeQuery( queryTableCoffees );

while (rs.next()) {String coffeName = rs.getString("COF_NAME");int sales = rs.getInt(2);System.out.println( coffeName + "\t\t\t" + sales );

} con.close(); } catch ( SQLException e ) { System.err.println( e ); }} catch ( ClassNotFoundException e) { System.out.println("Error : " + e ); }

}}

Šta je rezultat izvršavanja ovog programa?

IV aktivnost: Rad sa servletima

Page 9: Java Baze 2 Sevleti

U okviru ove aktivnosti demonstriran je rad i osnovne operacije sa specijalnim Java programima - servletima.

Page 10: Java Baze 2 Sevleti

Zadatak 1. U Notepadu ukucati sledeće klase i snimiti ih pod odgovarajućim imenom. Iskompajlirati napisane Java programe.U folderu C:\Program Files\Apache Tomcat 4.0\webapps napraviti sledeću direktorijumsku strukturu:

1. SADRŽAJ STRANICE index.html

<html><head><title>Poziv servleta</title></head><body><form action="http://localhost:8080/intProg/ZdravoSvima" method="post">Prezime:<input type="text" name="prezime"><br>Ime:<input type="text" name="ime"><br>Broj indeksa:<input type="text" name="index"><br>Smer:<select name="smer"><option>RT<option>EL<option>NRT</select><br><input type="submit" name="submit" value="Pozovi servlet"></form></body></html>

2. SADRŽAJ SERVLETA ZdravoSvima

import java.io.*;import javax.servlet.*;import javax.servlet.http.*;

public class ZdravoSvima extends HttpServlet {

public void doPost (HttpServletRequest zahtev, HttpServletResponse odgovor) throws ServletException, IOException{

String ime=zahtev.getParameter("ime");String prezime=zahtev.getParameter("prezime");String index=zahtev.getParameter("index");String smer=zahtev.getParameter("smer");

PrintWriter izlaz = odgovor.getWriter();

izlaz.println("<HTML><HEAD><TITLE>ZdravoSvima1</TITLE></HEAD>"); izlaz.println("<BODY>");

izlaz.println("<H1>Zdravo svima!!! Zovem se " +prezime+" "+ime+". Broj indeksa mi je "+index+". Studiram na smeru "+smer+".</H1>");

izlaz.println("</BODY></HTML>");izlaz.close();

intProgWEB-INF

classes

ZdravoSvima.javaweb.xmlindex.html

Page 11: Java Baze 2 Sevleti

}}

3. SADRŽAJ web.xml fajla

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app> <servlet> <servlet-name>ZdravoSvima</servlet-name> <servlet-class>ZdravoSvima</servlet-class> </servlet> <servlet-mapping> <servlet-name>ZdravoSvima</servlet-name> <url-pattern>/ZdravoSvima</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> <welcome-file-list>

<welcome-file>index.html</welcome-file> </welcome-file-list></web-app>

Fajlove index.html, ZdravoSvima.java i web.xml snimiti u odgovarajuće direktorijume (kao na slici). Pokrenuti Tomcat Web server (Start->Programs->Apache Tomcat 4.0->start). Otvoriti Web browser i u adresnom baru uneti sledeću adresu: http://localhost:8080/intProg

3. Zadaci za samostalan radZadatak 1. Pomoću programa pisanog u Javi kreirati tabele, u okviru formirane baze podataka BazaPrimer, sa navedenim poljima:

a. student: korisnickoIme - varchar (32), lozinka - varchar (32);b. predmeti: Name - varchar (255), PredmetSkraceno - varchar (255);

U formirane tabele prvo učitati određeni skup podataka, zatim nekim poljima promeniti vrednosti.

Page 12: Java Baze 2 Sevleti

PROGRAMIRANJE U JEZIKU JAVA

PRIMER JAVA INTERNET APLIKACIJE

VEŽBA BR. 10

PREGLEDAO:

OCENA:

DATUM:

Page 13: Java Baze 2 Sevleti

VEŽBA 10: PRIMER JAVA INTERNET APLIKACIJE

1. CILJ VEŽBE

Cilj desete vežbe je da se studenti upoznaju sa realizacijom jedne Internet aplikacije bazirane na Java programskom jeziku. Da bi se to postiglo potrebno je primeniti sve koncepte i teme obrađene u prethodnim vežbama. Aplikacija koja se realizuje je troslojne arhitekture: klijent - Web server - server baze podataka. Na klijentskoj strani izvršava se HTML kôd sa JavaScript funkcijama i JSP tagovima. Serverski deo aplikacije je realizovan pomoću Java servleta. Kao baza podataka koristi se MySQL baza.

2. OPIS VEŽBE

U okviru ove vežbe potrebno je da se realizuju klijentske strane, servleti na Web serveru, kao i da se projektuje baza podataka. Kao Web server koristi se Jakarta Tomcat, a kao baza podataka MySQL baza. Treba naglasiti da su svi alati koji se koriste u ovoj vežbi apsolutno besplatni i dostupni za download. Takođe, ono što izdvaja ovu tehnologiju, pored nezavisnosti od hardverske ili softverske platforme ili korišćenog Web servera, je efikasno korišćenje moćne Java tehnologije na serverskoj strani sa jednostavnošću statičkih HTML strana na klijentu.Na klijentskoj strani izvršavaju se stranice koje sadrže HTML kôd sa JavaScript funkcijama i JSP (Java Server Pages) tagovima. Pomoću HTML i JavaScript kôda generiše se statički sadržaj stranica, dok se pomoću Jave dobija i mogućnost dinamičkog generisanja sadržaja. Svrha postojanja JSP stranica je definisanje deklarativnog, prezentacijskog metoda za pisanje servleta. Kao što je već navedeno, JSP specifikacija je definisana kao standardna tehnologija na vrhu Servlet API klasa.

Slika 1. Primer izvršavanja JSP stranice

Page 14: Java Baze 2 Sevleti

Uobičajeno je da JSP stranica prolazi kroz dve faze: translacionu i fazu odgovora na zahtev. Translaciona faza izvršava se samo jednom, sve dok se u kôd stranice ne unesu neke izmene, u kom slučaju se prevođenje ponavlja. Ako u kôdu na stranici ne postoji greška, formira se novi fajl, kao što je prikazano na slici 1. Dobijeni fajl predstavlja Javinu klasu. Ova klasa implementira interfejs Servlet i na osnovu Java koda u okviru JSP stranice dobija format koji prepoznaje Web server. Ovu fazu izvršava JSP mašina na Web serveru sama kada primi prvi put zahtev za stranicom. Takođe, JSP stranica može se iskompajlirati u class fajl pre instalacije aplikacije na server čime se izbegava kašnjenje pri prvom pozivu stranice od strane korisnika. Gde se postavlja kôd stranice ili iskompajlirana klasa zavisi od korišćenog web servera.JSP sintaksu možemo grubo podeliti na direktive, scripting elemente, i standardne akcije.JSP direktive su poruke za JSP mašinu. One ne proizvode nikakav vidljivi izlaz, ali govore mašini šta da radi sa ostatkom JSP stranice. JSP direktive se nalaze u okviru <%@ ... %> taga. Dve osnovne direktive su page i include. Include direktiva daje mogućnost podele sadržaja stranice u manje, lakše razumljive, elemente kao što su uključivanje u svaku stranicu aplikacije standardnih headera ili footera. Stranica koja se poziva u okviru ove direktive može biti statička HTML strana ili neki drugi JSP sadržaj. Na primer direktiva:

<%@ include file="copyright.html" %>može se koristiti za prikaz sadržaja fajla copyright.html bilo gde u okviru JSP stranice.JSP deklaracije dozvoljavaju definisanje promenljivih na nivou stranice radi snimanja određenih informacija ili definisanja određenih metoda koje su potrebne ostatku JSP stranice. Na ovaj način mogu se koristiti i JavaBeans komponente. Deklaracija se piše u okviru <%! ... %> taga. Uvek se deklaracija promenljivih završava tačka zarezom i njen sadržaj mora biti validna Java naredba. Primer deklaracije promenljive:

<%! int i=0; %>Takođe mogu se deklarisati i metode. Na primer preklapanje osnovne metode za inicijalizaciju događaja u okviru života JSP stranice deklariše se na sledeći način:

<%!public void jspInit(){//some initialization code

}%>

JSP Izrazi - Kada JSP mašina naiđe na izraz u okviru stranice izračunava se rezultat izraza, konvertuje u string i direktno prikazuje na izlaznom dokumentu. Obično, izrazi koriste se za prikazivanje vrednosti promenljivih ili vrednosti dobijene nakon izvršavanja pozvane JavaBeans komponente. JSP izrazi nalaze se u okviru <%= ... %> taga i ne završavaju se tačka zarezom:

<%= fooVariable %><%= fooBean.getName() %>

Scriptleti ili Java kôd u okviru JSP strane nalaze se u okviru <% ... %> taga. Ovaj Java kôd se izvršava pri obradi zahteva od JSP stranice. U okviru scriptleta može se pisati bilo koji validan Java kôd i količina kôda nije limitirana na jednu liniju. Sledeći primer prikazuje string "Zdravo" pomoću H1, H2, H3, i H4 taga, kombinujući korišćenje izraza i scriptleta:

<% for (int i=1; i<=4; i++) { %><H<%=i%>>Hello</H<%=i%>><% } %>

Komentari - Iako se mogu koristiti standardni HTML komentari u okviru JSP stranice, ove komentare klijent može da vidi ako pogleda kôd dobijen u okviru browsera. Ako se to ne želi mogu se koristiti komentari u okviru <%-- ... --%> taga:

<%-- comment for server side only --%>

Page 15: Java Baze 2 Sevleti

Servlet tehnologija i rad sa Web serverom i serverom baze podataka objašnjen je u tekstu prethodnih vežbi.

Zadatak 1. U Notepadu ukucati sledeće stranice i snimiti ih u odgovarajuće direktorijume Web servera. Iskompajlirati one stranice za koje je to potrebno.

1. SADRŽAJ STRANICE index.html <html><head><title>Prijava korisnika</title><meta http-equiv="Content-Type" content="text/html; charset=windows-1250"></head>

<body bgcolor="#FFFFFF" text="#000000"><form name="Login" method="post" action="LogovanjeServlet"> <table width="400" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td width="153"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>Korisnicko ime:</b></font></td> <td width="247"> <input type="text" name="korisnickoIme"> </td> </tr> <tr> <td width="153"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>Lozinka:</b></font></td> <td width="247"> <input type="password" name="lozinka"> </td> </tr> <tr> <td width="153"> <input type="submit" name="prosledi" value="Prosledi"> </td> <td width="247"> <input type="reset" name="odustani" value="Odustani"> </td> </tr> </table></form></body></html>

2. SADRŽAJ STRANICE OpstiPodaci.jsp <%@ page language="java" %><%@ page import="java.util.*" %>

<%! String korisnickoIme; %><%! String lozinka; %><%

korisnickoIme=(String)session.getAttribute("korisnickoIme");lozinka=(String)session.getAttribute("lozinka");

%><html><head><title>Opsti podaci</title></head><body>

Page 16: Java Baze 2 Sevleti

<FORM name='opstiPodaci' method='POST' action="SpisakPredmetaServlet">Vase korisnicko ime je &nbsp;<%=korisnickoIme%>.<br>A vasa lozinka je &nbsp;<%=korisnickoIme%>.<br>Pritisnite dugme da dobijete spisak predmeta.<br> <Input type=submit name="predmeti" value="Spisak predmeta"></form></body></html>

3. SADRŽAJ STRANICE PregledPredmeta.jsp <%@ page language="java" %><%@ page import="java.util.*" %><html><head><title>Spisak predmeta</title></head><body><%! int broj_predmeta; %><%! Vector predmeti; %><%! Vector predmetDetalji; %><%

broj_predmeta = (new Integer(session.getAttribute("broj_predmeta").toString())).intValue();predmetDetalji=(Vector)session.getAttribute("predmetDetalji");

%> <table width="600" border="0" cellspacing="3" cellpadding="2" align="left"> <tr> <td bgcolor="#6699CC"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#FFFFFF">PREDMET SKRACENO</font></b></td> <td bgcolor="#6699CC"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#FFFFFF">PUNO IME PREDMETA</font></b></td> </tr> <% for (int m=0;m<broj_predmeta;m++) { %> <% predmeti=(Vector)predmetDetalji.elementAt(m);%> <tr> <td bgcolor="#FFFFCC"> <div align="left"> <b><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#000066"><%=(String)predmeti.elementAt(0)%> </font></b></div> </td> <td bgcolor="#FFFFCC"> <div align="left"> <b><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#000066"><%=(String)predmeti.elementAt(1)%> </font></b></div> </td>

<%}%> </tr>

</table></body></html>

4. SADRŽAJ STRANICE Greska.jsp <%@ page language="java" %><%@ page import="java.util.*" %>

Page 17: Java Baze 2 Sevleti

<%! String greska; %><%

greska=(String)session.getAttribute("greska");%><html><head><title>JSP Page</title></head><body> <%=greska%>

</body></html>

5. SADRŽAJ STRANICE web.xml <?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>Logovanje</servlet-name> <servlet-class>Logovanje</servlet-class> </servlet> <servlet> <servlet-name>SpisakPredmeta</servlet-name> <servlet-class>SpisakPredmeta</servlet-class> </servlet> <servlet-mapping> <servlet-name>Logovanje</servlet-name> <url-pattern>/LogovanjeServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>SpisakPredmeta</servlet-name> <url-pattern>/SpisakPredmetaServlet</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file> index.jsp </welcome-file> <welcome-file> index.html </welcome-file> <welcome-file> index.htm </welcome-file> </welcome-file-list></web-app>

6. SADRŽAJ STRANICE Logovanje.jsp import java.io.*;

Page 18: Java Baze 2 Sevleti

import java.util.*;import java.sql.*;import javax.servlet.*;import javax.servlet.http.*;

public class Logovanje extends HttpServlet implements SingleThreadModel{

String upit="";String greska="";String korisnickoIme="";String lozinka="";

Connection con=null;Statement stmt=null;ResultSet RS=null;

boolean prazno=false;

ServletContext sc =null;RequestDispatcher rd=null;

public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException

{ doPost(req,res);}

public void doPost (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{

HttpSession session=null; session=req.getSession(true); sc=getServletContext(); if(!req.getParameter("korisnickoIme").equals("")) { korisnickoIme=req.getParameter("korisnickoIme");

} else{

prazno=true; greska=greska+"Korisnicko ime nije prosledjeno!<br>";

} if(!req.getParameter("lozinka").equals("")) { lozinka=req.getParameter("lozinka");

} else{

prazno=true; greska=greska+"Lozinka nije prosledjena!<br>";

} try{ session.setAttribute("korisnickoIme",korisnickoIme); session.setAttribute("lozinka",lozinka); poveziMe(req,res); zatvoriKonekciju(); pozoviJSP(req,res); }catch (Exception e) {

greska="Doslo je do greske! Pokusajte ponovo!";proslediGresku(greska,req,res);greska="";

}}//kraj do post

Page 19: Java Baze 2 Sevleti

//pocinju ostale metode servleta

//pocinje metoda za povezivanje sa bazom podatakapublic void poveziMe(HttpServletRequest req, HttpServletResponse res){ try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); String url="jdbc:odbc:BazaPrimer";

con = DriverManager.getConnection(url,"",""); stmt=con.createStatement();

String query1 = "select * from Student where (korisnickoIme='"+korisnickoIme+"' and lozinka='"+lozinka+"')";

RS=stmt.executeQuery(query1); if(!RS.next()) { greska="Ne postoji korisnik sa unetim korisnickim imenom i sifrom!"; proslediGresku(greska,req,res); } } catch (Exception e) {

e.printStackTrace();greska="Konekcija sa bazom podataka nije uspostavljena!";proslediGresku(greska,req,res);greska="";//prosledjuje se greska jsp stranici koja vraca gresku...

}}

//pocinje metoda za zatvaranje konekcije sa bazom podatakapublic void zatvoriKonekciju(){ if (con!=null){ try { con.close(); } catch (SQLException e) { e.printStackTrace();

greska="Greska prilikom zatvaranja konekcije sa bazom podataka!";//proslediGresku(greska,req,res);greska="";

}}}//zavrsava se metoda za zatvaranje konekcije sa bazom podataka

//pocinje metoda koja prosledjuje odgovarajucu gresku korisnikupublic void proslediGresku(String g, HttpServletRequest req, HttpServletResponse res) {

HttpSession session=null;

session=req.getSession(true);

session.setAttribute("greska",greska); rd = sc.getRequestDispatcher("/Greska.jsp"); try{ rd.forward(req,res); greska=""; } catch(Exception e){

Page 20: Java Baze 2 Sevleti

}}//zavrsava se metoda koja prosledjuje odgovarajucu gresku korisniku

//pocinje metoda koja poziva JSP stranicu "Login"public void pozoviJSP(HttpServletRequest req, HttpServletResponse res){

try{ rd = sc.getRequestDispatcher("/OpstiPodaci.jsp"); rd.forward(req,res); } catch(Exception e){ greska="nije uspelo "+e; //proslediGresku(greska,req,res); greska=""; } }}//zavrsava se metoda koja poziva JSP stranicu "Login"

7. SADRŽAJ STRANICE SpisakPredmeta.jsp

import java.io.*;import java.util.*;import java.sql.*;import javax.servlet.*;import javax.servlet.http.*;

public class SpisakPredmeta extends HttpServlet implements SingleThreadModel{

String upit="";String greska="";Connection con=null;Statement stmt=null;ResultSet RS=null;ServletContext sc =null;RequestDispatcher rd=null;

public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException

{ doPost(req,res);}

public void doPost (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{

sc=getServletContext(); try{ poveziMe(req,res); zatvoriKonekciju(); pozoviJSP(req,res); }catch (Exception e) {

greska="Doslo je do greske! Pokusajte ponovo!";proslediGresku(greska,req,res);greska="";

}}//kraj do post

//pocinju ostale metode servleta

//pocinje metoda za povezivanje sa bazom podataka

Page 21: Java Baze 2 Sevleti

public void poveziMe(HttpServletRequest req, HttpServletResponse res){ HttpSession session=null; session=req.getSession(true); try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); String url="jdbc:odbc:BazaPrimer";

con = DriverManager.getConnection(url,"",""); stmt=con.createStatement();

String query1 = "select * from Predmeti";RS=stmt.executeQuery(query1);

int broj_predmeta=0; Vector predmetDetalji=new Vector(); while (RS.next()){ broj_predmeta++; Vector predmet=new Vector(); for(int i=1;i<=2;i++){

predmet.addElement(RS.getString(i)); } predmetDetalji.addElement(predmet); }

session.setAttribute("predmetDetalji",predmetDetalji);session.setAttribute("broj_predmeta",new Integer(broj_predmeta));

} catch (Exception e) {

e.printStackTrace();greska="Konekcija sa bazom podataka nije uspostavljena!";proslediGresku(greska,req,res);greska="";//prosledjuje se greska jsp stranici koja vraca gresku...

}}

//pocinje metoda za zatvaranje konekcije sa bazom podatakapublic void zatvoriKonekciju(){ if (con!=null){ try { con.close(); } catch (SQLException e) { e.printStackTrace();

greska="Greska prilikom zatvaranja konekcije sa bazom podataka!";//proslediGresku(greska,req,res);greska="";

}}}//zavrsava se metoda za zatvaranje konekcije sa bazom podataka

//pocinje metoda koja prosledjuje odgovarajucu gresku korisnikupublic void proslediGresku(String g, HttpServletRequest req, HttpServletResponse res) {

HttpSession session=null;

session=req.getSession(true);

session.setAttribute("greska",greska); rd = sc.getRequestDispatcher("/Greska.jsp");

Page 22: Java Baze 2 Sevleti

try{ rd.forward(req,res); greska=""; } catch(Exception e){ }}//zavrsava se metoda koja prosledjuje odgovarajucu gresku korisniku

//pocinje metoda koja poziva JSP stranicu "Login"public void pozoviJSP(HttpServletRequest req, HttpServletResponse res){

try{ rd = sc.getRequestDispatcher("/PregledPredmeta.jsp"); rd.forward(req,res); } catch(Exception e){ greska="nije uspelo "+e; proslediGresku(greska,req,res);

} }}//zavrsava se metoda koja poziva JSP stranicu "Login"

8. SADRŽAJ BAZE PODATAKA U okviru MySQL baze podataka formirati bazu pod imenom BazaPrimer. U okviru formirane baze podataka formirati sledeće tabele sa navedenim poljima:

a. student: korisnickoIme - varchar (32), lozinka - varchar (32);b. predmeti: Name - varchar (255), PredmetSkraceno - varchar (255);

Pokrenuti Tomcat Web server (Start->Programs->Apache Tomcat 4.0->start). Otvoriti Web browser i u addresnom baru uneti odgovarajuću adresu aplikacije.

3. ZADACI ZA SAMOSTALAN RAD

Zadatak 1: Potrebno je napraviti sledeću Internet aplikaciju:Omogućiti prijavljivanje korisnika na sistem. Korisnik treba da ima mogućnost unošenja

korisničkog imena i lozinke, i u slučaju ispravno unetih podataka omogućavanje rada sa ostatkom sistema. U slučaju pogrešno unetih podataka prikazati odgovarajuću poruku. Pored prijavljivanja na sistem korisniku na početnom ekranu prikazati linkove na registraciju i promenu šifre.

Registracija treba da omogući unos sledećih podataka: ime, prezime, korisničko ime, šifra, potvrda šifre, e-mail adresa. Ako su podaci uneti na pravilan način podatke zapamtiti u bazi podataka i korisniku omogućiti pristup sistemu.

Ekran za promenu šifre treba da omogući korisniku da, nakon unošenja dosadašnjeg korisničkog imena i šifre, promeni šifru.

Nakon pravilnog prijavljivanja korisnika na sistem, prikazati sledeće opcije: dodavanje novog albuma, lista albuma po izvodjaču, lista albuma po imenu albuma, lista albuma po trajanju albuma.

Page 23: Java Baze 2 Sevleti

Opcija dodavanje novog albuma treba da omogući korisniku da unese sledeće podatke: ime albuma, izvođač albuma, trajanje albuma.

Opcije lista albuma po izvodjaču treba da omogući korisniku da dobije spisak svih albuma čije ime izvođača počinje unetim stringom.

Opcije lista albuma po imenu albuma treba da omogući korisniku da dobije spisak svih albuma čije ime albuma počinje unetim stringom.

Opcije lista albuma po trajanjju treba da omogući korisniku da dobije spisak svih albuma čije trajanje je manje od unete vrednosti.

Na ekranu gde je prikazan željeni spisak korisniku treba omogućiti opciju za povratak na ekran sa korisničkim opcijama.

Baza podataka treba da ima dve tabele:korisnici – sa poljima: korisnikID, ime, prezime, korisničko ime, šifra, email adresaalbumi – sa poljima: albumID, ime albuma, izvođač albuma, trajanje albumaNapomena 1: Na klijentskoj strani pri unosu određenih vrednosti izvršiti sve moguće

provere.Napomena 2: Zadatak je bio u formi projektnog zadatka za ispitni rok jun 2003. godine.

Zadatak 2: Potrebno je napraviti sledeću Internet aplikaciju:Omogućiti prijavljivanje korisnika na sistem. Korisnik treba da ima mogućnost unošenja

korisničkog imena i lozinke, i u slučaju ispravno unetih podataka omogućavanje rada sa ostatkom sistema. U slučaju pogrešno unetih podataka prikazati odgovarajuću poruku. Pored prijavljivanja na sistem korisniku na početnom ekranu prikazati linkove na registraciju i promenu šifre.

Registracija treba da omogući unos sledećih podataka: ime, prezime, korisničko ime, šifra, potvrda šifre, e-mail adresa. Ako su podaci uneti na pravilan način podatke zapamtiti u bazi podataka i korisniku omogućiti pristup sistemu.

Ekran za promenu šifre treba da omogući korisniku da, nakon unošenja dosadašnjeg korisničkog imena i šifre, promeni šifru.

Nakon pravilnog prijavljivanja korisnika na sistem prikazati sledeće opcije: dodavanje novog filma, lista filmova po reditelju, lista filmova po glavnom glumcu, lista filmova po imenu, lista filmova po godini distribuiranja.

Opcija dodavanje novog filma treba da omogući korisniku da unese sledeće podatke: ime filma, reditelj, glavni glumac, godina distribuiranja.

Opcija lista filmova po reditelju treba da omogući korisniku da dobije spisak svih filmova čije ime reditelja počinje unetim stringom.

Opcija lista filmova po imenu filma treba da omogući korisniku da dobije spisak svih filmova čije ime počinje unetim stringom.

Opcija lista filmova po imenu glavnog glumca treba da omogući korisniku da dobije spisak svih filmova čije ime glavnog glumca počinje unetim stringom.

Opcija lista filmova po godini distribuiranja treba da omogući korisniku da dobije spisak svih filmova čija je godina distribuiranja uneta vrednost.

Na ekranu gde je prikazan željeni spisak korisniku treba omogućiti opciju za povratak na ekran sa korisničkim opcijama.

Baza podataka treba da ima dve tabele:korisnici – sa poljima: korisnikID, ime, prezime, korisničko ime, šifra, e-mail adresafilm – sa poljima: filmID, ime filma, reditelj, glavni glumac, godina distribuiranja.Napomena 1: Na klijentskoj strani pri unosu određenih vrednosti izvršiti sve moguće

provere.Napomena 2: Zadatak je bio u formi projektnog zadatka za ispitni rok maj 2004. godine.