Framework di Middleware per Architetture Enterprise Corso di Ingegneria del Software A.A.2011-2012
Un po di storia 1998: Sun Microsystem comprende l importanza del World Wide Web come possibile interfaccia di applicazioni distribuite L idea era quella di realizzare applicazioni che girassero server-side accessibili tramite un client diffuso che richiedesse requisiti locali moderati (web-browser) 2
Java EE (Java Platform Enterprise Edition) Piattaforma per sviluppo di applicazioni Java lato server. Aggiunge a Java SE librerie orientate a soddisfare requisiti per la realizzazione di artefatti software: Fault tolerant Distributed Multi-tier Le componenti software che implementano tali caratteristiche, unitamente all artefatto che si intende sviluppare, girano su un Application Server che ne fornisce un implementazione coerente con le specifiche Java EE 3
API Java EE I package della versione 5: javax.faces.* javax.faces.component.* javax.servlet.* java.enterprise.inject.* javax.enterprise.context.* javax.ejb.* javax.validation javax.persistence javax.transaction javax.jms.* javax.resources.* javax.sql.* 4
API Java EE I package della versione 5: javax.faces.* javax.faces.component.* javax.servlet.* java.enterprise.inject.* javax.enterprise.context.* javax.ejb.* javax.validation javax.persistence javax.transaction javax.jms.* javax.resources.* javax.sql.* 5
Architetture a n-tier Nelle architetture JavaEE ogni applicazione è partizionata in livelli o tiers o layers Presentation layer (come l'applicazione si presenta) Business logic layer (come l'applicazione lavora implementando una logica che astrae un problema del mondo reale) Data access layer (i dati su cui l'applicazione lavora) Non vi ricorda un design pattern????? 6
Due pattern a confronto 3-tier pattern MVC Pattern 7
Servlet: definizione È una classe Java la cui peculiarità è quella di risiedere lato server. Ha lo scopo di estendere le funzionalità offerta da un server sul quale gira un'applicazione il cui accesso si basa su un modello di programmazione requestresponse Nel caso più comune una servlet estende applicazioni ospitate su un server web Una sorta di applet server side 8
Java Servlet API Definiscono un protocollo in grado di rispondere a una request Questo protocollo non è legato necessariamente al protocollo client-server HTTP anche se HTTP rappresenta la scelta più frequente nelle servlet destinate al mondo web Ma dove risiede fisicamente una servlet? Chi è in grado di farla girare? 9
...un servlet-container! 10
Servlet: statechart 11
Servlet: ciclo di vita Fase di inizializzazione (One-time-call): viene eseguito il metodo init(). Il servlet-container rende disponibile un istanza di ServletConfig che contiene eventuali parametri di inizializzazione globali dichiarati nel descrittore web.xml. Fase di servizio (Business logic): la servlet è in grado di rispondere alle richieste del client. Viene invocato il metodo service() che effettuerà il dispatch della richiesta in base alla tipologia della stessa (es: si tratta di una richiesta GET da HTTP: service invocherà il metodo doget()) Fase di destroy (One-time-call): viene invocato il metodo destroy() dove è possibile prendersi cura di aspetti di chiusura: deallocazione risorse, chiusura connessioni verso l engine che implementa il modello dei dati ecc. 12
HttpServlet: Sequence Diagram loop 13
Http Servlet: flusso request-response 14
Servlet: gerarchia API 15
Riassumendo (server-side): Nel caso specifico di Servlet che gestiscono il flusso client servlet di transazioni con il protoccolo HTTP, la logica di business che implemento nella servlet deve: inputneeded = analizzacontenuto(request); if(inputneeded) (input=getinput()); output = produce(input); write(output); 16
Riassumendo (client-side): Il client ovvero il browser web deve: input = get(response); dom = parse(input); render(dom); if (dom.script) execute (dom.script); show(dom); //mostra a video la pagina... resta in attesa di interazioni da parte dell'utente per generare una nuova richiesta 17
Java Server Pages: JSP Le servlet vincolano la scrittura dell output HTML all interno del codice Java, direttamente sulla response, prima che venga affidata al protocollo. Le JSP permettono l approccio opposto: sono pagine HTML in cui posso scrivere codice java tramite scriptlet o attraverso speciali tag. In un file.jsp tutto ciò che non è un tag speciale o una scriptlet verrà copiato senza alterazioni nella response. E il resto da chi viene interpretato? 18
JSP: traduzione if (!page.hasclassfile()) or (page.ismodified()){ javasource = container.translate(page); classfile = jdk.compile(javasource); } jre.execute(classfile); 19
JSP: traduzione La prima volta che una pagina JSP viene invocata o non appena viene modificata a seguito di tale invocazione, subisce un processo di traduzione in una servlet. Il servlet container attiva un traduttore interno che produce un sorgente java che implementa una servlet Viene invocato il compilatore java che compila il sorgente e genera un file.class Il file class è passato alla VM per l esecuzione della servlet generata Una seconda invocazione della pagina salta la fase di traduzione e di compilazione e prevede la sola esecuzione da parte della VM. E necessario però che la pagina non abbia subito alcuna modifica (scenario tipico in fase di produzione ma non in fase di sviluppo) 20
JSP e Pattern MVC 2 Lo scenario in cui l'output html è prodotto dal codice della servlet scrivendo sulla response viene identificato come pattern model 1 (viewlogic e business-logic miscelate assieme). Nel pattern Model 2, il client effettua una richiesta al controller. Quest'ultimo, attraverso la logica che lo implementa, produce un visualobject, comunemente un POJO che viene posto in request e che viene così reso disponibile alla view (una jsp nel nostro caso) scelta dal dispatcher 21
MVC 2 diagram 22
Modello dei dati Nel data tier vengono memorizzati i dati su cui opera la logica di business Lo scenario tipico di una servlet web prevede che il modello dei dati venga realizzato utilizzando il motore di un database relazionale Java SE e Java EE mettono a disposizione un set di API per colloquiare con un database Il compito di ciascun produttore è quello di creare un connettore conforme allo standard JDBC Java DataBase Connectivity Tale connettore separa le API di comunicazione dall'implementazione specifica del produttore dell'engine del DB 23
Pattern DAO 24
Pattern DAO: DTO Un Data Transfer Object è solitamente un POJO, un Java Bean le cui proprietà rappresentano un mapping con una tabella di DB Esistono diverse strategie di mapping tra POJO e tabelle-relazioni di un db Nel nostro esempio ci limitiamo ad una strategia di mapping 1:1 Vediamo ora una sequenza di chiamate dalla business logic al modello 25
DAO: Sequence Diagram 26
Due middleware migliorativi Per piccole applicazioni le servlet sono un buono strumento di sviluppo Se il modello dei dati è composto da poche tabelle JDBC può rappresentare un buon approccio Scenari reali però richiedono strumenti maggiormente potenti e flessibili 27
Apache Struts Framework che estende le servlet basato solamente su MVC 2 Aggiunge strumenti per la manipolazione della view quali: Tag-libraries per la view Controlli sintattici per le form web Business logic implementabile in una gerarchia di classi chiamate Action Action sono implementabili sia lato Java che lato configurazione (xml) o miste 28
Hibernate E' un middleware che fornisce un servizio di ORM (Object-Relational Mapping) Un database relazione è gestito tramite una gerarchia di oggetti Java e relativi DAO secondo diverse strategie di mapping Stabilito il mapping e creata la gerarchia di oggetti Java, non scrivo più query verso il db Il mio codice lavora sulla gerarchia di oggetti che rappresenta il db (layer persistente sincronizzato rispetto ai dati presenti sul db) 29
Riferimenti Beginning Java EE 5 Apress di K. Mukhar e C. Zelenak Core J2EE Patterns : http://java.sun.com/blueprints/corej2eepatterns/patterns/ DataAccessObject.html Struts: http://struts.apache.org/ Hibernate: http://www.hibernate.org/