Ciao a tutti,
stò seguendo questo tutorial per capire la logica basilare dell'MVC di Spring: http://netbeans.org/kb/docs/web/quic...ps-spring.html
Mi riferisco solo ed eslcusivamente all'esempio più basilare (la sola creazione dello scheletro con NetBeans che praticamente apre semplicemente la pagina di default di Spring MVC)
Praticamente che succede? Io l'ho capita così (ma ho qualche dubbio in merito):
Creo il progetto e tra le varie cose che ho ci stanno 4 file importanti che sono:
1) dispatcher-servlet.xml (che a grandi linee contiene la configurazione per l'esecuzione dell'applicazione)
2) applicationContext.xml
3) redirect.jsp (che redirige semplicemente verso index.jsp)
4) index.jsp
Per capire come funziona per prima cosa esamino il DESCRITTORE DEL PROGETTO: ovvero il file web.xml (dentro WEB-INF) e tra le varie cose c'è questo pezzo di codice che specifica l'entry point di default dell'applicazione:
codice:
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
Cos'è di preciso l'entry point dell'applicazione? Ad occhio e da quello che sò di Java in genere è la prima cosa che deve essere eseguita (ovvero la pagina redirect.jsp) un po' come in Java SE il metodo main() è l'entry point...ho capito bene?
Quindi se ho ben capito questa configurazione dice che l'entry point e è il file redirect.jsp che semplicemente redireziona verso la pagina index.html (FILE CHE DI FATTO NON È PRESENTE NEL SISTEMA...LA RICHIESTA DOVRÀ ESSERE GESTITA IN MANIERA IDONEA)
poichè contiene questo codice:
codice:
<% response.sendRedirect("index.htm"); %>
E' da notare che la pagina redirect.jsp redirige verso una pagina index.html che non esiste ed in seguito il sistema dovrà trattare in qualche modo specifico tale richiesta (almeno credo...ditemi se ho capito male)
Poi andando avanti nell'analisi dello scheletro del progetto base creato da NetBeans:
Spring usa una classe chiamata DispatcherServlet che da quello che ho capito che inoltra tutte le richieste HTTP ai corretti gestori\controllori (che sono implementati con servlet o pagine JSP, giusto?)
Sempre dentro al file web.xml ho questo pezzo di codice:
codice:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
Ecco quì ho dei dubbi abbastanza seri sul significato di questa roba...praticamente dice che mappa tutti i file con estensione *.html del DispatcherServlet...da quello che ho capito in pratica nella prima parte (tra i tag <servlet> e </servlet> lui si carica la classe DispatcherServlet e nei tag <servlet-mapping> e </servlet-mapping> gli dice che deve "gestire" col DispatcherServlet tutti i file con estensione *.htm
In pratica da quello che ho capito gli si stà dicendo: Se trovi un fil con estensione *.htm sarà il Dispatcher-Servlet a gestirlo in qualche modo inoltrando la richiesta di gestione HTTP ad uno specifico controllore che farà qualcosa di specifico per i file *.htm
Ho capito bene o stò facendo casini?
Se avessi capito bene il discorso continuerebbe così:
La configurazione del DispatcherServlet (come si deve comportare questa classe che gestisce le richieste HTTP) è contenuta nel file dispatcher-servlet.xml
Tale file definisce 3 beans (un bean dovrebbe essere una generica classe in Spring che fà qualcosa)
Questi 3 bean sono:
1) indexController
2) viewResolver
3) urlMapping
e vengono definiti tramite questo codice:
codice:
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/index.htm">indexController</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<bean name="indexController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController"
p:viewName="index" />
Quindi...quando il DispatcherServlet riceve una richiesta HTTP di accesso ad un file con estensione *.htm (come appunto il nostro index.htm) la deve gestire mediante la configurazione presente nel file dispatcher-servlet.xml
Per prima cosa guarda nella definizione del bean urlMapping se c'è un controllore che può risolvere tale richiesta e trova questa roba che mappa proprio la richiesta HTTP per il file "index.htm" con il bean indexController...quindi che fà in pratica? la dispaccia al bean indexController o cosa?
Se avessi capito bene a questo punto la richiesta HTTP viene dispacciata a runtime al bean indexController.
indexController è un'estensione della classe ParameterizableViewController fornita da Spring che è una classe che riceve una richiesta e di fatto invoca un metodo che ritorna una view (che credo sia la roba da visualizzare)
In particolare il pezzo di codice:
codice:
p:viewName="index"
restituisce la view chiamata name che è risolta usando la classe viewResolver in /WEB-INF/jsp/index.jsp perchè di fatto la classe viewResolver cerca in /WEB-INF/jsp il nome logico "index" appendendogli l'estensione jsp
Quindi il workflow dell'esecuzione di questo scheletro dovrebbe essere il seguente:
Un utente accede alla mia applicazioncina web (lo scheletro appena descritto), in web.xml è specificato che l'entry point di tale applicazione è la pagina redirect.jsp che redirige verso la pagina index.htm, ciò genera una richiesta HTTP.
Tale richiesta HTTP è gesitata dalla classe DispatcherServlet secondo la configurazione presente nel file dispatcher-servlet.xml. In tale file troviamo proprio la mappatura di come deve essere gestita la richiesta di accesso ad un file chiamato"index.html", cioè usando il bean chiamato indexController che riceve la richiesta HTTP e ritona una view il cui nome logico è "index". A questo punto si usa il bean viewResolver che risolve il nome della view aggiungendo .jsp al nome logico e chiamandola dalla cartella /WEB-INF/jsp/
Quindi infine viene invocata la pagina /WEB-INF/jsp/index.jsp che stampa l'Hello World
mmm...spero di essere stato abbastanza chiaro e spero che qualcuno riesca a darmi delle conferme e a chiarire i miei dubbi
Grazie
Andrea