“Basi di dati - Architetture e linee di evoluzione 2/ed”
Paolo Atzeni, Stefano Ceri, Piero Fraternali, Stefano Paraboschi, Riccardo Torlone
Capitolo 4
Esercizio 4.1
Commentare le caratteristiche di HTTP come protocollo client-server, evidenziando gli aspetti
differenti rispetto ai protocolli client-server tradizionali.
Soluzione:
La caratteristica che differenzia particolarmente HTTP rispetto ad altri protocolli è il suo essere
stateless. E' si possibile inviare informazioni tramite le sue primitive, ma non è possibile tenerne
traccia. Questa caratteristica lo rende particolarmente inadatto per le operazioni normalmente attuate
dai web services.
Esercizio 4.2
Scrivere un form html che permetta all'utente di inviare il proprio nome e cognome a un programma
CGI che stampa una pagina HTML di saluto, contenente il nome e il cognome dell'utente e l'ora di
sistema.
Soluzione:
<P align= “center”> Form di invio nome e cognome </P>
<FORM action= “nomeCognome.exe” method= “post”>
nome:
<INPUT type= “text” name= “nome”> <BR>
cognome:
<INPUT type= “text” name= “cognome”> <BR>
<INPUT type= “submit” value= “invia”>
</FORM>
//Programma
nomeCognome.exe
#include <stdio.h>
void main()
{
char* QUERY_STRING;
int i=0;
//legge le variabili inviate al programma
strcpy( QUERY_STRING, getenv( “QUERY_STRING” ););
cout(“Content-type text/html\n\n ”);
cout(“<HTML>\n<BODY>\n”);
cout(“BENVENUTO ”,QUERY_STRING “\n”);
cout(“Ora di sistema: ”,getOraSistema(), “\n”);
cout(“</BODY>\n</HTML>\n”);
return 0;
}
Copyright © 2007 - The McGraw-Hill Companies srl
“Basi di dati - Architetture e linee di evoluzione 2/ed”
Paolo Atzeni, Stefano Ceri, Piero Fraternali, Stefano Paraboschi, Riccardo Torlone
Esercizio 4.3
Riscrivere il programma dell'esercizio precedente come servlet e come template JSP.
Soluzione:
SERVLET:
import java.io.*;
import=java.util.* ;
import java.servlet.*;
import java.servlet.http.*;
public class nomeCognome extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
string nome = request.getParameter(“nome”);
string cognome = request.getParameter(“cognome”);
Date data = new Date();
response.setContentType(“text\html”);
PrintWriter out = response.getWriter();
out.println(“<HTML>”);
out.println(“<HEAD>”);
out.println(“<TITLE>Pagina di Benvenuto</TITLE>”);
out.println(“</HEAD>”);
out.println(“<BODY>”);
out.println(“Benvenuto ” + nome + “ ” + cognome);
out.println(“Ora di sistema” + data);
out.println(“</BODY>”);
out.println(“</HTML>”);
}}
TEMPLATE:
<%@page language=”java” %>
<% page import=”java.util.*” %>
<% Date data= new Date; %>
<%String nome = request.getParameter(“nome”);%>
<%String cognome = request.getParameter(“cognome”);%>
<HTML>
<HEAD>
<TITLE>Pagina di Benvenuto</TITLE>
</HEAD>
<BODY>
Benvenuto <%= nome %> <%= cognome %>
Ora di sistema <%= data %>
</BODY>
</HTML>
Copyright © 2007 - The McGraw-Hill Companies srl
“Basi di dati - Architetture e linee di evoluzione 2/ed”
Paolo Atzeni, Stefano Ceri, Piero Fraternali, Stefano Paraboschi, Riccardo Torlone
Esercizio 4.4
Dato lo schema concettuale della base di dati contenente autori e libri utilizzato nei paragrafi 4.2.1,
4.2.2 e 4.2.3, scrivere un template JSP contenente una form di ricerca che permette di inserire il
cognome di un autore. Scrivere un secondo template che, ricevuto il cognome di un autore, stampa la
lista dei libri da lui scritti.
Soluzione:
FORM 1:
<P align= “center”> Form di inserimento cognome autore </P>
<FORM action= “form2” method= “post”>
cognome:
<INPUT type= “text” name= “cognome”> <BR>
<INPUT type= “submit” value= “invia”>
</FORM>
FORM 2:
<%@page language=”java” %>
<% page import=”java.io.*” %>
<% page import=”java.util.*” %>
<% page import=”java.sql.*” %>
<%
string cognome = request.getParameter(“cognome”);
Class.forName(“sun.jdbc.odbc.JdbcObdcDriver”);
Connection conn =
DriverManager.getConnection
(“jdbc:odbc:DB”,”Utente”,”psw”);
PreparedStatement sqlCode = conn.PrepareStatement(
“Selec ISBN, Titolo, Editore, Prezzo”
“from (AUTORE join SCRIVE on autore.codice=scrive.codice)
join LIBRO”
“where Cognome = ?”
sqlcode.setString(1, cognome);
ResultSet result = sqlCode.executeQuery();
%>
<%<HTML>
<HEAD>
<TITLE>Elenco dei Libri dell'autore selezionato</TITLE>
</HEAD>
<BODY>
<% while (result.next()) {%>
<P>
ISBN: <%= result.getString(“ISBN”) %>
Titolo: <%= result.getString(“Titolo”) %>
Editore: <%= result.getString(“Editore”) %>
Prezzo: <%= result.getString(“Prezzo”) %>
</P>
<% } %>
</BODY>
</HTML> %>
<%
result.close();
sqlCode.close();
conn.close();
%>
Copyright © 2007 - The McGraw-Hill Companies srl
“Basi di dati - Architetture e linee di evoluzione 2/ed”
Paolo Atzeni, Stefano Ceri, Piero Fraternali, Stefano Paraboschi, Riccardo Torlone
Esercizio 4.5
Si vuole costruire un sito Web per la società di formazione discussa negli esempi dei capitoli 7 e 8 del
primo volume di questo libro. Allo scopo:
1. specificare i requisiti per il sito, individuando le informazioni di interesse per il pubblico esterno
dell'azienda;
2. progettare lo schema concettuale dell'ipertesto.
Soluzione:
1.Le informazioni di interesse sono i corsi, gli orari delle lezioni,
i docenti e, nel caso siano contemplate, le abilitazioni connesse
al corso.
2.
Esercizio 4.6
Si vuole costruire un sito Web per la gestione di una bacheca di messaggi. Allo scopo:
1. specificare i requisiti per il sito, individuando le informazioni di interesse per gli utenti;
2. progettare lo schema concettuale della base di dati e dell'ipertesto;
3. realizzare la base di dati e le pagine dell'ipertesto. In particolare, si utilizzino JSP per le pagine
dinamiche di pubblicazione dei contenuti e Java servlet per l'operazione di creazione di un
messaggio nella bacheca.
Copyright © 2007 - The McGraw-Hill Companies srl
“Basi di dati - Architetture e linee di evoluzione 2/ed”
Paolo Atzeni, Stefano Ceri, Piero Fraternali, Stefano Paraboschi, Riccardo Torlone
Soluzione:
1. Le informazioni di interesse sono: l'autore del messaggio e alcune
informazioni sulla sua identità (e-mail, nome o nickname), la data
del messaggio e, naturalmente, il corpo del messaggio.
2.
3.
BASE DI DATI:
Create table Utente
(
nome
char(20) primary key,
email
chat(20)
)
Create table Messaggio
(
codice
int
primary key,
data
date,
corpo
clob,
utente
char(20) references Utente(nome)
)
Copyright © 2007 - The McGraw-Hill Companies srl
“Basi di dati - Architetture e linee di evoluzione 2/ed”
Paolo Atzeni, Stefano Ceri, Piero Fraternali, Stefano Paraboschi, Riccardo Torlone
PAGINE DELL'IPERTESTO:
<%@page language=”java” %>
<% page import=”java.io.*” %>
<% page import=”java.sql.*” %>
<%
Class.forName(“sun.jdbc.odbc.JdbcObdcDriver”);
Connection conn =
DriverManager.getConnection
(“jdbc:odbc:DB”,”Utente”,”psw”);
PreparedStatement sqlCode = conn.PrepareStatement(
“Select utente, email, codice, data, corpo”
“from (UTENTE join MESSAGGIO on
utente.nome=messaggio.utente)”
“order by data”
ResultSet result = sqlCode.executeQuery();
%>
<%
<HTML>
<HEAD>
<TITLE>Elenco messaggi</TITLE>
</HEAD>
<BODY>
<% while (result.next()) {%>
<P>
Utente: <%= result.getString(“utente”) %>
E-mail utente: <%= result.getString(“email”) %>
Data Invio: <%= result.getString(“data”) %>
Corpo del messaggio: <%= result.getString(“corpo”) %>
</P>
<% } %>
</BODY>
</HTML> %>
<%
result.close();
sqlCode.close();
conn.close();
%>
Copyright © 2007 - The McGraw-Hill Companies srl
“Basi di dati - Architetture e linee di evoluzione 2/ed”
Paolo Atzeni, Stefano Ceri, Piero Fraternali, Stefano Paraboschi, Riccardo Torlone
SERVLET PER CREAZIONE MESSAGGI:
import java.io.*;
import=java.sql.*;
import=java.util.*;
import java.servlet.*;
import java.servlet.http.*;
public class nomeCognome extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
string nome = request.getParameter(“nome”);
string email = request.getParameter(“email”);
string corpo = request.getParameter(“corpo”);
Date data = new Date();
Codice codice = new Codice();
Connection conn =
DriverManager.getConnection
(“jdbc:odbc:DB”,”Utente”,”psw”);
PreparedStatement sqlCode = conn.PrepareStatement(
“insert into UTENTE(nome,email)
values('”+ nome +”','”+ email + “')”
“insert into MESSAGGIO(codice,data,corpo,utente)
values('”+ codice +”','”+ data
+”','”+ corpo +”','” + nome + “')”
sqlCode.executeQuery();
sqlCode.close();
conn.close();
}}
Copyright © 2007 - The McGraw-Hill Companies srl