Java Portlets

Z FI WIKI
Přejít na: navigace, hledání


Úvod

Portály jsou webové servery, které slouží jako vstupní místo. Existují obecné portály, např. seznam.cz nebo Yahoo, které chtějí být portálem běžných uživatelů k celému Internetu. Existují také firemní portály, které slouží jako vstupní místo pro zaměstnance a partnery firmy k neveřejným informacím. Zkrátka portál je webový server s nějakou snadno zapamatovatelnou adresou.

Všechny stránky na portálu obvykle sdílí jednotný vzhled a jednotný způsob navigace (menu, breadcrumbs, vyhledávání atd.). Na jedné stránce portálu se mohou vyskytovat nesouvisející věci, například menu, formulář pro vyhledávání, kalendář. Dále různé portály mnohdy obsahují podobné součásti, třeba přístup k e-mailu. Odtud vznikla myšlenka, že portál by šlo tvořit z menších nezávislých částí, které by šlo úhledně zabalit, přidávat do dalších portálů a vidět by byly jako části stránek portálu. Tyto části byly nazvány portlety.

V prostředí portálů založených na Java EE technologiích pak vznikla specifikace Portlet API, určující rozhraní mezi portlety a portálovým serverem. Verze 1 tohoto API bylo stanoveno v rámci JSR-168 (Java Specification Request), a existují jeho různé implementace, jmenujme např. JetSpeed 2 a eXo platform. Verze 2 je připravována v rámci JSR 286.

Definice

Portlet (podle specifikace JSR-168) je Java třída implementující rozhraní javax.portlet.Portlet. Je podobná Java servletu, ale liší se ve třech zásadních věcech:

  • generuje jen část webové stránky (okno)
  • okno portletu lze minimalizovat a maximalizovat, má módy pro prohlížení, help a editaci
  • má oddělené fáze zpracování informací od uživatele a generování části stránky

Použití

Stejně jako u servletu, implementace portletů obvykle rozšiřují třídu javax.portlet.GenericPortlet. Specifikace bohužel není přímo dostupná na webu, je nutné ji stáhnout a rozbalit. Hlavní metody jsou:

 
 /**
  * Called by the portlet container to indicate to a portlet that the portlet is being placed into service.
  */
 void init(PortletConfig config);
 
 /**
  * Called by the portlet container to allow the portlet to process an action request.
  */
 void processAction(ActionRequest request, ActionResponse response);
 
 /**
  * Called by the portlet container to allow the portlet to generate the content of the response based on its current state.
  */
 void render(RenderRequest request, RenderResponse response)

Důležitý rozdíl proti servletům je, že portlet si musí udržovat svůj aktuální stav, protože na jedno zavolání processAction() může přijít libovolný počet vyvolání render().

Portlet se nachází v jednom ze stavů okna (minimized, normal, maximized) a módu (edit, help, view).

Pro ulehčení práce má GenericPortlet implementaci metody render(), která podle aktuálního módu volá 'doView(), doEdit() nebo doHelp(). Atributy nastavené během processAction() do renderRequest jsou platné během všech vyvolání render() až do příštího processAction().

Portletová aplikace je webová aplikace ve WAR souboru, a může využívat servlety a JSP stránky. PortletSession přímo souvisí s HttpSession. Volání portletů jsou cross-contextová volání servletů z webové aplikace obsahující portál.

Portlet taglib

Specifikace definuje knihovnu značek:

<%@ taglib uri= http://java.sun.com/portlet  prefix= portlet  %>

Značka defineObjects definuje objekty 'renderRequest, renderResponse a portletConfig.

<portlet:defineObjects/>
<%=renderResponse.setTitle("my portlet title")%>

Značka actionURL generuje URL vyvolávající akci:

<portlet:actionURL windowState="maximized"  portletMode="edit" >
 <portlet:param name="action"  value="editStocks" /> 
</portlet:actionURL>

Značka renderURL generuje URL vyvolávající zobrazení bez akce:

<portlet:renderURL portletMode="view"  windowState="normal" > 
 <portlet:param name="showQuote"  value="myCompany" /> 
 <portlet:param name="showQuote"  value="someOtherCompany" />
</portlet:renderURL>

Značka namespace generuje unikátní identifikátor, umožňující použít více instancí stejného portletu na jedné stránce:

<A HREF= javascript:<portlet:namespace/>doFoo() >Foo</A>