Académique Documents
Professionnel Documents
Culture Documents
1 INTRODUZIONE.........................................................................................................................................................3
2 IL PROTOCOLLO TCP/IP..........................................................................................................................................4
3 IL PROTOCOLLO HTTP............................................................................................................................................6
4 IL LINGUAGGIO HTML............................................................................................................................................8
5 I FOGLI DI STILE CSS.............................................................................................................................................10
6 IL SERVER HTTP......................................................................................................................................................12
7 IL BROWSER..............................................................................................................................................................13
8 L'INTERFACCIA CGI...............................................................................................................................................14
9 JAVASCRIPT...............................................................................................................................................................16
10 COOKIE.....................................................................................................................................................................19
11 SERVER STATICI E APPLICATION SERVER...................................................................................................20
12 GLI APPLICATION SERVER................................................................................................................................21
13 CENNI SULLA PROGRAMMAZIONE A OGGETTI.........................................................................................22
13.1 CLASSI ..................................................................................................................................................................22
13.2 OGGETTI.................................................................................................................................................................22
13.3 INCAPSULAMENTO.....................................................................................................................................................22
13.4 EREDITARIETÀ..........................................................................................................................................................22
13.5 POLIMORFISMO.........................................................................................................................................................23
14 IL LINGUAGGIO JAVA...........................................................................................................................................24
15 APPLET JAVA ..........................................................................................................................................................27
16 I SERVLET JAVA......................................................................................................................................................28
17 LE JAVA SERVER PAGES......................................................................................................................................29
18 GESTIONE DELLE SESSIONI..............................................................................................................................31
18.1 IL PROBLEMA...........................................................................................................................................................31
18.2 LE SOLUZIONI POSSIBILI.............................................................................................................................................31
18.3 SESSION MANAGEMENT..............................................................................................................................................33
19 IBM WEBSPHERE...................................................................................................................................................34
19.1 L'AMBIENTE DI SVILUPPO RATIONAL............................................................................................................................34
19.2 STRUTTURA DELL'APPLICAZIONE E DEPLOYMENT DESCRIPTOR...........................................................................................36
19.3 IL DEPLOYMENT DESCRIPTOR.......................................................................................................................................36
20 ESECUZIONE SUL SERVER DI TEST.................................................................................................................38
21 IL SERVER WEBSPHERE UFFICIALE...............................................................................................................41
21.1 AVVIO....................................................................................................................................................................41
21.2 STOP......................................................................................................................................................................41
21.3 CONTROLLARE I LOG.................................................................................................................................................41
21.4 FILE DELL'APPLICAZIONE INSTALLATA...........................................................................................................................41
22 IL DEPLOYMENT SUL SERVER UFFICIALE...................................................................................................42
Quando un host inizia una comunicazione, spezzerà il file da trasmettere in pacchetti, e ad ogni
pacchetto farà precedente una intestazione contenente l'indirizzo del mittente e l'indirizzo del
destinatario, quindi invierà i pacchetti sul bus.
Tutti gli host della sottorete, saranno in ascolto e riceveranno tutti i pacchetti trasmetti,
controlleranno l'indirizzo del destinatario e se corrisponde al proprio, preleveranno il pacchetto,
viceversa lo scarteranno.
Questo sistema crea però dei problemi di sicurezza, perchè ciascun host nella sottorete può
“ascoltare” (con opportuni software) tutte le comunicazioni degli altri.
Per questo motivo ultimamente si preferisce utilizzare altri protocolli più sicuri al posto di TELNET
e FTP, come SSH e SFTP che utilizzano Secure Sockets Layer (SSL) per criptare le informazioni
che transitano sulla rete, evitando così l'intercettazione da parte di altri host.
Per quanto riguarda il web, è stato introdotto il protocollo HTTPS che utilizza anch'esso un
meccanismo di crittografia di tipo Secure Sockets Layer (SSL) o Transport Layer Security (TLS)
La porta di default per un accesso di tipo https:// è la porta 443 (mentre per il protocollo http:// si
utilizza di default la porta 80).
Per impostare un web server in modo che accetti connessioni di tipo https, l'amministratore deve
creare un certificato digitale ovvero un documento elettronico che associa l'identità di una persona
ad una chiave pubblica.
Il servizio http è una sessione telnet sulla porta 80 esattamente come il servizio FTP è una sessione
telnet sulla porta 21.
Tramite il telnet posso inviare del testo al server che verrà interpretato secondo il protocollo http e
verrà fornita una risposta sullo standard output.
Il caso più semplice è il metodo GET che permette di recuperare una pagina web o un file dal
server, dopo metodo (che nel caso del http può essere uno tra GET, POST, HEAD, PUT, DELETE,
TRACE, OPTIONS) possono poi essere aggiunte delle informazioni opzionali.
la richiesta deve poi terminare con una riga vuota, cioè con due "a capo" consecutivi.
A questo punto il server risponderà con una riga di stato, una intestazione (header http) costituita da
una o più righe, e dopo una riga vuota che ne identifica l’inizio vero e proprio del corpo del
messaggio, il file richiesto.
$ telnet www.miosito.it 80
Connected to www.miosito.it port 80
HTTP/1.0 200 OK
Date: Mon, 28 Jun 2004 10:47:31 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4
X-Powered-By: PHP/4.3.4
Vary: Accept-Encoding,Cookie
Cache-Control: private, s-maxage=0, max-age=0, must-revalidate
Content-Language: it
Content-Type: text/html; charset=utf-8
<html>
<head><title>Welcome to Mio sito</title></head>
<body>
<h1>Mio sito, web server del progetto </h1>
...
$ _
Nella risposta è molto importante la presenza della riga di stato e della direttiva Content-Type che
identifica il MIME type del file che segue, in pratica fa la veci dell'estensione usata sul filesystem,
questo permette al browser di interpretare in modo corretto il file e attivarsi di conseguenza, ad
esempio una pagina HTML deve essere preceduta dalla direttiva Content-Type: text/html; che
istruirà il browser a interpretare il testo seguente come codice HTML.
Esempio:
L'inserimento di codice CSS nelle pagine web può essere effettuato in due modi:
• Inserendo nel tag <head> della pagina un collegamento ad un foglio di stile esterno, cioè
un file contrassegnato dall'estensione .css come negli esempi seguenti:
<html>
<head>
<title>Esempio</title>
<link rel="stylesheet" type="text/css" href="foglio_di_stile.css">
</head>
• Inserendo, sempre all'interno dell'<head> tra gli specifici tag <style> e </style> le
dichiarazioni css.
•
<html>
<head>
<title>Esempio</title>
<style type="text/css">
codice css
</style>
</head>
Le regole CSS sono strutturate secondo il seguente schema (gli spazi sono tutti facoltativi):
selettore {
proprietà1 : valore1;
proprietà2 : valore2, valore3;
}
E' anche possibile inserire le regole direttamente nei tag HTML usando l'attributo style:
table.tab1 {
background-color: #a0a0a0;
color: black;
border-width: 1px 1px 1px 1px;
border-style: solid;
border-color: black;
padding-left: 10px;
padding-right: 10px;
padding-top: 10px;
padding-bottom: 5px;
font-size: 14px;
}
In questo secondo caso viene definita una classe tab1 applicabile solo agli oggetti table con la
sintassi HTML:
<table class='tab1'>
È il canale di comunicazione tra il server HTTP (le pagine HTML) e le procedure software che
girano sul sistema (procedure e script CGI).
Consente di passare dei parametri ad un programma esterno attraverso una form o una semplice
URL. Consente anche di catturare l'output della procedura (tipicamente in formato HTML) e di
inviarlo al client dell'utente remoto.
I metodi per il passaggio dei parametri alla procedura esterna sono due:
GET: tramite variabile di ambiente (QUERY_STRING);
POST: tramite lo standard input.
Il metodo utilizzato viene comunicato alla procedura CGI mediante la variabile di ambiente
REQUEST_METHOD.
Uno script CGI può essere richiamato mediante una form HTML:
<A HREF="/cgi-bin/search.cgi?nome=Marco&eta=28">Richiesta</A>
La stessa richiesta può essere fatta anche direttamente dalla barra degli indirizzi del browser,
utilizzando la seguente sintassi:
http://miosito/cgi-bin/search.cgi?nome=Marco&eta=28
In questo caso, search.cgi non corrisponderà ad una pagina HTML statica memorizzata sul server,
bensì ad un qualche applicativo che verrà eseguito sul server, gli verranno passati i parametri
nome=Marco ed eta=28 e in funzione di questi genererà sul suo standard output del codice HTML
che verrà poi interpretato dal browser.
uno script può essere inserito in due modi all'interno di pagina HTML:
● Usando un file contenente uno script esterno (con estensione .js)
● Includendo direttamente il codice javascript nel codice HTML all'interno dei tag
<script></script>
Esempio di inclusione javascript con un file esterno
<script type="text/javascript">
alert("Messaggio");
</script>
<html>
<body>
<script type="text/javascript">
this.myForm.userEmail.focus();
this.myForm.userEmail.select();
function validateInput()
{
userInput = new String();
userInput = this.myForm.userEmail.value;
if (userInput.match("@"))
alert("Thanks for your interest.");
else
alert("Please check your email details are correct before submitting");
}
</script>
</body>
</html>
13.1 Classi
Le classi sono uno strumento per costruire strutture dati che contengano non solo dati ma anche il
codice per gestirli.
Come tutti i costrutti che permettono di definire le strutture dati, una classe definisce un nuovo tipo
di dato.
I membri di una classe sono:
● attributi (dati, esattamente come i membri di un record)
● metodi (procedure che operano su un oggetto)
13.2 Oggetti
Un oggetto è una istanza di una classe. Un oggetto occupa memoria, la sua classe definisce come
sono organizzati i dati in questa memoria.
Ogni oggetto possiede tutti gli attributi definiti nella classe, ed essi hanno un valore, che può mutare
durante l'esecuzione del programma come quello di qualsiasi variabile.
Sintatticamente, i metodi di una classe vengono invocati "su" un particolare oggetto, e ricevono
come parametro implicito l'oggetto su cui sono stati invocati. Questo parametro normalmente può
essere referenziato esplicitamente; per esempio, a tale scopo in C++, in Java, e in C# si usa la parola
chiave this
Gli oggetti effettivamente creati sono membri dell'insieme definito dalla loro classe.
Molti linguaggi forniscono un supporto per l'inizializzazione automatica di un oggetto, con uno o
più speciali metodi detti costruttori. Analogamente, la fine della vita di un oggetto può essere
gestita con un metodo detto distruttore.
13.3 Incapsulamento
L'incapsulamento è la proprietà per cui un oggetto contiene ("incapsula") al suo interno gli attributi
(dati) e i metodi (procedure) che accedono ai dati stessi. Lo scopo principale dell'incapsulamento è
appunto dare accesso ai dati incapsulati solo attraverso i metodi definiti, nell'interfaccia, come
accessibili dall'esterno. Gestito in maniera intelligente, l'incapsulamento permette di vedere
l'oggetto come una black-box, cioè una scatola nera di cui, attraverso l'Interfaccia sappiamo cosa fa
e come interagisce con l'esterno ma non come lo fa (o per lo meno non ci interessa).
13.4 Ereditarietà
L'OOP prevede un meccanismo molto importante, l'ereditarietà, che permette di derivare nuove
classi a partire da classi già definite. L'ereditarietà permette di aggiungere membri ad una classe, e
di modificare il comportamento dei metodi, in modo da adattarli alla nuova struttura della classe.
Da una stessa classe è possibile costruire diverse classi derivate. Da una classe derivata è possibile
derivarne un'altra con lo stesso meccanismo.
13.5 Polimorfismo
La possibilità che le classi derivate implementino in modo differente i metodi e le proprietà dei
propri antenati rende possibile che gli oggetti appartenenti a delle sottoclassi di una stessa classe
rispondano diversamente alle stesse istruzioni. Ad esempio in una gerarchia in cui le classi Cane e
Gatto discendono dalla SuperClasse Animale potremmo avere il metodo mangia() che restituisce la
stringa "osso" se eseguito sulla classe Cane e "pesce" se eseguito sulla classe Gatto. I metodi che
vengono ridefiniti in una sottoclasse sono detti "polimorfi", in quanto lo stesso metodo si comporta
diversamente a seconda del tipo di oggetto su cui è invocato.
Normalmente nei linguaggi che supportano i tipi non è possibile assegnare ad una variabile di un
tipo una di un'altro tipo, la OOP, grazie al polimorfismo, fa un deroga a questa regola, poiché ad una
variabile di un certa classe posso anche assegnare tutte le variabili delle classi derivate.
Forma a,b,c;
Quadrato q1; //Quadrato deriva Forma
QuadratoOmbreggiato q2; //QuadratoOmbreggiato deriva da Quadrato
Cerchio c1; //Cerchio deriva da Forma
.......
a=q1;
b=q2;
q1=q2;
c=c1;
........
a.draw();
/* questa istruzione potrebbe potenzialmente disegnare
* un quadrato, un cerchio, o un quadrato ombreggiato,
* dipende dalla “storia” che ha avuto la variabile 'a'
In realtà, nelle ultime versioni della JVM viene effettuata una compilazione Bytecode-linguaggio
Macchina “Just-in-Time” per migliorare le prestazioni a discapito di una maggiore lentezza
nell'avvio dell'applicazione.
Si parla di "macchina virtuale" perché in pratica questo software è stato implementato per simulare
un hardware completo e non solo una CPU. Si potrebbe affermare che il linguaggio macchina sta ad
un computer come il byte code sta ad una Java Virtual Machine.
Multithreaded: Oltre che permettere l’indipendenza dalla piattaforma, la J.V.M. permette a Java di
essere un linguaggio multithreaded (caratteristica di solito dei sistemi operativi), ovvero capace di
mandare in esecuzione più processi in maniera parallella.
Orientato agli oggetti: Java ci fornisce infatti degli strumenti che praticamente ci "obbligano" a
programmare ad oggetti.
Nella Figura è illustrato il flusso dei dati e i controlli del sistema Java, controlli fatti attraverso il
compilatore Java, il caricatore di bytecode, il verificatore di bytecode e quindi l’interprete Java.
Java è un linguaggio orientato agli oggetti, ciascun oggetto è dichiarato con la parola chiave class,
un file .java può contenere solo una classe e il file deve avere lo steso nome della classe.
La classe è poi divisa in attributi (necessari a memorizzare i dati del oggetto) e metodi, che sono le
funzioni che permettono di operare sugli attributi.
Gli attributi di norma sono dichiarati privati e i metodi pubblici, definendo l'interfaccia che
permette di operare sull'oggetto.
Le classi sono poi raccolte in package, per utilizzare un particolare package bisogna importarlo con
l'istruzione import.
Java è fornita da un'ampia libreria di package, i principali sono:
public setBound(x,y,w,h) {
this.x=x; this.y=y; this.w=w; this.h=h; }
public draw() {
//disegna un quadrato
}
}
rettangolo1.setBound(10,10,100,150);
rettangolo1.setBound(60,80,200,100);
rettangolo1.draw();
rettangolo2.draw();
import java.applet.*;
import java.awt.*;
<HTML>
<HEAD>
</HEAD>
<BODY>
<APPLET
ALIGN="CENTER"
CODE="FirstApplet.class"
WIDTH="800"
HEIGHT="500">
</APPLET>
</BODY>
</HTML>
A differenza di uno script CGI i servlet vengono caricati solo una volta, al momento della prima
richiesta, e rimangono residenti in memoria pronti per servire le richieste fino a quando non
vengono chiusi, con ovvi vantaggi in fatto di prestazioni (risultano infatti un po' più lenti in
caricamento, ma una volta "aperti" le successive richieste vengono evase molto velocemente).
Di seguito un esempio di Servlet che implementa il metodo doGet che risponde ad una richiesta di
un browser (http://mioserver/MioServlet) scrivendo “Ciao Mondo” nella finestra del browser.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
Le pagine JSP sono un'evoluzione dei già collaudati servlet Java, create per separare i contenuti
dalla loro presentazione: una pagina JSP si presenta, infatti, come un normale documento in
linguaggio HTML, frammentato da sezioni di codice Java. Si potranno quindi modificare le parti
sviluppate in Java lasciando inalterata la struttura HTML o viceversa.
Una Java Server Page possono essere invocate (richiamate) utilizzando due diversi metodi: la
richiesta può venire effettuata direttamente ad una pagina JSP, che grazie alle risorse messe a
disposizione sul lato server, è in grado di elaborare i dati di ingresso per ottenere e restituire l'output
voluto, oppure la richiesta può essere fatta in un primo tempo ad un servlet che, dopo l'elaborazione
dei dati, incapsula adeguatamente i risultati e richiama la pagina JSP. Sarà poi quest'ultima che, in
grado di prelevare i dati immagazzinati, produrrà l'output voluto.
Un primo esempio di Java Server Page potrebbe essere rappresentato dalla semplice stampa a
video di un messaggio ("PRIMA PROVA JSP"), implementato in questo modo:
<%=testo %>
</BODY>
</HTML>
Come si può notare le sezioni racchiuse tra i tag <% e %> sono quelle che contengono le istruzioni
in linguaggio Java (gli stessi tag sono utilizzati anche nelle pagine ASP). Da notare che i file per
essere riconosciuti dal browser come pagine JSP devono essere salvati con estensione .jsp.
La sezione <%= %> invece valuta un espressione e il risultato viene sostituito a tutta l’espressione
<%= %>
La prima volta che si effettua la richiesta di visualizzazione del file, quest'ultimo viene compilato,
creando un oggetto servlet, che sarà archiviato in memoria (per servire le richieste successive); solo
dopo questi passaggi l'output viene mandato al browser, che potrà interpretarlo come fosse una
semplice pagina HTML.
Sessione = sequenza di pagine, visitata sullo stesso sito dallo stesso utente con lo stesso browser
nella stessa seduta di navigazione, che presentino una consequenzialità logica.
18.1 Il problema
L’utente inserisce i propri username e password sulla prima pagina che visita
La pagina successiva sarà necessariamente una pagina dinamica che “valida” il login
Tutte le pagine successive dovranno conoscere il nome dell’utente e generare le pagine successive
di conseguenza, mostrando solo i dati a cui l'utente può accedere.
Non visibile dall’utente, non modificabile dall’utente (a meno di visualizzare il codice HTML della
pagina)
Occorre ripetere tutte le variabili comuni a più pagine come parametri nascosti in tutti i form
Occorre fare sì che tutti i passaggi di pagina siano sotto forma di invio di form (quindi non sono
permessi semplici link <a href="...">)
http://www.miosito.it/posta.php?user=abc
18.2.3 Cookie
Nella risposta http il server aggiunge un comando di intestazione “set cookie”
Il browser si impegna a restituire al server il cookie ad ogni nuova richiesta http che farà
Esempio: Nome: “user”, valore: “andrea”, scadenza: “1400”, dominio: “miosito.it”
In pratica quando la pagina di login valida la password, può settare un cookie sul browser
La pagine successive possono leggere il cookie, che il server riceverà nuovamente dal browser
Svantaggi:
● Non è possibile memorizzare informazioni voluminose
● Non è “educato” memorizzare molti cookie diversi
● Non è consigliabile fidarsi dei dati memorizzati sul browser dell’utente
● È possibile che il browser rifiuti di restituire i cookie memorizzati
nome="session" value="123456"
Il server memorizza, da qualche parte, tutte le variabili di sessione associate al numero magico.
queste informazioni possono essere memorizzato nella memoria del web server, oppure in un file
privato del server, oppure in una tabella di database (Session, Name, Value).
● http://www.ibm.com/websphere/wasce/
● http://www-306.ibm.com/software/webservers/appserv/community/
All'interno del campo di testo contrassegnato dalla etichetta Workspace andrà specificata la
directory (comprensiva del path) che Rational utilizzerà per salvare i propri progetti.
È possibile accettare quella fornita per default oppure modificarla a proprio piacimento.
Attraverso la check box in basso alla finestra di dialogo sarà, quindi, possibile scegliere se utilizzare
la medesima directory per tutti i progetti evitando di sceglierla di volta in volta.
Una volta ultimata la selezione del workspace, verrà visualizzata una schermata di benvenuto.
Menu delle
Prospettive
Console dei
Messaggi
L’interfaccia grafica di rational è organizzata a prospettive. Le prospettive non sono altro che dei
raggruppamenti di funzionalità dell’IDE, fatti in base ad una specifica operazione di sviluppo. La
Java perspective ad esempio riunisce strumenti di stesura e organizzazione del codice mentre la
Debug perspective fornisce strumenti in fase di debug.
La prospettiva che interesserà a noi è quella denominata J2EE.
Le varie viste possono essere spostate da un gruppo all’altro mediante semplice trascinamento della
scheda sul nuovo gruppo.
Le viste sono molto numerose. Per aggiungerne di nuove occorre accedere al menù
“Finestra->Mostra Viste”.
• Descrittore di distribuzione
• Java resources
• Web Content
• Tutto il contenuto statico dell'applicazione (pagine HTML, javascript, css, etc) organizzato
come si vuole, e tutte le pagine JSP anch'esse in cartelle strutturate a piacere,
vengonoincluse nella cartella WebContent che a sua volta contiene le cartelle:
• Il contenuto dinamico (sorgenti java, nel nostro caso) viene incluso nella cartella Java
Source inclusa nella cartella Java Resources, suddivise per java package.
Per accedere al Depoloyment Descriptor, basta cliccare due volte sulla voce
sulla sinistra (nell'esploratore di progetti) e visionare il file "web.xml" che Rational ha generato in
automatico per noi.
Sarà poi possibile, qualora ce ne sia la necessità, modificare il contenuto del file stesso avvalendosi
della struttura ad albero che Eclipse fornisce per leggere il contenuto dei nodi XML.
● Esportare l'applicazione come file WAR o EAR (meglio) e fare il deployment su un server
Websphere, dalla pagina della console amministrativa.
● Eseguire la nostra applicazione sul server di test interno al Rational (che deve essere
installato come modulo a parte assieme all'Agent)
Per l'esecuzione sul server di test, andiamo nella vista inferiore dove appaiono i messaggi e
selezioniamo la linguetta “Server”.
Se non fosse visibile è possibile richiamarla dal menù Finestra->Mostra Vista->Server
Se non fosse presente nessun server è possibile cliccare all'interno della “vista” e selezionare
“nuovo...” per visualizzare il wizard di creazione dei server.
MyApp
Una volta completato il Wizard di creazione dei nuovi server, cliccare con il tasto di destra sul
server creato per visualizzare il menù contestuale e selezionare “Apri” per visualizzare le proprietà
del server:
Avvia il Pubblicazion
Server e
21.1 Avvio
/usr/WebSphere/AppServer/bin/startServer.sh server1
21.2 Stop
/usr/WebSphere/AppServer/bin/stopServer.sh server1 -username <user> -password <pwd>
/usr/WebSphere/installedApps/<hostname>
Suddivisi in sottocartelle con estensione ear, al cui interno troviamo una ulteriore cartella con
estensione war:
Ad esempio:
.../DefaultApplication.ear/DefaultApplication.war/WEB-INF/classes
Nella fase di esportazione è possibile anche includere tutti i sorgenti, spuntando la casella:
“Esporta file di origine” nella finestra di esportazione, realizzando così anche una forma di backup
dei sorgenti.
Una volta creato il pacchetto EAR, bisogna importarlo nel Websphere Ufficiale, accedendo alla
console amministrativa con l'indirizzo:
http://serverUfficiale:9090/Admin
Quindi occorre:
Agendo sui pulsanti “Arresta” “Disinstalla” “Installa” “Avvia” mostrati nella figura,
ricordandosi di spuntare sempre l'applicativo su cui si vuole operare.
http://ServerUfficiale:9080/MyApp