“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