JavaBean Dott. Ing. Rossella Rubino [email protected] A.A. 2007/2008 Laboratorio III Operatore Informatico Giuridico Cosa è un JavaBean? E’ una classe Java che risponde a due requisiti ha un costruttore con zero argomenti implementa Serializable o Externalizable per essere persistente Molte classi sono JavaBean o possono essere convertite facilmente Possono essere inserite in applet, javascript, jsp, servlet o applicazioni Java indipendenti unico requisito: JVM Proprietà del JavaBean Sono attributi del JavaBean per i quali lo stesso JavaBean offre dei metodi di scrittura e lettura Questi metodi sono l’unica interfaccia del JavaBean con l’esterno Convenzioni di denominazione per i metodi relativi alle proprietà get<nomeproprieta>() set<nomeproprieta>() Osservazione I metodi di accesso alle proprietà del Bean devono essere pubblici, ma una proprietà non è detto che debba per forza avere il metodo set ed il metodo get. Per esempio potrebbe essere di sola lettura e quindi avere solo il metodo get. Esempio: Prestito.java import java.beans.*; import java.io.Serializable; public class Prestito extends Object implements Serializable { private double somma; private double tasso; private int mesi; public Prestito() { } Prestito.java: proprietà somma /* Restituisce la somma prestata *@return la somma*/ public double getSomma(){ return somma; } /* Imposta la somma *@param somma: la somma prestata*/ public void setSomma(double somma){ this.somma=somma; } Prestito.java: proprietà tasso /* Restituisce il tasso di interesse annuo *@return il tasso di interesse annuo*/ public double getTasso(){ return tasso; } /* Imposta il tasso di interesse annuo *@param tasso: il tasso di interesse annuo*/ public void setTasso(double tasso){ this.tasso=tasso; } Prestito.java: proprietà mesi /* Restituisce i mesi scelti per il rimborso del prestito *@return i mesi scelti per il rimborso del prestito*/ public int getMesi(){ return mesi; } /* Imposta i mesi scelti per il rimborso del prestito *@param mesi: i mesi scelti per il rimborso del prestito*/ public void setMesi(int mesi){ this.mesi=mesi; } Prestito.java: metodo getPagamento() /*Restituisce il fattore di ammortamento, l'entità del pagamento mensile per la restituzione della somma e l'interesse nel periodo di tempo specificato */ public double getPagamento(){ if (tasso==0){ throw new IllegalArgumentException("Non è stato specificato il tasso di interesse"); } double tassoMensile=tasso/1200.0; double fv=Math.pow((1+tassoMensile),mesi); double num=fv*tassoMensile*somma; double denom=fv-1.0; return round(num/denom); } Prestito.java: metodo round /*Metodo di servizio che arrotonda un valore valutario al centesimo più vicino*/ public static final double round(double x){ return ((double) ((long)(x*100.0+0.5)))/100.0; } } Esempio: Prestito.java Il JavaBean Prestito ha 4 proprietà somma: la somma prestata tasso: l’interesse annuo espresso in percentuale mesi: il numero di mesi scelti per il rimborso del prestito pagamento: una proprietà di sola lettura Serializzazione Un programma che contiene il JavaBean Prestito può serializzarlo nel seguente modo OutputStream fileout=new FileOutputStream(“prestito.ser”); ObjectOutputStream objOut=new ObjectOutputStream(fileout); objOut.writeObject(prestitoBean); objOut.flush(); fileOut.close(); Deserializzazione Il JavaBean può essere riconstruito nel seguente modo InputStream filein=new FileInputStream(“prestito.ser”); ObjectInputStream objIn=new ObjectInputStream (filein); Prestito prestBean=null; try{ prestBean=(Prestito) objIn.readObject(); } catch(ClassNotFoundException e{ //gestione eccezioni } filein.close(); Externalizable Un JavaBean può implementare lo schema di persistenza Externalizable Un oggetto Externalizable gestisce le operazioni di lettura e scrittura dagli stream degli oggetti utilizzando il formato preferito metodo readExternal(ObjectInput) metodo writeExternal(ObjectOutput) Ma poiché gli oggetti Serializable possono offrire i propri metodi utilizzando qualsiasi formato, Externalizable offre pochi vantaggi e viene utilizzato raramente JSP e JavaBean Le specifiche JSP offrono uno speciale supporto per i JavaBean che li rende gestibili ad un livello superiore Questo supporto è costituito da 3 azioni standard <jsp:useBean> per dichiarare, istanziare e utilizzare i JavaBean <jsp:setProperty> per impostare le proprietà dei JavaBean <jsp:getProperty> per estrarre i valori delle proprietà dei JavaBean Azione <jsp:useBean> Crea o deserializza un JavaBean e lo associa a una variabile script La sintassi è <jsp:useBean id=“…” scope=“…” [specTipo]/> o, se si vuole inserire del codice da eseguire quando il bean viene istanziato, la seguente <jsp:useBean id=“…” scope=“…” [specTipo]> … </> <jsp:useBean>: attributo ID Identificatore utilizzato per un progetto JavaBean nel campo di visibilità specificato e dichiarato come una variabile script Java nella pagina JSP Questo valore viene utilizzato nell’attributo name delle azioni <jsp:setProperty> e <jsp:getProperty> per indicare i JavaBean cui si applica l’azione <jsp:useBean>: attributo SCOPE Indica lo spazio dei nomi in cui esiste il JavaBean. Possono essere utilizzati i seguenti valori PAGE: valido per la durata di questa pagina (default) pageContext.getAttribute() e pageContext.setAttribute() REQUEST: valido per il resto della pagina e per tutte le pagine invocate tramite <jsp:include> ServletRequest.getAttribute() e ServletRequest.setAttribute() SESSION: valido in questa sessione HTTP HttpSession.getAttribute() e HttpSession.setAttribute() APPLICATION: valido in ogni pagina JSP e servlet di questa applicazione (contesto della servlet) ServletContext.getAttribute() e ServletContext.setAttribute() Specifiche del tipo Combinazione degli attributi CLASS, TYPE e BEANNAME solo TYPE solo CLASS TYPE e CLASS TYPE e BEANNAME Specifiche tipo: solo TYPE L’engine JSP definisce una variabile del tipo specificato e poi ricerca nel campo di visibilità specificato un attributo il cui nome corrisponde al codice fornito se lo trova, lo converte nel tipo specificato altrimenti lancia l’eccezione InstantiationException Specifiche tipo: solo CLASS L’engine JSP dichiara una variabile della classe e poi ricerca nel campo di visibilità specificato un attributo il cui nome corrisponde al codice fornito se lo trova, converte l’oggetto e lo assegna alla variabile altrimenti crea un nuovo oggetto della classe specificata lo assegna alla variabile lo imposta come un attributo viene valutato, se esiste, il corpo di <jsp:useBean> Specifiche tipo: CLASS e TYPE L’engine JSP dichiara una variabile del tipo specificato e poi ricerca nel campo di visibilità specificato un attributo il cui nome corrisponde al codice fornito se lo trova, converte l’oggetto nel tipo specificato e lo assegna alla variabile altrimenti crea un nuovo oggetto del tipo specificato lo assegna alla variabile lo imposta come un attributo viene valutato, se esiste, il corpo di <jsp:useBean> Specifiche tipo: TYPE e BEANNAME Quando un JavaBean già serializzato deve essere importato nell’ambiente JSP, si devono usare gli attributi TYPE e BEANNAME Il BEANNAME viene convertito nel nome di un file i punti vengono convertiti in “/” alla fine viene aggiunto il suffisso “.ser” Se esiste un file con questo nome viene deserializzato altrimenti viene creata una nuova istanza della classe Il nuovo bean viene assegnato ad una variabile con l’ID specificato memorizzato come attributo nel campo di visibilità Azione <jsp:setProperty> Assegna dei valori alle proprietà del JavaBean sulla base dei valori contenuti nella pagina JSP La sintassi è <jsp:setProperty name=“…” property=“…” [param=“…” value=“…”]/> <jsp:setProperty>: attributi (1) Attributo NAME identifica il JavaBean sul quale voglio impostare l’attributo il nome del JavaBean deve essere stato precedentemente specificato come valore dell’attributo ID di <jsp:useBean> Attributo PROPERTY può avere due valori nome proprietà: il JavaBean deve avere un metodo con nome setnomeproprieta() *: l’elenco delle proprietà del JavaBean viene confrontato con un elenco di parametri della richiesta corrente quando viene trovata una corrispondenza viene richiamato il metodo set relativo a quella proprietà altrimenti la proprietà non viene modificata <jsp:setProperty>: attributi (2) Attributo PARAM Attributo VALUE per specificare l’associazione tra parametro della richiesta e proprietà del JavaBean per specificare il valore da associare alla proprietà Se questi due parametri non vengono specificati allora il valore della proprietà viene assegnato a partire dal parametro corrispondente della richiesta Azione <jsp:getProperty> Per ottenere i valori delle proprietà del JavaBean La sintassi è <jsp:getProperty name=“…” property=“…”/> Attributi name: nome con corrispondente attributo ID proprietà: nome della proprietà desiderata deve essere una stringa e non un espressione valutata durante la richiesta Riepilogo Cosa è un JavaBean Esempio: Prestito.java Persistenza tramite serializzazione e deserializzazione di JavaBean esternalizzazione JSP e JavaBean azione <jsp:useBean> azione <jsp:setProperty> azione <jsp:getProperty>