Università degli Studi di Modena e Reggio Emilia Facoltà di Ingegneria – Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB Accesso Web a Data Base Ing. Marco Mamei Anno Accademico 2004-2005 M. Mamei - Introduzione al corso di Tecnologie e Applicazioni Web 1 OBIETTIVI Vogliamo che i nostri servizi Web siano in grado di accedere e usare basi di dati contenute sul server. Motivazioni: - siti Web di grandi dimensioni potrebbero dover gestire molti dati, e potrebbero avere necessità di organizzare questi dati in apposite dasi di dati - attraverso i linguaggi di interrogazione delle basi di dati (specificatamente SQL) possiamo essere in grado di produrre dinamicamente delle risposte selezionando opportunamente le cose da visualizzare (si può fare anche con XSL) - sempre di più i sistemi informativi delle aziende – tipicamente centrati sulle basi di dati – vengono gestiti in modalità SAP (service application provider): l’azienda non si preoccupa più di avere i propri server e la propria rete. Viene tutto delegato alle software house che installano e gestiscono i sistemi informativi sui loro server (in modo tale che una azienda non se ne debba più assolutamente preoccupare) e li rendono accessibili all’azienda tramite Web. Cosa bisogna sapere fare: - rendere disponibili i database per l’accesso da parte dei servizi Web, tramite appositi driver - fare in modo che i servizi possano usare questi driver per accedere alle basi di dati - fare in modo che i servizi sappiano creare dinamicamente delle query SQL per poter accedere, leggere e/o modificare, la base di dati M. Mamei - Introduzione al corso di Tecnologie e Applicazioni Web 2 COME RENDERE DISPONIBILE IL DATABASE con ODBC Un database non è generalmente accessbile da qualunque programma e applicazione, ma in genere solo dall’applicazione che direttamente lo ha creato e lo gestisce (p.e., access o Oracle, etc.). Per renderlo accessibile a altre applicazioni, è necessario predisporre dei driver appositi che permettano l’accesso. ODBC è il driver messo a disposizione da Microsoft per accedere ai database. Come installare ODBC per una specifica base di dati: Win 95 – Win 98 Pannello di Controllo Æ Origine Dati Win 2000 – Win XP Pannello di Controllo Æ Strumenti di Amm. Æ Origine Dati Scegliere il tipo di database che si vuole rendere disponibile (p.e., access, oracle, etc.). Quindi fare “aggiungi” per aggiungere una nuova origine dati. E quindi specificare: - il nome (o URL) con il quale si vuole rendere accessibile tale database (“nome origine dati”) - eventuali commenti (“descrizione”) - selezionare poi il nome del file che contiene effettivamente il database - è possibile con le opzioni avanzate proteggere l’accesso con username e password M. Mamei - Introduzione al corso di Tecnologie e Applicazioni Web 3 ACCEDERE AL DATABASE (1): da ODBC a JDBC Il programma Java dovrà includere: import java.sql.*; package che contiene le classi attraverso le quali si possono creare e fare delle query sql. Prima di fare query, bisogna connettersi alla base di dati con appositi driver. Attenzione: java usa il driver JDBC per accedere alle basi di dati. Ogni sistema operativo però tende ad usare il suo specifico driver per rendere disponibili le basi di dati. Microsoft usa ODBC. Quindi: è chiaro che bisogna fare in modo di avere un driver che mi faccia la “conversione” da JDBC a ODBC. Questo driver è definito dalla classe sun.jdbc.odbc.JdbcOdbcDriver che non avremo mai bisogno di usare direttamente, ma che il nostro programma userà indirettamente e che quindi bisognerà provvedere a cercare. Class.forName va a caricare una classe e la rende pronta all’uso, quindi noi dobbiamo fare: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); che renderà attivo all’interno del nostro programma l’apposito driver. M. Mamei - Introduzione al corso di Tecnologie e Applicazioni Web 4 ACCEDERE AL DATABASE (2): Connettersi al DataBase Una volta che il driver jdbc-odbc è attivo, possiamo stabilire la connessione con la base di dati. Per fare questo si usa una funzione static della classe DriverManager che si chiama getConnection. Connection c = DriverManager.getConnection(…) La funzione getConnection accetta tre parametri: una stringa che rappresenta l’URL della base di dati, che non è altro che il nome (preceduto dall’indicazione dei driver) con il quale la base di dati è stata resa accessibile dal sistema operativo. Due stringhe che rappresentano lo username e la password con i quali si deve accedere a una base di dati eventualmente protetta. Esempio: Connection c = DriverManager.getConnection(“jdbc:odbc:people”,”ugo ”,”1254”); Altro esempio: String bdurl = “jdbc:odbc:esami_web”; String un = “docente”; String pwd = “thezambo”; Connection c = DriverManager.getConnection(dburl, un,pwd); M. Mamei - Introduzione al corso di Tecnologie e Applicazioni Web 5 ACCEDERE AL DATABASE (3): Fare le Query Banale: si prepara la query SQL come una stringa. String query="SELECT "+campo+" FROM nometabella"; Oppure String query="SELECT "+campo+" FROM persone WHERE " eta + “ < “ + eta_minima); + Oppure qualsiasi altra query anche complessa. SI sottomette la query attraverso la creazione di un cosiddetto Statement nel database. Statement s = c.createStatement(); ResultSet r = s.executeQuery(query); Il risultato ritornato dalla executeQuery è tipo una Enumeration, i cui vari elementi sono le righe della tabella come ritornate dalla query, accessibili via via tramite next. Poi ogni colonna della tabella (corrispondente a un campo con un certo nome) è accessibile tramite getString(nome_del_campo) e ritorna una stringa con il valore del campo corrispondente. Esempio: while(r.next()) { out.print(r.getString(“matricola”)+"<BR>"); out.print(r.getString(“voto”)+"<BR>"); } M. Mamei - Introduzione al corso di Tecnologie e Applicazioni Web 6 ESEMPIO COMPLETO Semplicissimo database di nomi, età, e email, creato con access (ricordiamo che un database ha un nome suo, e poi ha una serie di tabella all’interno ognuna con il proprio nome…). Qui il nostro database ha una sola tabella di nome “persone” Rendiamo accessibile il database: M. Mamei - Introduzione al corso di Tecnologie e Applicazioni Web 7 SCRIVIAMO LA PAGINA WEB PER ACCEDERE AL DATABASE <HTML> <HEAD> <TITLE>Simple Form</TITLE> </HEAD> <BODY> <H1> Esempio di Servlet che accede ad un database</H1> <H2> Selezionare il campo su cui fare la query tra i seguenti:<H2> nome <BR> cognome <BR> email <BR> telefono <BR> <HR/> <form method="post" action="servlet/JDBCServlet"> Campo Query <input type="text" name="campo"/> Eta minima da selezionare <input type="text" name="eta"/> <input type="submit" value="query"/> <BODY> </HTML> M. Mamei - Introduzione al corso di Tecnologie e Applicazioni Web 8 IL CODICE DELLA SERVLET (1) import import import import import javax.servlet.*; javax.servlet.http.*; java.io.*; java.util.*; java.sql.*; public class JDBCServlet extends HttpServlet { public void service (HttpServletRequest req, HttpServletResponse res) throws IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); String campo=req.getParameter("campo"); String eta=req.getParameter("eta"); String query= "SELECT "+campo +" FROM persone WHERE eta < " + eta; /* prepare the db connection */ String dbUrl="jdbc:odbc:mieiamici"; // oppure // String dbUrl context.getInitParameterName(“DB”); String user="franco"; String password="zambo"; try { /* the following command load the jdbc driver */ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection c = DriverManager.getConnection(dbUrl,user,password); Statement s=c.createStatement(); ResultSet r=s.executeQuery(query); M. Mamei - Introduzione al corso di Tecnologie e Applicazioni Web 9 IL CODICE DELLA SERVLET (2) /* Here we start writing the real Servlet code */ out.print("<HTML>"); out.print("<BODY>"); out.print("<H1>Query sul database nomipersone</H1>"); out.print("<B>I "+campo+" di quelli che hanno meno di “+eta+” anni sono:”</B><BR>\n"); while(r.next()) { out.print(r.getString(campo)+"<BR>"); } out.print("</BODY>"); out.print("</HTML>"); s.close(); } catch (Exception e) { out.println("<HTML>"); out.println("<BODY>"); out.println("<H1>&Egrave; successo un errore dopo la query sul database db_persone</H1>"); out.println(e.toString()); out.println("</BODY>"); out.println("</HTML>"); } } } M. Mamei - Introduzione al corso di Tecnologie e Applicazioni Web 10 Accesso a DB Tramite JSP Query.html <html> <body> <h1>Form per effettuare una query in un Database</h1> <h2>il database ha una sola tabella "utenti" contraddistinta dai campi: "nome", "cognome", "username", "password"</h2> <hr/> <form action="db.jsp"> Insersci la query: <input type="text" name="query"/> <br/> Insersci il campo da visualizzare: <input type="text" name="display"/> <br/> <br/> <input type="submit" name="query" value="Query"/> </form> </body> </head> Db.jsp <html> <head> <%@ page language= "java" %> <jsp:useBean id="bean" scope="session" class="jspbeans.DBBean" /> <% bean.setDbUrl("jdbc:odbc:provadb"); %> <% bean.connect(); %> <% String query = request.getParameter("query"); %> <% String display = request.getParameter("display"); %> </head> <body> <h1> Risultato della Query </h1> <%= bean.query(query,display) %> </body> </html> M. Mamei - Introduzione al corso di Tecnologie e Applicazioni Web 11 DBBean.jsp package jspbeans; import java.io.*; import java.util.*; import java.sql.*; public class DBBean { private String dbUrl; private Connection c; private Statement s; public DBBean() { } public void setDbUrl(String dbUrl) { this.dbUrl = dbUrl; } public void connect() { try { /* the following command load the jdbc driver */ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); c = DriverManager.getConnection(dbUrl,null,null); s = c.createStatement(); } catch(Exception e){e.printStackTrace(); } } public void disconnect() { try { c.close(); }catch(Exception e){e.printStackTrace(); } } public String query(String query, String field) { String result = new String(); try { ResultSet r = s.executeQuery(query); while(r.next()) result = result + r.getString(field)+"<BR>"; }catch(Exception e){e.printStackTrace(); } return result; } public static void main(String[] args) { DBBean bean = new DBBean(); bean.setDbUrl("jdbc:odbc:provadb"); bean.connect(); String result = bean.query("select * from utenti","nome"); System.out.println(result); } } M. Mamei - Introduzione al corso di Tecnologie e Applicazioni Web 12