Java EE 3 Ingegneria del Software (parte II) Andrea Bei
Architettura di media complessità: JSP e Servlet In una architettura J2EE di media complessità convivono Servlet e pagine JSP con responsabilità diverse JSP (Java Server Page) è una tecnologia che definisce un linguaggio di "scripting server side". Tale linguaggio permette di inserire, all interno di pagine HTML, sezioni di codice Java che verranno eseguite dal web container. di creare applicazioni web, che accettano richieste dai client e generano dinamicamente le risposte sotto forma di pagine html. Le pagine JSP si presentano come pagine HTML, all interno delle quali sono inserite sezioni di codice Java Le sezioni di codice HTML costituiscono la parte "template" del documento, ovvero ciò che è inviato "tale e quale" ai browser ed è invariante Le sezioni di codice Java costituiscono la "parte dinamica" e può generare dinamicamente parti del documento HTML (es: tabelle HTML riempite con dati di un database) che sarà inviato ai client Eseguire qualsiasi metodo scritto in Java (es: un componente DAO per l inserimento dei dati in un DB)
JSP: Esempio <html> <head> <title> Somma di due numeri - JSP Example </title> </head> <body> <h1> Somma di due numeri - JSP Example 2 </h1> <p> <form method="post" action="jspexample.jsp"> <p> <table> <tr><td>inserisci il primo numero<td> <input type=text name="n1"> <tr><td>inserisci il secondo numero<td> <input type=text name="n2"> <tr><td> <td><input type=submit value="somma"> </table> </form> </body> </html>
JSP: Esempio jspexample.jsp <html> <head> <title> JSP Example </title> </head> <body> <h1>jsp Example </h1> <% String sn1; String sn2; int n1,n2; sn1 = request.getparameter("n1"); sn2 = request.getparameter("n2"); n1 = Integer.parseInt(sn1); n2 = Integer.parseInt(sn2); %> <p>i numeri sono </p> <%=sn1%> e <%=sn2%> <br>la somma è <%=(n1+n2)%> </body> </html> Codice HTML Codice Java
JSP: Vantaggi Rispetto alle Servlet le JSP consentono una più chiara separazione delle parti statiche di una pagina web (codice HTML) da quelle dinamiche (codice Java). Lo sviluppo delle pagine JSP può essere organizzato in due fasi distinte con responsabilità diverse: I Web Designer producono i template (parte statica del documento); Gli sviluppatori Java ricevono i template dai Web Designer e vi aggiungono le parti dinamiche.
JSP: Ciclo di vita Il web container ospita le pagine JSP all interno di una particolare directory. Quando la pagina JSP è richiesta per la prima volta da un client, il container (il componente JSP Engine) la traduce in una servlet HTTP, la compila e la invia al Servlet Engine che la esegue. La traduzione e la compilazione sono effettuate solo la prima volta che la pagina è richiesta da un client. (infatti la prima richiesta della pagina comporta un tempo di risposta superiore alle successive) Una volta generata la HttpServlet, questa seguirà il ciclo di vita delle normali servlet.
JSP: Elementi Fondamentali Template text Commenti e sequenze di escape Costrutti Scripting elements Direttive Azioni Oggetti impliciti
JSP: Template Text HTML statico Editabile con qualsiasi tool di sviluppo HTML (es: DreamWeaver) Non è processato dal parser Java È inserito automaticamente all'interno della servlet come argomento della funzione out.print()
JSP: Commenti e sequenze di escape Commenti: JSP: <%-- commento --%>. Non riportato nella servlet. HTML: <!-- commento -->. Riportato nella servlet, ignorato dal browser Sequenze di escape Il backslash è usato come simbolo di non intepretazione <\% : usato per rappresentare <%. %\>: usato per rappresentare %>. \' : usato per rappresentare ' \" : usato per rappresentare "
JSP: Costrutti Scripting elements: codice Java eseguito a run-time incluse tra "<%" e "%>". Es: <% n2 = Integer.parseInt(sn2); %> Direttive: direttive considerate nella traduzione JSP- >Servlet. incluse tra "<%@" e "%>". Es: <%@ page import="java.util.math"%> permette l uso della classe Math nella pagina Nella Servlet viene inserita import java.util.math Azioni: azioni eseguite a runtime. Sono tag XML associati al namespace "jsp". Es: <jsp:include page="listapergenere.jsp" /> Permette di includere a run-time, nella pagina JSP in cui è invocata, la pagina JSP ListaPerGenere
JSP: Scripting elements Espressioni: <%= espressione %>. L espressione è valutata ed il risultato è inserito nell'output HTML della servlet. Es: <%= new java.util.date() %>. Mostra la data corrente Scriptlet: <% codice java %>. Il codice java è inserito nel metodo service() della servlet. Es: <% if (Math.random() < 0.5) {%> <font face="verdana">hai vinto!</font> <%} else {%> <font face="verdana">hai perso!</font> <% } %> Dichiarazioni: <%! codice java %>. Il codice java è inserito al di fuori del metodo service() ma nel corpo della servlet. Es: <%! private int accessi=0; %> Accessi alla pagina dall avvio del server: <%= ++accessi %>
JSP: Direttive - Page Direttiva Page Permette di configurare proprietà della servlet quali: classi e package importati; pagina di errore verso la quale il client è ridiretto nel caso in cui la servlet sollevi un eccezione; MIME type del contenuto della pagina (es.: text/html). Esempio: <%@ page import="java.util.*" %> importa il package java.util.*
JSP: Direttive Page Attributi principali import="[classi e package separati da virgole]" permette di importare classi e/o package. Esempio: <%@ page import="java.util.*" %> contenttype="[mime-type]; charset=[set di caratteri]" Permette di impostare il MIME type ed il set di caratteri dell output della servlet. Il MIME-Type di default è "text/html" Es: <%@ page contenttype="text/plain" %> indica chel output della servlet è costituito da semplice testo. errorpage="url" permette di specificare la pagina verso la quale sarà rediretto il browser nel caso in cui la servlet sollevi un eccezione senza gestirla. iserrorpage="true false" Indica se la pagina può agire da pagina di errore per un'altra pagina, ovvero se gestisce oggetti Throwable per conto di un altre pagine. MIME (Multipurpose Internet Mail Extension) stabilisce una codifica per i tipi di file (testo="text/plain", html="text/html", etc.). Nato per gli attachment nelle e- mail, ma ormai usato diffusamente anche in altri contesti.
JSP: Direttive - Include Direttiva Include Permette di includere il contenuto di un file, al momento della traduzione JSP -> Servlet Il file può contenere semplice testo, codice HTML, codice JSP o Java. Sintassi: <%@ include file="[url relativo]" %> Se l URL comincia con il carattere "/", il percorso da esso specificato è relativo al contesto applicativo della servlet (application context), altrimenti è relativo alla directory che contiene la pagina JSP. Application Context L URL di una pagina JSP ha la seguente forma: http://[indirizzo server]/[application context]/[percorso pagina] L application context è la directory radice dell applicazione web
JSP: Azioni Sono specificate tramite tag XML. Permettono di specificare azioni eseguite a "runtime" Es.: inclusione del contenuto di altri file, inoltro della request ad altre pagine JSP, utilizzo di java beans etc..
JSP: Azioni - include <jsp:include/> Permette di includere il contenuto di un altro file al momento della richiesta da parte del client Sintassi: <jsp:include page="[url_relativo]" flush="[true false]"/> Rispetto alla direttiva "include" Comporta un tempo di risposta maggiore e non consente di includere codice java. Non comporta la rigenerazione della servlet ad ogni modifica del file incluso. Risulta conveniente quando si deve includere codice html statico che può essere modificato molto frequentemente.
JSP: Azioni usebean 1/2 <jsp:usebean/>: Localizza o istanzia un JavaBean. Sintassi semplificata: (unico tag) <jsp:usebean id="[nome istanza]" class="[nome completo della classe] scope="[page request session application]" /> Sintassi completa: (tag di apertura e chiusura) <jsp:usebean id="[nome istanza]" class="[nome completo della classe]" scope=[page request session application]"> [codice JSP] </jsp:usebean> Scope: visibilità del JavaBean Page:visibile all interno della pagina JSP che contiene l azione <jsp:usebean> o in file inclusi con la direttiva <%@ include %>, Request:visibile in ogni pagina JSP che processa la stessa request Session: visibile da ogni pagina JSP richiamata nella stessa sessione della pagina contenente l azione <jsp:usebean>. Il bean esiste per tutta la sessione ed è visibile da ogni pagina che vi partecipi. La pagina in cui è creato deve contenere una direttiva <%@ page %> con l attributo session="true". Application: visibile in qualunque pagina appartenente alla stessa applicazione della pagina che lo ha istanziato. Il bean esiste finchè l applicazione è attiva e ogni pagina dell applicazione può usarlo.
JSP: Azioni usebean 2/2 L azione <jsp:usebean/> opera nel seguente modo: 1. Definisce una variabile con il nome specificato tramite l attributo "id". 2. Cerca di "localizzare" un bean con il nome e lo scope specificati. 1. Se trova il bean, assegna il riferimento alla variabile. 2. Se non trova il bean, lo istanzia a partire dalla classe specificata e ne assegna un riferimento alla variabile 3. Se l azione "jsp:usebean" è nella forma completa <jsp:usebean> [elementi JSP] </jsp:usebean> gli elementi JSP inclusi tra i due tag sono processati solo se il bean è istanziato (e non semplicemente localizzato).
JSP: Azioni setproperty e getproperty <jsp:setproperty/>: Permette di impostare il valore degli attributi dei Java Bean istanziati Sintassi: <jsp:setproperty name="nome_del_bean" property="attributo" value="valore"/> <jsp:getproperty/>: Permette di leggere il valore di un attributo di un bean, convertirlo in una stringa e stamparlo sull'output Sintassi: <jsp:getproperty name="nome_del_bean" property="nome_attributo"/>
JSP: Azioni forward e plugin <jsp:forward/> Permette di inoltrare la richiesta ad un'altra pagina Sintassi: <jsp:forward page="url"/> url può essere un valore statico o un'espressione java racchiusa tra "<%=" e"%>", calcolata a tempo di esecuzione <jsp:plugin/> Permette di inserire nell output html un elemento <OBJECT> o <EMBED>, che istruisce il browser affinché scarichi ed esegua un determinato plugin. Sintassi: <jsp:plugin type= "applet" code= "class" codebase= "url" width="numero_pixel_larghezza" height="numero_pixel_altezza"> <params> <param name="nome" value="valore">... </params> <fallback> codice html visualizzato se il browser ha i plugin disabilitati </fallback> </jsp:plugin>
JSP: Oggetti impliciti Oggetti disponibili all'interno delle pagine jsp senza bisogno di dichiarazione né istanziazione: request session page response out application config pagecontext
JSP: Oggetti impliciti - request request Oggetto che implementa l interfaccia HttpServletRequest (è istanziato con i dati della richiesta del client) Permette di accedere a : Informazioni relative all URL della pagina e ad eventuali query string; Informazioni relative all host locale (il server) ed all host remoto (il client) ; Dati inviati tramite un form.
JSP: Oggetti impliciti - request Informazioni relative all URL della pagina e alla query string getcontextpath(): restituisce la parte di URL che rappresenta la ContextRoot della pagina JSP. getquerystring(): restituisce la query string es: http://server/application/pagina.jsp?var1=val1&var2=val2 getrequesturi(): restituisce la parte di URL che va dalla Context Root al nome della pagina. getservletpath(): restituisce il percorso della pagina (ContextRoot esclusa). Informazioni relative al server a al client getremoteaddr(): restituisce l indirizzo IP della macchina client getremotehost(): restituisce il nome della macchina client getservername(): restituisce il nome del server getserverport(): restituisce il numero della porta in ascolto sul server. getscheme(): restituisce lo schema usato per la richiesta (http, https, ftp). getprotocol(): restituisce nome e versione del protocollo (es: HTTP/1.1) getmethod(): restituisce il metodo usato per la request (GET o POST). getcontenttype(): restituisce il MIME type del contenuto. Dati inviati via Form getparameter(string nomeparametro): restituisce il parametro nomeparametro presente nella request (vedi es. successivo)
JSP: Oggetti impliciti - session Oggetto di tipo HttpSession Usato per conservare lo stato attraverso una serie di richieste consecutive, provenienti da un medesimo client. (es. il carrello di un sito di e-commerce che viene via via riempito durante la navigazione tra diverse pagine di un listino) I principali metodi sono: void setattribute(string nome, Object oggetto): aggiunge un oggetto alla session associandolo ad un nome. Object getattribute(string nomeattributo): permette di recuperare un oggetto dalla session, specificandone il nome. Normalmente è necessario farne il casting. void removeattribute(string nomeattributo): rimuove dalla sessione l oggetto associato al nome passato come parametro. Enumeration getattributenames(): restituisce la lista dei nomi degli oggetti associati alla session, sotto forma di Enumeration.
JSP: Oggetti impliciti - page Sinonimo di this all interno della servlet. Esempio: <%! int attr = 0 %>... <%= page.attr %>
JSP: Oggetti impliciti response e out response Oggetto di tipo HttpServletResponse associato alla servlet. HttpServletResponse è un interfaccia che estende l interfaccia ServletResponse. Permette di impostare le proprietà della risposta da inviare al client (Es.: campi dello header http). Out Oggetto di tipo JspWriter (una versione bufferizzata di PrintWriter) Eso: out.println("hello world!");