portlet jsr168/286

54
Portlet JSR168/286

Upload: alessio-dimauro

Post on 04-Dec-2014

175 views

Category:

Software


0 download

DESCRIPTION

Java talk di Sassari, 21 maggio 2011

TRANSCRIPT

Page 1: Portlet JSR168/286

Portlet JSR168/286

Page 2: Portlet JSR168/286

Agenda

1. JSR1682. JSR2863. Spring MVC Portlet4. Esempio pratico

Page 3: Portlet JSR168/286

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

Soluzioni proprietarie

4

Portlet - evoluzione

Standard : JSR168

Page 5: Portlet JSR168/286

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

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

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

8

javax.portlet.Portlet

Page 9: Portlet JSR168/286

9

Caricamento pagina

Page 10: Portlet JSR168/286

10

Process di una action

Page 11: Portlet JSR168/286

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

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

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

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

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

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

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

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

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

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

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

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

Agenda

1. JSR1682. JSR2863. Spring MVC Portlet4. Esempio pratico

Page 24: Portlet JSR168/286

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

GenericPortlet

Page 26: Portlet JSR168/286

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

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

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

29

Eventi - flusso

Page 30: Portlet JSR168/286

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

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

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

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

34

Resource - flusso

public class TestAPortlet extends GenericPortlet{

public void serveResource(ResourceRequest request, ResourceResponse response){

}}

Arisorsa

B

C

Page 35: Portlet JSR168/286

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

Agenda

1. JSR1682. JSR2863. Spring MVC Portlet4. Esempio

Page 37: Portlet JSR168/286

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

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

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

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

41

Interazione tra i componenti

DispatcherPortlet

HandlerMappingController

ModelAndView

ViewResolverView

request

lookup

select

generate

return

lookup

select

render

Page 42: Portlet JSR168/286

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

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

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

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

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

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

48

@RequestMapping - 3

Page 49: Portlet JSR168/286

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

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

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

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

Agenda

1. JSR1682. JSR2863. Spring MVC Portlet4. Esempio

Page 54: Portlet JSR168/286

54

Esempio

• IDE: Netbeans 6.9.1

• Spring v.3.0.5

• Maven

• Portlet Container: Apache Pluto

•JQuery