Vývoj portletů – 2. část
František Hartman
Vývoj portletů Agenda Komplexní portlety
Obsluha zdrojů (r s uc s r n ) e o re evi g Meziportletová komunikace (I C- I t r ote c m u i ai n P ne-p r t o m nc to ) l Sdílená s s i n e so Veřejné parametry (p b cr n e p r m t r) u l e d r aa ees i Události (e ve t ) ns
©2012 IBA CZ, s. r. o.
2
Komplexní portlety Více pohledů Více akcí CRUD Administrační aplikace Nastavení Velké množství vstupních dat Složitá aplikační logika
©2012 IBA CZ, s. r. o.
3
Více pohledů Využít metodu doView() k rozdělování požadavků na základě příchozích parametrů podle uživatelského nastavení (peee c s rf rn e ) Připravit zobrazovaná data v portletu Využít J SP (nebo jinou technologii) k důslednému oddělení view vrstvy
©2012 IBA CZ, s. r. o.
4
Víc e p o h le d ů – u k á z k a JSP
Show list …
©2012 IBA CZ, s. r. o.
5
Víc e p o h le d ů – u k á z k a - p o rtle t
public static final String PARAM_VIEW = “view”; public static final String VIEW_DETAIL = “detail”; public void doView(RenderReq., RenderResp.).. { String view = req.getParameter(PARAM_VIEW); if (VIEW_DETAIL.equals(view)) { doViewDetail(request, response); } else { doViewMain(request, response); } } protected void doViewDetail(RenderReq., RenderResp.).. { ... } protected void doViewMain(RenderReq., RenderResp.).. { ... }
©2012 IBA CZ, s. r. o.
6
Více akcí Využit metodu processAction() k rozdělování požadavků J SR-168 Využit anotace k rozdělování požadavků J SR-286, J ava 1.5+ V akci provést všechny změny stavu portletu nastavit render parametry odeslat události
©2012 IBA CZ, s. r. o.
7
Víc e a k c í - u ká z ka
“ /> …
©2012 IBA CZ, s. r. o.
8
Víc e a k c í - u ká z ka
@ProcessAction(name=ACTION_SEARCH) public void actionSearch(ActionRequest request, ActionResponse response) throws PortletException, IOException { ... response.setRenderParameters(request.getParameterMap()); } @ProcessAction(name=ACTION_ADD_TO_CART) public void actionAddToCart(ActionRequest request, ActionResponse response) throws PortletException, IOException { ... }
©2012 IBA CZ, s. r. o.
9
Konstanty, nastavení, pomocné metody Programové konstanty – PortletNameConstants (např. CatalogConstant) Nastavení Init parameters portlet.xml web.xml Preferences Pomocné metody Odstranění duplikace kódu Vede ke snadnější udržovatelnosti Dědičnost vs. Util třídy
©2012 IBA CZ, s. r. o.
10
Použití MVC V MVC je Portlet = Controller J SP = View Bussiness vrstva (DTO) = Model Velké množství vstupních dat Validace není součástí specifikace Zvážit použití MVC rámce, zjednoduší: Validaci dat Převod dat z formuláře na objekty Složitá aplikační logika Patří do modelu Portlet by měl obsahovat pouze logiku UI
©2012 IBA CZ, s. r. o.
11
Komplexní portlety Velmi složitý portlet může naznačovat špatný návrh a portletovou dekompozici Zkontrolovat návrh aplikace Různé portlety pro různé role Portlety podle případu užití Zkontrolovat duplikaci kódu Zvážit možnosti zjednodušení či rozložení funkcionality do více portletů Zvážit využití MVC rámce
©2012 IBA CZ, s. r. o.
12
Poskytování statických zdrojů PortletResponse.encodeURL()
Nemusí vygenerovat validní URL Vyšší výkon – nedochází k zpracování portálem Doporučený způsob pro statický obsah v J SR-168 Cachované resourceURL v J SR-286
©2012 IBA CZ, s. r. o.
13
Poskytování dynamických zdrojů J SR-168 Nemožné získat pouze fragment kódu nebo dynamická binární data Řešení – servlet Problémy s autentizací Problémy se získáváním dat z portletu (preference, uživatel atd.) J SR-286 Rozhraní ResourceServingPortlet s metodou serveResource() Klient může posílat požadavky na Binární data (obrázky, dokumenty, ...) Serializovaná data (J SON, …) HTML fragmenty Často také ve spojení s technologií AJ AX
©2012 IBA CZ, s. r. o.
14
Požadavky při poskytování zdroje
©2012 IBA CZ, s. r. o.
15
Dynamické zdroje - implementace Metoda serveResource() Neměla by měnit stav portletu (databáze), pokud je volána metodou GET ResourceRequest getResourceID() getCacheability() FULL, PAGE, PORTLET ResourceResponse setContentType() getWriter() getPortletOutputStream()
©2012 IBA CZ, s. r. o.
16
Dyn a m ic ké z d ro je - u k á z k a
@Override public void serveResource(ResourceRequest req, ResourceResponse res) throws PortletException, IOException { String resourceID = request.getResourceID(); if (RESOURCE_QUERY.equals(resourceID)) { ... } else { super.serveResource(request, response); } }
©2012 IBA CZ, s. r. o.
17
Meziportletová komunikace (IPC) J SR-168 Nemá standardizovanou cestu pro meziportletovou komunikaci Řešení Sdílení dat v „application scope“ session J avaScript Databáze Proprietární řešení J SR-286 Veřejné parametry (public render parameters) Události (events) (Cookies)
©2012 IBA CZ, s. r. o.
18
Session – application scope Využívá se http session PORTLET_SCOPE APPLICATION_SCOPE Sdílení dat v rámci portletové aplikace Nelze sdílet mezi aplikacemi Změny provádět během zpracování akcí či událostí Pozor na změny dat session v render fázi Pozor na kolize jmen
©2012 IBA CZ, s. r. o.
19
Public render parameters Nejjednodušší standardní metoda meziportletové komunikace Parametry se definují v deskriptoru portlet.xml Parametr je definován jako veřejný Pro každý parametr je nutné definovat jedinečné jméno Pro portlet se definuje který z veřejných parametrů využívá Veřejné parametry jsou dostupné ve všech částech životního cyklu požadavku Pouze řetězcové hodnoty
©2012 IBA CZ, s. r. o.
20
Public render parameters - ukázka
http://pv230.ibacz.eu/ param1 p1 … param1
©2012 IBA CZ, s. r. o.
21
Události - events Události umožňují portletům reagovat na akce nebo změny stavu, které nesouvisí přímo s interakcí uživatele s portletem Portlety mohou reagovat na různé události a měnit svůj stav Např. událost přidání položky do košíku Události mohou být vysílány jak portálem tak portlety Zpracování událostí probíhá před render fází
©2012 IBA CZ, s. r. o.
22
Události - events
©2012 IBA CZ, s. r. o.
23
Události - events Události jsou navrženy podle vzoru Producer – Listener Portlety mohou vytvářet události Portlety mohou události přijímat (portlet musí implementovat rozhraní EventPortlet) Události se mohou řetězit Událost je objekt Události je možné posílat mezi portlety různých portletových aplikací Pozor na umístění třídy události – možné problémy s classloaderem
©2012 IBA CZ, s. r. o.
24
Události - events Nastavení se provádí v deskriptoru portlet.xml Každá událost má jedinečné jméno Pro portlety se nastavuje, které události vysílá a které přijímá Velmi mocné Mohou zvýšit složitost projektu J edná se prakticky o interface, který portlet poskytuje a k němuž mohou přistupovat portlety třetích stran
©2012 IBA CZ, s. r. o.
25
Ud á lo s ti - e v e n ts - u ká z ka
http://pv230.ibacz.eu/ event1 java.lang.String … event1 event1
©2012 IBA CZ, s. r. o.
26
Události - events - ukázka
@ProcessAction(name=ACTION_ADD_TO_CART) public void actionAddToCart(ActionRequest request, ActionResponse response) throws PortletException, IOException { response.setEvent("event1", "event value"); }
@ProcessEvent(name="event1") public void processEvent1(EventRequest request, EventResponse response) throws PortletException, IOException { Event e = request.getEvent(); String value = (String) e.getValue(); ... }
©2012 IBA CZ, s. r. o.
27
Události vs. Veřejné parametry Veřejné parametry Výhody J ednoduché a účinné Pracuje s renderURL (záložky, caching)
Události Výhody Velmi mocné Volnost v jejich použití a možnost řetězení
Použití Zobrazení příbuzných informací v několika portletech na stejné stránce První volba pro IPC Co nedělat? Nastavit všechny parametry jako veřejné
Použití Když nestačí veřejné parametry K propagování stavu napříč portlety
Co nedělat? Používat události jako message system
28
©2012 IBA CZ, s. r. o.