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=" xmlns:xsi=" xsi:schemalocation=" <!-- 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=" xmlns:xsi=" xsi:schemalocation=" <!-- 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.

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

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

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

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

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

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

I casi d uso corrispondono ai compiti che l attore (che può essere una persona fisica e non) può svolgere.

I casi d uso corrispondono ai compiti che l attore (che può essere una persona fisica e non) può svolgere. UML e i Casi d USO I casi d uso specificano una sequenza di azioni che producono un risultato visibile agli attori del sistema. Essi nascono per fornire descrizioni delle capacità del sistema. I casi d

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

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

Funzioni in C. Violetta Lonati

Funzioni in C. Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Funzioni - in breve: Funzioni Definizione di funzioni

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

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

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

PROCEDURA INVENTARIO DI MAGAZZINO di FINE ESERCIZIO (dalla versione 3.2.0)

PROCEDURA INVENTARIO DI MAGAZZINO di FINE ESERCIZIO (dalla versione 3.2.0) PROCEDURA INVENTARIO DI MAGAZZINO di FINE ESERCIZIO (dalla versione 3.2.0) (Da effettuare non prima del 01/01/2011) Le istruzioni si basano su un azienda che ha circa 1000 articoli, che utilizza l ultimo

Dettagli

Progettazione : Design Pattern Creazionali

Progettazione : Design Pattern Creazionali Progettazione : Design Pattern Creazionali Alessandro Martinelli alessandro.martinelli@unipv.it 30 Novembre 2010 Progettazione : Design Pattern Creazionali Aspetti generali dei Design Pattern Creazionali

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

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti Capitolo 3 L applicazione Java Diagrammi ER Dopo le fasi di analisi, progettazione ed implementazione il software è stato compilato ed ora è pronto all uso; in questo capitolo mostreremo passo passo tutta

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 a Oggetti Modulo B

Programmazione a Oggetti Modulo B Programmazione a Oggetti Modulo B Progetto Dott. Alessandro Roncato 4/10/2011 Progetto Da svolgere singolarmente Scadenza consegna: una settimana prima dello scritto; Valutazione in base a: Corretta compilazione

Dettagli

Creare un sito Multilingua con Joomla 1.6

Creare un sito Multilingua con Joomla 1.6 Creare un sito Multilingua con Joomla 1.6 Istruzioni Vai a: navigazione, ricerca Testo originale: http://docs.joomla.org/language_switcher_tutorial_for_joomla_1.6 Questa guida è valida sia per Joomla 1.6

Dettagli

Banca dati Professioniste in rete per le P.A. Guida all uso per le Professioniste

Banca dati Professioniste in rete per le P.A. Guida all uso per le Professioniste Banca dati Professioniste in rete per le P.A. Guida all uso per le Professioniste versione 2.1 24/09/2015 aggiornamenti: 23-set-2015; 24-set-2015 Autore: Francesco Brunetta (http://www.francescobrunetta.it/)

Dettagli

risulta (x) = 1 se x < 0.

risulta (x) = 1 se x < 0. Questo file si pone come obiettivo quello di mostrarvi come lo studio di una funzione reale di una variabile reale, nella cui espressione compare un qualche valore assoluto, possa essere svolto senza necessariamente

Dettagli

Guida all uso di Java Diagrammi ER

Guida all uso di Java Diagrammi ER Guida all uso di Java Diagrammi ER Ver. 1.1 Alessandro Ballini 16/5/2004 Questa guida ha lo scopo di mostrare gli aspetti fondamentali dell utilizzo dell applicazione Java Diagrammi ER. Inizieremo con

Dettagli

Gestione Risorse Umane Web

Gestione Risorse Umane Web La gestione delle risorse umane Gestione Risorse Umane Web Generazione attestati di partecipazione ai corsi di formazione (Versione V03) Premessa... 2 Configurazione del sistema... 3 Estrattore dati...

Dettagli

Concetto di Funzione e Procedura METODI in Java

Concetto di Funzione e Procedura METODI in Java Fondamenti di Informatica Concetto di Funzione e Procedura METODI in Java Fondamenti di Informatica - D. Talia - UNICAL 1 Metodi e Sottoprogrammi Mentre in Java tramite le classi e gli oggetti è possibile

Dettagli

Soluzione dell esercizio del 2 Febbraio 2004

Soluzione dell esercizio del 2 Febbraio 2004 Soluzione dell esercizio del 2 Febbraio 2004 1. Casi d uso I casi d uso sono riportati in Figura 1. Figura 1: Diagramma dei casi d uso. E evidenziato un sotto caso di uso. 2. Modello concettuale Osserviamo

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

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da ARPA Fonte Dati Regione Toscana Redatto da L. Folchi (TAI) Rivisto da Approvato da Versione 1.0 Data emissione 06/08/13 Stato DRAFT 1 Versione Data Descrizione 1,0 06/08/13 Versione Iniziale 2 Sommario

Dettagli

Il calendario di Windows Vista

Il calendario di Windows Vista Il calendario di Windows Vista Una delle novità introdotte in Windows Vista è il Calendario di Windows, un programma utilissimo per la gestione degli appuntamenti, delle ricorrenze e delle attività lavorative

Dettagli

Università degli Studi di L Aquila. Facoltà di Ingegneria. Corso di Laurea in Ingegneria Elettronica Corso di Sistemi Informativi

Università degli Studi di L Aquila. Facoltà di Ingegneria. Corso di Laurea in Ingegneria Elettronica Corso di Sistemi Informativi Università degli Studi di L Aquila Facoltà di Ingegneria Corso di Laurea in Ingegneria Elettronica Corso di Sistemi Informativi Prof. Gaetanino Paolone Dott. Ottavio Pascale a.a.2003-2004 Progetto Campo

Dettagli

Product Shipping Cost Guida d'installazione ed Utilizzo

Product Shipping Cost Guida d'installazione ed Utilizzo Guida d'installazione ed Utilizzo Installazione Per installare il modulo è sufficiente copiare la cartella app del pacchetto del modulo nella cartella principale dell'installazione di Magento dove è già

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

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012 Fondamenti di informatica Oggetti e Java ottobre 2012 1 JUnit JUnit è uno strumento per assistere il programmatore Java nel testing JUnit consente di scrivere test di oggetti e classi Java i test sono

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

Analisi e diagramma di Pareto

Analisi e diagramma di Pareto Analisi e diagramma di Pareto L'analisi di Pareto è una metodologia statistica utilizzata per individuare i problemi più rilevanti nella situazione in esame e quindi le priorità di intervento. L'obiettivo

Dettagli

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli CODICE Le fonti in cui si possono trovare tutorial o esempi di progetti utilizzati con Arduino si trovano nel sito ufficiale di Arduino, oppure nei forum di domotica e robotica. Il codice utilizzato per

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

Esame dell 8 settembre 2012

Esame dell 8 settembre 2012 Basi di Dati e Sistemi Informativi Errori ricorrenti nella progettazione concettuale Questo documento ha, come scopo, presentare alcuni gravi errori che ricorrono spesso nella progettazione concettuale

Dettagli

Versione 7.0 Taglie e Colori. Negozio Facile

Versione 7.0 Taglie e Colori. Negozio Facile Versione 7.0 Taglie e Colori Negozio Facile Negozio Facile: Gestione taglie e colori Il concetto di base dal quale siamo partiti è che ogni variante taglia/colore sia un articolo a se stante. Partendo

Dettagli

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo. DALLE PESATE ALL ARITMETICA FINITA IN BASE 2 Si è trovato, partendo da un problema concreto, che con la base 2, utilizzando alcune potenze della base, operando con solo addizioni, posso ottenere tutti

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

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

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

Registratori di Cassa

Registratori di Cassa modulo Registratori di Cassa Interfacciamento con Registratore di Cassa RCH Nucleo@light GDO BREVE GUIDA ( su logiche di funzionamento e modalità d uso ) www.impresa24.ilsole24ore.com 1 Sommario Introduzione...

Dettagli

Database. Si ringrazia Marco Bertini per le slides

Database. Si ringrazia Marco Bertini per le slides Database Si ringrazia Marco Bertini per le slides Obiettivo Concetti base dati e informazioni cos è un database terminologia Modelli organizzativi flat file database relazionali Principi e linee guida

Dettagli

Raggruppamenti Conti Movimenti

Raggruppamenti Conti Movimenti ESERCITAZIONE PIANO DEI CONTI Vogliamo creare un programma che ci permetta di gestire, in un DB, il Piano dei conti di un azienda. Nel corso della gestione d esercizio, si potranno registrare gli articoli

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

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

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2009-2010

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2009-2010 Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2009-2010 Alessandro Longheu http://www.diit.unict.it/users/alongheu alessandro.longheu@diit.unict.it Reflection in Java 1 Reflection Riflessione

Dettagli

Progetto: ARPA Fonte Dati. ARPA Fonte Dati. Regione Toscana. Manuale Amministratore

Progetto: ARPA Fonte Dati. ARPA Fonte Dati. Regione Toscana. Manuale Amministratore ARPA Fonte Dati Regione Toscana 1 Redatto da L. Folchi (TAI) Rivisto da Approvato da Versione 1.1 Data emissione 09/10/13 Stato FINAL 2 Versione Data Descrizione 1,0 06/08/13 Versione Iniziale 1.1 09/10/2013

Dettagli

MANUALE D USO DELLA PIATTAFORMA ITCMS

MANUALE D USO DELLA PIATTAFORMA ITCMS MANUALE D USO DELLA PIATTAFORMA ITCMS MANULE D USO INDICE 1. INTRODUZIONE... 2 2. ACCEDERE ALLA GESTIONE DEI CONTENUTI... 3 3. GESTIONE DEI CONTENUTI DI TIPO TESTUALE... 4 3.1 Editor... 4 3.2 Import di

Dettagli

http://www.programmiamo.altervista.org/c/oop/o...

http://www.programmiamo.altervista.org/c/oop/o... PROGRAMMIAMO Programma per la gestione di un conto corrente C++ - Costruttore e distruttore C++ Home Contatti Supponiamo ora di voler scrivere un programma a menu per la gestione di un conto corrente bancario.

Dettagli

Cookie. Krishna Tateneni Jost Schenck Traduzione: Luciano Montanaro

Cookie. Krishna Tateneni Jost Schenck Traduzione: Luciano Montanaro Krishna Tateneni Jost Schenck Traduzione: Luciano Montanaro 2 Indice 1 Cookie 4 1.1 Politica............................................ 4 1.2 Gestione........................................... 5 3 1

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

Release Note Aconex Release 15.1.20 Pubblicato il 6 febbraio 2015 e aggiornato il 26 febbraio 2015 per coprire il periodo di release dal 15 febbraio

Release Note Aconex Release 15.1.20 Pubblicato il 6 febbraio 2015 e aggiornato il 26 febbraio 2015 per coprire il periodo di release dal 15 febbraio Release Note Aconex Release 15.1.20 Pubblicato il 6 febbraio 2015 e aggiornato il 26 febbraio 2015 per coprire il periodo di release dal 15 febbraio al 15 marzo Panoramica Questa release comporta alcune

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

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE SOMMARIO Coda (queue): Specifica: interfaccia. Implementazione: Strutture indicizzate (array): Array di dimensione variabile. Array circolari. Strutture collegate (nodi). Prestazioni. Strutture Software

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

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

4 3 4 = 4 x 10 2 + 3 x 10 1 + 4 x 10 0 aaa 10 2 10 1 10 0

4 3 4 = 4 x 10 2 + 3 x 10 1 + 4 x 10 0 aaa 10 2 10 1 10 0 Rappresentazione dei numeri I numeri che siamo abituati ad utilizzare sono espressi utilizzando il sistema di numerazione decimale, che si chiama così perché utilizza 0 cifre (0,,2,3,4,5,6,7,8,9). Si dice

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

FtpZone Guida all uso

FtpZone Guida all uso FtpZone Guida all uso La presente guida ha l obiettivo di spiegare le modalità di utilizzo del servizio FtpZone fornito da E-Mind Srl. All attivazione del servizio E-Mind fornirà solamente un login e password

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

[MANUALE VISUAL BASIC SCUOLA24ORE PROF.SSA PATRIZIA TARANTINO] 14 dicembre 2008

[MANUALE VISUAL BASIC SCUOLA24ORE PROF.SSA PATRIZIA TARANTINO] 14 dicembre 2008 Se devo memorizzare più valori che sono in qualche modo parenti dal punto di vista logico, posso usare il concetto di vettore di variabili (array). Ad esempio, se devo memorizzare le temperature di tutti

Dettagli

La manutenzione come elemento di garanzia della sicurezza di macchine e impianti

La manutenzione come elemento di garanzia della sicurezza di macchine e impianti La manutenzione come elemento di garanzia della sicurezza di macchine e impianti Alessandro Mazzeranghi, Rossano Rossetti MECQ S.r.l. Quanto è importante la manutenzione negli ambienti di lavoro? E cosa

Dettagli

Creare una nuova spedizione personalizzata.

Creare una nuova spedizione personalizzata. Gestione spedizioni La piattaforma ecommerce compry.it offre una gestione estremamente potente dei costi di spedizione da applicare al cliente che effettua acquisti. Il sistema, oltre al classico calcolo

Dettagli

Integrazione InfiniteCRM - MailUp

Integrazione InfiniteCRM - MailUp Integrazione InfiniteCRM - MailUp La funzionalità della gestione delle campagne marketing di icrm è stata arricchita con la spedizione di email attraverso l integrazione con la piattaforma MailUp. Creando

Dettagli

Laboratorio di Basi di Dati

Laboratorio di Basi di Dati Laboratorio di Basi di Dati Docente: Alberto Belussi Lezione 9 Architettura Model-View-Controller (MVC) Adottando l'architettura MVC e la tecnologia Servlet-JSP, un'applicazione web può essere realizzata

Dettagli

Introduzione ai database relazionali

Introduzione ai database relazionali Introduzione ai database relazionali Tabelle Un database (DB) è costituito da un insieme di file che memorizzano dati opportunamente organizzati Nei database relazionale tale organizzazione è costituita

Dettagli

Strumenti di modellazione. Gabriella Trucco

Strumenti di modellazione. Gabriella Trucco Strumenti di modellazione Gabriella Trucco Linguaggio di modellazione Linguaggio formale che può essere utilizzato per descrivere (modellare) un sistema Il concetto trova applicazione soprattutto nell

Dettagli

Architettura MVC-2 A L B E R T O B E L U S S I A N N O A C C A D E M I C O 2 0 1 2 / 2 0 1 3

Architettura MVC-2 A L B E R T O B E L U S S I A N N O A C C A D E M I C O 2 0 1 2 / 2 0 1 3 Architettura MVC-2 A L B E R T O B E L U S S I A N N O A C C A D E M I C O 2 0 1 2 / 2 0 1 3 Verso l architettura MVC-2 2 Il secondo passo verso l architettura MVC-2 è quello di separare il controllo dell

Dettagli

Registri RMI. Massimo Merro Univ. Verona Programmazione di Rete 90 / 247

Registri RMI. Massimo Merro Univ. Verona Programmazione di Rete 90 / 247 Registri RMI Per poter interagire con un server remoto, un client deve essere in possesso di una sua referenza remota (ovvero un oggetto stub). Un servizio di Naming è una risorsa centralizzata che può

Dettagli

Spazio Commerciale. Le tue vendite, il nostro successo. Manuale Operativo. Guida inserimento articoli tramite Area di amministrazione.

Spazio Commerciale. Le tue vendite, il nostro successo. Manuale Operativo. Guida inserimento articoli tramite Area di amministrazione. Manuale Operativo Guida inserimento articoli tramite Area di amministrazione Pagina 1 di 8 Indice Generale 1. Sommario 2. Introduzione 3. Glossario 4. Accesso all'interfaccia 5. Icone e funzionalità 5.1.

Dettagli

INSERIMENTO DATI BASILARI

INSERIMENTO DATI BASILARI PASSO PASSO. Questo applicativo software nasce con l idea di essere molto semplice da usare. Di fatto lo è ed infatti non dispone di un help in linea all interno dello stesso. Tuttavia ci sentiamo in dovere

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

Mac Application Manager 1.3 (SOLO PER TIGER)

Mac Application Manager 1.3 (SOLO PER TIGER) Mac Application Manager 1.3 (SOLO PER TIGER) MacApplicationManager ha lo scopo di raccogliere in maniera centralizzata le informazioni piu salienti dei nostri Mac in rete e di associare a ciascun Mac i

Dettagli

UTILIZZATORI A VALLE: COME RENDERE NOTI GLI USI AI FORNITORI

UTILIZZATORI A VALLE: COME RENDERE NOTI GLI USI AI FORNITORI UTILIZZATORI A VALLE: COME RENDERE NOTI GLI USI AI FORNITORI Un utilizzatore a valle di sostanze chimiche dovrebbe informare i propri fornitori riguardo al suo utilizzo delle sostanze (come tali o all

Dettagli

CMS MUSEO&WEB. Mappe grafiche. Andrea Tempera (OTEBAC) 12 aprile 2010

CMS MUSEO&WEB. Mappe grafiche. Andrea Tempera (OTEBAC) 12 aprile 2010 CMS MUSEO&WEB Mappe grafiche Andrea Tempera (OTEBAC) 12 aprile 2010 Introduzione Grazie ad appositi tag HTML possiamo associare molteplici collegamenti a differenti zone di un'unica immagine; un'immagine

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

Funzioni non documentate Openoffice.org. 3 Base mini-howto

Funzioni non documentate Openoffice.org. 3 Base mini-howto Funzioni non documentate Openoffice.org. 3 Base mini-howto Augusto Scatolini (webmaster@comunecampagnano.it) Ver. 1.0 gennaio 2009 Come risolvere il problema del contatore che inizia da 0 (zero) Come importare

Dettagli

MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE

MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE 1/6 MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE Per prima cosa si ringrazia per aver scelto ImmobiPhone e per aver dato fiducia al suo autore. Il presente documento istruisce l'utilizzatore sull'uso del programma

Dettagli

Dimensione di uno Spazio vettoriale

Dimensione di uno Spazio vettoriale Capitolo 4 Dimensione di uno Spazio vettoriale 4.1 Introduzione Dedichiamo questo capitolo ad un concetto fondamentale in algebra lineare: la dimensione di uno spazio vettoriale. Daremo una definizione

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

H1 Hrms Gestione eventi/scadenze automatiche

H1 Hrms Gestione eventi/scadenze automatiche Sintesi H1 Hrms Gestione eventi/scadenze automatiche Il presente documento nasce con lo scopo di illustrare la funzionalità all interno di H1 hrms relativa alla procedura di gestione degli eventi e delle

Dettagli

Laboratorio di Sistemi Distribuiti Leonardo Mariani

Laboratorio di Sistemi Distribuiti Leonardo Mariani Laboratorio di Sistemi Distribuiti Leonardo Mariani ELECTION ALGORITHMS In molti sistemi distribuiti un processo deve agire da (o svolgere un ruolo particolare) per gli altri processi. Spesso non è importante

Dettagli

Strutturazione logica dei dati: i file

Strutturazione logica dei dati: i file Strutturazione logica dei dati: i file Informazioni più complesse possono essere composte a partire da informazioni elementari Esempio di una banca: supponiamo di voler mantenere all'interno di un computer

Dettagli

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a. 2009-10. prof.

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a. 2009-10. prof. Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a. 009-10 prof. Viviana Bono Blocco 9 Metodi statici: passaggio parametri, variabili locali, record

Dettagli

Esercizio data base "Biblioteca"

Esercizio data base Biblioteca Rocco Sergi Esercizio data base "Biblioteca" Database 2: Biblioteca Testo dell esercizio Si vuole realizzare una base dati per la gestione di una biblioteca. La base dati conterrà tutte le informazioni

Dettagli

Inizializzazione, Assegnamento e Distruzione di Classi

Inizializzazione, Assegnamento e Distruzione di Classi Inizializzazione, Assegnamento e Distruzione di Classi Lezione 9 Operazioni Automatiche In ogni programma C++ oggetti classe vengono gestiti automaticamente dal compilatore Inizializzati al momento della

Dettagli

Invio SMS. DM Board ICS Invio SMS

Invio SMS. DM Board ICS Invio SMS Invio SMS In questo programma proveremo ad inviare un SMS ad ogni pressione di uno dei 2 tasti della DM Board ICS. Per prima cosa creiamo un nuovo progetto premendo sul pulsante (Create new project): dove

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

Da dove nasce l idea dei video

Da dove nasce l idea dei video Da dove nasce l idea dei video Per anni abbiamo incontrato i potenziali clienti presso le loro sedi, come la tradizione commerciale vuole. L incontro nasce con una telefonata che il consulente fa a chi

Dettagli

Il web server Apache Lezione n. 3. Introduzione

Il web server Apache Lezione n. 3. Introduzione Procurarsi ed installare il web server Apache Introduzione In questa lezione cominciamo a fare un po di pratica facendo una serie di operazioni preliminari, necessarie per iniziare a lavorare. In particolar

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

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12}; ESERCIZI 2 LABORATORIO Problema 1 Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12}; Chiede all'utente un numero e, tramite ricerca

Dettagli

COME AVERE SUCCESSO SUL WEB?

COME AVERE SUCCESSO SUL WEB? Registro 3 COME AVERE SUCCESSO SUL WEB? Guida pratica per muovere con successo i primi passi nel web MISURAZIONE ED OBIETTIVI INDEX 3 7 13 Strumenti di controllo e analisi Perché faccio un sito web? Definisci

Dettagli

PSNET UC RUPAR PIEMONTE MANUALE OPERATIVO

PSNET UC RUPAR PIEMONTE MANUALE OPERATIVO Pag. 1 di 17 VERIFICHE E APPROVAZIONI VERSIONE V01 REDAZIONE CONTROLLO APPROVAZIONE AUTORIZZAZIONE EMISSIONE NOME DATA NOME DATA NOME DATA PRATESI STATO DELLE VARIAZIONI VERSIONE PARAGRAFO O DESCRIZIONE

Dettagli

Traccia di soluzione dell esercizio del 25/1/2005

Traccia di soluzione dell esercizio del 25/1/2005 Traccia di soluzione dell esercizio del 25/1/2005 1 Casi d uso I casi d uso sono in Figura 1. Ci sono solo due attori: il Capo officina e il generico Meccanico. Figura 1: Diagramma dei casi d uso. 2 Modello

Dettagli

I file di dati. Unità didattica D1 1

I file di dati. Unità didattica D1 1 I file di dati Unità didattica D1 1 1) I file sequenziali Utili per la memorizzazione di informazioni testuali Si tratta di strutture organizzate per righe e non per record Non sono adatte per grandi quantità

Dettagli

Software per Helpdesk

Software per Helpdesk Software per Helpdesk Padova - maggio 2010 Antonio Dalvit - www.antoniodalvit.com Cosa è un helpdesk? Un help desk è un servizio che fornisce informazioni e assistenza ad utenti che hanno problemi nella

Dettagli