Ingegneria del Software - ICAR-CNR

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);