SlideShare a Scribd company logo
1 of 54
Portlet JSR168/286
2
Agenda
1. JSR168
2. JSR286
3. Spring MVC Portlet
4. Esempio pratico
3
Portale
• facilmente inseribili nella pagina
• unità indipendenti
• configurabili
• riusabili anche in altri contesti e portali
Applicazioni
Porta di accesso unica a un insieme di
applicazioni, dati e servizi.
Portale
Soluzioni proprietarie
4
Portlet - evoluzione
Standard : JSR168
5
JSR 168 (Java Portlet Specification 1.0)
La specifica JSR 168 è stata rilasciata nel 2003
• al gruppo di lavoro hanno partecipato Apache,
BEA, Broadvision, IBM, Oracle, SAP, SUN, Sybase, TIBCO
•il ruolo e le funzionalità del Portlet Container
• il contratto tra il Container e i Portlet
• la gestione del ciclo di vita dei Portlet
• il packaging per la distribuzione dei Portlet
• l'interazione con Web Services for Remote Portlets
(WSRP) di OASIS
Definisce
6
Portlet – Portlet container
Portlet
Componenti web Java, gestiti da un portlet
container, che processano le richieste ricevute e
generano contenuti dinamici.
Portlet container
•contiene i portlet e gestisce il loro ciclo di vita.
•si occupa di immagazzinare le preference e le
configurazioni di ogni portlet
• riceve le request dal portale e le indirizza alle
portlet che gestisce
7
Ciclo di vita di un portlet
Il ciclo di vita è gestito dai 4 metodi esposti dall’interfaccia portlet:
• init: il metodo viene chiamato dal container quando il portlet viene
instanziato
•destroy: viene chiamato dal container quando il portlet viene
distrutto
•processAction: viene chiamato dopo che l’utente ha effettuato una
richiesta; serve a processare i dati avuti in input
•render: va in esecuzione ogni volta che il portlet si visualizza nella
pagina web
8
javax.portlet.Portlet
9
Caricamento pagina
10
Process di una action
11
ActionRequest – RenderRequest
• Derivano dall’oggetto PortletRequest
• Sono sottoinsiemi dell’HttpRequest
• è compito del portlet container dividere i parametri tra i vari
portlet della pagina
• I parametri in actionRequest sono in generale diversi da quelli in
renderRequest
• a meno che il portlet non li inserisca in actionResponse
Esempio
String value=request.getParameter(“test”);
response.setRenderParameter(“test”, value);
Il parametro test è preso dalla actionRequest e passato in actionResponse
12
PortletSession
Ogni portlet ha il proprio PortletSession
• i parametri inseriti nel PortletSession con lo scope APPLICATION
sono visibili anche in HttpSession
Esempio
PortletSession session = request.getSession(true);
session.setAttribute(“home.url”,url,PortletSession.APPLICATION_SCOPE);
session.setAttribute(“bkg.color”,”RED”,PortletSession.PORTLET_SCOPE);
Attributo visibile con stesso nome
anche in HttpSession
Attributo visibile
solo al portlet
13
Modalità di un portlet
La specifica definisce 3 modalità standard:
•VIEW: la modalità standard che ogni portlet deve implementare
•EDIT: consente di modificare le impostazioni dell’utente
•HELP: tale modalità presenta informazioni di help relative alla
portlet
I vari vendor possono comunque aggiungere modalità differenti.
14
Portlet taglib
URI: http://java.sun.com/portlet
Permettono alle JSP incluse nel portlet
• di avere accesso ad elementi specifici del portlet (render,
request, id del portlet)
• di creare i link per l’interazione con il portlet
L’implementazione delle taglib è responsabilità del portlet
container
15
<portlet:namespace/>
Utile per l’assegnazione di id univoci agli elementi della
pagina web, soprattutto se sono presenti più istanze dello
stesso portlet nella stessa pagina
Esempio
var <portlet:namespace/>_resTab=new ResultsTable(..);
<portlet:namespace/>_populateTable(output);
</script>
<table id="<portlet:namespace/>_results">
<th><td>Nome</td><td>Cognome</td></th>
</table>
Ritorna l’identificativo univoco del portlet
all’interno della pagina web
Definizione
16
<portlet:defineObjects/>
Esempio
<portlet:defineObjects/>
<%=renderResponse.setTitle("my portlet title")%>
definisce le seguenti variabili all’interno della JSP:
• renderRequest
• renderResponse
• portletConfig
Definizione
17
<portlet:actionURL/>
Esempio
<portlet:actionURL var="searchAction">
<portlet:param name="action" value="search" />
</portlet:actionURL>
<form action="${searchAction}" method="POST">
crea un URL che punta al portlet corrente ed invia
un action request con i parametri specificati
Definizione
portletMode: la modalità del portlet
var: il nome della variabile nella JSP
Parametri
18
<portlet:renderURL/>
Esempio
<portlet:renderURL var=“helpUrl“ portletMode=“HELP”>
</portlet:renderURL>
<a href=“${helpUrl}”>Help</a>
crea un URL che punta al portlet corrente ed invia
un render request con i parametri specificati
Definizione
portletMode: la modalità del portlet
var: il nome della variabile nella JSP
Parametri
19
Portlet library
I portlet possono essere inserite in un opportuno file war
• il file deve contenere le classi e tutte le resources relative ad
essi
•nel folder WEB-INF deve essere presente il file portlet.xml
20
portlet.xml
<portlet>
<description xml:lang="it">Portlet di test A</description>
<portlet-name>TestAPortlet</portlet-name>
<display-name xml:lang="it">Portlet di test A</display-name>
<portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class>
<init-param>
<name>contextConfigLocation</name>
<value>/WEB-INF/context/TestPortletA-context.xml</value>
</init-param>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>view</portlet-mode>
<portlet-mode>help</portlet-mode>
</supports>
<supported-locale>en</supported-locale>
…
</portlet>
21
Limiti di JSR168
La specifica presenta alcune limitazioni:
• manca un meccanismo standard per fare interagire tra loro i
portlet (Inter Portlet Communication)
• non è possibile ottenere una risorsa direttamente da un portlet
• bisogna passare dal portlet containet
• integrazione con AJAX non supportata internamente
• a meno che non sia offerta dal portlet container in modo
non standard
22
Integrazione con AJAX
Web container
Portlet container
Servlet container
PortletSession
HttpSession
JSP
JSP
caricamento iniziale
aggiornamento AJAX
render
AJAX request
Le due session condividono i parametri con scope
APPLICATION_SCOPE
JavaScript
Portlet
Servlet
23
Agenda
1. JSR168
2. JSR286
3. Spring MVC Portlet
4. Esempio pratico
24
JSR286 (Java Portlet Specification 2.0)
La specifica JSR 286 è stata rilasciata nel 2008
• a febbraio 2006 fu costituito il JSR 286 Expert Group al fine di
arrivare alla Java Portlet Specification 2.0
Novità introdotte
• Eventi: ogni portlet può lanciare e ricevere determinati
eventi
•Public render parameter: possibilità per i portlet di
condividere parametri tra loro
•Possibilità per un portlet di restituire una risorsa.
25
GenericPortlet
26
Eventi- dichiarazione dell’evento
portlet.xml
<event-definition>
<qname xmlns:x="http://com.alex/test/portlets/ns">x:event</qname>
<value-type>java.lang.String</value-type>
</event-definition>
Il parametro value-type indica la classe dell’evento
27
Eventi - lancio dell’evento
portlet.xml
<portlet>
<description xml:lang="it">Portlet di test A</description>
<supported-publishing-event>
<qname
xmlns:x="http://com.alex/test/portlets/ns">x:event</qname>
</supported-publishing-event>
codice
String event="Test Event";
QName name=new QName("http://com.alex/test/portlets/ns", "event");
response.setEvent(name, event); //ActionResponse
28
Eventi - process dell’evento
portlet.xml
<portlet>
<description xml:lang="it">Portlet di test B</description>
<supported-processing-event>
<qname
xmlns:x="http://com.alex/test/portlets/ns">x:event</qname>
</supported-processing-event>
codice
public void processEvent(EventRequest request, EventResponse
response){
Event event=request.getEvent();
String qname= event.getQName();
}
29
Eventi - flusso
30
Parametri pubblici - dichiarazione
portlet.xml
<public-render-parameter>
<identifier>foo</identifier>
<qname xmlns:x=“http://com.alex/test/portlets/ns”>x:foo2</qname>
</public-render-parameter>
I parametri pubblici vengono dichiarati in portlet.xml
in una opportuna sezione
• vengono distinti tra loro utilizzando opportuni
identifier
31
Parametri pubblici - utilizzo
portlet.xml
<portlet>
<portlet-name>portletA</portlet-name>
…
<supported-public-render-parameter>foo</supported-public-render-
parameter>
</portlet>
I portlet dichiarano in portlet.xml i parametri pubblici che
utilizzeranno
• i parametri sono identificati con il loro identifier
32
Parametri pubblici – flusso
public void processAction(ActionRequest
request, ActionResponse response){
response.setRenderParameter(“foo", foo);}
Portlet A
public void render(RenderRequest request,
RenderResponse response){
String value = response.getParameter(“foo");}
Portlet B
A B
C
33
Resource - <portlet:resourceURL/>
Esempio
<portlet:resourceURL var="changePage" id="changePage">
<portlet:param name=“par1” value=“val1”/>
</portlet:resourceURL>
crea l’url per una risorsa, identificata da un id,
fornita dal portlet
Definizione
var: il nome della variabile all’interno della JSP.
id: l’identificativo della risorsa richiesta
Parametri
34
Resource - flusso
public class TestAPortlet extends
GenericPortlet{
public void
serveResource(ResourceRequest
request, ResourceResponse response){
}
}
A
risorsa
B
C
35
Integrazione con AJAX
Web container
Portlet container
PortletSession
JSP
JSP
caricamento iniziale
aggiornamento AJAX
render
serveResource
response:
contentType: application/jsonJavaScript
Portlet
36
Agenda
1. JSR168
2. JSR286
3. Spring MVC Portlet
4. Esempio
37
Spring MCV Portlet
• modello flessibile e leggero
• Implementa il classico pattern MVC
• analogo al modello Spring MVC
Caratteristiche
• DispatcherPortlet
• HandlerMapping
• Controller
• ViewResolver
Componenti
38
DispatcherPortlet
portlet.xml
<portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class>
<init-param>
<name>contextConfigLocation</name>
<value>/WEB-INF/context/TestPortletA-context.xml</value>
</init-param>
39
HandlerMapping
<bean
class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotatio
nHandlerMapping">
<property name="interceptors">
<bean
class="org.springframework.web.portlet.handler.ParameterMappingInterce
ptor" />
</property>
</bean>
context.xml
Responsabilità
Mappa le PortletRequest verso gli opportuni controllers
40
ViewResolver
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewR
esolver">
<property name="cache" value="true" />
<property name="viewClass“
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/testA/" />
<property name="suffix" value=".jsp" />
</bean>
context.xml
Responsabilità
Sceglie la view opportuna a seconda del contesto
41
Interazione tra i componenti
DispatcherPortlet
HandlerMapping
Controller
ModelAndView
ViewResolver
View
request
lookup
select
generate
return
lookup
select
render
42
Controller annotati
Nuovi in Spring 2.5
•Rendono più snelle le configurazioni
•Permettono di riunire la logica nella stessa classe di
controller
•Possibilità di utilizzare segnature ‘libere’ nei
metodi.
Caratteristiche
43
Controller annotati – metodi
• oggetto ModelAndView
•Model o oggetti del model
• oggetto View
• string che identifica
l’oggetto view
Output metodi
Possono essere in qualsiasi
ordine:
•Request/response
•Model o oggetti del model
• Errors
• java.util.Locale
Parametri metodi
esempio
public void searchAction(@ModelAttribute("search") SearchUserForm
search,Model model,ActionRequest request){
44
Controller annotati – component-scan
<context:component-scan base-package=
"com.alex.springportlet.testA" />
<context:annotation-config />
context.xml
Il tag component-scan indica al framework dove cercare i
controller annotati da usare per il portlet
45
@Controller
La classe marcata con l’annotation @Controller viene utilizzata come
controller
• il parametro value indica l’id del bean nel file di context
codice
@Controller(value="testAController")
public class TestAPortletController extends GeneralController{
context.xml
<bean id="testAController"
class="com.alex.springportlet.testA.controller.TestAPortletCon
troller">
<property name="service" ref="serviceImpl"/>…
46
@RequestMapping - 1
A livello di classe,viene usata per distinguere I vari controller in base
alle modalità che gestiscono
codice
@Controller(value="testAController")
@RequestMapping(“VIEW”)
public class TestAPortletController extends GeneralController{
In questo caso il controller
è utilizzato
per gestire la modalità VIEW
47
@RequestMapping - 2
A livello di metodo, indica il metodo del controller da richiamare a
partire da una certa action/render request
codice
@RequestMapping(params="action=launchEvent")
public void launchEventAction(ActionRequest request,ActionResponse
response){}
@RequestMapping(params="action=launchEvent")
public String launchEventRender(RenderRequest
request,RenderResponse response){
return "index";
}
48
@RequestMapping - 3
49
@SessionAttributes
A livello di classe, identifica gli attributi del model da inserire in
sessione
codice
@SessionAttributes({"search","output"})
public class TestAPortletController {
@RequestMapping
public String begin(Model model,PortletSession session){
SearchUserForm search=new SearchUserForm();
model.addAttribute("search", search);…
Il framework colloca
automaticamente search in
sessione
50
@ModelAttribute
A livello di parametro, indica che il parametro di un determinato
metodo va preso dal model
codice
public void jsonChangePage(@ModelAttribute("search")
SearchUserForm search,Model model…)
Il parametro search viene
preso dal model
51
@EventMapping
A livello di metodo, identifica il metodo che deve trattare un
particolare evento
codice
@EventMapping("{http://com.alex/test/portlets/ns}event")
public void handleEvent(Event event,EventRequest request)
throws Exception {
…
}
JSR 286
52
@ResourceMapping
A livello di metodo, identifica il metodo che deve restituire una
determinata resource
codice
@ResourceMapping(value="changePage")
public void jsonChangePage(…,
JSR 286
<portlet:resourceURL var="changePage"
id="changePage">
<portlet:param name=“par1” value=“val1”/>
</portlet:resourceURL>
53
Agenda
1. JSR168
2. JSR286
3. Spring MVC Portlet
4. Esempio
54
Esempio
• IDE: Netbeans 6.9.1
• Spring v.3.0.5
• Maven
• Portlet Container: Apache Pluto
•JQuery

More Related Content

What's hot

Lezione 9: Web Service in Java
Lezione 9: Web Service in JavaLezione 9: Web Service in Java
Lezione 9: Web Service in JavaAndrea Della Corte
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Eugenio Minardi
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Wellnet srl
 
Lezione 9: Design Pattern Comportamentali
Lezione 9: Design Pattern ComportamentaliLezione 9: Design Pattern Comportamentali
Lezione 9: Design Pattern ComportamentaliAndrea Della Corte
 
Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014Fabio Collini
 

What's hot (7)

Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Lezione 9: Web Service in Java
Lezione 9: Web Service in JavaLezione 9: Web Service in Java
Lezione 9: Web Service in Java
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
 
Lezione 9: Design Pattern Comportamentali
Lezione 9: Design Pattern ComportamentaliLezione 9: Design Pattern Comportamentali
Lezione 9: Design Pattern Comportamentali
 
Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014
 
Jpnde
JpndeJpnde
Jpnde
 

Similar to Portlet JSR168/286

Analisi e sviluppo di componenti standard JSR 168 per la realizzazione di Por...
Analisi e sviluppo di componenti standard JSR 168 per la realizzazione di Por...Analisi e sviluppo di componenti standard JSR 168 per la realizzazione di Por...
Analisi e sviluppo di componenti standard JSR 168 per la realizzazione di Por...DavisMol
 
Installing Apache tomcat with Netbeans
Installing Apache tomcat with NetbeansInstalling Apache tomcat with Netbeans
Installing Apache tomcat with NetbeansDavide Nardone
 
Using Plugins to extend and customize Liferay
Using Plugins to extend and customize LiferayUsing Plugins to extend and customize Liferay
Using Plugins to extend and customize LiferayAndrea Di Giorgi
 
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Codemotion
 
Java Unit Testing - In container and database testing
Java Unit Testing - In container and database testingJava Unit Testing - In container and database testing
Java Unit Testing - In container and database testingfgianneschi
 
September 2010 - Gatein
September 2010 - GateinSeptember 2010 - Gatein
September 2010 - GateinJBug Italy
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC FrameworkDotNetMarche
 
WeWantWeb - WCF Data Services
WeWantWeb - WCF Data ServicesWeWantWeb - WCF Data Services
WeWantWeb - WCF Data ServicesDomusDotNet
 
Self hosted Services with .NET OWin
Self hosted Services with .NET OWinSelf hosted Services with .NET OWin
Self hosted Services with .NET OWinNicolò Carandini
 
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012Andrea Dottor
 
AngularJS: server communication
AngularJS: server communicationAngularJS: server communication
AngularJS: server communicationVittorio Conte
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 

Similar to Portlet JSR168/286 (20)

Analisi e sviluppo di componenti standard JSR 168 per la realizzazione di Por...
Analisi e sviluppo di componenti standard JSR 168 per la realizzazione di Por...Analisi e sviluppo di componenti standard JSR 168 per la realizzazione di Por...
Analisi e sviluppo di componenti standard JSR 168 per la realizzazione di Por...
 
react-it.pdf
react-it.pdfreact-it.pdf
react-it.pdf
 
Installing Apache tomcat with Netbeans
Installing Apache tomcat with NetbeansInstalling Apache tomcat with Netbeans
Installing Apache tomcat with Netbeans
 
Using Plugins to extend and customize Liferay
Using Plugins to extend and customize LiferayUsing Plugins to extend and customize Liferay
Using Plugins to extend and customize Liferay
 
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
 
Powerful asp.net 4 e ie9
Powerful asp.net 4 e ie9Powerful asp.net 4 e ie9
Powerful asp.net 4 e ie9
 
Java lezione 17
Java lezione 17Java lezione 17
Java lezione 17
 
Java Unit Testing - In container and database testing
Java Unit Testing - In container and database testingJava Unit Testing - In container and database testing
Java Unit Testing - In container and database testing
 
Novità di Asp.Net 4.0
Novità di Asp.Net 4.0Novità di Asp.Net 4.0
Novità di Asp.Net 4.0
 
September 2010 - Gatein
September 2010 - GateinSeptember 2010 - Gatein
September 2010 - Gatein
 
Many Designs Elements
Many Designs ElementsMany Designs Elements
Many Designs Elements
 
Ajax - Presente e futuro delle applicazioni web
Ajax - Presente e futuro delle applicazioni webAjax - Presente e futuro delle applicazioni web
Ajax - Presente e futuro delle applicazioni web
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC Framework
 
WeWantWeb - WCF Data Services
WeWantWeb - WCF Data ServicesWeWantWeb - WCF Data Services
WeWantWeb - WCF Data Services
 
Self hosted Services with .NET OWin
Self hosted Services with .NET OWinSelf hosted Services with .NET OWin
Self hosted Services with .NET OWin
 
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012
 
AngularJS: server communication
AngularJS: server communicationAngularJS: server communication
AngularJS: server communication
 
Java Advanced
Java AdvancedJava Advanced
Java Advanced
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 

Portlet JSR168/286

  • 2. 2 Agenda 1. JSR168 2. JSR286 3. Spring MVC Portlet 4. Esempio pratico
  • 3. 3 Portale • facilmente inseribili nella pagina • unità indipendenti • configurabili • riusabili anche in altri contesti e portali Applicazioni Porta di accesso unica a un insieme di applicazioni, dati e servizi. Portale
  • 4. Soluzioni proprietarie 4 Portlet - evoluzione Standard : JSR168
  • 5. 5 JSR 168 (Java Portlet Specification 1.0) La specifica JSR 168 è stata rilasciata nel 2003 • al gruppo di lavoro hanno partecipato Apache, BEA, Broadvision, IBM, Oracle, SAP, SUN, Sybase, TIBCO •il ruolo e le funzionalità del Portlet Container • il contratto tra il Container e i Portlet • la gestione del ciclo di vita dei Portlet • il packaging per la distribuzione dei Portlet • l'interazione con Web Services for Remote Portlets (WSRP) di OASIS Definisce
  • 6. 6 Portlet – Portlet container Portlet Componenti web Java, gestiti da un portlet container, che processano le richieste ricevute e generano contenuti dinamici. Portlet container •contiene i portlet e gestisce il loro ciclo di vita. •si occupa di immagazzinare le preference e le configurazioni di ogni portlet • riceve le request dal portale e le indirizza alle portlet che gestisce
  • 7. 7 Ciclo di vita di un portlet Il ciclo di vita è gestito dai 4 metodi esposti dall’interfaccia portlet: • init: il metodo viene chiamato dal container quando il portlet viene instanziato •destroy: viene chiamato dal container quando il portlet viene distrutto •processAction: viene chiamato dopo che l’utente ha effettuato una richiesta; serve a processare i dati avuti in input •render: va in esecuzione ogni volta che il portlet si visualizza nella pagina web
  • 11. 11 ActionRequest – RenderRequest • Derivano dall’oggetto PortletRequest • Sono sottoinsiemi dell’HttpRequest • è compito del portlet container dividere i parametri tra i vari portlet della pagina • I parametri in actionRequest sono in generale diversi da quelli in renderRequest • a meno che il portlet non li inserisca in actionResponse Esempio String value=request.getParameter(“test”); response.setRenderParameter(“test”, value); Il parametro test è preso dalla actionRequest e passato in actionResponse
  • 12. 12 PortletSession Ogni portlet ha il proprio PortletSession • i parametri inseriti nel PortletSession con lo scope APPLICATION sono visibili anche in HttpSession Esempio PortletSession session = request.getSession(true); session.setAttribute(“home.url”,url,PortletSession.APPLICATION_SCOPE); session.setAttribute(“bkg.color”,”RED”,PortletSession.PORTLET_SCOPE); Attributo visibile con stesso nome anche in HttpSession Attributo visibile solo al portlet
  • 13. 13 Modalità di un portlet La specifica definisce 3 modalità standard: •VIEW: la modalità standard che ogni portlet deve implementare •EDIT: consente di modificare le impostazioni dell’utente •HELP: tale modalità presenta informazioni di help relative alla portlet I vari vendor possono comunque aggiungere modalità differenti.
  • 14. 14 Portlet taglib URI: http://java.sun.com/portlet Permettono alle JSP incluse nel portlet • di avere accesso ad elementi specifici del portlet (render, request, id del portlet) • di creare i link per l’interazione con il portlet L’implementazione delle taglib è responsabilità del portlet container
  • 15. 15 <portlet:namespace/> Utile per l’assegnazione di id univoci agli elementi della pagina web, soprattutto se sono presenti più istanze dello stesso portlet nella stessa pagina Esempio var <portlet:namespace/>_resTab=new ResultsTable(..); <portlet:namespace/>_populateTable(output); </script> <table id="<portlet:namespace/>_results"> <th><td>Nome</td><td>Cognome</td></th> </table> Ritorna l’identificativo univoco del portlet all’interno della pagina web Definizione
  • 16. 16 <portlet:defineObjects/> Esempio <portlet:defineObjects/> <%=renderResponse.setTitle("my portlet title")%> definisce le seguenti variabili all’interno della JSP: • renderRequest • renderResponse • portletConfig Definizione
  • 17. 17 <portlet:actionURL/> Esempio <portlet:actionURL var="searchAction"> <portlet:param name="action" value="search" /> </portlet:actionURL> <form action="${searchAction}" method="POST"> crea un URL che punta al portlet corrente ed invia un action request con i parametri specificati Definizione portletMode: la modalità del portlet var: il nome della variabile nella JSP Parametri
  • 18. 18 <portlet:renderURL/> Esempio <portlet:renderURL var=“helpUrl“ portletMode=“HELP”> </portlet:renderURL> <a href=“${helpUrl}”>Help</a> crea un URL che punta al portlet corrente ed invia un render request con i parametri specificati Definizione portletMode: la modalità del portlet var: il nome della variabile nella JSP Parametri
  • 19. 19 Portlet library I portlet possono essere inserite in un opportuno file war • il file deve contenere le classi e tutte le resources relative ad essi •nel folder WEB-INF deve essere presente il file portlet.xml
  • 20. 20 portlet.xml <portlet> <description xml:lang="it">Portlet di test A</description> <portlet-name>TestAPortlet</portlet-name> <display-name xml:lang="it">Portlet di test A</display-name> <portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class> <init-param> <name>contextConfigLocation</name> <value>/WEB-INF/context/TestPortletA-context.xml</value> </init-param> <expiration-cache>0</expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>view</portlet-mode> <portlet-mode>help</portlet-mode> </supports> <supported-locale>en</supported-locale> … </portlet>
  • 21. 21 Limiti di JSR168 La specifica presenta alcune limitazioni: • manca un meccanismo standard per fare interagire tra loro i portlet (Inter Portlet Communication) • non è possibile ottenere una risorsa direttamente da un portlet • bisogna passare dal portlet containet • integrazione con AJAX non supportata internamente • a meno che non sia offerta dal portlet container in modo non standard
  • 22. 22 Integrazione con AJAX Web container Portlet container Servlet container PortletSession HttpSession JSP JSP caricamento iniziale aggiornamento AJAX render AJAX request Le due session condividono i parametri con scope APPLICATION_SCOPE JavaScript Portlet Servlet
  • 23. 23 Agenda 1. JSR168 2. JSR286 3. Spring MVC Portlet 4. Esempio pratico
  • 24. 24 JSR286 (Java Portlet Specification 2.0) La specifica JSR 286 è stata rilasciata nel 2008 • a febbraio 2006 fu costituito il JSR 286 Expert Group al fine di arrivare alla Java Portlet Specification 2.0 Novità introdotte • Eventi: ogni portlet può lanciare e ricevere determinati eventi •Public render parameter: possibilità per i portlet di condividere parametri tra loro •Possibilità per un portlet di restituire una risorsa.
  • 26. 26 Eventi- dichiarazione dell’evento portlet.xml <event-definition> <qname xmlns:x="http://com.alex/test/portlets/ns">x:event</qname> <value-type>java.lang.String</value-type> </event-definition> Il parametro value-type indica la classe dell’evento
  • 27. 27 Eventi - lancio dell’evento portlet.xml <portlet> <description xml:lang="it">Portlet di test A</description> <supported-publishing-event> <qname xmlns:x="http://com.alex/test/portlets/ns">x:event</qname> </supported-publishing-event> codice String event="Test Event"; QName name=new QName("http://com.alex/test/portlets/ns", "event"); response.setEvent(name, event); //ActionResponse
  • 28. 28 Eventi - process dell’evento portlet.xml <portlet> <description xml:lang="it">Portlet di test B</description> <supported-processing-event> <qname xmlns:x="http://com.alex/test/portlets/ns">x:event</qname> </supported-processing-event> codice public void processEvent(EventRequest request, EventResponse response){ Event event=request.getEvent(); String qname= event.getQName(); }
  • 30. 30 Parametri pubblici - dichiarazione portlet.xml <public-render-parameter> <identifier>foo</identifier> <qname xmlns:x=“http://com.alex/test/portlets/ns”>x:foo2</qname> </public-render-parameter> I parametri pubblici vengono dichiarati in portlet.xml in una opportuna sezione • vengono distinti tra loro utilizzando opportuni identifier
  • 31. 31 Parametri pubblici - utilizzo portlet.xml <portlet> <portlet-name>portletA</portlet-name> … <supported-public-render-parameter>foo</supported-public-render- parameter> </portlet> I portlet dichiarano in portlet.xml i parametri pubblici che utilizzeranno • i parametri sono identificati con il loro identifier
  • 32. 32 Parametri pubblici – flusso public void processAction(ActionRequest request, ActionResponse response){ response.setRenderParameter(“foo", foo);} Portlet A public void render(RenderRequest request, RenderResponse response){ String value = response.getParameter(“foo");} Portlet B A B C
  • 33. 33 Resource - <portlet:resourceURL/> Esempio <portlet:resourceURL var="changePage" id="changePage"> <portlet:param name=“par1” value=“val1”/> </portlet:resourceURL> crea l’url per una risorsa, identificata da un id, fornita dal portlet Definizione var: il nome della variabile all’interno della JSP. id: l’identificativo della risorsa richiesta Parametri
  • 34. 34 Resource - flusso public class TestAPortlet extends GenericPortlet{ public void serveResource(ResourceRequest request, ResourceResponse response){ } } A risorsa B C
  • 35. 35 Integrazione con AJAX Web container Portlet container PortletSession JSP JSP caricamento iniziale aggiornamento AJAX render serveResource response: contentType: application/jsonJavaScript Portlet
  • 36. 36 Agenda 1. JSR168 2. JSR286 3. Spring MVC Portlet 4. Esempio
  • 37. 37 Spring MCV Portlet • modello flessibile e leggero • Implementa il classico pattern MVC • analogo al modello Spring MVC Caratteristiche • DispatcherPortlet • HandlerMapping • Controller • ViewResolver Componenti
  • 40. 40 ViewResolver <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewR esolver"> <property name="cache" value="true" /> <property name="viewClass“ value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/testA/" /> <property name="suffix" value=".jsp" /> </bean> context.xml Responsabilità Sceglie la view opportuna a seconda del contesto
  • 41. 41 Interazione tra i componenti DispatcherPortlet HandlerMapping Controller ModelAndView ViewResolver View request lookup select generate return lookup select render
  • 42. 42 Controller annotati Nuovi in Spring 2.5 •Rendono più snelle le configurazioni •Permettono di riunire la logica nella stessa classe di controller •Possibilità di utilizzare segnature ‘libere’ nei metodi. Caratteristiche
  • 43. 43 Controller annotati – metodi • oggetto ModelAndView •Model o oggetti del model • oggetto View • string che identifica l’oggetto view Output metodi Possono essere in qualsiasi ordine: •Request/response •Model o oggetti del model • Errors • java.util.Locale Parametri metodi esempio public void searchAction(@ModelAttribute("search") SearchUserForm search,Model model,ActionRequest request){
  • 44. 44 Controller annotati – component-scan <context:component-scan base-package= "com.alex.springportlet.testA" /> <context:annotation-config /> context.xml Il tag component-scan indica al framework dove cercare i controller annotati da usare per il portlet
  • 45. 45 @Controller La classe marcata con l’annotation @Controller viene utilizzata come controller • il parametro value indica l’id del bean nel file di context codice @Controller(value="testAController") public class TestAPortletController extends GeneralController{ context.xml <bean id="testAController" class="com.alex.springportlet.testA.controller.TestAPortletCon troller"> <property name="service" ref="serviceImpl"/>…
  • 46. 46 @RequestMapping - 1 A livello di classe,viene usata per distinguere I vari controller in base alle modalità che gestiscono codice @Controller(value="testAController") @RequestMapping(“VIEW”) public class TestAPortletController extends GeneralController{ In questo caso il controller è utilizzato per gestire la modalità VIEW
  • 47. 47 @RequestMapping - 2 A livello di metodo, indica il metodo del controller da richiamare a partire da una certa action/render request codice @RequestMapping(params="action=launchEvent") public void launchEventAction(ActionRequest request,ActionResponse response){} @RequestMapping(params="action=launchEvent") public String launchEventRender(RenderRequest request,RenderResponse response){ return "index"; }
  • 49. 49 @SessionAttributes A livello di classe, identifica gli attributi del model da inserire in sessione codice @SessionAttributes({"search","output"}) public class TestAPortletController { @RequestMapping public String begin(Model model,PortletSession session){ SearchUserForm search=new SearchUserForm(); model.addAttribute("search", search);… Il framework colloca automaticamente search in sessione
  • 50. 50 @ModelAttribute A livello di parametro, indica che il parametro di un determinato metodo va preso dal model codice public void jsonChangePage(@ModelAttribute("search") SearchUserForm search,Model model…) Il parametro search viene preso dal model
  • 51. 51 @EventMapping A livello di metodo, identifica il metodo che deve trattare un particolare evento codice @EventMapping("{http://com.alex/test/portlets/ns}event") public void handleEvent(Event event,EventRequest request) throws Exception { … } JSR 286
  • 52. 52 @ResourceMapping A livello di metodo, identifica il metodo che deve restituire una determinata resource codice @ResourceMapping(value="changePage") public void jsonChangePage(…, JSR 286 <portlet:resourceURL var="changePage" id="changePage"> <portlet:param name=“par1” value=“val1”/> </portlet:resourceURL>
  • 53. 53 Agenda 1. JSR168 2. JSR286 3. Spring MVC Portlet 4. Esempio
  • 54. 54 Esempio • IDE: Netbeans 6.9.1 • Spring v.3.0.5 • Maven • Portlet Container: Apache Pluto •JQuery