Ingegneria del Software Programmazione Java parte II Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Sviluppo di un’Applicazione Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Utilizzo del JDK • Installare il Java Development Kit (JDK) • Scrivere il codice in un file Example.java Example.java class Example { public static void main (){ System.out.println(“Hello World!”); } } • Compilare da linea di comando – javac Example.java Il “programma” é costituito da una classe che implementa un metodo main Example.class • Eseguire da linea di comando – java Example.class Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Utilizzo di un Ambiente Visuale Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Struttura di un’Applicazione • Affinchè un sistema a oggetti “parta”, devo avere una classe con un metodo statico e pubblico di nome main main d b a c e g f Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche L’Applicazione Example: Considerazioni public static void main (String args []) – void indica che main non ritorna nulla, il che è necessario per superare il type-checking del compilatore – args[] sono gli argomenti passati a main dalla shell quando si digita: java Hello arg1 arg2 ... argn – String dice che gli argomenti sono di classe String – public rende il metodo main visibile alle altre classi - e al comando java (interprete) – static associa main alla classe Hello, e non alle sue istanze System.out.println("HelloWorld!") – invoca il metodo println dell’oggetto out del package System, che stampa la stringa sul file stdout Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Packages Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Packages • Più classi o interfacce interrelate possono essere riunite in un package, dotato di nome classe o interfaccia MyPackage Esempio: c b a d e Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Nomi di Classi • Il nome di una classe (o di una interfaccia) va sempre qualificato con il nome del package a cui appartiene, tranne quando viene usato all’interno dello stesso package Esempio: aaa.bbb.ccc.MyClass all’interno di aaa.bbb.ccc basta questo Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Nomi di Package • Il nome di un package può essere composto da più identificatori separati da “.”: roberto.utilities.internet • Per evitare che package di produttori diversi abbiano lo stesso nome, si suggerisce di far iniziare il nome del package con il dominio Internet del produttore (invertito, e con il nome di più alto livello tutto maiuscolo) it.unimi.dsi.roberto.utilities.internet nome di dominio Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Packages Standard java.lang classi base del linguaggio (Object, Thread, Throwable, System, String, Math, wrapper classes, …) classi di I/O java.io java.util (FileInputStream, FileOutputStream, ) classi di utilità (Date, Random, …) java.applet classi di supporto alle applicazioni di rete (socket, URL, …) classe Applet, … java.awt Abstract Windowing Toolkit java.net Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Lo Statement package • Specifica che le classi che seguono appartengono a un certo package • Deve apparire (una sola volta) all’inizio di una unità di compilazione Esempio: a.java package p; class a {.. class b {... class c {.. le classi a,b,c appartengono al package p Se lo statement è omesso, la classe appartiene al package anonimo Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Lo Statement import • Per evitare di usare sempre nomi completi di classi, si può usare lo statement import Esempio: class MyClass { java.util.Date today; … } import java.util.Date; class MyClass { Date today; ... } Note: • import java.util.* importa tutte le classi del package java.util • java.lang.* è sempre importato implicitamente Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Package e Directory • Molti ambienti Java mappano i nomi dei package sui pathname del file system (compilatore e class loader) Esempio: aaa.bbb.ccc.MyClass package classe aaa/bbb/ccc/MyClass directories file pathname Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Visibilità Classi e interfacce • sono visibili all’interno del package in cui sono dichiarate; sono visibili all’esterno del package solo se dichiarate public public class a { … public interface b { … Membri (campi e metodi) • sono visibili quando: – la loro classe è visibile e – il loro modificatore li rende visibili Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche più visibile Visibilità di Campi e Metodi Modificatore Visibilità private nessuno (default) protected solo nella classe in cui è definito solo nelle classi del package classi nel package e sottoclassi (stesso package o altri package) tutte le classi public NB: I membri di una interfaccia sono sempre pubblici Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Esempio package pac class a {... class b { private int i; private void m( ) {…} int j; visibile void n( ) {…} public int k; public p( ){…} protected int i; protected void m( ){…} class c {... class classddextends extendsbb{... {... class e extends d {... Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Progettare la Visibilità Quando progettiamo una classe dobbiamo pensare a due tipi di utenti: • quelli che utilizzeranno la classe per realizzare delle applicazioni • quelli che estenderanno la classe per realizzare sottoclassi • I primi useranno i membri public; i secondi anche i membri protected • Le interfacce public e protected vanno progettate con cura Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Unità di Compilazione • • • Il sorgente di un’applicazione consiste di uno o più file (“unità di compilazione”) Ogni file contiene una o più dichiarazioni di classi (o di interfacce), di cui al più una dichiarata public Il nome del file deve essere uguale a quello della sua classe public , con estensione .java: file a.java public class a {... stesso nome class b {... class c {.. Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Packages: Riassunto I packages: • Permettono di creare gruppi di classi e interfacce fra loro in relazione • Definiscono uno spazio di nomi locale per classi e interfacce evitando conflitti con classi e inter-facce di altri packages • Permettono di avere classi, interfacce e membri (campi e metodi) non visibili all’esterno del package • Possono essere organizzati gerarchicamente • Si compone di più unità di compilazione Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Multithreading Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Che cos’e’ il Multithreading? • possibilità di realizzare più flussi di controllo concorrenti (“threads”) nell’ambito di una stessa applicazione • possibilità di condividere dati fra i threads • possibilità di controllare i threads e di sincronizzare i threads fra loro, attraverso opportune primitive Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Multitasking E Multithreading Multitasking Multithreading OS OS OS OS Task Task 11 Task Task 22 Task Task 11 Task Task 33 Task Task 22 Monitor Monitor (interprete (interpreteJava) Java) Memoria condivisa Memoria condivisa Thread Thread 1 1 Thread Thread 2 2 Thread Thread 3 3 Memoria condivisa Memoria locale Memoria locale Memoria locale Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche RUN-TIME DATA AREA Thread 1 Thread 2 Thread n Program Counter Stack variabili locali, ecc. dei metodi …. Heap oggetti condivisi fra i thread, creati dinamicamente e garbage collected Method Area qui vengono caricati dal class loader i files .class, contenenti la descrizione della classe (campi, metodi, ecc.) Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche La Classe Thread In Java, ogni thread è un oggetto: • ogni singolo thread viene creato come una istanza della classe java.lang.Thread • ogni istanza di java.lang.Thread deve essere associata a un metodo run() di qualche classe, che contiene il codice che deve essere eseguito dal thread • la classe java.lang.Thread contiene tutti i metodi per la gestione dei thread • … e in particolare il metodo start(), per “lanciare” il thread con il metodo run() “opportuno” Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche La Classe Thread: Schema “lancia” “lancia”ililthread, thread,rendendolo rendendoloschedulaschedulabile. bile.Esegue Esegueililmetodo metodorun() run()del delThread, Thread, che cheaasua suavolta voltalancia lanciaililmetodo metodorun() run() dell’oggetto dell’oggettopassato passatocome comeparametro parametro alalcostruttore costruttoreThread(), Thread(),oppure oppure(se (se Thread Threadnon nonha haparametri) parametri)non nonfafanulla. nulla. public class Thread implements Runnable Runnable target; …. public syncronized native void start() { … run(); } public void run() { if (target != null) { target.run(); } } Thread (Runnable t) { target = t; …. } } public interface Runnable { public abstract void run(); } Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Come Realizzare un Thread Ci sono due metodi per realizzare un thread: Metodo 1: implementando l’interfaccia Runnable Metodo 2: estendendo la classe java.lang.Thread e sovrascrivendo run() Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Metodo 1 public interface Runnable { public abstract void run(); } class Application implements Runnable { public void run() { <body> } } ... Application a = new Application(); /* creo l’Application a il cui metodo run() dovrà essere eseguita in un thread */ Thread th = new Thread(a); /* creo un thread e gli passo il riferimento all’Application a */ th.start(); /* lancio il thread, eseguendo il metodo a.run() */ Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Esempio 1.1 public class drinks { In questo esempio, public static void main(String[] a) { un main crea Coffee c = new Coffee(); e lancia i thread Tea t = new Tea(); Thread th1 = new Thread(c) ; th1.start(); Thread th2 = new Thread(t) ; th2.start() ; } } class Coffee implements Runnable { public void run() { while(true) { System.out.println(“I like coffee”);} } } class Tea implements Runnable { public void run() { while(true) { System.out.println(“I like tea”);} } Ing. Antonio Coronato Corso di Ingegneria del Software } Consiglio Nazionale delle Ricerche Università “Federico II” di Napoli ESEMPIO 1.2 In questo esempio, ogni public class drinks { oggetto crea e lancia public static void main(String[] a) { il proprio thread Coffee c = new Coffee(); Tea t = new Tea() ; } } class Coffee implements Runnable { Thread th; public void run() { while(true) { System.out.println(“I like coffee”);} } Coffee() { th = new Thread(this) ; th.start(); } } class Tea implements Runnable { Thread th; public void run() { while(true) { System.out.println(“I like tea”);} } Tea() { th = new Thread(this) ; th.start() ; } Ing. Antonio Coronato Corso } di Ingegneria del Software Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche METODO 2 class Thread implements Runnable { public void start() { … run(); } public void run() { } } class MyThread extends Thread { // eredita start() public void run() { < body> } } MyThread p = new MyThread(); p.start(); Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche ESEMPIO 2.1 public class drinks { In questo esempio, un main crea public static void main(String[] a) { Coffee th1=new Coffee(); th1.start(); e lancia i thread Tea th2=new Tea() ; th2.start(); } } class Coffee extends Thread { public void run() { while(true) { System.out.println(“I like coffee”);} } } class Tea extends Thread { public void run() { while(true) { System.out.println(“I like tea”);} } } Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche ESEMPIO 2.2 In questo esempio, ogni thread si lancia da solo public class drinks { public static void main(String[ ] a) { Coffee th1=new Coffee(); Tea=th2 new Tea() ; } } class Coffee extends Thread { public void run() { while(true) { System.out.println(“I like coffee”);} } Coffee() { start(); } } class Tea extends Thread { public void run() { while(true) { System.out.println(“I like tea”);} } Tea() { start(); } Ing. Antonio Coronato Corso } di Ingegneria del Software Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Quando un thread termina? Un thread continua nella sua esecuzione, fino a quando: 1. run() ritorna 2. viene eseguito il metodo stop() del thread 3. una eccezione causa l’uscita da run() Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Scheduling • lo scheduling è effettuato sulla base della priorità dei thread • la priorità può essere modificata mediante il metodo setPriority • a parità di priorità, lo scheduling è di tipo round-robin Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Alcuni Metodi di Thread public void start() public void run() public final void stop() public final void suspend() public final void resume() public static void sleep(long n) public final void setPriority(int newPriority) public final int getPriority() public static void yield() public final native boolean isAlive() ... lancia il thread esegue il codice distrugge il thread sospende il thread riattiva il thread sospende il thread per n msec modifica la priorità ottieni la priorità rischedula true se il thread è vivo Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Gli Stati di un Thread yield() new Thread() New New thread thread start() stop() Alive suspend() sleep() wait() Runnable Runnable resume() notify() stop() run() exit Not Not Runnable Runnable stop() Dead Dead Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Il Problema della Mutua Esclusione i=0 thread 1 thread 2 class Count { int i = 0; void incr() { i = i + 1; } i+1 1 i -1 -1 i=1 void decr() { i = -1 i = i - 1; } } Il valore finale di i dipende dalla sequenza di esecuzione Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Metodi synchronized • Il modificatore synchronized prescrive che il metodo a cui si applica sia eseguito da un solo thread alla volta: – quando un thread esegue un metod synchronized, viene fatto un lock dell’oggetto cui appartiene il metodo (o, per metodi static, della classe) – quando il thread termina l’esecuzione del metodo, viene fatta una unlock – prima di tale unlock, eventuali altri metodi synchronized si pongono in attesa Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Esempio i=0 thread 1 thread 2 class Count { int i = 0; synchronized void incr() { i+1 1 i = i + 1; i=1 } synchronized void decr() { i -1 0 i = i - 1; i=0 } } Il valore finale di i NON dipende dalla sequenza di esecuzione Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Blocchi synchronized • La keyword synchronized può essere usata anche per proteggere blocchi arbitrari, e non solo metodi • in tal caso, occorre specificare l’oggetto di cui acquisire il lock Esempio: synchronized ( myObject ) { <blocco> } Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Esempio synchronized void MyMethod() { … } è equivalente a: void MyMethod() { synchronized (this) { … } } Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Tecnologie per le basi di dati Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Java Data Base Connectivity (JDBC) • Le API JDBC sono le classi per l’accesso ai dati da parte di applicazioni Java. • Sono parte fondamentale di J2SE (Java 2 Standard Edition) e di J2EE (Java 2 Enterprise Edition. • Sono divise in due package: java.sql, lo standard e javax.sql le estensioni Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Architettura Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Compatibilità • JDBC 1.0 Introduce CallableStatement, Connection, PreparedStatement, ResultSet, Statement • JDBC 2.0 Estende DatabaseMetaData, ResultSetMetaData • JDBC 3.0 Introduce ParameterMetaData, Savepoint Estende DatabaseMetaData Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Tipi di driver • JDBC-ODBC. Il driver utilizza un "ponte" creato da Sun, che permette l' utilizzo di driver di tipo ODBC, all' interno di applicazioni Java. • JDBC basato su funzioni scritte in maniera nativa, cioè usando JNI: Java Native Interface. • JDBC-Net, driver nativo, pure Java, che non comunica direttamente con un DBMS, ma con un middleware, in grado di prendere le chiamate e convertirle in qualcosa che il database è in grado di capire, rispondendo poi di conseguenza. • JDBC, pure Java, con accesso diretto. In questo caso non occorre nulla, se non il driver e il DBMS al quale collegarsi. Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Interfacce base • Driver – Definisce i metodi per i driver JDBS • Connection – Definisce i metodi per la connessione col database • Statement – Definisce i metodi per l’interrogazione del database • ResultSet – Definisce i metodi per la gestione dei risultati delle interrogazioni Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Un Esempio • Acquisizione di un elenco di banche da un database Access Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Creazione di un Driver ODBC Nome Driver Selezione DB Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche La Classe di Interfacciamento import java.sql.*; // Package contentente le classi per la connessione public class PoolConnection { String url="jdbc:odbc:contra"; String dbUser = "Amministratore"; String dbPasswd = "ConTra01"; // Percorso di bridging // Dati di account al db public EntitaBanca[ ] acq_banche(){ // Metodo per l'acquisizione delle banche da data base Connection connection; Statement statement; ResultSet result; EntitaBanca[ ] VettoreBanche; // Connessione al database try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Driver di connessione connection = DriverManager.getConnection(url,dbUser,dbPasswd); // Connessione al db statement = connection.createStatement(); // Oggetto statement Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche La Classe di Interfacciamento (2) result = statement.executeQuery("SELECT * FROM BANCA"); // Esecuzione della query int count=0; while(result.next()) count++; result = statement.executeQuery("SELECT * FROM BANCA"); // Esecuzione della query VettoreBanche = new EntitaBanca[count]; int i = 0; while(result.next()) // Prelievo dei risultati VettoreBanche[i++] = new EntitaBanca(result.getLong(1),result.getString(2),result.getString(3)); connection.close(); // Chiusura della connessione return VettoreBanche; } catch(Exception e){ System.out.println(e); return null; Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche } } Tecnologie per il Web Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Applet Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Web Browser e Server Server abc.com Server xyz.com Client Hyperlink Browser program to xyz.com Disk HTTP used over this TCP connection Disk HTTP Server HTTP Server Internet Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Una Pagina Html Statica <HTML> <HEAD> <TITLE> Esempio </TITLE> Esempio </HEAD> Testo <BODY> DSI <P> Testo <A HREF=“http://www.dsi.unimi.it”> DSI </A> </BODY> </HTML> Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Gli Applet Java • Sono programmi Java riferiti da link in pagine HTML • Vengono caricati e interpretati dal browser (se questo supporta Java) • Permettono di “animare” le pagine web Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche HTML con Applet <HTML> <HEAD> <TITLE> Esempio </TITLE> Esempio </HEAD> Testo <BODY> Hello! <P> Testo <APPLET CODE=“HelloWorld.class WIDTH=300 HEIGHT=80> </APPLET> </BODY> </HTML> Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Un’Applet d’esempio import java.awt.*; L’applet è pilotato ad import java.applet.*; eventi. Un applet non ha metodo main. public class SimpleApplet extends Applet { public void paint(Graphics g) { g.drawString(Hello World!); } L’ I/O è realizzato } attraverso AWT o Swing. Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Esecuzione di un Applet • In un file HTML • Attraverso l’AppletViewer Metodi della classe Applet public public public public public public void init( ){...} void start( ){...} void paint( ){...} void stop( ){...} void destroy( ){...} boolean action( ) {...} Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche JSP e Servlet Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Servlet • Classi Java in grado di gestire richieste web e generare dinamicamente pagine HTML in seguito ad: – Elaborazione dei parametri della richiesta – Interazione con altre servlet, database, altri componenti • Realizzate come estensione della classe base Servlet Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Java Server Page (JSP) • Tecnologia per Tecnologia per scripting scripting server server-side side – pagine con codice HTML misto a codice Java – proposta da Sun • Si fonda su tecnologia Java – linguaggio Java – classi ed interfacce specifiche • package javax.servlet.jsp • package javax.servlet.jsp.tagext – riuso di componenti Java (JavaBean) Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche ! "###$ $ % & ' ( Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Elementi di una pagina JSP • Direttive • Elementi di Scripting – Dichiarazioni – Scriptlet – Espressioni • Azioni • Oggetti Impliciti Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche ' Direttive • Messaggi al JSP container – il programma (es. Tomcat) che compila/esegue le JSP • Permettono al programmatore di specificare: – Impostazioni della pagina (direttiva page) – Inclusione di contenuti da altre risorse (direttiva include) – Tag personalizzati usati nella pagina (direttiva taglib) • Sintassi: <%@ direttiva attributo1= “valore1”…attributoN= “valoreN” %> • Esempio: <%@ include file=“intestazione.jsp” %> Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Scriptlet • Blocchi di istruzioni Java – codice Java utilizzato per costruire la pagina HTML finale – permettono di generare dinamicamente porzioni di codice HTML in funzione dell' input • analogamente ai servlet • Sintassi: <% istruzione Java %> – si può specificare qualsiasi istruzione ammessa nei metodi doGet() o doPost() di un servlet – nei blocchi è visibile una serie di oggetti predefiniti Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Oggetti Impliciti • HttpServletRequest request: – rappresenta la richiesta HTTP • HttpServletResponse response: – rappresenta la risposta HTTP • HttpSession session: – rappresenta la sessione HTTP • ServletContext application: – rappresenta il contesto dell’applicazione • JspWriter out – rappresenta il PrintWriter su cui si stampa il corpo della risposta – il Content-Type predefinito è “text/html” Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Esempio 1 – entra.jsp Una jsp per l’autenticazione degli utenti Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche entra.jsp - codice <%@ page errorPage="entraError.jsp" %> <%@ page isThreadSafe="false" %> Direttiva <html><head><title>Accesso</title></head> <body bgcolor="#ACB4B4"> <jsp:useBean id="Manager" scope="session" class="sgtc.BeanSessionManager" /> <jsp:setProperty name="Manager" property="*" /> <jsp:useBean id="PC" scope="page" class="sgtc.PoolConnection" /> <jsp:setProperty name="PC" property="*" /> Azioni <center> <form method="post"> <table border="0" border="0" cellspacing="0"> <tr> <td valign="middle"> <applet code="tickertape.class" align="baseline" width="250" height="72" Applet name="tickertape"> <param name="SPEED" value="2"> <param name="TEXT" value=“SGCT - Container Transport"></applet> Ing. Antonio Coronato Corso</td> di Ingegneria del Software <td>“Federico II” di Napoli Consiglio Nazionale delle Ricerche Università entra.jsp – codice (continua) <table border="0" cellspacing="0" bgcolor="#AADD77" width="250"> <tr bgcolor="#004295"><td><font color="white">Account</font></td><td></td></tr> <tr><td colspan="2" width="150">User Name </td> <td><input type="textarea" name="User" size=15></td></tr> <tr><td colspan="2">Password </td> <td><input type="password" name="Psw" size=15></td></tr> </table> </td> </tr> <tr> <td></td> <td align="center"> <input type="submit" name="Submit" value="Login"> <input type="reset" value="Reset"> </td> </tr> </table> Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche entra.jsp codice - (continua) </form> </center> <% // localhost if(request.getMethod().equals("POST")){ String utente = request.getParameter("User"); String passwd = request.getParameter("Psw"); if(PC.autentica(utente,passwd)){ Manager.init(utente,passwd,true); %> Scriptlet <jsp:forward page="menu.jsp" /> <% } } %> </body></html> Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Esempio 2 – nuovasede.jsp Una jsp per l’inserimento di una nuova sede Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche nuovasede.jsp – form dati <form action="http://localhost/sgtc/inseriscisedi" method="post"> <FIELDSET> <LEGEND>Dati nuova sede</LEGEND> <table> <tr> <td> Soggetto</td><td> <select name="Soggetto"> <option value=0> </option> <% bean1.init(false,false,false,false,false,false); Metodo Servlet Parametro int dim = bean1.get_Dim(); long cod; String rag_soc; int i; for(i=0;i<dim;i++){ cod = bean1.get_CodiceSoggetto(i); rag_soc = bean1.get_RagioneSociale(i); %> <option value="<%=cod%>"> <%=rag_soc%> </option> <% } %> </select> </td> Corso di Ingegneria del Software </tr> Università “Federico II” di Napoli Ing. Antonio Coronato Consiglio Nazionale delle Ricerche nuovasede.jsp – form dati (2) <tr> <td> Localita'</td><td><select name="Localita"> <option value=0> </option> <% bean0.init(false); dim = bean0.get_Dim(); String loc; for(i=0;i<dim;i++){ cod = bean0.get_codice(i); loc = bean0.get_localita(i); %> <option value="<%=cod%>"> <%=loc%> </option> <% } %> </select> </td></tr> <tr><td> Indirizzo </td><td><input type="textarea" name="Indirizzo"> </td> </table> </FIELDSET> <input type="submit" name="Submit" value="Inserisci"> <input type="reset" value="Annulla"> </form> Parametro Parametro Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche inseriscisede.java import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; La servlet per l’inserimento di una nuova sede public class InserisciSedi extends HttpServlet { private static final String CONTENT_TYPE = "text/html"; /**Initialize global variables*/ public void init() throws ServletException { } /**Process the HTTP Post request*/ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PoolConnection pc = new PoolConnection(); BaseAddress BA = new BaseAddress(); Servlet Metodo di richiesta long cod_sog = 0; try { cod_sog = Long.parseLong(request.getParameter("Soggetto")); } catch(Exception e) { } Classe per la connessione al DB Parametro Corso di Ingegneria del Software Inserimento nuova sedeCoronato nel DB Ing. Antonio Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche pc.in_sede(cod_sog,cod_loc,indirizzo);