throws Exception;
void handleActionRequest(ActionRequest request, ActionResponse response)
throws Exception;
}
Allo stesso modo dell'MVC standard, viene fornita un'implementazione di base chiamata AbstractController che può essere estesa direttamente, anche se è più opportuno utilizzare una delle sottoclassi fornite da Spring che permettono di affrontare i casi più comuni. I controllers di tipo Command, per esempio, sono analoghi a quelli standard e hanno dei meccanismi per gestire il "binding" automatico dei dati della request nei data objects definiti dallo sviluppatore, e anche di gestire le classiche interazioni dei forms, compresa la validazione dei dati.
Gli Handler Mappings
I componenti Handler Mappings permettono di associare un componente "handler" a una particolare richiesta portlet. Un handler può essere un normale controller ma anche un qualsiasi componente, come nel caso di un'eventuale integrazione di frameworks esterni. Un Handler Mapping fornisce una cosiddetta HandlerExecutionChain che contiene l'handler associato alla richiesta corrente ed eventuali interceptors che si inseriscono nel ciclo di vita dello stesso handler. Due esempi di Handler Mapping sono il PortletModeHandlerMapping la cui configurazione è mostrata di seguito:
<bean id="portletModeHandlerMapping"
class="org.springframework.web.portlet.handler.PortletModeHandlerMapping">
<property name="portletModeMap">
<map>
<entry key="view" value-ref="viewHandler"/>
<entry key="edit" value-ref="editHandler"/>
<entry key="help" value-ref="helpHandler"/>
</map>
</property>
</bean>
e il ParameterHandlerMapping:
<bean id="parameterHandlerMapping"
class="org.springframework.web.portlet.handler.ParameterHandlerMapping">
<property name="parameterMap">
<map>
<entry key="add" value-ref="addHandler"/>
<entry key="edit" value-ref="editHandler"/>
<entry key="delete" value-ref="deleteHandler"/>
</map>
</property>
</bean>
Il PortletModeHandlerMapping associa un handler specifico alla modalità corrente della portlet (VIEW, EDIT, HELP). Il ParameterHandlerMapping invece permette di associare gli handlers in base a un parametro della request che per default si chiama "action".
Lo strato View
La fase di "renderizzazione" del risultato dell'elaborazione di un controller necessita di un componente di integrazione che permetta di riutilizzare le funzionalità dell'MVC servlet. Tale componente di integrazione è rappresentato dalla servlet ViewRendererServlet. La ViewRendererServlet si occupa di trasformare la PortlerRequest e la PortletResponse nelle HttpServletRequest e HttpServletResponse e di chiamare il metodo render della view. Occorre configurare la ViewRendererServlet come ogni altra servlet nel file web.xml dell'applicazione:
<servlet> <servlet-name>ViewRendererServlet</servlet-name> <servlet-class>org.springframework.web.servlet.ViewRendererServlet</servlet-class> </servlet> … <servlet-mapping> <servlet-name>ViewRendererServlet</servlet-name> <url-pattern>/WEB-INF/servlet/view</url-pattern> </servlet-mapping>
La DispatcherPortlet setta il WebApplicationContext come attributo della request con la stessa chiave WEBAPPLICATIONCONTEXT_ATTRIBUTE che usa la DispatcherServlet. Setta come attributi della request anche gli oggetti Model and View per renderli disponibili alla ViewRendererServlet. Infine recupera dalla request il PortletRequestDispatcher per eseguire un'include usando l'indirizzo "/WEB-INF/servlet/view" che è stato precedentemente mappato sulla ViewRendererServlet. Quest'ultima è in grado di richiamare a questo punto il metodo render sull'oggetto View con gli argomenti appropriati. Il ciclo di vita della request dopo l'include è dunque identico a quello Dell'MVC standard, con tutte le sue regole.
Conclusioni
Lo sviluppo di portali è un'attivita molto comune. L'introduzione di uno standard nel mondo delle portlet, definito dalle specifiche JSR-168, ha posto le basi per lo sviluppo di servizi in teoria integrabili senza grandi sforzi nei portali compatibili esistenti. Spring amplia il suo concetto di MVC per comprendere questa possibilità e offrire allo sviluppatore una piattaforma flessibile per gestire le problematiche relative. Può essere interessante verificare sul campo la possibilità di sviluppare su questa piattaforma applicazioni complesse e fortemente orientate ai dati.
Riferimenti
- [1] "Spring Reference" 2.0
http://www.springframework.org/
- [2] Craig Walls - Ryan Breidenbach, "Spring in Action", Manning 2005
