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>È
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