Università degli Studi di Modena e Reggio Emilia Facoltà di Ingegneria – Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB Http con java, URL Ing. Marco Mamei Anno Accademico 2004-2005 M. Mamei - Tecnologie e Applicazioni Web 1 URL E CONNESSIONI • • • • Sono un insieme di classi java usate per comunicare tramite http (o altri protocolli applicativi standard) in modo semplificato (ma meno flessibile) rispetto alle socket. Gestiscono automaticamente i dettagli del protocollo di comunicazione (ad esempio, http). La classe URL cattura il concetto di indirizzo Internet (URL) nella forma standard del Web: – http://localhost/index.html – file:///autoexec.bat – ... Un oggetto URL si crea a partire dall’indirizzo che rappresenta: URL url = new URL("...."); e si usa per aprire una connessione verso tale indirizzo. • Per aprire una connessione, si invoca sul-l’oggetto URL il metodo openConnection(): URLConnection c = url.openConnection(); • Il risultato è un oggetto URLConnection, che rappresenta una “connessione aperta” con un server Web M. Mamei - Tecnologie e Applicazioni Web 2 – in pratica, così facendo si è stabilito un canale di comunicazione http verso l’indirizzo richiesto M. Mamei - Tecnologie e Applicazioni Web 3 URL E CONNESSIONI Per comunicare si recuperano dalla connessione i due stream (di ingresso e di uscita) a essa associati, tramite i metodi: • public InputStream getInputStream() – restituisce lo stream di input da cui leggere i dati (byte) che giungono dall’altra parte • public OutputStream getOutputStream() – restituisce lo stream di output su cui scrivere i dati (byte) da inviare all’altra parte Poi, su questi stream si legge e si scrive come su qualunque altro stream di byte. Per la scrittura occorre però abilitare la connessione per l’output. Questo si fa attraverso il comando seguente. • connection.setDoOutput(true); M. Mamei - Tecnologie e Applicazioni Web 4 ESEMPIO DI USO DI URL 1 Connettersi a un URL dato e, nell’ipotesi che esso invii testo, visualizzarne il contenuto. import java.net.*; import java.io.*; public class URLConnectionReader { public static void main(String[] args) throws Exception { URL yahoo = new URL("http://www.yahoo.it"); URLConnection yc = yahoo.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader(yc.getInputStream())); String inputLine; while((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } } M. Mamei - Tecnologie e Applicazioni Web 5 ESEMPIO DI USO DI URL 2 Connettersi a un URL dato, inviare una richiesta http con paramerti e ricevere il risultato (ad esempio una pagina web). import java.net.*; import java.io.*; public class URLConnectionWriter { public static void main (String[] args) throws Exception { URL url = new URL("http://localhost/midp/hits"); URLConnection connection = url.openConnection(); connection.setDoOutput(true); PrintWriter out = new PrintWriter( connection.getOutputStream()); out.println("string=ciao"); out.close(); BufferedReader in = new BufferedReader( new InputStreamReader(connection.getInputStream())); String inputLine; while((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } } M. Mamei - Tecnologie e Applicazioni Web 6 ESEMPIO DI USO DI URL 2 La servlet che fa da controparte: import java.io.*; import java.util.*; import javax.servlet.*; public class Ese1 extends GenericServlet { public void service(ServletRequest request, ServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); String field = null; String value = null; Enumeration flds = request.getParameterNames(); while(flds.hasMoreElements()) { field= (String)flds.nextElement(); value= request.getParameter(field); } PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println(value+"<br>"); out.println("</body>"); out.println("</html>"); } } NOTA: Se avessimo la possibilitá di trasformare in forma grafica quello che il programma legge dall’URL avremmo praticamente realizzato un Browser Web. M. Mamei - Tecnologie e Applicazioni Web 7 SCENARI APPLICATIVI Queste tecniche permettono di estendere gli scenari applicativi delle servlet e delle altre tecnologie viste fin’ora. Non siamo più vincolati ad accedere a una servlet tramite form html e browser. Possiamo realizzare il programma (anche non interattivo) che meglio si adatta alle esigenze applicative. Questo in generale apre la strada verso gli scenari di Web service: “…un Web service può essere definito come un’unità di applicazione logica che offre dati e servizi ad altre applicazioni. Queste applicazioni accedono al Web, attraverso protocolli standard quali HTTP e XML…” Gli scenari applicativi associati vastissimi. Basti pensare che tutto il concetto di e-commerce routa attorno a queste tenologie. M. Mamei - Tecnologie e Applicazioni Web 8 MOTIVAZIONE E VANTAGGI Perché non possiamo utilizzare server e socket come quelle che conoscevamo già? Interoperabilità: utilizzando tecnologie standard (http e xml) una servlet o un client sono facilmente rivendibili in altri contesti. Servizi aggiuntivi: Tomcat e in generale altri container (middleware) offrono utili servizi aggiuntivi. Considerazioni come: multithreading, comunicazione di rete, sciurezza, etc. vengono gestite automaticamente e in maniera separata dal container. Inoltre, Tomcat è un sistema “improprio” per gestire web service di questo tipo. Noi useremo Tomcat perché è semplice e veloce, ma esistono container specifici (ad esempio i server J2EE) che offrono servizi ancora più potenti. Le tecniche che vediamo sono comunque riutilizzabili anche con questi altri sistemi. M. Mamei - Tecnologie e Applicazioni Web generali 9 ESEMPIO DI APPLICAZIONE 1/3 Vediamo un esempio di applicazione Web che utilizza queste tecnologie. Prendiamo la ditta SkatesTown che vende skateboards. Questa ditta mantiene lo stato del suo magazzino in un file xml strutturato come segue: <? xml version=”1.0”?> <products> <product> <id>947-TI</id> <name>Titanium Glider</name> <type>skateboard</type> <desc>Street-style titanium skateboard.</desc> <price>129.00</price> <inStock>36</inStock> </product> … … </products> SkatesTown dispone poi di una servlet per controllare lo stato dell’inventario. La servlet richiede due parametri all’interno della sua invocazione http: id e quantity. id=947-TI quantity=12 M. Mamei - Tecnologie e Applicazioni Web 10 ESEMPIO DI APPLICAZIONE 2/3 Il programma della servlet non fa altro che analizzare il file xml relativo al magazzino e controllare l’eventuale disponibilità di un certo numero di pezzi di un dato articolo. La servlet risponde con una pagina html formattata come segue: <html> <body> The item is available in the requested quantity. </body> </html> oppure <html> <body> The requested quantity is not available.<br> Only 4 items in stock! </body> </html> Il sistema mette a disposizione due modalità di accesso. La prima è tramite browser e form HTML. Un operatore umano compila una form e interroga la servlet che restituisce la pagina HTML con il risultato. La seconda è tramite un applicazione specifica che usa gli URL. Questa accede alla servlet e automaticamente controlla la disponibilità di almeno 5 elementi di tutti i prodotti. M. Mamei - Tecnologie e Applicazioni Web 11 ESEMPIO DI APPLICAZIONE 3/3 A questo punto un'altra servlet potrebbe essere creata per gestire gli ordini degli elementi sotto scorta. Questa potrebbe prevedere un’interfaccia browser per operatori umani, ma anche essere acceduta dalla applicazione URL precedente per ordinare in modo automatico tutti gli elementi sotto scorta. Note varie: La sevlet potrebbe distinguere il suo comportamento sulla base di chi l’ha invocata (ad esempio modificando l’invocazione URL da quella della form html). In questo modo potrebbe rispondere HTML al browser, XML all’applicazione. Il database relativo al magazzino potrebbe essere un vero db. Attraverso il meccanismo JDBC, che vedremo, un’ applicazione java può accedere a un database. Come fa un’applicazione URL a conoscere come invocare una servet? Che parametri devono essere passati? Possibilità di interrogare servlet che descrivono come invocarne altre… (WSDL) M. Mamei - Tecnologie e Applicazioni Web 12