Portlet JSR168/286
-
Upload
alessio-dimauro -
Category
Software
-
view
175 -
download
0
description
Transcript of Portlet JSR168/286
![Page 1: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/1.jpg)
Portlet JSR168/286
![Page 2: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/2.jpg)
Agenda
1. JSR1682. JSR2863. Spring MVC Portlet4. Esempio pratico
![Page 3: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/3.jpg)
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
![Page 4: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/4.jpg)
Soluzioni proprietarie
4
Portlet - evoluzione
Standard : JSR168
![Page 5: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/5.jpg)
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
![Page 6: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/6.jpg)
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
![Page 7: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/7.jpg)
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
![Page 8: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/8.jpg)
8
javax.portlet.Portlet
![Page 9: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/9.jpg)
9
Caricamento pagina
![Page 10: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/10.jpg)
10
Process di una action
![Page 11: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/11.jpg)
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
EsempioString value=request.getParameter(“test”);response.setRenderParameter(“test”, value);
Il parametro test è preso dalla actionRequest e passato in actionResponse
![Page 12: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/12.jpg)
12
PortletSession
Ogni portlet ha il proprio PortletSession• i parametri inseriti nel PortletSession con lo scope APPLICATION
sono visibili anche in HttpSession
EsempioPortletSession 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
![Page 13: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/13.jpg)
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.
![Page 14: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/14.jpg)
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
![Page 15: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/15.jpg)
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
Esempiovar <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
![Page 16: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/16.jpg)
16
<portlet:defineObjects/>
Esempio<portlet:defineObjects/><%=renderResponse.setTitle("my portlet title")%>
definisce le seguenti variabili all’interno della JSP:• renderRequest• renderResponse• portletConfig
Definizione
![Page 17: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/17.jpg)
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
![Page 18: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/18.jpg)
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
![Page 19: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/19.jpg)
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
![Page 20: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/20.jpg)
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>
![Page 21: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/21.jpg)
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
![Page 22: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/22.jpg)
22
Integrazione con AJAX
Web containerPortlet container
Servlet container
PortletSession
HttpSession
JSP
JSP
caricamento iniziale
aggiornamento AJAX
render
AJAX request
Le due session condividono i parametri con scopeAPPLICATION_SCOPE
JavaScript
Portlet
Servlet
![Page 23: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/23.jpg)
Agenda
1. JSR1682. JSR2863. Spring MVC Portlet4. Esempio pratico
![Page 24: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/24.jpg)
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.
![Page 25: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/25.jpg)
GenericPortlet
![Page 26: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/26.jpg)
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
![Page 27: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/27.jpg)
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
![Page 28: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/28.jpg)
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();}
![Page 29: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/29.jpg)
29
Eventi - flusso
![Page 30: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/30.jpg)
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.xmlin una opportuna sezione• vengono distinti tra loro utilizzando opportuni
identifier
![Page 31: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/31.jpg)
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 cheutilizzeranno• i parametri sono identificati con il loro identifier
![Page 32: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/32.jpg)
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
![Page 33: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/33.jpg)
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
![Page 34: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/34.jpg)
34
Resource - flusso
public class TestAPortlet extends GenericPortlet{
public void serveResource(ResourceRequest request, ResourceResponse response){
}}
Arisorsa
B
C
![Page 35: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/35.jpg)
35
Integrazione con AJAX
Web container
Portlet container
PortletSession
JSP
JSP
caricamento iniziale
aggiornamento AJAX
render
serveResource
response: contentType: application/jsonJavaScript
Portlet
![Page 36: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/36.jpg)
Agenda
1. JSR1682. JSR2863. Spring MVC Portlet4. Esempio
![Page 37: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/37.jpg)
37
Spring MCV Portlet
• modello flessibile e leggero• Implementa il classico pattern MVC• analogo al modello Spring MVC
Caratteristiche
• DispatcherPortlet• HandlerMapping• Controller• ViewResolver
Componenti
![Page 38: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/38.jpg)
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>
![Page 39: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/39.jpg)
39
HandlerMapping
<bean class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="interceptors"> <bean class="org.springframework.web.portlet.handler.ParameterMappingInterceptor" /> </property></bean>
context.xml
Responsabilità
Mappa le PortletRequest verso gli opportuni controllers
![Page 40: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/40.jpg)
40
ViewResolver
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <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
![Page 41: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/41.jpg)
41
Interazione tra i componenti
DispatcherPortlet
HandlerMappingController
ModelAndView
ViewResolverView
request
lookup
select
generate
return
lookup
select
render
![Page 42: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/42.jpg)
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
![Page 43: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/43.jpg)
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){
![Page 44: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/44.jpg)
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
![Page 45: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/45.jpg)
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.TestAPortletController"> <property name="service" ref="serviceImpl"/>…
![Page 46: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/46.jpg)
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
![Page 47: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/47.jpg)
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"; }
![Page 48: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/48.jpg)
48
@RequestMapping - 3
![Page 49: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/49.jpg)
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
![Page 50: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/50.jpg)
50
@ModelAttribute
A livello di parametro, indica che il parametro di un determinatometodo va preso dal model
codice
public void jsonChangePage(@ModelAttribute("search") SearchUserForm search,Model model…)
Il parametro search viene preso dal model
![Page 51: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/51.jpg)
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
![Page 52: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/52.jpg)
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>
![Page 53: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/53.jpg)
Agenda
1. JSR1682. JSR2863. Spring MVC Portlet4. Esempio
![Page 54: Portlet JSR168/286](https://reader035.fdocuments.net/reader035/viewer/2022081413/548032e1b4af9fb17b8b469b/html5/thumbnails/54.jpg)
54
Esempio
• IDE: Netbeans 6.9.1
• Spring v.3.0.5
• Maven
• Portlet Container: Apache Pluto
•JQuery