Java **portlet** je webový komponent, umožňujúci integráciu webových aplikácií a portálov.

Portlety sú používané ako vymeniteľné komponenty používateľského rozhrania poskytujúce prezentačnú vrstvu pre informačný systém.

Jeden webový portál pozostáva vo všeobecnosti z niekoľkých portletov, napr. jeden pre e-maily, ďalší obsahuje nové správy, tretí prezentuje počasie a pod. V minulosti
webové portály (ešte bez portletov) obsluhovali všetky používateľské funkcie. Použitie portletov v r. 2003 zaviedlo štruktúru do webových portálov, ktorá prináša rad výhod, najmä vývoj jednotlivých portletov rôznymi tímami, s tým súvisiacu časovú nezávislosť vývoja jednotlivých portletov a opakované použitie portletov v rôznych portáloch.

Súčinnosť portálov a portletov je zabezpečená pomocou rozhrania pre programovanie aplikácií (API), ktoré je definované v celom rade noriem .

Špeciálne pre portlety sú relevantné 2 normy, už spomenuté Webové služby pre vzdialené portlety (WSRP), pozri aj  *Introduction to WSRP* [online]. ORACLE, 2016, [cit. 2016-01-19]. Dostupné online. Archivované 2016-01-25 z originálu. (anglicky). Táto norma všeobecne (t. j. nezávisle od platformy) popisuje rozhrania a narábanie s portletmi. 
Verzia 2.0 tejto normy platí od 1. apríla 2008.

Nakoľko najrozšírenejšou platformou pre tvorbu webových portálov je Java, aktuálny vývoj sa koncentruje na Java Portlet Specification, pozri Verzie Java Portlet Specification nižšie.

Použitím tohto rozhrania za dodržania spomenutých noriem sa môžu portlety spúšťať na hocijakom portále založenom na Java EE bez ohľadu na jeho implementáciu.

Technológia
-----------

**Portlet** je komponent používateľského rozhrania, ktorý beží v kontajneri portálu a možno ho použiť ako stavebný kameň portálu.

Technicky sú portlety prevažne založené na technológii Java a sú podobné servletom. Podobne ako servlety i portlety sú riadené kontajnerom (portletový kontajner je „obal" ktorý portlety štartuje, riadi ich životný cyklus, zabezpečuje prostriedky potrebné pre ich beh a poskytuje perzistentný úložný priestor pre ich nastavenia). Portlety sú implementované na strane webového servera na rozdiel od widgetov – komponentov pouźívateľského rozhrania implementovaných v prehliadači koncového používateľa.
Portlet prijíma a spracúva požiadavky podľa ktorých neskoršie mení svoj obsah. Obsah generovaný portletom, nazývaný aj „fragment", je úsek kódu v markup-jazyku (HTML, XHTML, WML). Jednotlivé fragmenty sa potom môžu spájať a spolu dohromady vytvoriť portálovú stránku.

Portlety sa odlišujú od servletov v týchto vlastnostiach:

* Portlety generujú iba fragmenty markup výstupu, nikdy celé dokumenty.
* Portlety sa nedajú priamo adresovať. Neexistuje URL jednotlivého portletu, iba URL stránky obsahujúcej portlet.
* Portlety nesmú vytvárať ľubovoľné dokumenty, pretože ich úlohou je geneoravať časť stránky portálu. Ak portálový server vyžaduje html/text, potom musia všetky portlety poskytovať obsah vo forme text/html. Ak zasa portálová server požaduje WML, každý portlet musí generovať WML.

Používateľský web-klient komunikuje s portletom pomocou štandardnej paradigmy požiadavka/odpoveď implementovaného portálom a používatelia môžu teda väčšinou narábať s portletom rovnako ako sa pohybujú po bežných webových stránkach.

Životný cyklus portletu
-----------------------

Portlet riadi portletový kontajner a to po celú dobu životného cyklu portletu. Podľa špecifikácie JSR-168 má každý portlet implementované nasledovné štyri metódy riadiace jeho životný cyklus:

* init (PortletConfig config)
* processAction (ActionRequest request, ActionResponse response)
* render (RenderRequest request, RenderResponse response)
* destroy ().

Inicializačná metóda init (PortletConfig config) sa volá okamžite po vytvorení inštancie celého portálu. PortletConfig reprezentuje konfiguračné dáta (read only), ktoré sú špecifikované v xml-súbore portletu, napr. inicializačné parametre.

Metóda processAction (ActionRequest request, ActionResponse response) je volaná pri odpovedi na podnet používateľa (napríklad kliknutie myšou na odkaz alebo odoslanie formulára). V tejto metóde sa môžu volať i ďalšie metódy businessových komponent ako napr. JavaBeans. ActionRequest a ActionResponse sú podrozhraniami PortletRequest a PortletResponse. Pomocou tejto metódy sa môžu zmeniť nastavenia portletu i jeho perzistentné informácie.

Metoda render (RenderRequest request, RenderResponse response) v životnom cykle portletu nasleduje po volaní metódy processAction. Táto metóda generuje vlastne obsah založený na aktuálnom stave portletu.

Poslednou povinnou metódou je metóda destroy (). Táto metóda sa volá predtým než je inštancia portletu podsunutá pre garbage collector. V tejto metóde sa teda ako i názov hovorí, majú o. i. aj uvoľniť zdroje.

Verzie Java Portlet Specification
---------------------------------

* Prvá verzia Java Portlet Specification **1.0** sa zverejnila v októbri 2003 v Java Specification Request JSR-168.
* Verzia **2.0** bola vyhlásená za ukončenú v júni 2008 pod kódom JSR-286. Zmeny sa týkali hlavne komunikácie medzi samotnými portletmi (Inter-Portlet Kommunikation, IPC). Každý portlet má teraz možnosť odoslať Event ktorémukoľvek inému portletu na portáli. Na to bola zavedená ďalšia fáza životného cyklu portletu, processEvent-fáza. Odohráva sa medzi fázami processAction a render. Pomocou volania metódy setEvent rozhrania EventResponse sa dá odoslať event z jedného portletu na iný. Volanie sa môže uskutočniť z metód processAction alebo processEvent. Eventy sa dajú definovať v deployment-descriptore a spracovať v metóde processAction rozhrania EventPortlet. Alternatívne sa dá na spracovanie eventov použiť implementácia GenericPortlet, na to však potrebuje každá metóda, ktorá takýto event spracováva, špeciálnu anotáciu.
* V marci 2013 sa začalo s prácou na verzii **3.0**, ktorá bola zverejnená pod JSR-362 v máji 2015 a prvá odozva je stiahnuteľná od 7. januára 2016. Okrem iného obsahuje nasledovné zmeny:
	+ Podpora JEE-7
	+ Špecifikácia spôsobu deľby zdrojov medzi portletmi
	+ Vylepšená podpora mobilných zariadení
	+ Zlepšenie podpory na client-konci
	+ Optimalizovaná podpora pre JavaServer Faces
	+ Web Socket Support
	+ Úprava portletov na OpenSocial-Standard
	+ Ďalšie zlepšenie Portlet-Eventingu
	+ Možnosť podpory nových verzií WSRP (Web Services for Remote Portlets)-špecifikácie
	+ Ďalšie rozšírenia, opravy a rozlíšenia k JSR-286

Referencie
----------

1. ↑  Deepak Gothe: *Understanding the Java Portlet Specification 2.0 (JSR 286): Part 1, Overview and Coordination Between Portlets* január 2010
2. ↑  Rich Thompson, a kol. *WSRP Specification* [online]. OASIS, 2008-04-01, [cit. 2016-01-19]. S. 17. Dostupné online. (anglicky)
3. ↑  Rich Thompson, a kol. *Web Services for Remote Portlets Specification v 2.0* [online]. OASIS, 2008-04-01, [cit. 2016-01-19]. Dostupné online. (anglicky)
4. ↑  Martin Nicklous, a kol. *JSRs: Java Specification Requests, JSR 168: Portlet Specification 1.0 (Early Draft Review)* [online]. ORACLE, 2003-01-27, [cit. 2016-01-19]. Dostupné online. (anglicky)
5. ↑  Martin Nicklous, a kol. *JSRs: Java Specification Requests, JSR 286: Portlet Specification 2.0* [online]. ORACLE, 2008-06-12, [cit. 2016-01-19]. Dostupné online. (anglicky)
6. ↑  Martin Nicklous, a kol. *JSRs: Java Specification Requests, JSR 362: Portlet Specification 3.0 (Early Draft Review)* [online]. ORACLE, 2016-01-07, [cit. 2016-01-19]. Dostupné online. (anglicky)