Title: Un framework per il pattern MVC
1Un framework per il pattern MVC
Simone Pulcini
2Oggi parleremo di
- Framework
- Design Pattern e MVC
- Contoller in Struts e Servlet
- Model in Struts e Form Bean
- View in Struts e Java Server Pages (JSP)
3Framework definizione
- Insieme di librerie di codice
- Implementano funzionalità per sviluppare una
propria applicazione software - Favorisce riusabilità del codice e permette di
concentrarsi sullo sviluppo di funzionalità
proprie. - Sviluppo come integrazione
- Funzionalità del framework documentate attraverso
le API. - Sovrainsieme delle librerie run-time proprie del
linguaggio. - Offre funzionalità specifiche
4Design Pattern
- Soluzione riutilizzabile ad un problema comune
nello sviluppo di software - Soluzione proposta non è implementazione diretta.
- Descritta attraverso un template, per astrarre
dal linguaggio di sviluppo e dal caso specifico
5Design Pattern MVC
- Separa logica operativa da interfaccia utente.
- Interfaccia utente detta VIEW
- Sorgenti di dati identificate dal MODEL
- Interazione gestita dal CONTROLLER notifica il
MODEL di richieste di cambiamenti risultanti
dalle interazioni. - MODEL notifica VIEW dei cambiamenti nei dati
6MVC Diagramma
Controller
View
Model
7Problemi MVC su Web
- Connessioni senza stato fra client e server
- Come notificare modifiche nel model?
- Browser deve reinterrogare il server per scoprire
modifiche nello stato dellapplicazione - Differenze nella tecnologia di implementazione
fra client e server
8MVC Model 2
9Struts e MVC
- Struts framework che implementa il pattern MVC
per lo sviluppo di web applications - Struts integra ed estende alcuni componenti di
Java Enterprise Edition - Arricchisce le API Java per la gestione delle
Servlet e offre tag aggiuntivi per le Java Server
Pages (JSP)
10Diagramma di una applicazione Struts
Web Browser
Application Server
View
Model
JSP
ActionForm beans
Controller
Struts-config.xml e Actions
11Ruoli
- Client browser
- Produce eventi di richiesta e attende una
risposta. - Controller
- Riceve la richiesta e decide a chi mandarla.
Riflette il pattern Command ed è implementato
come servlet. Configurato in struts-config.xm - Business logic
- Aggiorna lo stato del modello e aiuta a
controllare il flusso dellapplicazione.
Realizzato mediante una Action class. - Model state
- Rappresenta lo stato dellapplicazione.
Rappresentato da bean ActionForm a livello di
sessione o richiesta, non a livello di
persistenza. Informazione dalla ActionForm letta
mediante tag JSP. - View
- Componente JSP senza logica di flusso o di
business o informazione di modello, solo tag.
12Componenti chiave
- "request" handler fornito dallapplicazione,
associato a uno URI standard. - "response" handler trasferisce il controllo a
unaltra risorsa che completa la risposta. - Biblioteca di tag per creare applicazioni
interattive, basate su form, con pagine lato
server.
13Controller in Struts
- Controller di Struts basato su 4 componenti
- ActionServlet
- Action
- Plugins
- RequestProcessor
- Flusso di web application da richiesta dal
client a risposta offerta da application server
14Servlet definizione
- Componente di web application Java EE
- Programma Java che gira lato server
(differentemente da una applet che gira lato
client) - Classe java che estende funzionalità offerte da
un server (HTTP, FTP, SMTP ecc.) - HttpServlet (da javax.servlet.http)
15Architettura
16Separation of concerns per Web applications
- Per-action logic
- Accesso agli oggetti necessari per eseguire la
logica dellazione e accedere alle risorse - Traduzione, associazione e conversione da valore
stringa in HTML a tipi e primitive e da oggetti
vista a oggetti business - Cross-cutting concerns per fornire funzionalità a
gruppi di azioni o a tutte le azioni
nellapplicazione.
17Ciclo di vita
18Servlet ciclo di vita
- Richiesta da client ad application server
- Application server verifica in web.xml a quale
servlet mappare la richiesta - Classe Servlet indicata nel descrittore viene
caricata, istanziata, e inizializzata dal Servlet
Container - La classe genera la risposta alla richiesta
ricevuta dal client doGet() oppure doPost() - Se non vi sono altre richieste da soddisfare con
tale servlet, Servlet Container chiama il metodo
destroy()
19ActionServlet la servlet di Struts
- Controller si innesta estendendo ActionServlet
- Questa servlet raccoglierà tutte le richieste
conformi ad un certo pattern, opportunamente
dichiarato nel file web.xml - Ma se cè una sola servlet che raccoglie tutte le
richieste, come differenzio le risposte? - ActionServlet prende come parametro un file di
configurazione (struts-config.xml) nel quale lo
sviluppatore può dichiarare i mapping fra una
risorsa richiesta (path), la logica di risposta
(Action) e la pagina JSP che produce il risultato
(View) - Struts genera opportunamente il codice di
risposta dei metodi doGet o doPost in base a
quanto dichiarato nel file di configurazione
struts-config.xml
20Esempio WEB.XML
- E il file di descrittore di ciascuna WEB
APPLICATION. Viene letto dallapplication Server.
NON E UN FILE DI CONFIGURAZIONE DI STRUTS - In esso però scriveremo una dichiarazione ad hoc
per far si che ogni richiesta venga elaborata da
una particolare servlet che estende la
ActionServlet delle API di Struts
21WEB.XML
- ltservletgt ltservlet-namegtactionlt/servlet-namegt
ltservlet-classgtorg.apache.struts.action.Act
ionServletlt/servlet-classgt
ltinit-paramgt ltparam-namegtconfiglt/param-nam
egt ltparam-valuegt/WEB-INF/struts-config.xml
lt/param-valuegt lt/init-paramgt - .
- lt/servletgt
- ltservlet-mappinggt ltservlet-namegtactionlt/servle
t-namegt lturl-patterngt.dolt/url-patterngt - lt/servlet-mappinggt
22Struts-config.xml tag ltactiongt
- Indica mapping fra risorse View, Controller,
Model - Tag ltactiongt
- Allinterno si dichiara in quale classe è
implementata la logica di controllo che deve
gestire la richiesta di una risorsa effettuata
dal client, quale è la view e quale è il model
con il quale si devono rappresentare i dati - Esaminiamo, per concludere il discorso sul
Controller, i tipi di classi Action messi a
disposizione da Struts e vediamo eventualmente
come definire una nostra Action che implementa
una logica non identificabile tra le Action già
implementate in Struts
23Actions in Struts
- Ogni classe di tipo Action deve estendere la
classe org.apache.struts.action.Action - Ogni Action deve ridefinire il metodo execute()
che ha la seguente segnature - public ActionForward execute( ActionMapping ma
pping, ActionForm form, HttpServletRequest
request, HttpServletResponse response)
throws Exception - Non è compito dello sviluppatore istanziare la
classe ACTION!!! - Sarà la ActionServlet, in base a quanto
dichiarato nel file di configurazione
struts-config.xml, ad istanziare la corretta
Action e a chiamare il metodo execute in essa
ridefinito.
24Esempio di Action
- package org.provaimport javax.servlet.http.HttpS
ervletRequestimport javax.servlet.http.HttpServl
etResponseimport org.apache.struts.action.Action
import org.apache.struts.action.ActionFormimpo
rt org.apache.struts.action.ActionForwardimport
org.apache.struts.action.ActionMappingpublic cl
ass TestAction extends Action public ActionFor
ward execute( ActionMapping mapping, Actio
nForm form, HttpServletRequest request, Ht
tpServletResponse response) throws Exception//
Logica di controllo (codice Java) -
- //al termine devo restituire una istanza di
ActionForward per soddisfare - //la segnatura del metodo execute()
- return mapping.findForward("testAction")
25Struts-config.xml tag ltactiongt
- ltaction-mappingsgt
- ltaction path"/TestAction" typeorg.prova.TestA
ction"gt - ltforward name"testAction" path"/pages/Test
Action.jsp"/gt - lt/actiongt
- lt/action-mappingsgt
26Actions Built-in di Struts
- Vi sono alcune Action già implementate che
offrono funzionalità comuni. Possibile usarle
direttamente. - org.apache.struts.actions.DispatchAction
- Riceve valore che può funzionare come
discriminante in un parametro della URL. Invece
di execute, un metodo per ogni valore di tale
parametro. A seconda del valore presente nel
parametro, Struts chiamerà il metodo
corrispondente - org.apache.struts.actions.ForwardAction
- Chiama pagina jsp. Non richiede nessuna
implementazione di codice ma solo dichiarazione
opportuna in tag ltactiongt
27Esempio di Dispatch Action
- package org.provaimport java.io.import javax.
servlet.http.HttpServletRequestimport javax.serv
let.http.HttpServletResponseimport javax.servlet
.ServletExceptionimport org.apache.struts.action
s.DispatchActionimport org.apache.struts.action.
ActionFormimport org.apache.struts.action.Action
Forwardimport org.apache.struts.action.ActionMap
ping - public class Dispatch_Action extends DispatchActio
n public ActionForward add( ActionMapping
mapping, ActionForm form, HttpServletRequest reque
st HttpServletResponse response) throws Exception
System.out.println("You are in add function
.") return mapping.findForward("add")
28Dispatch action (contd.)
- public ActionForward edit( ActionMapping mappi
ng, ActionForm form, HttpServletRequest reques
t, HttpServletResponse response) - throws Exception
- System.out.println("You are in edit function."
) return mapping.findForward("edit")
-
-
29Dispatch Action struts-config.xml
- ltaction
- path"/DispatchAction"typeorg.prova.Dispatch_A
ction"parameterdiscrimina"input"/pages/Dispat
chAction.jsp"name"DispatchActionForm"gt - ltforward name"add" path"/pages/DispatchActionAd
d.jsp" /gtltforward name"edit" path"/pages/Dispat
chActionEdit.jsp" /gtltforward name"search
path"/pages/DispatchActionSearch.jsp"/gt - lt/actiongt
30ForwardAction struts-config.xml
- Forward Action richiede sola configurazione non
è necessario scrivere codice Java - ltactionpath"/success"type"org.apache.struts.ac
tions.ForwardAction"parameter"/pages/Success.jsp
"input"/pages/ForwardAction.jspgt - lt/actiongt
31Model in Struts
- Struts non dettaglia scelte specifiche sulle
componenti che riguardano il Modello. - Fondamentalmente il Modello deve occuparsi del
reperimento di dati e informazioni ignorando
comunque come esse verranno presentate nella View - Per il modello vi sono molte API che permettono
ad esempio linterfacciamento con un database
(JDBC, Hibernate)
32ActionForm il punto di raccordo tra Model e View
- Struts prevede struttura di supporto per
raccordare i dati ottenuti dal modello e renderli
più facilmente manipolabili da una View. - ActionForm Java Bean estende org.apache.struts.ac
tion.ActionForm, le cui variabili membro
contengono i valori di un form html dichiarato
nella view (oltre eventuali parametri passati
nella URL e tag di tipo hidden) - ActionForm popolato automaticamente da Struts
- Ogni pagina jsp dovrebbe contenere la
dichiarazione di un form html. Attraverso
opportuni tag dichiaritivi contenuti nella pagina
JSP, Struts sarà in grado di popolare il bean
associato a tale form
33ActionForm esempio
- package org.prova
- import org.apache.struts.action.ActionForm
- public class DispatchActionForm extends ActionForm
- private String discriminante " "
- public String getDiscriminante( )
- return discriminante
-
- public void setDiscriminante(String discriminante)
- this.discriminante discriminante
-
34Action Form struts-config.xml
- ltform-bean name"DispatchActionForm"
typeorg.prova.DispatchActionForm"/gt
35View in Struts
- Struts estende Java Server Pages (JSP)
aggiungendo ulteriori tag a quelli già presenti - Prima di vedere alcuni esempi però è necessario
richiamare alcuni concetti di base riguardanti le
pagine JSP
36JSP definizione e ciclo di vita
- Java Server Pages è una tecnologia per la
realizzazione di pagine web con contenuti
dinamici - Una pagina JSP può contenere
- Tag HTML
- Tag XML definiti in apposite librerie esterne
(Tag Libraries) - Codice Java inserito in apposite sezioni
denominate Scriptlet - Una pagina JSP viene caricata dallapplication
Server e tradotta in nelloutput finale, HTML,
subendo però un processo di generazione
intermedio. Il container che si occupa di
tradurre le JSP genera infatti una Servlet (JSP
Page Implementation Class) - Il codice Java della Servlet si occupa di creare
dinamicamente sullo stream di Output il sorgente
HTML che viene offerto quale risposta alla
richiesta effettuata dal client
37JSP Tag Libraries 1/2
- Le specifiche JSP prevedono tag di base
identificabili dal prefisso jsp - In generale un tag ha un prefisso relativo alla
tag library di appartenenza seguito dal nome
della funzionalità che si intende utilizzare - ltnome_prefissonome_funzionegtlt/nome_prefissonome
_funzionegt
38JSP Tag Libraries 2/2
- Tag library è composta da un jar e da un file
.tld che descrive il contenuto del jar. Ha una
sintassi specifica. - Il jar e il tld permettono allopportuno
componente dellapplication server di tradurre i
tag in frammenti di codice java. Lapplication
server sa dellesistenza di nuove tag libraries
perché file web.xml avrà ricevuto le opportune
modifiche per le nuove dichiarazioni di tag
libraries aggiuntive - Processo di traduzione da JSP in Servlet e
produzione del codice HTML di output interamente
server-side
39JSP scriptlet
- Codice Java incluso direttamente, racchiuso tra
opportuni marcatori se necessario si possono
anche scrivere tag html. - Problema manutenzione di JSP contenente
scriptlet, HTML e tag appartenenti a librerie - Esistono oggi molte tag libraries, comprese
quelle aggiunte da Struts e le note JSTL, che
permettono tramite tag di rendere una pagina JSP
facilmente scriptless ?
40Tag Libraries di Struts
- Bean contiene tag per la manipolazione e
laccesso di Java Bean - Html contiene tag per creare form HTML gestibili
attraverso Struts e ulteriori tag per generare
altri elementi html (ovvero permettono di non
usare direttamente tag HTML dentro la pagina JSP) - Logic contiene tag per riprodurre logica
decisionale, cicli iterativi e valutazioni di
valori
41Esempio finale
- Faremo vedere i componenti di una mini web
application struts che visualizza una pagina con
un form nel quale è possibile inserire un numero - Se questo numero è uguale ad 1 verrà visualizzato
una pagina con un messaggio di successo. - In ogni altro caso verrà visualizzata una pagina
di insuccesso.
42Form bean
- Ci serve un bean in cui memorizzare il numero che
verrà inserito nel form visualizzato dallutente. - package org.provaimport org.apache.struts.acti
on.import javax.servlet.http.HttpServletReques
timport javax.servlet.http.HttpServletResponse
public class LogicForm extends ActionForm
private long number public long
getNumber() return number pu
blic void setNumber(long number) this.numbe
rnumber -
43Pensiamo ora alla Action
- Non ha bisogno di logica operativa particolare
dovrà soltanto restituire il mapping alla pagina
successiva (ovvero la pagina dove esaminerò il
valore introdotto dallutente e stamperò un msg
di successo/insuccesso)
44Action
- package org.provaimport java.io.import java.
util.import javax.servlet.http.HttpServletReque
stimport javax.servlet.http.HttpServletResponse
import javax.servlet.ServletExceptionimport org
.apache.struts.action.public class LogicAction
extends Action public ActionForward execute(
ActionMapping mapping, ActionForm form, Ht
tpServletRequest request, HttpServletResponse
response) throws IOException, ServletException
//Il mapping identificato dalla stringa
success si trova in struts-config.xml
return mapping.findForward("success")
45Configuriamo lo struts-config.xml per il bean e
per la action
- ltform-bean name"LogicForm" typeorg.prova.Logic
Form" /gt - ltaction path"/LogicAction"typeorg.prova.LogicA
ction"name"LogicForm"input"/pages/InputLogic.j
sp"gt ltforward name"success" path"/pages/o
utput.jsp"/gt - lt/actiongt
46InputLogic.jsp
- lt_at_ taglib uri"/tags/struts-html" prefix"html"
gtlt_at_ taglib uri"/tags/struts-logic"
prefix"logic" gtlthtmlhtmlgtltheadgtlttitlegtEsemp
io tag Logiclt/titlegtlt/headgtltbodygtlthtmlform
action"/LogicAction" method "post"gtlth2gtEnter
a numberlt/h2gtlthtmltext property"number"/gtltbr
gt
47InputLogic.jsp (contd.)
- ltbrgtlth3gtNella pagina di output logicequal
funzionerà se il valore inserito sarà
1lt/h3gtlth3gtaltrimenti verrà eseguito
logicnotEquallt/h3gtltbrgtlthtmlsubmit
value"Submit"/gtlthtmlcancel/gtlt/htmlformgtlt/b
odygtlt/htmlhtmlgt
48Output.jsp
- lt_at_ taglib uri"/tags/struts-bean" prefix"bean"
gtlt_at_ taglib uri"/tags/struts-logic"
prefix"logic" gtlthtmlgtltheadgtlttitlegtVerifichia
mo il dato...lt/titlegtlt/headgtltbodygtlth3gtIl
momento della verifica!!!!!lt/h3gtlth4gtIl numero
inserito èlt/h4gt
49Output.jsp
- ltbeanwrite name"LogicForm" property"number"/gtlt
/h4gtltlogicequal name"LogicForm"
property"number" value"1"gtlth4gtHai immesso il
numero 1 e sono entrato nel tag
equallt/h4gt lt/logicequalgtltlogicnotEqual
name"LogicForm" property"number"
value"1"gtlth4gtHai immesso un numero diverso da 1
e sono entrato nel tag notEquallt/h4gt lt/logicnotE
qualgtlt/bodygtlt/htmlgt
50Fonti
- Chuck Cavaness, Programming Jakarta Struts, 2nd
Edition, OReilly, 2004 - http//struts.apache.org/
- http//www.infoq.com/minibooks/starting-struts2
- http//www.roseindia.net/struts/