Java: la libreria delle classi • Applet – anatomia di un applet – cenni di html • La libreria JDBC per l’accesso ai database – il package java.sql 213 Gianpaolo Cugola Applet • Un applet è una applicazione Java che ha una forma particolare che le permette di essere eseguita da un JVM integrata in un browser web • Un applet è costruita creando una sottoclasse della classe di libreria java.applet.Applet • Il tag html <applet> permette di specificare che una certa applet deve essere visualizzata all’interno di una pagina html Gianpaolo Cugola Gianpaolo Cugola 214 Applet: schema di funzionamento Il codice html e il codice dell’applet vengono scaricati dalla macchina server sul client sfruttando il protocollo http browser applet code (class file) HTTP server html code client 215 Gianpaolo Cugola La classe java.applet.Applet • La classe java.applet.Applet esporta i seguenti metodi pubblici: – public void init() • invocato dal browser quando la pagina che contiene l’applet viene aperta per la prima volta – public void start() • invocato dal browser quando si entra nella pagina che contiene l’applet – public void stop() • invocato dal browser quando si esce dalla pagina che contiene l’applet – public void destroy() • invocato dal browser quando si esce definitivamente dalla pagina che contiene l’applet • Questi metodi possono essere ridefiniti nelle sottoclassi per attribuire alle proprie applet il comportamento desiderato Gianpaolo Cugola Gianpaolo Cugola 216 La classe java.applet.Applet • Le applet non hanno accesso all’interfaccia a carattere • La classe java.applet.Applet è sottoclasse della classe java.awt.Panel. Può quindi contenere oggetti grafici per l’input/ output con l’utente 217 Gianpaolo Cugola Applet e pagine html • Il tag applet viene utilizzato per indicare al browser che deve visualizzare un applet all’interno di una pagina html • Esempio: <applet code="Clock" width=50 height=50> <param name=Color value="blue"> </applet> • Il metodo: public String getParameter(String name) per l’accesso ai parametri specificati nel codice html Gianpaolo Cugola Gianpaolo Cugola 218 Applet: un esempio 219 Gianpaolo Cugola Applet: un esempio - codice Java import java.awt.*; public class ProvaApplet ex tends java.applet.Applet { private TextArea ta; private Button b; public void init() { ta=new TextArea(20,80); b=new Button("Press here"); setLayout(new BorderLayout()); add("Center",ta); add("North",b); resize(400,200); } public void start() {ta.appendText("Chiamato metodo start\n");} public void stop() {ta.appendText("Chiamato metodo stop\n");} public void destroy() {ta.appendText("Chiamato metodo destroy\n");} public boolean handleEven t(Event evt) { if(evt.target==b) {ta.appendText("Premuto bottone\n"); return true;} else return false; } } Gianpaolo Cugola Gianpaolo Cugola 220 Applet: un esempio - codice html <HTML> <HEAD> <TITLE>Un esempio di applet</TITLE> </HEAD> <BODY> <H2>Un esempio di applet</H2> <P> prova a premere il bottone... <P> <APPLET code="ProvaApplet.class" width=400 height=200> </APPLET> </BODY> </HTML> 221 Gianpaolo Cugola Applet: esercizio • Si scriva un applet con un bottone che, premuto, che apre una finestra esterna al browser con un messaggio Gianpaolo Cugola Gianpaolo Cugola 222 Applet: vincoli • Le applet sono soggette ad una serie di vincoli di sicurezza che variano da browser a browser • Attualmente (Netscape 3 e Internet Explorer 3) un applet: – non può accedere al file system – non può lanciare applicazioni esterne – può aprire connessioni tcp/ ip solo con la macchina dalla quale è stata scaricata 223 Gianpaolo Cugola Applet come applicazioni • E’ possibile scrivere una classe che sia tanto un applet quanto un applicazione “stand-alone” • Esempio: public class ProvaApplet ex tends java.applet.Applet { private TextArea ta; private Button b; public static void main(String args[]) { Frame f=new Frame("ProvaApplet"); ProvaApplet p=new ProvaApplet(); p.init(); p.start(); f.add(p); f.show(); f.p ack(); } ... Gianpaolo Cugola Gianpaolo Cugola 224 JDBC • JDBC (Java DataBase Connectivity) è una libreria per l’accesso a database SQL • Permette di: – aprire una connessione ad un database SQL – inviare dei comandi SQL – manipolare i risultati forniti dal database • JDBC è un front-end per motori di accesso a database diversi (es. ODBC) • La libreria è costituita dal package java.sql 225 Gianpaolo Cugola JDBC: cenni generali • JDBC può sfruttare diversi “driver” per implementare l’accesso vero e proprio al database • Driver diversi possono avere caratteristiche diverse in termini di capacità a connettersi in maniera trasparente a database remoti • Noi prenderemo in considerazione il solo driver basato su ODBC (parte integrante del JDK di Sun) Gianpaolo Cugola Gianpaolo Cugola 226 La classe java.sql.Connection • La classe Connection rappresenta una connessione ad un DB • Una applicazione può avere più connessioni aperte con lo stesso DB o con DB diversi • Attraverso una connessione è possibile inviare comandi SQL e ottenere indietro gli eventuali risultati 227 Gianpaolo Cugola Aprire una connessione • Una connessione viene generalmente aperta invocando il metodo getConnection della classe DriverManager come segue: Connection con=DriverManager.getConnection("jdbc:odbc:Prova"); • Il parametro passato rappresenta l’URL del DB • Un driver capace di gestire l’accesso al DB specificato deve essere preliminarmente registrat o presso il DriverManager – ciò si può ottenere con uno statement del tipo: • Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); • NOTA: – Nel caso di uso del driver ODBC, il DB deve essere preliminarmente esportato ed associato ad un nome simbolico (pannello di controllo : 32 bit ODBC) Gianpaolo Cugola Gianpaolo Cugola 228 URL JDBC • Un URL JDBC ha la seguente forma generale: jdbc:<subprotocol>:<subname> • La parte “subprotocol” specifica il tipo del protocollo di comunicazione da adottare – da tale scelta dipende il tipo di driver JDBC che verrà scelto • La parte “subname” indica il DB al quale collegarsi – il formato di questa parte dipende dal protocollo usato 229 Gianpaolo Cugola Invio di comandi SQL • Attraverso una connessione è possibile invocare normali statement SQL, prepared statement, o calleable statement • Un “prepared statement” è usato per invocare una serie di statement “precompilati” che differiscono solo per il valore di certi parametri • Un “calleable statement” è usato per invocare una procedura SQL definita all’interno del DB Gianpaolo Cugola Gianpaolo Cugola 230 Transazioni • Per default una connessione è in modalità “auto commit” – ogni statement è automaticamente seguito da una commit • E’ possibile cambiare questo comportamento (metodo setAutocommit della classe Connection) e specificare esplicitamente commit e rollback (metodi omonimi della classe Connection) 231 Gianpaolo Cugola Invio di comandi SQL standard • Il metodo: public Statement createStatement() della classe Connection permette di creare uno statement SQL privo di parametri • La classe Statement: metodi principali: public ResultSet executeQuery(String sql) public int executeUpdate(String sql) • La classe ResultSet esporta una serie di metodi per accedere ai risultati di una query Gianpaolo Cugola Gianpaolo Cugola 232 ResultSet: un esempio int i; String s; float f; java.sql.Statement stmt = conn.createStatement(); ResultSet r = stmt.executeQuery( "SELECT a, b, c FROM Table1"); while (r.next()) { // print the values for the current row. i = r.getInt("a"); s = r.getString("b"); f = r.getFloat("c"); System.out.println("ROW = " + i + " " + s + " " + f); } 233 Gianpaolo Cugola Invio di “prepared statement” SQL • Il metodo: public PreparedStatement prepareStatement(String sql) della classe Connection permette di invocare statement SQL con parametri • La classe PreparedStatement: metodi principali: – public ResultSet executeQuery() – public int executeUpdate() più una serie di metodi per impostare il valore dei parametri Gianpaolo Cugola Gianpaolo Cugola 234 Invocazione di “calleable statement” • Il metodo: public CallableStatement prepareCall(String sql) della classe Connection permette di invocare procedure SQL salvate nel DB • La classe CalleableStatement: è una sottoclasse della classe PreparedStatement e fornisce tutti i metodi di quest’ultima 235 Gianpaolo Cugola JDBC: un esempio completo import java.sql.*; public class ProvaJDBC { public static void main(String[] args) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); DriverManager.setLoginTimeout(5); Connection con= DriverManager.getConnection("jdbc:odbc:Prova"); Statement stat = con.createStatement(); ResultSet res = stat.executeQuery("SELECT T1.Nome, T2.Dim FROM `Table1$` T1, `Table2$` T2 WHERE T1.Dip = T2.Dip"); while(res.next()) {System.out.println(res.getString(1)+" : "+res.getString(2));} stat.close(); }catch(Exception e){e.printStackTrace();} } } Gianpaolo Cugola Gianpaolo Cugola 236