Predavanje JSP Plus JDBC

23
JSP While there are numerous technologies for building web applications that serve dynamic content, the one that has really caught the attention of thedevelopment community is JavaServer Pages TM (JSP TM ). And not without ample reason either. JSP not only enjoys cross-platform and cross-Web- server support, but effectively melds the power of server- side Java technology with the WYSIWYG features of static HTML pages. 1. JSP pages typically comprise of: 2. Static HTML/XML components. 3. Special JSP tags Najčešće, delovi Java koda u okviru JSP stranice se nazivaju "scriptlets." JSP stranica se može kreirati pomoću standardnih HTML/XML alata, ali treba naglasiti da je JSP specifikacaija standardni deo Java Servlet API. Zbog ove činjenice u radu sa JSP stranicama iskustvo i znanje o servletima je veom akorisno. Ipak, postoje značajne razlike izmđu ove dve tehnologije. Za razliku od servleta, gde je za programiranje potrebno značajno programersko znanje, JSP tehnologija je mnogo bliža i manje iskusnim programerima, ali i dizajnerima korisničkog interfejsa. Na ovaj način i

Transcript of Predavanje JSP Plus JDBC

Page 1: Predavanje JSP Plus JDBC

JSP

While there are numerous technologies for building web applications that serve dynamic content, the one that has really caught the attention of thedevelopment community is JavaServer Pages TM (JSP TM ). And not without ample reason either. JSP not only enjoys cross-platform and cross-Web-server support, but effectively melds the power of server-side Java technology with the WYSIWYG features of static HTML pages.

1. JSP pages typically comprise of:

2. Static HTML/XML components.

3. Special JSP tags

Najčešće, delovi Java koda u okviru JSP stranice se nazivaju "scriptlets."

JSP stranica se može kreirati pomoću standardnih HTML/XML alata, ali treba naglasiti da je JSP specifikacaija standardni deo Java Servlet API. Zbog ove činjenice u radu sa JSP stranicama iskustvo i znanje o servletima je veom akorisno. Ipak, postoje značajne razlike izmđu ove dve tehnologije. Za razliku od servleta, gde je za programiranje potrebno značajno programersko znanje, JSP tehnologija je mnogo bliža i manje iskusnim programerima, ali i dizajnerima korisničkog interfejsa. Na ovaj način i dizajneru mogu da dobiju značajajniju ulogu u toku razvoja same aplikacije. Još jedna prednost JSP tehnologije je efikasno korišćenje odvojenih nezavisnih programskih segmenata. Time do punog izražaja dolaze sve osobine objektno orijentisanog programiranja. Nezavisni programski segmenti se definišu u okviru komponenata zvanih JavaBeans, a tehnologija koja ih koristi je Enterprise JavaBeans tehnologija.

Da bi se pokretale i JSP stranice i povezivale sa servletima potrebno ih je izvršavati na određenom Web serveru. U okviru ovog kursa koristiće se Jakarta Tomcat Web Server, na kome će se izvršavati svi primeri.

Prednosti JSP tehnologije

Page 2: Predavanje JSP Plus JDBC

Odvojen statički od dinamičkog sadržaja: Kada se klijentski sadržaj generiše u okviru servleta, logika stvaranja dinamičkog sadržaja je sastavni deo koda servleta. Takođe statički deo klijentske strane je “sakrivena” u okviru servleta. Pored otežanog praćenja samog koda, nakon svake, pa i najmanje promene, servlet se mora ponovo kompajlirati. Sve ovo prouzrokuje stvaranje aplikacije čija se logika veom ateško razume, a svaka promena zahteva određeno vreme.

Sa JSP stranicama statički deo se odvaja od dinamičkog korišćenjem specialnih tagova i scriptleta. Kada dizajner strane napravi bilo koju promenu, JSP stranica se automatski rekompajlira i ponovo učita na web server pomoću JSP mašine.

Piši jednom izvršavaj bilo gde: JSP tehnologija donosi ovo pravilo i u interaktivne Web strane. JSP stranice se mogu prenositi sa jedne platforme na drugu, ili promeniti Web server, ponašanje aplikacije će biti potpuno isto.

Dinamički sadržaj se može predstaviti u različitim formatima: Ne postoji pravilo u kom formatu staitički (template) deo JSP stranice mora da bude. Tako, da JSP stranica može koristiti standardni HTML/DHTML kod koji se može izvržavati pomoću browser-a, ili WML kod koji se izvršava na hanheld bežičnim uređajima, dok novije aplikacije koriste XML kod.

Dobijanje Web pristupnog nivoa kod aplikacija n-slojnr arhitekture: Standardna Sunova dokumentacija J2EE TM Blueprints, koja predstavlja glavni vodič za implementaciju složenih Java aplikacija pomoću enterprise Java klasa i JavaBeans, kategorično preporučuje korišćenje JSP stranica u odnosu na servlete za generisanje klijentske strane aplikacije.

Potpuna usklađenost sa servlet tehnologijom: Za svakog servlet programera, potrebno je veoma malo truda i vremena za razumevanje JSP tehnolgije. U stvari, servlet programeri su u velikoj prednosti, jer je su JSP stranice u stvari servelti pisani na velikom nivou apstrakcije. Sve što se može uraditi sa servletima, može i pomoću JSP stranica, ali mnogo jednostavnije!

Arhitektura JSP stranicaSvrha 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.

Page 3: Predavanje JSP Plus JDBC

Uobičajeno je da JSP stranicaprolazi kroz dve faze: translacionu i fazu odgovra na zahtev. Translaciona faza se izvršava samo jednom, sve dok se u kod stranice ne unesu neke izmene,u kom slučaju se prevođenje ponavlja. Ako u kodu na stranici ne postoji greška, rezultat prevođenja je fajl koji predstavlja klasu implementiranu Servlet interface, kao što je prikazano na slici. Ovu fazu izvršava JSP mašina na web serveru sama, kada primi prvi put zahtev za stranicom. Takođe, JSP stranica se može iskompajlirati u class fajl pre instalacije aplikacije na server čime se izbegava kašnjenje pri prvom pozivu stranice od strane korisnika. Gde se postavlja kod stranice ili iskpmpajlirana klasa zavisi od korišćenog web servera. Kod dobijen od JSP stranice prikazane na gornjoj slici i iskompajliran od strane Tomcat serveraje sledeći:

package jsp;

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;

import java.io.PrintWriter;

import java.io.IOException;

import java.io.FileInputStream;

import java.io.ObjectInputStream;

import java.util.Vector;

import org.apache.jasper.runtime.*;

import java.beans.*;

import org.apache.jasper.JasperException;

import java.text.*;

import java.util.*;

public class _0005cjsp_0005cjsptest_0002ejspjsptest_jsp_0

extends HttpJspBase {

static {

}

Page 4: Predavanje JSP Plus JDBC

public _0005cjsp_0005cjsptest_0002ejspjsptest_jsp_0( ) {

}

private static boolean _jspx_inited = false;

public final void _jspx_init() throws JasperException {

}

public void _jspService(HttpServletRequest request,

HttpServletResponse response)

throws IOException, ServletException {

JspFactory _jspxFactory = null;

PageContext pageContext = null;

HttpSession session = null;

ServletContext application = null;

ServletConfig config = null;

JspWriter out = null;

Object page = this;

String _value = null;

try {

if (_jspx_inited == false) {

_jspx_init();

_jspx_inited = true;

}

_jspxFactory = JspFactory.getDefaultFactory();

response.setContentType("text/html");

pageContext = _jspxFactory.getPageContext(this,

request,response, "", true, 8192, true);

application = pageContext.getServletContext();

config = pageContext.getServletConfig();

session = pageContext.getSession();

out = pageContext.getOut();

// begin

out.write("\r\n<html>\r\n<body>\r\n");

// end

// begin [file="E:\\jsp\\jsptest.jsp";from=(3,2);to=(5,0)]

Date d = new Date();

String today = DateFormat.getDateInstance().format(d);

// end

// begin

out.write("\r\nToday is: \r\n<em> ");

// end

// begin [file="E:\\jsp\\jsptest.jsp";from=(7,8);to=(7,13)]

Page 5: Predavanje JSP Plus JDBC

out.print(today);</b>

// end

// begin

out.write(" </em>\r\n</body>\r\n</html>\r\n");

// end

} catch (Exception ex) {

if (out.getBufferSize() != 0)

out.clear();

pageContext.handlePageException(ex);

} finally {

out.flush();

_jspxFactory.releasePageContext(pageContext);

}

}

}

Dobijena klasa od JSP stranice nasleđuje osnovnu klasu HttpJspBase, čime u stvari vrši implementaciju Servlet interfejsa.Kada se jednom klasa učita u okviru servlet container, _jspService() metod je odgovoran za odgovor na klijeske zahteve. Ovaj metod se ne može preklapati i izvršava se u posebnoj niti u okviru servlet containera. Tok izvršavanja JSP stranice je prikazan na sledećoj slici:

Modeli pristupa JSP stranicama

Rana JSP specifikacija je preporučivala dva metoda pristupa JSP stranicama, koji su nazvani Model 1 i Model 2 arhitekture. Ova dva pristupa su se razlikovala po mestu gde je vršena obrada zahteva. Model 1 arhitektura je sledeća:

Page 6: Predavanje JSP Plus JDBC

Kod ovog modela, Zahtev dobijen od strane web browsera se šalje direktno JSP stranici, koj aje odgovorna za procesiranje zahteva i generisanje odgovora klijentu. Još uvek postoji razdvajanje klijentskog od sreverskog dela aplikacije, jer se svi pristupi podacima odvijaju preko Java Beans. Model 1 arhitektura se može koristiti za jednostavnije aplikacije, dok je za kompleksne implementacije ovaj model nepogodan. Korišćenje ove arhitekture obično dovodi do veoma velike količine scriptleta Java koda u okviru JSP stranice, posebno u slučajevima kada postoji složenije obrada klijetnskih zahteva. Na ovaj način se gubi mogućnost da i dizajneri učestvuju u razvoju logike strane, jer je za ovu vrstu implementacije potrebno veće Java iskustvo. Još jedan nedostatak ovakve arhitekture je da svaka JSP stranica stranica mora individualno da vodi računa o stanju aplikacije.

Arhitektura Modela 2 je sledeća:

Osnovna sintaksa JSP stranicaJSP sintaksu možemo grubo podeliti na direktive, scripting elemente, i standardne akcije.

Page 7: Predavanje JSP Plus JDBC

Direktive

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 and include. (Postoji još i taglib direktiva, koja se može koristiti za rad sa tag bibliotekama, ali neće biti razmatrana u daljem tekstu.)

Page Direktiva

Uobičajeno je da se ova direktiva nalazi u vrhu svih JSP stranica. Može se navseti proizvoljan broj page direktiva u okviru jedne JSP stranice, ali vrednost u okviru taga mora biti jedinstvena. Nepoznati atributi ili vrednosti dovode do greške pri kompajliranju. Na primer,

<%@ page import="java.util.*, moj.paket.*" buffer="16k" %>

dozvoljava korišćenje svih klasa koje postoje u okviru navedenih paketa u okviru scripting elemenata u nastavku stranice, kao i setovanje bafera stranice na 16K.

Include Direktiva

include direktiva daje mogućnost podele sadržahja stranice u manje, lakše razumljive elemente, kao što su uključivanje u svaku stranicu aplikacije standardnih headera ili footer-a. 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" %>

se može koristiti za prikaz sadržaja fajla copyright.html bilo gde u okviru JSP stranice.

Deklaracije

JSP deklaracije dozvoljavaju definisanje promenljivih na nivou stranice radi snimanja određenih informacija ili definisanja određenih metoda koji su potrebni ostatku JSP stranice. Takođe, na ovaj način se mogu 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 methodi. Na primer preklapanje osnovnog metoda za inicijalizaciju događaja u okviru života JSP stranice se deklariše na sledeći način:

<%!public void jspInit(){

//some initialization code

}

%>

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 se koriste za prikazivanje vrednosti promenljivih ili vrednosti dobijene nakon izvršavanja pozvane JavaBeans komponente. JSP izrazi se nalaze u okviru <%= ... %> taga i ne završavaju se tačka zarezom:

<%= fooVariable %>

<%= fooBean.getName() %>

Scriptleti

Page 8: Predavanje JSP Plus JDBC

Java kod u okviru JSP strane ili scriptleti se nalaze u okviru <% ... %> taga. Ovaj Java kod se izvršava pri obradi zahteva od JSP stranice. U okviru scripleta se može pisati bilo koji validan Java kod i količina koda nije limitirana na jednu liniju. Sledeći primer prikazuje string "Zdravo" pomoću H1, H2, H3, i H4 taga, combinujuć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 kod dobijen u okviru browser-a. Ako se to ne želi, mogu se koristiti komentari u okviru <%-- ... --%> taga:

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

Oblast važenja promenljivih

Predefinisani JSP Objekti

Kao dodatna prednost tehnologije, JSP container dozvoljava korišćenje predefinisanih objekata, koji se mogu koristiti u okviru scriptleta i izraza, bez potrebe da ih autor prvo kreira pre upotrebe. Ovi objekti su:

request: predstavlja objekat tipa HttpServletRequest. Oblast važenja je u okviru zahteva.

response: predstavlja objekat tipa HttpServletResponse za zahtev. Ne koristi se često. Oblast važenja je u okviru stranice.

pageContext: obuhvata osobine u zavisnosti od implementacije u okviru PageContext objekta. Oblast važenja je u okviru stranice.

application: predstvalja objekat tipa ServletContext. Oblast važenja je u okviru aplikacije.

out: predstavlja objekat tipa JspWriter koji zapisuje podatke u izlazni stream. Oblast važenja je u okviru stranice..

Page 9: Predavanje JSP Plus JDBC

config: predstvalja ServletConfig objekat za JSP stranicu. Oblast važenja je u okviru stranice.

page: sinonim za "this" operator, to jest za HttpJspPage.objekat. Ne koristi se često. Oblast važenja je u okviru stranice.

session: objekat tipa HttpSession. Oblast važenja je u okviru sesije.

exception: objekat tipa Throwable čije izvršavanje rezultuje pozivanjem error stranice koja je definisana u okviru ovog objekta. Oblast važenja je u okviru stranice.

Neki od navedenih metoda su vidljivi samo u okviru _jspService() metoda. Oni nisu vidljivi autoru i ne mogu se koristiti u deklaracijama.

Mogućnosti sihronizacije

Po definiciji service metod JSP stranice implementiran u prevedenu klasu, koji opslužuje zahteve klijenta je višekorisnički (multithreaded). Na ovaj način, odgvoronost je programera da li je pristup deljenim stanjima dobro sihronizovan. Postoji nekoliko načina da se obezbedi da service method bude bezbedan po pitanju sihronizacije. Najlakši način je pomoći sledeće direktive:

<%@ page isThreadSafe="true" %>

Ova direktiva prouzrokuje da se izvrši implementacija SingleThreadModel interface, čiji rezultat je sihronizacija, i više instanci servleta se učitava u memoriju Paralelni zahtevi više klijenata se distribuiraju između ovih instanci. Ovaj metod ne daje najbolje perfomanse. Bolji način je eksplicitni sinhroni pristup deljenim objektima pomoću Java koda u okviru scriptleta:

<%

synchronized (application) {

SharedObject foo = (SharedObject)

application.getAttribute("sharedObject");

foo.update(someValue);

application.setAttribute("sharedObject",foo);

}

%>

Rukovođenje izuzecima

JSP tehnologija omogućava elegantan mehanizam za handlovanje runtime exception. Korišćenjem atributa errorPage au okviru page direktive, moguće je u slučaju nepredviđene greške usmeriti program na izvršavanje stranice za obradu greške. Na primer,

<%@ page isErrorPage="false" errorPage="errorHandler.jsp" %>

informiše JSP mašinu d au slučaju bilo kakve neočekivane greške aplikaciju nastavi izvršavanjem JSP stranice errorHandler.jsp. Takođe, neophodno je u okviru errorHandler.jsp

tstranice naznačiti da se radi o stranici koja je pozvana, jer se desila greška, pomoću direktive:

<%@ page isErrorPage="true" %>

Rad sa sesijom

Po definiciji, sve JSP stranice se izvršavaju u okviru HTTP sesije. Objektu HttpSession

može se pristupiti iz Java koda implicitnim navođenjem session JSP objekta. Sesije su

Page 10: Predavanje JSP Plus JDBC

odlične lokacije za smeštanje objekata kojima je potrebno pristupati iz nekoliko JSP stranica ili servleta. Objekat session se identifikuje preko session ID i zapisan je u okviru browser-a kao cookie. Ako cookies nisu podržani od strane browser-a, tada se session ID može pamtiti pomoću samog URL, ali je ova mogućnost podržana samo kod nekoliko web servera:

<%

Foo foo = new Foo();

session.putValue("foo",foo);

%>

omogućava pristup Foo instanci preko svih JSP stranica i servleta koji pripadaju istoj sesiji. Instanci ovog objekta se može pristupiti sa druge JSP stranice preko sledećeg koda:

<%

Foo myFoo = (Foo) session.getValue("foo");

%>

Poziv session.getValue() vraća referencu na osnovni Object tip. Zato je veoma važno navesti kog tipa je promenljiva koja je pročitana, pre njenogkorišćenja. Moguće je definisati da određena JSP stranica ne pripada sesiji pomoću određenog atributa u okviru page

direktive:

<%@ page session="false" %>

Ne postoji limitiran broj koliko se objekata može zapamtiti u okviru sesije. Treba napomenuti da smeštanje velikih objekata u sesiju može bitno da degradira perfomanse aplikacije. Po definiciji većina servera setuje vreme objekta sesije na 30 minuta, ali se može jednostavno resetovati i menjati pozivom metoda invoking setMaxInvalidationInterval(int secs) nad objektom sesije. Naredna slika opisuje način rukovođenja sesijom:

JSP mašina održava reference na objekte smeštene u sesiji onoliko dugo koliko je sesija validna. Ako sesija postaje nevalidna ili istekne vreme sesije, objecti sesije se označavaju za garbage collection.

Page 11: Predavanje JSP Plus JDBC

Hidden promenljive

<input type=hidden name=”par1” value=88>

Organizacija Web AplikacijeJedna od mogućnosti je distribucija Web aplikacije u obliku fajla Web ARchive, ili WAR fajla, koji predstvalja standardni format za većinu servera.

Prvi i osnovni direktorijum se naziva document root aplikacije. Tu se smeštaju HTML fajlovi i JSP stranice, to jest klijentski deo aplikacije.Kada se aplikacija instalira na sistem definiše se putanja do aplikacije. Na primer ako je definisana putanja /catalog, tada pozivni URI glasi /catalog/index.html i izvršavaće se index.html sa document roota aplikacije.

Standardni Direktorijumi

*.html, *.jsp, itd. - HTML i JSP stranice, zajedno sa ostalim fajlovima koji se koriste na kloijetskoj strani (kao što su JavaScript i stylesheet fajlovi) se smeštaju u osnovni direktorijum. Kod većih aplikacija može se napraviti poddirektorijumi i ova hijerarhija.

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

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

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

JDBC 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 se mogu izvršavati SQL naredbe i manipulisati sa rezultatima dobijenim na osnovu ovih naredbi.

JDBC API sadrži niz abstraktnih Java interface koji dozvoljavaju programeru da ostvari konekciju sa određenom bazom podataka, izvrši SQL naredbe i obradi dobijene rezultate.

Najvažniji interface u okviru ovog paketa su:

Driver Manager

Connection Connection Connection

StatementStatementStatementStatement

Resultset Resultset Resultset

Page 12: Predavanje JSP Plus JDBC

- java.sql.DriverManager sprovodi učitavanje driver-a baze podataka i omogućava podršku za kreiranje nove konekcije

- java.sql.Connection predstavlja konekciju sa određenom bazom podataka- java.sql.Statement izvrašava se u obliku container-a za izvršavanje SQL

naredbi u okviru uspostavljene konekcije- java.sql.ResultSet kontroliše pristup rezultatima dobijenim izvršavanjem

određene SQL naredbe

java.sql.Statement interface ima dva važna podtipa:- java.sql.PreparedStatement za izvršavanje pre-kompajlirane SQL neredbe i- java.sql.CallableStatement za izvršavanje poziva stored procedura koje

postoje u okviru baze podataka.

JDBC URL ima sledeću strukturu: jdbc:<subprotocol>:<subname> gde je subprotocol ime odrđ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..

Primer inicijalizacije drajvera baze podataka:

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

Class.forName("org.gjt.mm.mysql.Driver”);

Page 13: Predavanje JSP Plus JDBC

Example: Execute Query

import java.sql.*;public class JDBCDemoCreateTable { public static void main(String[] args) {// 1. step loading the driver

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

// 2. step making the connection String url = "jdbc:odbc:BootCamp" ; String myLogin = "mika" ; // the name you use to log in to the DBMS String myPassword = "mika" ; // your password for the DBMS 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. step creating JDBC sStatement. A Statement object is what sends your SQL// statement to the DBMS. You simply create a Statement object and then execute// it, supplying the appropriate execute method with the SQL statement you want// to send. For a SELECT statement, the method to use is executeQuery . For // statements that create or modify tables, the method to use is executeUpdate

Statement stmt = con.createStatement();stmt.executeUpdate(createTableCoffees);

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

}}----

import java.sql.*;public class JDBCDemoUpdateTable {

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

try {Connection con = DriverManager.getConnection( "jdbc:odbc:BootCamp",

"mika", "mika" );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 );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 );

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

}---

import java.sql.*;public class JDBCDemoSelectTable {

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

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");try {Connection con = DriverManager.getConnection( "jdbc:odbc:BootCamp",

"mika", "mika" );Statement stmt = con.createStatement();String queryTableCoffees = "SELECT COF_NAME, SUP_ID, PRICE, SALES,

TOTAL FROM COFFEES" ;// JDBC returns results in a ResultSet object, so we need to declare an instance of the

Page 14: Predavanje JSP Plus JDBC

// class ResultSet to hold our results. The following code demonstrates declaring the // ResultSet object rs and assigning the results of our earlier query to it:

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 allows you to use either the column name or the column number as the argument to a getXXX method

System.out.println( coffeName + " " + supplierId + " " + price + " " +

sales + " " + total );}} catch ( SQLException e ) { System.err.println( e ); }

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

}}---

Example: Using parameter Query

/**

*

* If you want to execute a Statement object many times, it will normally reduce

* execution time to use a PreparedStatement object instead.

*

*/

import java.sql.*;

public class JDBCDemoPreparedStatement {

public static void main(String[] args) {

try {

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

try {

Connection con = DriverManager.getConnection( "jdbc:odbc:BootCamp", "mika", "mika" );

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]); // setting up first parameter

updateSalesPrepared.setString(2, coffees[i]); // setting up second parameter

updateSalesPrepared.executeUpdate(); // executing update

}

Page 15: Predavanje JSP Plus JDBC

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 + " " + sales );

}

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

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

}

}

Page 16: Predavanje JSP Plus JDBC

Example: Using CallableStatement

import java.sql.*;

public class JDBCDemoCallableStatement {

public static void main(String[] args) {

try {

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

String url = "jdbc:odbc:BootCamp" ;

String myLogin = "mika" ; // the name you use to log in to the DBMS

String myPassword = "mika" ; // your password for the DBMS

try {

Connection con = DriverManager.getConnection( url, myLogin, myPassword );

// A stored procedure is a group of SQL statements that form a logical unit and perform a particular task

String createProcedure = "create procedure SHOW_SUPPLIERS " +

"as " +

"select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " +

"from SUPPLIERS, COFFEES " +

"where SUPPLIERS.SUP_ID = COFFEES.SUP_ID " +

"order by SUP_NAME";

Statement stmt = con.createStatement();

stmt.executeUpdate(createProcedure);

// Calling a Stored Procedure from JDBC

CallableStatement cs = con.prepareCall("{call SHOW_SUPPLIERS}");

ResultSet rs = cs.executeQuery();

while (rs.next()) {

String supName = rs.getString("SUP_NAME");

String coffyName = rs.getString("COF_NAME");

System.out.println( supName + " " + coffyName );

}

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

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

}

}

Page 17: Predavanje JSP Plus JDBC

Mapping SQL data types into Java and Use of ResultSet.getXXX Methods to Retrieve JDBC Types

SQ

L t

ype

TIN

YIN

T

SM

AL

LIN

T

INT

EG

ER

BIG

INT

RE

AL

FL

OA

T

DO

UB

LE

DE

CIM

AL

NU

ME

RIC

BIT

CH

AR

VA

RC

HA

R

LO

NG

VA

RC

HA

R

BIN

AR

Y

VA

RB

INA

RY

LO

NG

VA

RB

INA

RY

DA

TE

TIM

E

TIM

ES

TA

MP

Java

Typ

e

Str

ing

Str

ing

Str

ing

java

.mat

h.B

igD

ecim

al

java

.mat

h.B

igD

ecim

al

bool

ean

byte

shor

t

int

long

floa

t

doub

le

doub

le

byte

[]

byte

[]

byte

[]

java

.sql

.Dat

e

java

.sql

.Tim

e

java

.sql

.Tim

esta

mp

getByte X x x x x x x x x x x x x            

getShort x X x x x x x x x x x x x            

getInt x x X x x x x x x x x x x            

getLong x x x X x x x x x x x x x            

getFloat x x x x X x x x x x x x x            

getDouble x x x x x X X x x x x x x            

getBigDecimal x x x x x x x X X x x x x            

getBoolean x x x x x x x x x X x x x            

getString x x x x x x x x x x X X x x x x x x x

getBytes                           X X x      

getDate                     x x x       X   x

getTime                     x x x         X x

getTimestamp                     x x x       x x X

getAsciiStream                     x x X x x x      

getUnicodeStream                     x x X x x x      

getBinaryStream                           x x X      

getObject x x x x x x x x x x x x x x x x x x x

An "x" indicates that the getXXX method may legally be used to retrieve the given JDBC type.

An " X " indicates that the getXXX method is recommended for retrieving the given JDBC type.

Page 18: Predavanje JSP Plus JDBC

Relationships between the interface

Page 19: Predavanje JSP Plus JDBC