J2EE Antonio Cisternino
Java Beans I Java Beans sono un esempio di realizzazione di un sistema a componenti in Java I componenti possono adottare convenzioni sintattiche sui nomi per esporre la propria interfaccia adottare convenzioni sintattiche sui nomi per esporre la propria interfaccia Esporre l’interfaccia attraverso oggetti che implementano interfacce Esporre l’interfaccia attraverso oggetti che implementano interfacce Nel primo caso il runtime userà l’introspection altrimenti farà uso dell’invocazione di metodi di interfacce conosciute
La classe di un Bean Un Java Bean deve ereditare da java.awt.Component se ha bisogno di essere visualizzato Altrimenti qualsiasi classe è un Bean Gli elementi principali di un Bean sono: Properties Properties Methods Methods Events Events
Properties Le proprietà sono metodi che seguono una convenzione particolare: void setPropertyName(PropertyType val) void setPropertyName(PropertyType val) PropertyType getPropertyName() PropertyType getPropertyName() Sono possibili anche indexed properties: void setter(int index, PropertyType value); void setter(int index, PropertyType value); PropertyType getter(int index); PropertyType getter(int index); void setter(PropertyType values[]); void setter(PropertyType values[]); PropertyType[] getter(); PropertyType[] getter();
Methods and Events I metodi di un bean sono normali metodi Java Un componente può generare eventi Si fa uso del delegation event model Le interfacce sono alla base di questo modello: Un Listener implementa un’interfaccia Un Listener implementa un’interfaccia Chi genera un evento invoca tutti i listener in ascolto Chi genera un evento invoca tutti i listener in ascolto
Event model
Coding pattern L’implementazione dell’event model è basato su convenzioni Un Listener è una classe che implementa un’interfaccia che deriva da EventListener Gli eventi collegati possono essere inclusi in un’unica interfaccia Chi lancia gli eventi implementa addXXXListener e removeXXXListener Un evento che deriva da EventObject fornisce informazioni sull’evento
Bean Persistence Un componente normalmente può essere utilizzato in un designer A design time il componente espone alcune proprietà Per persistere il suo stato: Serializzazione/Externalization Serializzazione/Externalization Salvare e ripristinare le proprietà (non sempre basta!) Salvare e ripristinare le proprietà (non sempre basta!)
Creare un Bean Se si sa che un Bean non è stato preinizializzato si può usare new Altrimenti si ricorre al ClassLoader e alla Reflection (cercando in it.unipi.di.MioBean.ser: ClassLoader cl = this.getClass().getClassLoader(); ProvaBean w = (ProvaBean) Beans.instantiate(cl, “it.unipi.di.MioBean”);
Packaging I Beans possono essere impacchettati in file jar Nel manifesto si indicano quali classi sono Beans e con che caratteristiche Si usa un insieme di coppie nome/valore: Name: argle/Bargle.class Java-Bean: True Name argle/BargleBeanInfo.class Design-Time-Only: True
Esempio di Bean public class HWBean extends Canvas { private String s = "Hello World"; private String s = "Hello World"; public String getText() { public String getText() { return s; return s; } public void paint(Graphics g) { public void paint(Graphics g) { g.drawString(s, 0, 15); g.drawString(s, 0, 15); }}
Enterprise Java Beans La specifica Enterprise JavaBeans (EJB) definisce un’architettura per lo sviluppo e il deployment di “transactional, distributed object applications-based, server-side software components” Organizzazioni possono comprare o sviluppare componenti focalizzandosi sulla business logic piuttosto che sugli aspetti di concorrenza e distribuzione
Goin’ Enterprise EJB costruisce sulla specifica Java Beans Un EJBean è sempre contenuto in un EJB Container I container amministrano i componenti in modo da ottimizzare l’uso di risorse (es. pooling)
EJB Container Un contenitore EJB è responsabile per mediare l’accesso di un EJBean alle risorse Ad esempio: un altro bean, o una connessione JDBC L’interazione tra l’EJBean e il contenitore: Callback methods Callback methods EJBContext EJBContext Java Naming and Directory Interface (JNDI) Java Naming and Directory Interface (JNDI)
Callback Methods Ogni EJBean implementa un’interfaccia derivata da EnterpriseBean Queste interfacce definiscono metodi che possono essere invocati dal container Ad esempio l’interfaccia EntityBean (sel.): ejbLoad() ejbLoad() ejbStore() ejbStore() ejbActivate() ejbActivate() ejbPassivate() ejbPassivate()
EJBContext È un’interfaccia che espone i metodi per interagire col contenitore: getCallerPrincipal() getCallerPrincipal() getEJBHome() getEJBHome() getEJBLocalHome() getEJBLocalHome() getRollbackOnly() getRollbackOnly() getUserTransaction() getUserTransaction() isCallerInRole(java.lang.String roleName) isCallerInRole(java.lang.String roleName) setRollbackOnly() setRollbackOnly()
JNDI Offre un’interfaccia standard a sistemi di naming, come ad esempio LDAP Ogni EJBean ha automaticamente accesso un sistema di naming chiamato Environment Naming Context (ENC). ENC è amministrato dal container e accesso dai bean JNDI JNDI ENC consente ad un bean l’accesso a risorse come connessioni JDBC, altri EJBeans, e proprietà specifiche del bean
Accedere un Bean Ogni EJBean è composto da tre componenti: Classe di implementazione Classe di implementazione Un’interfaccia Home (che rappresenti i metodi per la gestione del life cycle dell’oggetto) Un’interfaccia Home (che rappresenti i metodi per la gestione del life cycle dell’oggetto) Un’interfaccia Remote (che esponga i metodi che implementano la business logic) Un’interfaccia Remote (che esponga i metodi che implementano la business logic)
Tipi di enterprise bean Entity Bean: sono bean solitamente utilizzati per accedere ai dati memorizzati in un database Session Bean: rappresentano processi o agiscono come agenti che compiono qualche attività Un’applicazione EJB è costituita da un insieme di entity o session beans
Persistenza Spesso i bean devono essere salvati e ripristinati Esistono due tipi di persistenza: Container-Managed Container-Managed Bean-Managed Bean-Managed La prima si basa sulla serializzazione Mentre la seconda è controllata dal Bean (e quindi è più efficiente!)
JBoss È una collezione di progetti: JBoss Application Server JBoss Application Server Javassist (bytecode generation) Javassist (bytecode generation) AOP AOP Nukes/JBoss (Content Management) Nukes/JBoss (Content Management) JBoss-IDE (Integration with Eclipse) JBoss-IDE (Integration with Eclipse) Hibernate (Oggetti mappati su tabelle relazionali) Hibernate (Oggetti mappati su tabelle relazionali)
JBoss Application Server Fino alla versione 3 è un’implementazione open della piattaforma J2EE La nuova release del sistema propone un modello alternativo a quello proposto da Sun Oltre a EJB incorpora Tomcat e le servlet in una lista quasi infinita di buzzword
Hibernate Mappare oggetti su un database può essere molto utile: nel mondo programmativo si leggono oggetti che corrispondono a righe di tabelle L’approccio? Dei file XML indicano come mappare i field di una classe sulle colonne di una tabella relazionale
Sommario Il sistema dei tipi in Java Reflection in Java Il modello di caricamento dinamico Open Java patterns JDBCJavaBeansEJB JBoss, Hibernate Conclusioni
Conclusioni Java ha introdotto elementi come il caricamento dinamico dei tipi e la reflection Questi meccanismi, uniti ad un ambiente con VM type-driven ha favorito l’affermarsi di pattern di programmazione prima più complessi EJB non fa altro che astrarre coding patterns in un framework a oggetti