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.