Spring 3. Traversi Simone

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Spring 3. Traversi Simone"

Transcript

1 Spring 3 Traversi Simone 29 gennaio 2010

2 Indice Introduzione iv 0.1 Panoramica iv 0.2 Le innovazioni iv 0.3 I moduli v I Core Technologies 1 1 Il contenitore IoC Creazione di un bean Congurazione di un bean Costruire una rete di oggetti Le collezioni I generics La stringa vuota e il null Inizializzazione Lazy Lo scope Ciclo di vita Estensione del container BeanPostProcessor BeanFactoryPostProcessor BeanFactory Ereditarietà Usare i le.properties Uso delle annotation Rilevazione automatica dei componenti Uso dei ltri per uno scanning customizzato Internazionalizzazione con MessageSource Validazione Introduzione L'interfaccia Validator Gestione di controlli più complessi Gestione dei messaggi d'errore tramite messagesource Validazione di una rete di bean i

3 INDICE ii 3 Spring Expression Language (SpEL) Introduzione Panoramica sulle caratteristiche Valutazione delle espressioni usando l'interfaccia Expression di Spring L'interfaccia EvaluationContext Supporto delle espressioni alla denizione dei bean Reference del linguaggio Spring AOP Introduzione Concetti dell'aop Capacità e obiettivi di Spring AOP AOP Proxies AOP Abilitare il supporto Dichiarare un aspetto Dichiarare un pointcut Indicatori supportati per i Pointcut Combinare le espressioni dei pointcut Condividere le denizioni dei pointcut in comune Alcuni esempi Dichiarare un advice Before After returning After throwing After (nally) Around Gestione dei parametri Priorità Introduction Modello di instanziazione di un aspetto Esempio AOP con XML Dichiarare un aspetto Dichiarare un pointcut Dichiarare un advice Before After returning After throwing After (nally) Around Gestione dei parametri Introduzioni Modello di instanziazione di un aspetto Advisors Esempio Scegliere lo strumento per gestire l'aop Spring AOP o AspectJ? o XML?

4 INDICE iii 4.5 Il meccanismo dei proxy Capire i proxy AOP Creazione programmatica dei 60 II Data Access 61 5 Gestione delle transazioni Vantaggi del supporto di Spring alla gestione delle transazioni Transazioni globali Transazioni locali Modello di programmazione di Spring Comprendere l'astrazione delle transazioni di Spring Gestione dichiarativa delle transazioni Comprendere l'approccio dichiarativo Esempio Rollback Congurazione dierenti per bean dierenti <tx:advice/> Congurazione Propagazione delle transazioni Required RequiresNew Nested Advise per le transazioni Gestione programmatica delle transazioni Usare il PlatformTransactionManager Gestione dichiarativa Vs gestione programmatica

5 Introduzione Questo documento ha lo scopo di fornire una guida semplice e immediata, ma non esaustiva, all'utilizzo del framework Spring. Il motivo che mi ha spinto alla composizione di questo documento risiede nella scarsissima presenza di materiale in italiano sull'argomento. Ci tengo a precisare che questa guida non presenta tutti gli argomenti presenti sulle reference uciali, ma solo una selezione, eettuata sulla base dell'eettiva utilità che io ho rilevato su certe funzionalità. Tanto per citare uno dei grandi esclusi, la funzionalità dell'autowiring non sarà trattata, poichè la ritengo una funzionalità che se da una parte semplica un pochino il le di congurazione di Spring, dall'altra rischia di introdurre imprecisione nella struttura dell'applicazione che si realizza. Tale imprecisione, se non ben controllata, può portare a un cattivo funzionamento. Tuttavia, saltare questo argomento non toglie nulla allo studio del framework, poichè lo stesso tipo di funzionalità (ma senza imprecisioni) può essere ottenuta con altri strumenti che invece saranno trattati. In ogni caso, per qualsiasi approfondimento si consiglia di utilizzare la documentazione uciale in lingua inglese, disponibile all'indirizzo: La versione a cui questo documento si riferisce è la Panoramica Spring è un framework opensource per lo sviluppo di applicazioni su piattaforma Java [Wikipedia]. Il suo scopo è quello di rendere lo sviluppo di applicazioni enterprise più semplice e più veloce, abbattendo quindi i costi di produzione. La prima versione venne scritta da Rod Johnson, nel Giugno 2003 e sotto Licenza Apache. Il primo rilascio, la versione 1.0, risale al Marzo Spring nasce per fornire agli sviluppatori un'alternativa più semplice agli EJB 2.0, lasciando al tempo stesso una maggiore libertà. In questo è stato ampiamente riconosciuto come un ottimo risultato. 0.2 Le innovazioni Uno dei meriti di questo framework è stato quello di rendere popolari alcune tecniche prima di esso poco note, come l'inversion Of Control e il paradigma di programmazione orientata agli aspetti. Tipicamente un'applicazione Java è composta da un certo numero di componenti, gli oggetti, che collaborano l'uno con l'altro per ottenere il comportamento desiderato. Tali oggetti sono pertanto legati da dipendenze. Il linguaggio Java ha sempre lasciato gli sviluppatori molto liberi di progettare l'architettura delle applicazioni con assoluta (forse troppa) libertà. Per questo motivo nel corso del iv

6 INTRODUZIONE v tempo sono nati una vasta gamma di patterns (Factory, Builder, Abstract Factory, Decorator, Service Locator) comunemente riconosciuti ed accettati dall'industria del software. Questo è stato sicuramente un bene, ma i pattern sono solo questo: dei best pratices. Il modulo dell'ioc (Inversion of Control), come si vedrà in seguito, formalizza questi concetti, fornendo una infrastruttura che guida lo sviluppatore nella costruzione dell'applicazione, fornendogli tutti gli strumenti necessari per poter applicare i suddetti patterns. La programmazione orientata agli aspetti è un paradigma di programmazione basato sulla creazione di entità software, gli aspetti, che sovrintendono alle interazioni fra oggetti nalizzate ad eseguire un compito comune. Il vantaggio rispetto all'approccio tradizionale ad oggetti consiste nel non dover implementare separatamente in ciascun oggetto il codice necessario ad eseguire questo compito comune [Wikipedia]. Tipici esempi di responsabilità 'spalmate' su molteplici oggetti sono il log delle operazioni o la gestione della prolazione. Entrambi questi concetti saranno approfonditi più avanti. 0.3 I moduli In realtà chiamarlo framework è forse riduttivo, poichè Spring è composto da una vasta gamma di moduli, ognuno dei quali è un framework a se stante. L'aspetto interessante è che ognuno di questi moduli lavora in maniera indipendente dagli altri. Questo permette di integrare nella propria applicazione tutti e soli i moduli di interesse. Non siamo quindi costretti ad un approccio del tipo o tutto o niente. Tali moduli si possono raggruppare in base alle loro caratteristiche principali: Core Container, Data Access/Integration, Web, AOP, Instrumentation, Test. L'organizzazione di tali gruppi è visibile chiaramente nella gura 1. Figura 1: Architettura di Spring

7 INTRODUZIONE vi Nei capitoli che seguiranno verrano descritti questi moduli uno per uno.

8 Parte I Core Technologies 1

9 Capitolo 1 Il contenitore IoC E' probabilmente uno degli aspetti in cui Spring si è mostrato veramente innovativo. Per usufruire di tale servizio è necessario importare nel proprio progetto i due les jar org.springframework.beans e org.springframework.context. Molto spesso nelle nostre applicazioni, capita che un oggetto A debba usare il metodo di un oggetto B. Quando questo succede, tipicamente l'oggetto A deve prima di tutto creare un'istanza di B. Questa operazione è possibile tramite l'uso dell'operatore new: // classe B public class B { public void esegui() { System.out.println("Ciao Mondo!"); // classe A public class A { public static void main(string[] args) { B b = new B(); b.esegui(); Con l'operatore new noi stiamo chiedendo l'istanziazione della classe B. Ovvero la classe A chiede alla JVM un'istanza della classe B, come rappresentato in gura 1.1. new A JVM Figura 1.1: Creazione di un bean L'IoC parte dall'idea di inframezzare tra la classe A e la JVM un terzo componente, che chiameremo IOC, che si propone come intermediario. Il passaggio, com'è visibile in gura 1.2, sarà quindi: A chiede a IOC di chiedere a JVM un'istanza della classe B. 2

10 CAPITOLO 1. IL CONTENITORE IOC 3 Figura 1.2: Inversion of Control Da qui, il concetto di 'inversione del controllo': non siamo più 'noi' a chiedere un'istanza, ma è qualcun altro che la chiede (certo, sulla base comunque delle nostre istruzioni) e ce la restituisce. Ma perchè introdurre un'indirezione? L'idea di introdurre un intermediario, in realtà, non è poi cosi strana. In eetti, nelle attuali applicazioni, molto spesso la creazione dei beans è adata a classi (di solito statiche) preposte a questo compito, nel rispetto del pattern factory. Nell'esempio in gura 1.3 le classi del business che hanno bisogno di utilizzare classi dao, ne chiedono le istanze al modulo ServiceFactory. Il vantaggio è quello di centralizzare il concetto di creazione (e soprattutto congurazione) dei beans all'interno di un'unica classe, anchè il problema possa essere gestito più agilmente. I vantaggi di questo approccio saranno meglio evidenziati più avanti. Business DAO ServiceFactory Figura 1.3: Esempio di implementazione del pattern factory Supponendo di adottare una soluzione di questo tipo, il nostro codice diventerebbe: // Factory public abstract class BeansFactory { public static B getb() { return new B(); // classe A public class A {

11 CAPITOLO 1. IL CONTENITORE IOC 4 public static void main(string[] args) { B b = BeansFactory.getB(); b.esegui(); 1.1 Creazione di un bean L'idea di IoC è quindi una formalizzazione di una tecnica già presente da diversi anni nell'ingegneria del software. Tale modulo ci mette quindi a disposizione una factory già pronta per l'uso alla quale dobbiamo solo dare le istruzioni per la creazione dei beans. Come in tutti i framework, tale congurazione avviene tramite le xml. Quello che segue è il codice d'esempio del le spring-cong.xml: <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans <!-- Definizione dei beans --> <bean id="pippo" class="esempio.b" /> </beans> Il tag usato per la denizione dei beans è <bean>. Ogni beans andrà denito dentro un proprio tag di questo tipo. Tra i vari attributi che è possibile settare, due sono obbligatori: id, con il quale deniamo il nome che decidiamo di assegnare al bean in questione (in questo caso pippo); class, con il quale specichiamo al container qual è, all'interno del nostro progetto, la classe che dovrà essere utilizzata per l'implementazione di pippo, completa di package in cui tale classe si trova. Vediamo a questo punto come cambia il codice all'interno della nostra classe A. // classe A public class A { public static void main(string[] args) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"spring-config.xml"); B b = (B) context.getbean("pippo"); b.esegui(); ApplicationContext è l'interfaccia che ci permette di comunicare con il container IoC e utilizzare i servizi che mette a disposizione. Per poter usufruire di tali servizi creiamo l'oggetto context (che quindi è di tipo ApplicationContext), passandogli il le di congurazione a cui deve fare riferimento, e in cui nello specico abbiamo denito il bean pippo. L'argomento della funzione ClassPathXmlApplicationContext() è un array di stringhe poichè possono essere passati più le.xml.

12 CAPITOLO 1. IL CONTENITORE IOC 5 A questo punto possiamo chiedere al container di restituirci un'istanza del bean che abbiamo chiamato 'pippo', tramite il metodo getbean(string nome). Tale metodo è sovraccarico. In questa specica denizione, accetta come parametro una stringa (il nome del bean che vogliamo). Restituisce un object, e questo ci costringe ad un cast. Se vogliamo evitare il cast possiamo anche scrivere: B b = context.getbean("pippo", B.class); Avendo passato la classe B tra i parametri, il cast non è necessario. 1.2 Congurazione di un bean Naturalmente, se il ruolo dell'intermediario fosse solo quello di creare oggetti, sarebbe piuttosto complicato capirne l'utilità. Molto spesso capita che un bean, prima di essere usato, debba essere congurato. Potrebbe essere il caso di un DAO, che prima di essere usato devono essere settati i suoi parametri per la connessione ad un db. In generale, ogni oggetto il cui comportamento è determinato dal valore dei suoi attributi, deve essere congurato prima di essere usato. In un caso come quello sopra descritto, alla creazione di un bean, dovrebbero seguire un elenco di chiamate ai suoi metodi set() per settare tutti gli attributi del bean, o in alternativa, creare un costruttore ad hoc per poterlo fare. Il modulo IoC di Spring, consente di settare i parametri di congurazione direttamente dentro il le di congurazione. Supponiamo che la classe B sia fatta cosi: // classe B public class B { private String stringa; public void esegui() { System.out.println(this.stringa); // metodi set() e get()... In questo modo, il metodo esegui() scrive sulla console la stringa con cui in quel momento è stato settato l'oggetto. Il le di congurazione di Spring a questo punto potrebbe diventare questo: <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans <!-- Definizione dei beans --> <bean id="pippo" class="esempio.b"> <property name="stringa" value="ciao Mondo!" /> </bean>

13 CAPITOLO 1. IL CONTENITORE IOC 6 </beans> E' stato aggiunto un nuovo nodo, interno a <bean> che è <property>. Con questo tag è possibile elencare tutti gli attributi che si vogliono congurare contestualmente alla creazione del bean. Ogni attributo viene identicato con l'attributo name, valorizzato con il nome con cui è stato chiamato all'interno della classe B. Il suo valore viene settato con l'attributo value. Questa denizione è anche dotata di un meccanismo automatico di conversione dei valori. Se per esempio scrivessimo: <!-- bean che rappresenta un punto nel piano --> <bean id="origine" class="esempio.punto"> <property name="x" value="0.0" /> <property name="y" value="0.0" /> </bean> il sistema, conoscendo il tipo di x e y, sa in automatico che i valori '0.0' sono numeri e come tali li convertirà. Se x fosse di tipo String, tratterebbe '0.0' come una stringa. La classe A non subisce alcuna modica. Una chiamata del tipo: B b = context.getbean("pippo", B.class); restituirebbe un'istanza di B già congurata cosi come specicato nel le spring-cong.xml. E' facile capire come questo meccanismo renderebbe più semplice, per fare un esempio, l'uso di un DAO. Il le spring-cong.xml potrebbe contenere un frammento del tipo. <!-- dao --> <bean id="dao" class="esempio.classedao"> <property name="url" value="jdbc:mysql://localhost:3306/mydb" /> <property name="driver" value="com.mysql.jdbc.driver" /> <property name="username" value="admin" /> <property name="password" value="admin" /> </bean> In questo modo, chiedere al container un'istanza di 'dao' restituirebbe una dao già congurato e pronto all'uso. Ovviamente è possibile descrivere più congurazioni diverse per lo stesso bean. Potrei per esempio creare più di una congurazione diversa per ClasseDAO, chiamandone una o l'altra in funzione dello specico DB da utilizzare. Non è possibile, però, avere due bean con lo stesso id. Anchè questo meccanismo possa funzionare, è necessario che siano stati creati i metodi set() di tutti gli attributi che Spring dovrà settare. Il fatto che sia il container a settare direttamente gli attributi, prende il nome di Direct Injection (iniezione diretta, DI). 1.3 Costruire una rete di oggetti E se l'attributo di un bean è un riferimento ad un altro oggetto? Un'applicazione, tipicamente, è strutturata come una rete di oggetti, più o meno tta, che collaborano tra loro. Ogni oggetto, quindi, svolge il suo compito usandone altri.

14 CAPITOLO 1. IL CONTENITORE IOC 7 Uno degli aspetti più utili del modulo IoC di Spring è che il meccanismo di DI funziona anche nel caso in cui l'attributo da settare è un riferimento ad un altro oggetto! Vediamo un esempio... Supponiamo di avere la seguente situazone: // classe B public class B { private String stringa; public void esegui() { System.out.println(this.stringa); // classe A public class A { private B b; public void esegui() { this.b.esegui(); // classe Main public class Main { public static void main(string[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"spring-config.xml"); A a = context.getbean("pippo", A.class); a.esegui(); In questo esempio, l'oggetto A, per eseguire il metodo esegui() ha bisogno di utilizzare l'oggetto B. Il le di congurazione di Spring diventa: <!-- bean A --> <bean id="pippo" class="esempio.a"> <property name="b" ref="pluto" /> </bean> <!-- bean B --> <bean id="pluto" class="esempio.b" > <property name="stringa" value="ciao Mondo!" /> </bean> Qui vediamo un altro uso del tag <property>. Poichè la variabile b è un riferimento ad un altro oggetto, al posto dell'attributo value si usa l'attributo ref. Tale attributo permette di

15 CAPITOLO 1. IL CONTENITORE IOC 8 dire al container che quella variabile va fatta riferire ad un altro bean. Il valore dell'attributo ref è l'id che viene denito per un bean. Nel nostro caso specico, quando verrà fatta la chiamata A a = context.getbean("pippo", A.class); verrà creata un'istanza di 'pluto' e poi 'iniettata' nella variabile b del bean 'pippo'. E' facile immaginare come con questo meccanismo sia possibile tirare su con una semplice istruzione una rete di oggetti complicata quanto si vuole. Il programmatore deve solo opportunamente congurarla all'interno del le spring-cong.xml. 1.4 Le collezioni Può capitare, naturalmente, che un attributo di un oggetto sia una collezione (list, map, set o properties). In tal caso la sintassi nel spring-cong.xml può essere la seguente: <bean id="oggettocomplicato" class="progetto.complexobject"> <!-- Per le liste --> <property name="lista"> <list> <!-- Inserisco l'elemento per valore --> <value>elemento qualunque</value> <!-- Oppure lo inserisco per riferimento --> <ref bean="miodatasource" /> </list> </property> <!-- Mappa --> <property name="mappa"> <map> <!-- Elemento inserito per valore --> <entry key="elemento" value="una stringa qualunque"/> <!-- Elemento inserito per riferimento --> <entry key ="riferimento" value-ref="miodatasource"/> </map> </property> <!-- Set --> <property name="set"> <set> <value>una stringa qualunque</value> <ref bean="miodatasource" /> </set> </property> <bean> I generics Dalla Java 5 in poi, è possibile utilizzare le collezioni tipizzate. Utilizzando il meccanismo di DI per settare una collezione all'interno di un bean, possiamo trarre vantaggio dal meccanismo di conversione di tipi di Spring. Ad esempio:

16 CAPITOLO 1. IL CONTENITORE IOC 9 public class Pippo { private Map<String, Float> conti; public void setconti(map<string, Float> conti) { this.conti = conti; <beans> <bean id="pippo" class="x.y.pippo"> <property name="conti"> <map> <entry key="uno" value="9.99"/> <entry key="due" value="2.75"/> <entry key="sei" value="3.99"/> </map> </property> </bean> </beans> Le stringhe '9.99', '2.75' e '3.99' verranno automaticamente convertite in Float. 1.5 La stringa vuota e il null Spring tratta un argomento vuoto come una stringa vuota. Scrivendo: <bean id="esempio" class="esempi.prova"> <property name=" " value="" /> </bean> l'attributo verrà settato come se avessimo lanciato il seguente comando: set (""); Se si vuole invece considerare il valore null, si deve scrivere: <bean id="esempio" class="esempi.prova"> <property name=" "> <null/> </property> </bean> 1.6 Inizializzazione Lazy L'ApplicationContext tipicamente eettua una pre-istanziazione dei bean singletons in fase di inizializzazione dell'applicazione. Questo comportamento è molto comodo perchè permette di individuare alcuni errori subito piuttosto che dopo qualche ora o addirittura dopo qualche giorno. Tuttavia, qualora non si desideri questo comportamento, è possibile chiedere esplicitamente al container un'inizializzazione di tipo lazy di uno o più bean. <bean id="lazy" class="com.foo.expensivetocreatebean" lazy-init="true"/> <bean name="not.lazy" class="com.foo.anotherbean"/> Nel caso del bean chiamato lazy, questo verrà istanziato solo quando verrà esplicitamente indicato al container.

17 CAPITOLO 1. IL CONTENITORE IOC Lo scope Lo scope di un bean rappresenta l'arco di tempo in cui il bean deve essere utilizzabile e al di fuori del quale non lo deve essere. Spring supporta cinque diversi scope, tre dei quali sono disponibili solo in contesti Web. La tabella 1.1 riassume gli scope disponibili: scope descrizione singleton il bean è l'unico del suo tipo all'interno del container prototype esiste un bean per ogni istanza creata request il bean esiste solo nell'ambito di una singola richiesta HTTP session il bean esiste nell'ambito di un'intera HTTP Session globalsession il bean esiste nell'ambito di una HTTP Session globale Tabella 1.1: scope dei bean Per la denizione dello scope di un bean, si utilizza l'attributo scope del tag <bean>: <bean id="pippo" class="esempi.pippo" scope="prototype" /> I valori ammessi sono quelli espressi in tabella 1.1. Quando lo scope di un bean viene denito singleton, il container memorizza l'istanza dell'oggetto all'interno di una cache. Ad ogni successiva richiesta di quel bean, il container restituirà sempre la stessa istanza. Questo tipo di scope viene adottato da Spring di default. Quando invece lo scope viene denito prototype, il container ad ogni richiesta del bean, ne crea un'istanza nuova, sovrascrivendo quella vecchia. Gli altri tre scope rispondono alle stesse regole delle web application. Spring mette inoltre a disposizione un sistema per creare scopes personalizzati (vedi 3.5 delle reference). 1.8 Ciclo di vita Spring consente di specicare quali azioni debbano essere svolte durante l'inizializzazione di un bean, cosi come anche le precedure da eseguire prima della sua distruzione. Per quanto riguarda l'inizializzazione, è possibile denire all'interno del bean il metodo init() invocandolo poi in fase di congurazione con l'attributo init-method. Ad esempio: public class Pippo { //... public void init() { // Inizializzazione dell'oggetto... <bean id="pippo" class="esempi.pippo" init-method="init" /> Quando al container viene chiesta un'istanza di pippo, subito dopo la sua creazione verrà invocato il metodo init(). Lo stesso discorso vale anche per la fase di distruzione di un bean. In questo caso l'attributo da usare è destroy-method. Ad esempio:

18 CAPITOLO 1. IL CONTENITORE IOC 11 public class Pippo { //... public void cleanup() { // Distruzione dell'oggetto... <bean id="pippo" class="esempi.pippo" destroy-method="cleanup" /> In questo modo, prima della distruzione del bean pippo verranno eseguite tutte le operazioni all'interno del metodo cleanup() (ad esempio la chiusura delle connessioni di un dao). 1.9 Estensione del container Vediamo ora alcune funzionalità che ci permettono di estendere le funzionalità del container BeanPostProcessor L'IoC permette di poter estendere alcune funzionalità sul controllo del ciclo di vita dei bean, facendo uso di apposite interfacce. Una di queste è la BeanPostProcessor. Tale interfaccia è mostrata di seguito: public interface BeanPostProcessor { Object postprocessbeforeinitialization(object bean, String name) throws BeansException; Objcet postprocessafterinitialization(object bean, String name) throws BeansException; E' suciente scrivere una classe che implementi questa interfaccia e dichiararla come bean all'interno del le di congurazione di spring. A questo punto, prima della fase di inizializzazione di ogni bean verrà richiamato il metodo postprocessbeforeinitialization(...) e dopo l'inizializzazione il metodo postprocessafterinitialization(...). L'esempio molto semplice che segue mostra un BeanPostProcessor che chiama il metodo tostring() ogni volta che viene creato un nuovo bean. public class MioBeanPostProcessor implements BeanPostProcessor { // ritorno il bean appena istanziato così com'è public Object postprocessbeforeinitialization(object bean,string beanname) throws BeansException { return bean; public Object postprocessafterinitialization(object bean,string beanname) throws BeansException { System.out.println( "Bean '" + beanname + "' creato : " + bean.tostring() ); return bean;

19 CAPITOLO 1. IL CONTENITORE IOC 12 A questo punto è suciente dichiararlo all'interno del spring-cong.xml: <bean class="esempi.miobeanpostprocessor"/> Da notare che questo bean non ha l'attributo id. Immaginando una situazione del tipo // classe Punto public class Punto { private int x; private int public String tostring() { return "x="+this.getx()+" y="+this.gety();... // configurazione per Spring <bean id="punto" class="esempi.punto"> <property name="x" value="1" /> <property name="y" value="3" /> </bean> il metodo main seguente public static void main(final String[] args) throws Exception { ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"spring-config.xml"); Punto p = context.getbean("punto"); produrrebbe un output del tipo Bean 'punto' creato : x=1 y= BeanFactoryPostProcessor Esiste anche il concetto di BeanFactoryPostProcessor che attraverso il metodo postprocess- BeanFactory(...) permette di aggiungere del comportamento dopo che il container ha caricato le denizioni dei beans, ma prima che gli stessi siano istanziati. Non va quindi a inserirsi nel ciclo di vita dei beans, ma in quello dello stesso container. L'interfaccia è la seguente: public interface BeanFactoryPostProcessor { public void postprocessbeanfactory( ConfigurableListableBeanFactory beanfactory) throws BeansException;

20 CAPITOLO 1. IL CONTENITORE IOC 13 Anche in questo caso è suciente creare un bean che implementi questa interfaccia e denirne la congurazione all'interno dello spring-cong.xml BeanFactory E' possibile implementare l'interfaccia org.springframework.beans.factory.factorybean per tutti quegli oggetti che sono essi stessi delle factory. Tale interfaccia è da considerare come un'occasione per aggiungere funzionalità logiche di istanziazione al container IoC. Qualora si abbia del codice molto complesso per l'inizializzazione che rimane meglio esprimere direttamente in java invece che con moltissimo codice XML, è possibile creare una propria FactoryBean, scrivere l'inizializzazione all'interno di questa classe e inne integrare tale classe all'interno del container. Questa interfaccia provvede ai seguenti tre metodi: ˆ Object getobject(): ritorno un'istanza dell'oggetto che questa factory crea; ˆ boolean issingleton(): ritorna true se questa FactoryBean ritorna un singleton, false altrimenti; ˆ Class getobjecttype(): ritorna il tipo ritornato da getobject() o null se il tipo non è noto a priori; ApplicationContext estende questa interfaccia Ereditarietà La denizione di un bean può comprendere la congurazione di molte informazioni. La denizione di un bean glio eredita tutte queste informazioni. Inoltre può anche sovrascrivere alcuni valori o aggiungerne di nuovi, in base alle necessità. Questo tipo di congurazione è possibile tramite l'attributo parent del tag <bean>, come mostrato nell'esempio seguente: <bean id="inheritedtestbean" abstract="true" class="esempi.testbean"> <property name="name" value="parent"/> <property name="age" value="1"/> </bean> <bean id="inheritswithdifferentclass" class="esempi.derivedtestbean" parent="inheritedtestbean" init-method="initialize"> <property name="name" value="override"/> <!-- Il valore 1 sulla proprietà age viene ereditato dal padre --> <!-- l'attributo name invece viene sovrascritto --> </bean> La denizione del bean glio usa la classe dalla denizione del padre, se non ne è stata specicata nessuna, ma può anche sovrascriverla. In quest'ultimo caso, la classe del glio dev'essere compatibile con quella del padre e deve accettare i valori delle proprietà del genitore. La denizione di un bean glio eredita i valori degli argomenti del costruttore, i valori delle proprietà e i metodi dal padre, con in più la possibilità di aggiungere nuovi valori. Ogni metodo di inizializzazione, di distruzione e/o setting dei metodi factory statici che si specica eettuerà un override dei corrispondenti deniti nel genitore. Ciò che rimane viene sempre

21 CAPITOLO 1. IL CONTENITORE IOC 14 preso dalla denizione del glio: depends on, autowire mode, dependency check, singleton, scope e lazy-init. L'esempio precedente marca esplicitamente la denizione del bean genitore come astratto, usando l'attributo abstract. Se la denizione del padre non specica nessuna classe, tale denizione dev'essere marcata necessariamente come astratta, come segue: <bean id="inheritedtestbeanwithoutclass" abstract="true"> <property name="name" value="parent"/> <property name="age" value="1"/> </bean> <bean id="inheritswithclass" class="esempi.derivedtestbean" parent="inheritedtestbeanwithoutclass" init-method="initialize"> <property name="name" value="override"/> <!-- Il valore 1 sulla proprietà age viene ereditato dal padre --> <!-- l'attributo name invece viene sovrascritto --> </bean> Il bean genitore non può essere istanziato da solo, perchè è incompleto, essendo stato esplicitamente marcato come astratto. Quando una denizione è astratta come questa, viene utilizzata esclusivamente come template che serve come genitore per la denizione di altri bean. Se si prova a richiedere al container un'istanza di tale bean, con il metodo getbean(), viene ritornato un errore. Allo stesso modo, il metodo preinstantiatesingletons() del container ignora le denizioni dei bean settati come astratti Usare i le.properties Abbiamo visto come sia possibile costruire il le di congurazione di Spring in modo tale che contestualmente alla denizione di un bean si possano anche denire i valori dei suoi attributi. Tuttavia, scrivere esplicitamente i valori all'interno del le.xml può risultare poco comodo. Risulta sicuramente più pratico raccogliere i valori in un le di properties. Un le di properties è un semplice le di testo, con estensione.properties, e che è strutturato come una mappa: chiave = valore Quello che segue ne è un esempio: url = jdbc:mysql://localhost:3306/mydb driver = com.mysql.jdbc.driver username = admin password = admin x = 1 y = 3 Tali le sono molto usati, per esempio, per passare i dati di congurazione di un db, oppure per gestire la localizzazione di un sito (un le di properties per ogni lingua, le chiavi sono sempre le stesse, ma cambiano i valori), ecc. Per catturare tali valori all'interno del le spring-cong.xml si usa la seguente sintassi:

22 CAPITOLO 1. IL CONTENITORE IOC 15 <!-- Definizione file properties --> <bean class="org.springframework.beans.factory.config.propertyplaceholderconfigurer"> <property name="locations" value="classpath:/proprieta.properties"/> </bean> <!-- oppure con la seguente espressione --> <context:property-placeholder location="classpath:/proprieta.properties"/> <!-- Definizione dei beans --> <bean id="dao" class="esempiospring.miodao"> <property name="url" value="${url" /> <property name="driver" value="${driver" /> <property name="username" value="${username" /> <property name="password" value="${password" /> </bean> <bean id="punto" class="esempiospring.punto"> <property name="x" value="${x" /> <property name="y" value="${y" /> </bean> 1.12 Uso delle annotation A partire dalla versione 1.5 di Java, sono supportate ucialmente le annotation. Spring permette di realizzare la propria congurazione anche tramite questo strumento. Si applica ai metodi setter, come nel seguente esempio: public class SimpleMovieLister { private MovieFinder public void setmoviefinder(moviefinder moviefinder) { this.moviefinder = moviefinder; //... Questa annotation semplicemente indica che l'attributo associato al metodo set() deve essere necessariamente popolato a tempo di congurazione, con un valore denito esplicitamente. In caso contrario, il container solleva prende il nome di un attributo e di dafault Spring interpreta questo valore come il nome di un bean da iniettare. public class SimpleMovieLister {

23 CAPITOLO 1. IL CONTENITORE IOC 16 private MovieFinder public void setmoviefinder(moviefinder moviefinder) { this.moviefinder = moviefinder; Se non viene specicato nessun nome, questo viene derivato dal nome dell'attributo o del metodo set() associato in base a dov'è stato applicato. Nell'esempio che segue verrà ricercato il bean chiamato 'moviefinder'. public class SimpleMovieLister { private MovieFinder public void setmoviefinder(moviefinder moviefinder) { this.moviefinder = moviefinder; Queste possono essere utilizzate per marcare i metodi di inizializzazione e di distruzione di un bean, come nell'esempio che segue: public class CachingMovieLister public void populatemoviecache() { // populates the movie cache upon public void clearmoviecache() { // clears the movie cache upon destruction... In questo modo non c'è bisogno di usare gli attributi init-method e destroy-method visti nel paragrafo Rilevazione automatica dei componenti Spring introduce, già a partire dalla versione 2.0, in concetto di stereotipo con usata per caratterizzare componendi di accesso ai dati (dao). Con Spring 2.5 vengono aggiunte due nuove per completare la classica architettura a tre livelli (accesso ai dati, servizi di business, controller dell'interfaccia). Inoltre introduce anche il che gli altri stereotipi estendono. Queste annotazioni possono essere usate in combinazione con un'altra funzionalità di Spring: la rilevazione automatica di componenti a partire dal classpath.

24 CAPITOLO 1. IL CONTENITORE IOC 17 Tale funzionalità può risultare utile in tutti quei casi in cui si vuole che il container distingua i bean in funzione del ruolo che svolgono all'interno del container, per esempio per una gestione diversicata dei log tra i vari strati dell'applicazione, oppure per gestire meglio il problema dell'autowiring. Per fare in modo che Spring esegua una scansione del classpath allo scopo di catalogare i bean che abbiamo marchiato, l'istruzione da inserire nel le di congurazione è la seguente: <context:component-scan base-package="org.example"/> dove l'attributo base-package specica il package da cui iniziare la ricerca. Questa scansione infatti non deve coinvolgere necessariamente tutta l'applicazione, ma anche solo una parte Uso dei ltri per uno scanning customizzato Di default, le classi o con delle annotazioni personalizzate sono i soli componenti rilevati. E' possibile modicare ed estendere questo comportamento semplicemente applicando dei ltri customizzati. Tali ltri possono essere inclusivi (prendi tutti i componenti che...) o esclusivi (prendi tutti i componenti tranne...) e devono essere dichiarati come nodi dell'elemento component-scan. Ogni ltro richiede il tipo e un'espressione. La tabella 1.2 riassume le opzioni dei ltri. Tipo di ltro Espressione d'esempio Descrizione annotation org.example.someannotation Un annotazione dev'essere presente al livello di tipo nel componente target assignable org.example.someclass Un classe (o interfaccia) che il componente target può estendere/implementare aspectj org.example..*service+ Un espressione di tipo AspectJ che deve matchare con il componente target regex org/.example/.default.* Un'espressione regolare che deve matchare con il nome della classe del componente target custom org.example.mycustomtypefilter Un'implementazione customizzata dell'interfaccia org.springframework.core.type.typefilter Tabella 1.2: Opzioni dei ltri L'esempio che segue mostra la congurazione XML ignorando tutti i tranne quelli che rispettano l'espressione regolare.*stub.*repository, ovvero il cui nome termina con Repository e il nome del package in cui sono contenuti termina con Stub. <beans> <context:component-scan base-package="org.example"> <context:include-filter type="regex" expression=".*stub.*repository"/>

25 CAPITOLO 1. IL CONTENITORE IOC 18 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.repository"/> </context:component-scan> </beans> 1.14 Internazionalizzazione con MessageSource L'interfaccia ApplicationContext estende un interfaccia chiamata MessageSource e quindi provvede anche alla funzionalità di internazionalizzazione (i18n). I metodi deniti in questa interfaccia includono: ˆ String getmessage(string code, Object[] args, String default, Locale loc): Il metodo base utilizzato per recuperare un messaggio dal MessageSource. Se non viene trovato alcun messaggio, viene usato quello di default. ˆ String getmessage(string code, Object[] args, Locale loc): Fondamentalmente la stessa cosa del metodo precedente, ma con una dierenza: non è specicato alcun messaggio di default; se il messaggio non viene trovato, viene sollevata una NoSuchMessageException. ˆ String getmessage(messagesourceresolvable resolvable, Locale locale): Tutte le proprietà utilizzate nei metodi precedenti vengono wrappate in una classe chiamata Message- SourceResolvable. Quando viene caricato un ApplicationContext, viene automaticamente cercato un bean MessageSource denito nel contesto. Il bean deve avere il nome messagesource. Se tale bean viene trovato, tutte le chiamate dei metodi sopra elencati sono delegati al messagesource. Se invece non viene trovato, l'applicationcontext cerca un genitore che contenga un bean con lo stesso nome. Se lo trova lo usa come un MessageSource, altrimenti viene istanziato un DelegatingMessageSource vuoto, in grado di accettare chiamate ai metodi deniti sopra. L'uso del MessageSource è evidenziato dal seguente esempio: ˆ messaggi.properties benvenuto = Ciao Mondo!!! ˆ spring-cong.xml <beans> <bean id="messagesource" class="org.springframework.context.support.resourcebundlemessagesource"> <property name="basenames"> <list> <!-- Qui posso definire più file di properties. Per ora --> <!-- inserisco l'unico che ho che si chiama 'messaggi'. --> <value>messaggi</value> </list> </property> </bean> </beans> ˆ Main.java

26 CAPITOLO 1. IL CONTENITORE IOC 19 public class Main { public static void main(string[] args) { MessageSource resources = new ClassPathXmlApplicationContext("spring-config.xml"); String message = resources.getmessage("benvenuto", null, "Default", null); System.out.println(message); Eseguendo la classe Main, l'output sarà: Ciao Mondo!!! Se la voce benvenuto non fosse stata trovata all'interno del messaggi.properties, l'output sarebbe stato Default Questo meccanismo permette di eliminare qualunque stringa esplicitamente dichiarata all'interno del codice, sistemandole tutte in les appositi. Tale utilità risulta evidente proprio in fase di localizzazione. Supponendo per esempio di voler tradurre la nostra applicazione in inglese (en-gb), dovremo creare un le chiamato messaggi_en_gb.properties. Tipicamente la localizzazione è gestita dall'ambiente su cui gira l'applicazione. Supponendo per esempio di avere i seguenti les: ˆ messaggi.properties benvenuto = Ciao Mondo!!! ˆ messaggi_en_gb.properties benvenuto = Hello World!!! ˆ Main.java public class Main { public static void main(string[] args) { MessageSource resources = new ClassPathXmlApplicationContext("spring-config.xml"); // carico il file predefinito String message = resources.getmessage("benvenuto", null, "Default", null); System.out.println(message); // carico il file per la lingua inglese message = resources.getmessage("benvenuto", null, "Default", Locale.UK); System.out.println(message); L'output in questo caso sarà: Ciao Mondo!!! Hello World!!! La dierenza la fa l'ultimo parametro della funzione getmessage(...). Nel primo caso, non essendo specicato nessun valore, viene cercato in automatico il le messaggi (senza sussi). Nel secondo caso viene specicata la localizzazione inglese (Locale.UK), e quindi viene cercato lo stesso le ma con il susso per la lingue inglese (_en_gb).

27 Capitolo 2 Validazione 2.1 Introduzione La validazione, ovvero il controllo della validità dei valori con cui viene settato un bean o in generale vengono settati dei parametri, è un aspetto molto importante in ogni applicazione. Questa problematica diventa più critica quando i valori immessi provengono direttamente dall'utente. E' necessario quindi avere un meccanismo che consenta di controllare questo tipo di operazioni. Ci sono pro e contro nel considerare la validazione come parte della logica di business e Spring ore una soluzione per la validazione che non esclude nessuna delle due cose. In particolare la validazione ˆ non dovrebbe essere legata al layer web; ˆ dovrebbe essere semplice gestirne la localizzazione; ˆ dovrebbe essere possibile aggiungere qualunque validatore disponibile; Per assolvere a queste funzionalità, Spring propone l'interfaccia Validator. 2.2 L'interfaccia Validator Spring utilizza l'interfaccia Validator per consentire l'implementazione di meccanismi di validazione. Ogni validatore che si vuole costruire deve implementare tale interfaccia. Questi sono i metodi esposti: ˆ public boolean supports(class clazz); denisce su quali classi può agire il validatore. O meglio, data una classe passata come parametro restituisce true se il validatore in questione è stato scritto per poter validare quella classe. ˆ public void validate(object obj, Errors e); è il metodo che eettua la validazione sull'oggetto obj. Questo metodo fa anche uso dell'interfaccia Errors. Tutti gli errori rilevati durante l'esecuzione del metodo validate(...) verranno registrati all'interno di un apposito oggetto di tipo Errors. Vediamo il funzionamento di ciò di cui si è parlato nora con un esempio. Immaginiamo di avere un oggetto Indirizzo che racchiude tutte le informazioni per identicare univocamente un indirizzo nel mondo: 20

28 CAPITOLO 2. VALIDAZIONE 21 class Indirizzo { // attributi private String prefissovia; private String nomevia; private String numerocivico; private String cap; private String citta; private String provincia; private String nazione; // metodi set() e get()... // "via", "viale", "piazza", ecc. Per validare questo bean, abbiamo bisogno di un validatore ad hoc che, come descritto poco fa, deve implementare l'interfaccia Validator: public class IndirizzoValidator implements Validator { // Con questo metodo cosi definito, indichiamo che // questa classe valida SOLO gli oggetti Indirizzo public boolean supports(class clazz) { return Indirizzo.class.equals(clazz); // Metodo che realizza la validazione public void validate(object obj, Errors e) { ValidationUtils.rejectIfEmpty(e, "prefissovia", "required", "prefissovia è obbligatorio"); ValidationUtils.rejectIfEmpty(e, "nazione", "required", "nazione è obbligatorio"); ValidationUtils.rejectIfEmpty(e, "cap", "required", "cap è obbligatorio"); All'interno del metodo validate(...) vengono utilizzati i metodi statici della classe ValidationUtils. Il metodo rejectifempty(...), come dice il nome stesso, riuta (o, in altre parole, invalida la verica) il valore assegnato all'attributo pressovia di obj nel caso in cui tale attributo sia lasciato vuoto (ovvero con valore null). Il primo parametro è un riferimento all'oggetto di tipo Errors che raccoglierà tutte le informazioni circa gli errori rilevati; il secondo parametro si riferisce all'attributo di obj su cui viene eettuata la verica; il terzo parametro è un codice che rappresenta il tipo di errore. Tale codice è arbitrariamente scelto dallo sviluppatore (in questo caso è stato denito per semplicità all'interno della funzione, ma

29 CAPITOLO 2. VALIDAZIONE 22 sarebbe più corretto denirlo in un apposito le di costanti). L'ultimo parametro, che non è obbligatorio, è il messaggio d'errore di default. Secondo la logica utilizzata nell'esempio, un indirizzo non è considerato valido se il presso della via, la nazione e il cap non sono stati deniti. Per testare il nostro validatore, è suciente eseguire il seguente metodo main: public static void main(string[] args) { // creo un indirizzo Indirizzo i = new Indirizzo(); i.setnomevia("f. Ozanam"); i.setnumerocivico("44"); i.setcap(" "); // creo il validatore IndirizzoValidator iv = new IndirizzoValidator(); Errors errind = new BindException(i, i.getclass().getname()); // effettuo e gestisco la validazione iv.validate(i, errind); // controllo se ci sono stati errori if(errind.hasfielderrors()) { // mi faccio restituire una lista di errori rilevati sui campi List<FieldError> listacampi = errind.getfielderrors(); for (FieldError fe : listacampi) { System.out.println(fe.getDefaultMessage()); Vediamo di commentare il codice appena presentato. Tanto per cominciare viene creato un Indirizzo d'esempio, lasciando a null due dei tre campi richiesti come obbligatori. Viene poi creato il validatore. Abbiamo poi bisogno di un oggetto di tipo Errors. Naturalmente, trattandosi di un'interfaccia, niente ci impedisce di crearne uno nostro, ma Spring ne mette a disposizione alcuni già pronti. Nel nostro caso abbiamo usato un BindException. Non c'è un motivo particolare per aver scelto questo, se non che implementa Errors per un uso abbastanza standard. Da notare che questa classe estende Exception. Il costruttore di questo oggetto prende come parametri l'oggetto su cui si fa la validazione e il nome di tale oggetto. A questo punto possiamo chiedere al validatore di eettuare le veriche. Terminate queste operazioni, siamo ovviamente interessati a conoscere l'esito della validazione. Interroghiamo quindi l'oggetto Errors. Con il metodo hasfielderrors() verichiamo (ci restituisce un boolean) se sono stati rilevati errori sui controlli dei campi. In caso aermativo, con il metodo getfielderrors() ci facciamo restituire una lista di FieldError. Ognuno di questi oggetti contiene tutti i dettagli sugli errori rilevati sui campi. Nel nostro caso siamo interessati al messaggio di default per farcelo stampare sulla console. L'output di questo metodo produrrà il seguente risultato: prefissovia è obbligatorio nazione è obbligatorio Vediamo ora qualche osservazione di approfondimento.

JUG Ancona Italy Spring Framework

JUG Ancona Italy Spring Framework JUG Ancona Italy Spring Framework Andrea Del Bene Jug Marche Spring: perché e nato e perché lo voglio imparare? Quando si decide di investire in un nuova tecnologia è indispensabile capire il valore aggiunto

Dettagli

Modulo 4: Ereditarietà, interfacce e clonazione

Modulo 4: Ereditarietà, interfacce e clonazione Modulo 4: Ereditarietà, interfacce e clonazione Argomenti Trattati: Classi, Superclassi e Sottoclassi Ereditarietà Ereditarietà ed Attributi Privati Override super Ereditarietà e Costruttori Polimorfismo

Dettagli

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti: Javadoc Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti: /* commenti */ // commenti /** commenti documentazione */ Questi ultimi generano automaticamente

Dettagli

Programmazione Java Avanzata Spring - JDBC

Programmazione Java Avanzata Spring - JDBC Programmazione Java Avanzata Spring - JDBC Ing. Gianluca Caminiti Riferimenti Spring http://www.springsource.org/ (scaricate il reference) Beginning Spring 2 - From Novice to Professional. APress. 2008

Dettagli

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe prencipe@di.unipi.it. È qualcosa che abbiamo già visto varie volte

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe prencipe@di.unipi.it. È qualcosa che abbiamo già visto varie volte Java riutilizzo delle classi G. Prencipe prencipe@di.unipi.it Introduzione Una delle caratteristiche fondamentali in Java è il riutilizzo del codice Ci sono due modi per ottenerlo Creare oggetti di classi

Dettagli

Informatica. Prof. A. Longheu. Introduzione ai Linguaggi Object-Oriented

Informatica. Prof. A. Longheu. Introduzione ai Linguaggi Object-Oriented Informatica Prof. A. Longheu Introduzione ai Linguaggi Object-Oriented 1 Generalità programmazione OO La programmazione ad oggetti è un particolare modo di scrivere il programma. Si prevede che: 1) si

Dettagli

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti 13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/

Dettagli

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java Programmazione Orientata agli Oggetti in Linguaggio Java Design Pattern: Storia Parte b versione 2.1 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)

Dettagli

Processi BPEL. Obiettivi

Processi BPEL. Obiettivi Università degli studi di Roma Tor Vergata Facoltà di Ingegneria Processi BPEL Corso di Sistemi Distribuiti Stefano Iannucci Anno accademico 2009/10 Email: sd@chmod.it Obiettivi Esercitazione pratica su:

Dettagli

Relazioni tra oggetti e classi : Composizione. Relazioni tra oggetti e classi : esempio di Aggregazione. classe contenitore

Relazioni tra oggetti e classi : Composizione. Relazioni tra oggetti e classi : esempio di Aggregazione. classe contenitore Relazioni tra oggetti e classi : Generalizzazione Fondamenti di Informatica II 20. Laboratorio 6 Collegamenti e associazioni Le relazioni di tipo generalizzazione (specializzazione), servono per poter

Dettagli

Università degli Studi di Bologna Facoltà di Ingegneria. Tecnologie Web L-A A.A. 2014 2015. Esercitazione 08 DAO e Hibernate

Università degli Studi di Bologna Facoltà di Ingegneria. Tecnologie Web L-A A.A. 2014 2015. Esercitazione 08 DAO e Hibernate Università degli Studi di Bologna Facoltà di Ingegneria Tecnologie Web L-A A.A. 2014 2015 Esercitazione 08 DAO e Hibernate Agenda Pattern DAO e framework Hibernate progetto d'esempio relativo alla gestione

Dettagli

Object Oriented Programming

Object Oriented Programming OOP Object Oriented Programming Programmazione orientata agli oggetti La programmazione orientata agli oggetti (Object Oriented Programming) è un paradigma di programmazione Permette di raggruppare in

Dettagli

SWIM v2 Design Document

SWIM v2 Design Document PROGETTO DI INGEGNERIA DEL SOFTWARE 2 SWIM v2 DD Design Document Matteo Danelli Daniel Cantoni 22 Dicembre 2012 1 Indice Progettazione concettuale Modello ER Entità e relazioni nel dettaglio User Feedback

Dettagli

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto: Tipi primitivi Il linguaggio Java offre alcuni tipi di dato primitivi Una variabile di tipo primitivo può essere utilizzata direttamente. Non è un riferimento e non ha senso tentare di istanziarla mediante

Dettagli

Gli EJB offrono vari vantaggi allo sviluppatore di una applicazione

Gli EJB offrono vari vantaggi allo sviluppatore di una applicazione Gli EJB offrono vari vantaggi allo sviluppatore di una applicazione Un ambiente di esecuzione che gestisce o naming di oggetti, sicurezza, concorrenza, transazioni, persistenza, distribuzione oggetti (location

Dettagli

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) 12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica,

Dettagli

Mobilità di Codice. Massimo Merro Programmazione di Rete 128 / 144

Mobilità di Codice. Massimo Merro Programmazione di Rete 128 / 144 Mobilità di Codice Abbiamo già visto come un dato host possa trasmettere un oggetto (serializzabile) ad un altro host. Quest ultimo potrà eseguire l oggetto pur non possedendo il bytecode della classe

Dettagli

RMI. Java RMI RMI. G. Prencipe prencipe@di.unipi.it

RMI. Java RMI RMI. G. Prencipe prencipe@di.unipi.it Java Remote Method Invocation -- RMI G. Prencipe prencipe@di.unipi.it RMI RMI è una tecnologia JAVA che permette a una JVM di comunicare con un altra JVM per farle eseguire metodi È possibile che oggetti

Dettagli

Introduzione a Classi e Oggetti

Introduzione a Classi e Oggetti Introduzione a Classi e Oggetti Oggetto: concetto astratto Entità di un programma dotata di tre proprietà caratteristiche stato informazioni conservate nell oggetto condizionano il comportamento dell oggetto

Dettagli

UML Diagrammi delle classi. UML Diagramma classi 1

UML Diagrammi delle classi. UML Diagramma classi 1 UML Diagrammi delle classi UML Diagramma classi 1 Diagramma delle classi Non è nei nostri obiettivi affrontare UML nel suo complesso Ci concentreremo sui diagrammi delle classi che ci forniscono un linguaggio

Dettagli

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Siti web centrati sui dati Architettura MVC-2: i JavaBeans Siti web centrati sui dati Architettura MVC-2: i JavaBeans 1 ALBERTO BELUSSI ANNO ACCADEMICO 2009/2010 Limiti dell approccio SEVLET UNICA La servlet svolge tre tipi di funzioni distinte: Interazione con

Dettagli

La sintassi di un DTD si basa principalmente sulla presenza di quattro dichiarazioni:

La sintassi di un DTD si basa principalmente sulla presenza di quattro dichiarazioni: XML: DTD Da un punto di vista cronologico, il primo approccio per la definizione di grammatiche per documenti XML è rappresentato dai Document Type Definition (DTD). Un DTD è un documento che descrive

Dettagli

Java: Compilatore e Interprete

Java: Compilatore e Interprete Java: Compilatore e Interprete Java Virtual Machine Il bytecode non è Linguaggio Macchina. Per diventarlo, deve subire un ulteriore trasformazione che viene operata dall interprete Java in modalità JIT

Dettagli

Programmazione ad oggetti

Programmazione ad oggetti DAIS Univ. Ca' Foscari Venezia Programmazione ad oggetti Samuel Rota Bulò Informazioni generali Docente: Samuel Rota Bulò @email: srotabul@dais.unive.it Homepage: http://www.dais.unive.it/~srotabul/ ooprogramming2012.html

Dettagli

SMS IN. Rules SMS IN. Rules. Geodrop. Geodrop

SMS IN. Rules SMS IN. Rules. Geodrop. Geodrop SMS IN Rules SMS IN Rules } Geodrop Geodrop SMS In 2.3 Regole per la manipolazione dei messaggi Guida alla scrittura di condizioni complesse Guida alle condizioni complesse v1.0-it, 7 Dicembre 2012 Indice

Dettagli

19. Introduzione al multi-threading

19. Introduzione al multi-threading 19. Introduzione al multi-threading Marco Faella Dip. Ing. Elettrica e Tecnologie dell'informazione Università di Napoli Federico II Corso di Linguaggi di Programmazione II I thread I thread, o processi

Dettagli

Architettura MVC-2: i JavaBeans

Architettura MVC-2: i JavaBeans Siti web centrati sui dati Architettura MVC-2: i JavaBeans Alberto Belussi anno accademico 2008/2009 Limiti dell approccio SEVLET UNICA La servlet svolge tre tipi di funzioni distinte: Interazione con

Dettagli

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti Nascita di Java L uscita di Java, verso la metà degli anni novanta, fu accolta con molto entusiasmo dalla comunità dei programmatori e dei provider di servizi internet perché permetteva agli utenti del

Dettagli

Messa in esercizio, assistenza e aggiornamento di una Piattaform Open Source Liferay plug-in per ARPA

Messa in esercizio, assistenza e aggiornamento di una Piattaform Open Source Liferay plug-in per ARPA Messa in esercizio, assistenza e aggiornamento di una Piattaform Open Source Liferay plug-in per ARPA Pag. 1 di 16 Redatto da F. Fornasari, C. Simonelli, E. Croci (TAI) Rivisto da E.Mattei (TAI) Approvato

Dettagli

Marco Faella Classi enumerate

Marco Faella Classi enumerate Marco Faella Classi enumerate 22 Lezione n. Parole chiave: Java Corso di Laurea: Informatica Insegnamento: Linguaggi di Programmazione II Email Docente: faella.didattica@gmail.com A.A. 2009-2010 Il problema

Dettagli

Marco Faella Il paradigma Model-View-Controller. Il pattern Strategy.

Marco Faella Il paradigma Model-View-Controller. Il pattern Strategy. Marco Faella Il paradigma Model-View-Controller. Il pattern Strategy. 10 Lezione n. Parole chiave: Java Corso di Laurea: Informatica Insegnamento: Linguaggi di Programmazione II Email Docente: faella.didattica@gmail.com

Dettagli

Realizzazione di una classe con un associazione

Realizzazione di una classe con un associazione Realizzazione di una classe con un associazione Nel realizzare una classe che è coinvolta in un associazione, ci dobbiamo chiedere se la classe ha responsabilità sull associazione. Diciamo che una classe

Dettagli

Messaggi volatili. Matteo Zignani. 10 gennaio 2015

Messaggi volatili. Matteo Zignani. 10 gennaio 2015 UNIVESITÁ DEGLI STUDI DI MILANO LAUREA TRIENNALE IN COMUNICAZIONE DIGITALE PROGETTO LABORATORIO DI RETI DI CALCOLATORI Messaggi volatili Matteo Zignani 10 gennaio 2015 1 PRESENTAZIONE DEL PROBLEMA Lo studente

Dettagli

PHP: Interfacce; Gestione errori ed eccezioni. Pasqualetti Veronica

PHP: Interfacce; Gestione errori ed eccezioni. Pasqualetti Veronica PHP: Interfacce; Gestione errori ed eccezioni i Pasqualetti Veronica Interfacce In PHP non si possono ereditare proprietà da più classi. 2 Per ovviare al problema si possono creare delle interfacce che

Dettagli

Programmazione Java Avanzata Concetti su Java

Programmazione Java Avanzata Concetti su Java Programmazione Java Avanzata Concetti su Java Ing. Giuseppe D'Aquì Testi di Riferimento Java ( R. Liguori, P. Liguori), O'Reilly Hops Tecniche Nuove (2008) Java Virtual Machine Il codice scritto in Java

Dettagli

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio QUEUE : considerazioni QUEUE : considerazioni Si è realizzata una struttura dati complessa utilizzandone una primitiva, l array. Il pregio di tale implementazione è il basso costo computazionale, mentre

Dettagli

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011 Fondamenti di Informatica 1 Prof. B.Buttarazzi A.A. 2010/2011 Sommario Paradigma OO Incapsulamento Polimorfismo e Overloading Ereditarietà e Overriding Esercizi svolti Esercizi proposti Paradigma OO Le

Dettagli

Programmazione Java: Variabili membro, Metodi La parola chiave final

Programmazione Java: Variabili membro, Metodi La parola chiave final Programmazione Java: Variabili membro, Metodi La parola chiave final romina.eramo@univaq.it http://www.di.univaq.it/romina.eramo/tlp Roadmap Definire una classe» Variabili membro» Metodi La parola chiave

Dettagli

DATABASE IN RETE E PROGRAMMAZIONE LATO SERVER

DATABASE IN RETE E PROGRAMMAZIONE LATO SERVER DATABASE IN RETE E PROGRAMMAZIONE LATO SERVER L architettura CLIENT SERVER è l architettura standard dei sistemi di rete, dove i computer detti SERVER forniscono servizi, e computer detti CLIENT, richiedono

Dettagli

RMI Remote Method Invocation

RMI Remote Method Invocation RMI Remote Method Invocation [Pagina intenzionalmente vuota] (1 12 2004) slide 4:1/18 (p.106) Un applicazione RMI è un applicazione distribuita ad oggetti. Applicazione RMI tipica, strutturata in: server:

Dettagli

Rappresentazione grafica di entità e attributi

Rappresentazione grafica di entità e attributi PROGETTAZIONE CONCETTUALE La progettazione concettuale, ha il compito di costruire e definire una rappresentazione corretta e completa della realtà di interesse, e il prodotto di tale attività, è lo schema

Dettagli

DESIGN PATTERNS Parte 6. State Proxy

DESIGN PATTERNS Parte 6. State Proxy DESIGN PATTERNS Parte 6 State Proxy STATE Il Design Pattern State nasce dall'esigenza di poter gestire gli stati di una classe senza dover usare dei costrutti come gli Enum e quindi delle switch. Prendiamo

Dettagli

Programmazione a Oggetti Lezione 10. Ereditarieta

Programmazione a Oggetti Lezione 10. Ereditarieta Programmazione a Oggetti Lezione 10 Ereditarieta Sommario Come definire sottoclassi Costruttori Abstract Classes Final Ereditarietà: promemoria Strumento tipico dell OOP per riusare il codice e creare

Dettagli

Configurare e Gestire le ACLs in oneye 0.8

Configurare e Gestire le ACLs in oneye 0.8 Configurare e Gestire le ACLs in oneye 0.8 Ti stai chiedendo come funzionano in Controlli di Accesso in oneye, ma non sai come utilizzarli? Continua a leggere. In questa guida, mostrerò come sia possibile

Dettagli

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete La prima applicazione Java Programma MyFirstApplication Il programma visualizza una finestra vuota sullo schermo. Importo il package delle classi usate nel seguito. Dichiaro la classe MyFirstApplication

Dettagli

Programmazione in Java (I modulo) Lezione 3: Prime nozioni

Programmazione in Java (I modulo) Lezione 3: Prime nozioni Programmazione in Java (I modulo) Lezione 3: Prime nozioni La volta scorsa Abbiamo avuto un primo assaggio! Abbiamo visto come usare l editor per scrivere un programma Java. Abbiamo analizzato riga per

Dettagli

Java Server Pages (JSP) JSP o Servlet? Java Server Pages (JSP) Java Server Pages Costituiscono un estensione della tecnologia delle servlet

Java Server Pages (JSP) JSP o Servlet? Java Server Pages (JSP) Java Server Pages Costituiscono un estensione della tecnologia delle servlet Java Server Pages (JSP) Introduzione alle JSP Linguaggio di scripting lato server HTML-embedded Una pagina JSP contiene sia HTML sia codice Il client effettua la richiesta per la pagina JSP La parte HTML

Dettagli

Supermarket Progetto di Programmazione Febbraio 2010

Supermarket Progetto di Programmazione Febbraio 2010 Supermarket Progetto di Programmazione Febbraio 2010 1 Supermercato Dovete realizzare un insieme di classi e interfacce che riguardano la gestione di un supermercato. nella Sezione 2 verranno descritte

Dettagli

Breve riepilogo della puntata precedente:

Breve riepilogo della puntata precedente: Breve riepilogo della puntata precedente: 1. In C, il passaggio dei parametri alle funzioni avviene sempre per copia, ovvero il valore del parametro viene copiato all'interno della variabile che rappresenta

Dettagli

Internet Architettura del www

Internet Architettura del www Internet Architettura del www Internet è una rete di computer. Il World Wide Web è l insieme di servizi che si basa sull architettura di internet. In una rete, ogni nodo (detto host) è connesso a tutti

Dettagli

Spring WS Sviluppare WebService in Java

Spring WS Sviluppare WebService in Java Spring WS Sviluppare WebService in Java 1.1 Introduzione Nell ambito della programmazione Java è particolarmente utile avere una certa familiarità con i WebService e la tecnologia che li supporta. In particolare

Dettagli

Struttura di un programma Java

Struttura di un programma Java Struttura di un programma Java Un programma in Java è un insieme di dichiarazioni di classi. Una classe non può contenere direttamente delle istruzioni, ma può contenere la dichiarazione di metodi, che

Dettagli

Programmazione distribuita

Programmazione distribuita Programmazione distribuita 1 Architettura client-server È il modo classico di progettare applicazioni distribuite su rete Server offre un servizio "centralizzato" attende che altri (client) lo contattino

Dettagli

Programmazione server-side: Java Servlet

Programmazione server-side: Java Servlet Programmazione server-side: Java Servlet Corso di Applicazioni Telematiche A.A. 2006-07 Lezione n.11 parte II Prof. Roberto Canonico Università degli Studi di Napoli Federico II Facoltà di Ingegneria Cos

Dettagli

Java? Sì, grazie. Scopo del corso

Java? Sì, grazie. Scopo del corso Modulo di Java? Sì, grazie Il linguaggio di Internet? Portabilità su qualunque piattaforma (non solo calcolatori): It works everywhere Supporto e disponibilità di strumenti, librerie e documentazione garantiti

Dettagli

Corso html 5. Di Roberto Abutzu. *********** Quarta parte: Body ed elementi strutturali. ********** Cos'è il Body e gli elementi strutturali?

Corso html 5. Di Roberto Abutzu. *********** Quarta parte: Body ed elementi strutturali. ********** Cos'è il Body e gli elementi strutturali? Corso html 5. Di Roberto Abutzu. *********** Quarta parte: Body ed elementi strutturali. ********** Cos'è il Body e gli elementi strutturali? Riprendiamo il discorso, introducendo la tag Body e iniziando

Dettagli

Z3 B1 Message Addon Invio Massivo Documenti via Email e Fax per SAP Business One

Z3 B1 Message Addon Invio Massivo Documenti via Email e Fax per SAP Business One Z3 B1 Message Addon Invio Massivo Documenti via Email e Fax per SAP Business One Manuale Z3 B1 Message Versione 2.60 Pagina 1 di 19 Sommario Introduzione... 3 Installazione... 3 Attivazione... 3 Configurazione...

Dettagli

Esercitazione n 4. Obiettivi

Esercitazione n 4. Obiettivi Esercitazione n 4 Obiettivi Progettare e implementare per intero un componente software in Java Linguaggio Java: Classi astratte Utilizzo di costruttori e metodi di superclasse Polimorfismo Esempio guida:

Dettagli

20. Appunti sulle liste (gestione in linguaggio C#) 16/04/2015 Arraylist

20. Appunti sulle liste (gestione in linguaggio C#) 16/04/2015 Arraylist 20. Appunti sulle liste (gestione in linguaggio C#) 16/04/2015 Arraylist Esamina il codice seguente, eseguilo passo passo (F11) e rispondi ai quesiti: using System; using System.Collections; class Program

Dettagli

Appunti di Sistemi Distribuiti

Appunti di Sistemi Distribuiti Appunti di Sistemi Distribuiti Matteo Gianello 27 settembre 2013 1 Indice 1 Introduzione 3 1.1 Definizione di sistema distribuito........................... 3 1.2 Obiettivi.........................................

Dettagli

L ambizione dei design pattern (letteralmente schemi di programmazione) è quella di offrire soluzioni a problemi ricorrenti che facilitano lo

L ambizione dei design pattern (letteralmente schemi di programmazione) è quella di offrire soluzioni a problemi ricorrenti che facilitano lo Design Pattern L ambizione dei design pattern (letteralmente schemi di programmazione) è quella di offrire soluzioni a problemi ricorrenti che facilitano lo sviluppo dei programmi, il loro mantenimento,

Dettagli

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011 Fondamenti di Informatica 1 Prof. B.Buttarazzi A.A. 2010/2011 Sommario Installazione SOFTWARE JDK ECLIPSE 03/03/2011 2 ALGORITMI E PROGRAMMI PROBLEMA ALGORITMO PROGRAMMA metodo risolutivo linguaggio di

Dettagli

Applicazioni web. Sommario. Parte 6 Servlet Java. Applicazioni web - Servlet. Alberto Ferrari 1. Servlet Introduzione alle API ed esempi

Applicazioni web. Sommario. Parte 6 Servlet Java. Applicazioni web - Servlet. Alberto Ferrari 1. Servlet Introduzione alle API ed esempi Applicazioni web Parte 6 Java Alberto Ferrari 1 Sommario Introduzione alle API ed esempi Tomcat Server per applicazioni web Alberto Ferrari 2 Alberto Ferrari 1 Java: da applet a servlet In origine Java

Dettagli

DESIGN PATTERNS Parte 5. Facade Strategy Composite Interpreter

DESIGN PATTERNS Parte 5. Facade Strategy Composite Interpreter DESIGN PATTERNS Parte 5 Facade Strategy Composite Interpreter FACADE Per proteggere la nostra applicazione sfruttando il Protect Variation possiamo usare il pattern Facade. Questo pattern è ottimo per

Dettagli

La connessione php-mysql con MySQLi

La connessione php-mysql con MySQLi La connessione php-mysql con MySQLi Premessa Lo scenario che si intende alla base di questo capitolo è di disporre di un ambiente phpmysql rappresentato nel seguente schema: L'applicazione php viene eseguita

Dettagli

Programmazione ad oggetti

Programmazione ad oggetti DAIS Univ. Ca' Foscari Venezia Programmazione ad oggetti Samuel Rota Bulò Classi astratte Le classi astratte sono un ibrido tra le classi concrete e le interfacce. Hanno le stesse caratteristiche di una

Dettagli

Organizzazione della lezione. 15. Java Remote Method Invocation (3) Lo schema del Factory Design Pattern - 1. Factory design pattern

Organizzazione della lezione. 15. Java Remote Method Invocation (3) Lo schema del Factory Design Pattern - 1. Factory design pattern Organizzazione della lezione 15. Java Remote Method Invocation (3) Vittorio Scarano Corso di Programmazione Distribuita Laurea di I livello in Informatica Università degli Studi di Salerno Il design pattern

Dettagli

Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB. Http con java, URL

Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB. Http con java, URL Università degli Studi di Modena e Reggio Emilia Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB Http con java, URL Ing. Marco Mamei Anno Accademico 2004-2005 M. Mamei - Tecnologie

Dettagli

Gestione delle eccezioni in Java

Gestione delle eccezioni in Java Gestione delle eccezioni in Java - Introduzione al concetto di eccezioni E possibile definire un eccezione come un situazione imprevista che il flusso di un applicazione può incontrare. È possibile gestire

Dettagli

Introduzione al linguaggio Java: Servlet e JSP

Introduzione al linguaggio Java: Servlet e JSP Introduzione al linguaggio Java: Servlet e JSP Corso di Gestione della Conoscenza d Impresa A. A. 2006/2007 Dipartimento di Informatica Università degli Studi di Bari 1 Servlet e JSP: il contesto Un applicazione

Dettagli

The Hitchhiker's Guide to testable code

The Hitchhiker's Guide to testable code The Hitchhiker's Guide to testable code semplici regole per scrivere codice semplice da testare Davide Cerbo - davidecerbo@gmail.com - JUG Roma Nicola Raglia - n.raglia@gmail.com - JUG Roma Non parleremo

Dettagli

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Ottava Esercitazione. introduzione ai thread java mutua esclusione Ottava Esercitazione introduzione ai thread java mutua esclusione Agenda Esempio 1 Concorrenza in Java: creazione ed attivazione di thread concorrenti. Esercizio 2 da svolgere Concorrenza in Java: sincronizzazione

Dettagli

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo. Prototype 28 4. Prototype (GoF pag. 117) 4.1. Descrizione 4.2. Esempio Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

Dettagli

Blue s One CTI Enterpris Blue s Attendant Pro/Enterprise SDK - plugin creating tools

Blue s One CTI Enterpris Blue s Attendant Pro/Enterprise SDK - plugin creating tools Blue s One CTI Enterpris Blue s Attendant Pro/Enterprise SDK - plugin creating tools rel. 1.2 ITA 01-06-2012 Introduzione alla creazione del plug-in Questo documento ha lo scopo di illustrare come creare

Dettagli

Scrivere un programma in Java

Scrivere un programma in Java Programmare in JAVA Leonardo Rigutini Dipartimento Ingegneria dell Informazione Università di Siena Via Roma 56 53100 SIENA uff. 0577 234850 - interno: 7102 Stanza 119 rigutini@dii.unisi.it http://www.dii.unisi.it/~rigutini/

Dettagli

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind() Organizzazione della lezione Lezione 18 Remote Method Invocation - 6 Vittorio Scarano Corso di Programmazione Distribuita (2003-2004) Laurea di I livello in Informatica Università degli Studi di Salerno

Dettagli

Breve introduzione curata da Alessandro Benedetti. Struts2-Introduzione e breve guida

Breve introduzione curata da Alessandro Benedetti. Struts2-Introduzione e breve guida Breve introduzione curata da Alessandro Benedetti Struts2-Introduzione e breve guida 22-11- 2008 1 Struts 2 Costruisci,attiva e mantieni! Apache Struts 2 è un framework elegante ed estensibile per creare

Dettagli

Class File bytecode. Class loader. Verifier JIT. Run-time System

Class File bytecode. Class loader. Verifier JIT. Run-time System Un file.class è ottenuto compilando il codice sorgente Java. Esso contiene il bytecode, ovvero la sequenza di istruzioni per la JVM, ed anche molte informazioni simboliche. Il bytecode è il linguaggio

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare

Dettagli

Scaletta. Estensioni UML per il Web. Applicazioni web - 2. Applicazioni web. WAE: Web Application Extension for UML. «Client page»

Scaletta. Estensioni UML per il Web. Applicazioni web - 2. Applicazioni web. WAE: Web Application Extension for UML. «Client page» Scaletta Estensioni UML per il Web Michele Zennaro 14-05-2004 Le applicazioni web Scopo di un estensione UML per il web Due punti di vista Uno più astratto Uno più vicino ai file fisici conclusivo Commenti

Dettagli

JUG Ancona Italy. Andrea Del Bene. Jug Marche

JUG Ancona Italy. Andrea Del Bene. Jug Marche JUG Ancona Italy SpringMVC AndreaDelBene JugMarche Cos'èSpringMVC? Spring MVC è il sotto-framework di Spring che permetti di servirsi del Framework Spring per realizzare applicazioni web. Possiamo quindi

Dettagli

Modulo 4 Il pannello amministrativo dell'hosting e il database per Wordpress

Modulo 4 Il pannello amministrativo dell'hosting e il database per Wordpress Copyright Andrea Giavara wppratico.com Modulo 4 Il pannello amministrativo dell'hosting e il database per Wordpress 1. Il pannello amministrativo 2. I dati importanti 3. Creare il database - Cpanel - Plesk

Dettagli

PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI

PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI PROBLEMA DELLA RICERCA in termini generali: Dati in input un insieme S di elementi (numeri, caratteri, stringhe, ) e un elemento

Dettagli

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup Progetto Automi e Linguaggi Parser svliluppato con JLex e cup Sviluppato da Santoro Carlo Maurizio Matricola:0108/528 Sviluppo terminato il: 18/06/06 TRACCIA DEL PROGETTO Si costruisca, utilizzando la

Dettagli

Test di unità con JUnit4

Test di unità con JUnit4 Test di unità con JUnit4 Richiamo sul test di unità Il test d unità è una metodologia che permette di verificare il corretto funzionamento di singole unità di codice in determinate condizioni. Nel caso

Dettagli

Joomla! 2.5:Utenti e permessi - Il wiki di Joomla.it

Joomla! 2.5:Utenti e permessi - Il wiki di Joomla.it Pagina 1 di 6 Joomla! 2.5:Utenti e permessi Da Il wiki di Joomla.it. Traduzione (http://cocoate.com/it/j25it/utenti) dal libro Joomla! 2.5 - Beginner's Guide (http://cocoate.com/j25/users-permissions)

Dettagli

Prova di Laboratorio di Programmazione

Prova di Laboratorio di Programmazione Prova di Laboratorio di Programmazione 6 febbraio 015 ATTENZIONE: Non è possibile usare le classi del package prog.io del libro di testo. Oltre ai metodi richiesti in ciascuna classe, è opportuno implementare

Dettagli

Progettazione di interfacce web indipendenti dal dispositivo

Progettazione di interfacce web indipendenti dal dispositivo Progettazione di interfacce web indipendenti dal dispositivo Candidato Izzo Giovanni, Matr. 41/1305 Relatore Prof. Porfirio Tramontana 1 Panoramica su contesto ed obiettivi Il contesto della tesi è legato

Dettagli

Esercizi su. Funzioni

Esercizi su. Funzioni Esercizi su Funzioni ๒ Varie Tracce extra Sul sito del corso ๓ Esercizi funz_max.cc funz_fattoriale.cc ๔ Documentazione Il codice va documentato (commentato) Leggibilità Riduzione degli errori Manutenibilità

Dettagli

Tale attività non è descritta in questa dispensa

Tale attività non è descritta in questa dispensa Fondamenti di informatica Oggetti e Java ottobre 2014 1 Nota preliminare L installazione e l uso di Eclipse richiede di aver preliminarmente installato Java SE SDK Tale attività non è descritta in questa

Dettagli

Iniziativa Comunitaria Equal II Fase IT G2 CAM - 017 Futuro Remoto. Approfondimento SOFTWARE PER L ARCHIVIAZIONE

Iniziativa Comunitaria Equal II Fase IT G2 CAM - 017 Futuro Remoto. Approfondimento SOFTWARE PER L ARCHIVIAZIONE APPROFONDIMENTO ICT Iniziativa Comunitaria Equal II Fase IT G2 CAM - 017 Futuro Remoto Approfondimento SOFTWARE PER L ARCHIVIAZIONE ORGANISMO BILATERALE PER LA FORMAZIONE IN CAMPANIA INDICE SOFTWARE PER

Dettagli

Java Web Services. Uso di Eclipse e Apache Axis

Java Web Services. Uso di Eclipse e Apache Axis Java Web Services Uso di Eclipse e Apache Axis 1 Gli strumenti utili per iniziare Axis (Web Service tool) Eclipse (IDE di sviluppo) Tomcat (servlet/jsp container) N.B. Eclipse e Tomcat possono essere sostituiti

Dettagli

LEZIONE 3. Il pannello di amministrazione di Drupal, configurazione del sito

LEZIONE 3. Il pannello di amministrazione di Drupal, configurazione del sito LEZIONE 3 Il pannello di amministrazione di Drupal, configurazione del sito Figura 12 pannello di controllo di Drupal il back-end Come già descritto nella lezione precedente il pannello di amministrazione

Dettagli

Corso di Informatica

Corso di Informatica Corso di Informatica Modulo T1 B2 Significato e proprietà della OOP 1 Prerequisiti Concetto ed elementi della comunicazione Allocazione e deallocazione della memoria Compilazione di un programma Spazio

Dettagli

La gestione documentale con il programma Filenet ed il suo utilizzo tramite la tecnologia.net. di Emanuele Mattei (emanuele.mattei[at]email.

La gestione documentale con il programma Filenet ed il suo utilizzo tramite la tecnologia.net. di Emanuele Mattei (emanuele.mattei[at]email. La gestione documentale con il programma Filenet ed il suo utilizzo tramite la tecnologia.net di Emanuele Mattei (emanuele.mattei[at]email.it) Introduzione In questa serie di articoli, vedremo come utilizzare

Dettagli

Connessione ad internet

Connessione ad internet Introduzione al C++ Connessione ad internet Istruzioni per la connessione internet: - una volta connessi, aprire un browser (firefox) - in Modifica/preferenze/avanzate/rete/impostazioni - attivare la modalità

Dettagli

Configurazione di base. Dott. Doria Mauro doriamauro@gmail.com

Configurazione di base. Dott. Doria Mauro doriamauro@gmail.com Hibernate Configurazione di base Dott. Doria Mauro doriamauro@gmail.com I file di configurazione Hibernate prevede l uso dei file di configurazione formato XML. I principali file sono: Un file di configurazione

Dettagli

Candidato: Luca Russo Docente: Prof. Raffaele Montella. 27 Marzo 2013

Candidato: Luca Russo Docente: Prof. Raffaele Montella. 27 Marzo 2013 e di e di Candidato: Luca Russo Docente: Corso di laurea in Informatica Applicata Facoltá di Scienze e Tecnologie Programmazione su Reti 27 Marzo 2013 Traccia d esame Sviluppare multitier con disaccoppiamento

Dettagli

AOP Static Code Programming

AOP Static Code Programming AOP Static Code Programming I concetti dell' Aspect Oriented Programming sono sempre stati spunto di tante nuove idee che ho proposto alla web community, questa volta ripropongo una variante in termini

Dettagli

Java: Compilazione e Traduzione. Fondamenti di Informatica L-B Esercitazione n 3 Introduzione a JAVA. C: Editing, compilazione, esecuzione

Java: Compilazione e Traduzione. Fondamenti di Informatica L-B Esercitazione n 3 Introduzione a JAVA. C: Editing, compilazione, esecuzione Fondamenti di Informatica L-B Esercitazione n 3 Introduzione a JAVA A.A. 2007/08 Tutor: Barbara Pettazzoni barbara.pettazzoni@studio.unibo.it Java: Compilazione e Traduzione Editing, compilazione, esecuzione

Dettagli