Gianluca Moro [email protected] Dipartimento di Elettronica, Informatica e Sistemistica Università di Bologna Bean: Classi e Oggetti Java in JSP !! Un bean è una classe Java che rispetta le seguenti regole: !! !! !! Contiene almeno un attributo ed un metodo set… e un metodo get… per memorizzare e reperire il valore dell’attributo; Implementa l’interfaccia java.io.Serializable; I bean sono utili per: !! !! la gestione delle sessioni utente l’interfacciamento con sistemi non web-based JSP & Java Bean G. Moro - DEIS, Università di Bologna 3 Dichiarazione di un Bean !! E’ possibile indicare che si intende utilizzare un Bean all’interno della pagina: !! !! <jsp:useBean id=“nome dell’istanza” scope=“scope del bean” class=“classe del bean”/> Il nome dell’istanza viene cercata all’interno dello scopo indicato: se è presente viene riutilizzata, altrimenti ne viene creata una nuova !! equivalente a new … JSP & Java Bean G. Moro - DEIS, Università di Bologna 4 Visibilità e tempi di vita !! !! !! !! Nell’utilizzo della direttiva <jsp:useBean…/> è possibile specificare 4 diversi valori per l’attributo scope: page: pagina; request: richiesta; session: sessione; application: applicazione. JSP & Java Bean G. Moro - DEIS, Università di Bologna 5 Pagina e richiesta !! page indica un tempo di vita pari a quello della pagina JSP !! !! !! la visibilità è limitata al solo utente corrente la visibilità non viene mantenuta dopo il forward request indica un tempo di vita pari a quello della richiesta (GET o POST) !! !! la visibilità è limitata al solo utente corrente la gestione di una richiesta viene mantenuta anche dopo il forward verso una nuova pagina JSP & Java Bean G. Moro - DEIS, Università di Bologna 6 Sessione e applicazione !! session indica un tempo di vita pari a quello della sessione dell’utente corrente !! !! la visibilità è limitata al solo utente corrente application indica un tempo di vita pari a quello dell’applicazione web (pari cioè a quella del server Web) !! gli oggetti con scope application sono visibili a tutti gli utenti dell’applicazione JSP & Java Bean G. Moro - DEIS, Università di Bologna 7 Esempio: contatore !! Supponendo di utilizzare “come” bean la classe seguente public class Contatore { private int c = 0; public int getContatore() { return ++c; } } JSP & Java Bean G. Moro - DEIS, Università di Bologna 8 Esempio: contatore !! Nel caso di utilizzo di un bean con scope di pagina: !! !! o di richiesta: !! !! <jsp:usebean id=“c” scope=“page” class=“Contatore”> <jsp:usebean id=“c” scope=“request” class=“Contatore”> L’invocazione seguente, all’interno della pagina: <%=c.getContatore()%> !! restituisce sempre 1 tutte le volte che la pagina viene invocata JSP & Java Bean G. Moro - DEIS, Università di Bologna 9 Esempio: contatore !! Nel caso di utilizzo di un bean con scope di sessione: <jsp:usebean id=“c” scope=“session” class=“Contatore”> !! L’invocazione seguente, all’interno della pagina, restituisce il numero di volte che quella pagina è stata invocata dal client: <%=c.getContatore()%> JSP & Java Bean G. Moro - DEIS, Università di Bologna 10 Esempio: contatore !! Nel caso di utilizzo di un bean con scope di applicazione: <jsp:usebean id=“c” scope=“application” class=“Contatore”> !! L’invocazione seguente, all’interno della pagina, restituisce il numero di volte che quella pagina è stata invocata da ogni client: <%=c.getContatore()%> JSP & Java Bean G. Moro - DEIS, Università di Bologna 11 Reperimento valori dei Bean !! !! E’ possibile ottenere il valore di una proprietà di un Bean: <jsp:getProperty name=“nome del bean” property=“nome della proprietà”/> Utilizzando l’esempio precedente, per ottenere il valore del contatore si sarebbe potuto utilizzare: <jsp:getProperty name=“c” property=“contatore”> JSP & Java Bean G. Moro - DEIS, Università di Bologna 12 Impostazione valori dei Bean !! !! !! E’ possibile modificare il valore di una proprietà di un Bean: <jsp:setProperty name=“nome del bean” seguito da (un valore specificato): property=“proprietà” value=“valore”/> oppure da (un valore di una richiesta): property=“proprietà” param=“parametro”/ > JSP & Java Bean G. Moro - DEIS, Università di Bologna 13 Impostazione valori dei Bean !! utilizziamo come bean la classe seguente public class Contatore { private int c = 0; public int getContatore() { return ++c; } public void setContatore(int i) { c = i; } } JSP & Java Bean G. Moro - DEIS, Università di Bologna 14 Impostazione valori dei Bean !! Il codice seguente imposta il valore del contatore specificando il metodo da usare con property: <jsp:setProperty name=“c” property=“contatore” value=“10”> JSP & Java Bean G. Moro - DEIS, Università di Bologna 15 Impostazione valori dei Bean da parametri di form !! !! il seguente tag html di input permette di acquisire un valore impostato dall’utente: <input type=“text” name=“contatore”> Il seguente codice JSP permette di impostare il contatore con il valore specificato dall’utente: <jsp:setProperty name=“c” property=“contatore” param=“contatore”> JSP & Java Bean G. Moro - DEIS, Università di Bologna 16 Sessione utente realizzata tramite bean: esempio !! !! !! Supponiamo di voler memorizzare nella sessione solamente il nome ed il cognome di un utente (studente) che si collega la sessione non sarà costituita da attributi come mostrato per l’oggetto implicito session ma sarà rappresentata da un oggetto studente definiamo pertanto la relativa classe JSP & Java Bean G. Moro - DEIS, Università di Bologna 17 Esempio di Bean: classe studente public class Studente implements java.io.Serializable { // Attributi private String nome; private String cognome; // Costruttore public Studente() { nome = “”; cognome = “”; } // Metodi public void setNome(String s) { nome = s; } public String getNome() { return nome; } public void setCognome(String s) { cognome = s; } public String getCognome() { return cognome; } } JSP & Java Bean G. Moro - DEIS, Università di Bologna 18 Definizione del Bean (i) !! !! Per ognuna degli attributi è necessario definire due metodi che permettano l’accesso (lettura) e la trasformazione (scrittura) I due metodi devono essere denominati con i prefissi set e get seguiti dal nome della variabile di sessione con la prima lettera in maiuscolo. JSP & Java Bean G. Moro - DEIS, Università di Bologna 20 Definizione del Bean (ii) !! !! !! È necessario definire i quattro metodi setNome, getNome, setCognome, getCognome. Non esiste alcun vincolo sulla denominazione degli attributi essi potrebbero essere scelti indipendentemente dai nomi delle variabili di sessione, per comodità, questi sono stati denominati allo stesso modo (nome e cognome). JSP & Java Bean G. Moro - DEIS, Università di Bologna 21 Deployment dei Bean !! Per rendere un bean utilizzabile in pagine JSP è necessario: !! !! !! compilarla la classe che lo descrive inserirla nella directory apposita del server web nel caso di Tomcat 3.3 è sufficiente inserire la classe del Bean nella cartella WEB-INF \classes dell’applicazione Web JSP & Java Bean G. Moro - DEIS, Università di Bologna 22 Dichiarazione in pagina JSP di Bean con scope di sessione !! Con la seguente direttiva si dichiara l’intento di utilizzare un bean di sessione all’interno della pagina JSP: <jsp:useBean id=“stud" scope="session" class=“Studente"/> !! !! se l’oggetto con id stud è già presente nella sessione dell’utente allora viene utilizzato in caso di mancato ritrovamento l’istanza viene creata e associata alla sessione dell’utente che ha chiesto l’esecuzione della pagina JSP JSP & Java Bean G. Moro - DEIS, Università di Bologna 23 Scrittura di proprietà di un bean !! Tramite le direttive seguenti è possibile assegnare valori agli attributi dell’istanza stud: <jsp:setProperty name=“stud” property=“nome” value=“Paolo”/> <jsp:setProperty name=“stud” property=“cognome” value=“Rossi”/> JSP & Java Bean G. Moro - DEIS, Università di Bologna 24 Lettura di proprietà di un bean !! Tramite le direttive seguenti è invece possibile ricavare i valori degli attributi dell’istanza stud: <jsp:getProperty name=“stud” property=“nome”> <jsp:getProperty name=“stud” property=“cognome”/> JSP & Java Bean G. Moro - DEIS, Università di Bologna 25 FORM e Bean !! JSP fornisce facilitazioni per memorizzare le informazioni acquisite con una form direttamente in attributi istanza di un bean: <jsp:setProperty name=“<nome istanza del bean>” property=“<nome variabile di sessione>” param=“<nome parametro della richiesta>”/> JSP & Java Bean G. Moro - DEIS, Università di Bologna 26 FORM e Bean: FORM HTML <html> <head><title>Inserimento Studente</title></head> <body> <form action=“controller.jsp” method=“get”> <input type=“text” name=“nome”> <input type=“text” name=“cognome”> <input type=“submit” value=“Invio”> </form> </body> </html> JSP & Java Bean G. Moro - DEIS, Università di Bologna 27 FORM e Bean: controller … <jsp:useBean id=“stud” scope=“session” class=“studente”/> <jsp:setProperty name=“stud" property="nome" param="nome"/> <jsp:setProperty name=“stud" property="cognome" param="cognome"/> … JSP & Java Bean G. Moro - DEIS, Università di Bologna 28 FORM e Bean: assegnazione automatica (i) !! la direttiva seguente memorizza i parametri di una form HTML in attributi istanza di un bean: <jsp:setProperty name=“<nome bean>” property=“*”/> !! nel caso dell’esempio precedente il codice sarebbe stato il seguente: … <jsp:useBean id=“stud” scope=“session” class=“studente”/> <jsp:setProperty name=“stud" property=“*"/> … !! attenzione: i nomi dei parametri html utilizzati per acquisire i valori devono avere lo stesso nome dei metodi del Bean. JSP & Java Bean G. Moro - DEIS, Università di Bologna 29 FORM e Bean: assegnazione automatica (ii) !! !! notare che le variabili di sessione effettivamente modificate sono solo quelle valorizzate questo permette di utilizzare un unico bean (di sessione) per dati provenienti da diverse form, senza rischiare che assegnamenti successivi cancellino i dati relativi agli assegnamenti precedenti JSP & Java Bean G. Moro - DEIS, Università di Bologna 30 FORM e Bean: assegnazione automatica (iii) - esempio !! !! se i due controlli di input seguenti sono su due form diverse: <input type=“text” name=“nome”> <input type=“text” name=“cognome”> il seguente codice può essere utilizzato senza rischi di perdere uno dei due assegnamenti: <jsp:useBean id=“stud” scope=“session” class=“Studente”/> <jsp:setProperty name=“stud” property=“*”/> JSP & Java Bean G. Moro - DEIS, Università di Bologna 31 Bean: gli altri scope !! !! Finora, abbiamo parlato di bean con scope session Gli altri scope (page, request, application) non cambiano il modo in cui un bean può essere utilizzato, ma solo il suo tempo di vita e la sua visibilità JSP & Java Bean G. Moro - DEIS, Università di Bologna 32 Utilizzo di altri oggetti Java !! !! E’ possibile istanziare oggetti Java senza utilizzare la direttiva precedente. E’ possibile dichiarare una nuova istanza dell’oggetto nell’ambito delle dichiarazioni o all’interno degli scriptlet (con relativi ambiti di visibilità): <%! Contatore c = new Contatore() %> <% Contatore c = new Contatore() %> JSP & Java Bean G. Moro - DEIS, Università di Bologna 42