Java Servlet
Servlet (anglická výslovnost [ˈsəːvlit]) je program napsaný v jazyce Java, který je nástrojem pro tvorbu webových aplikací. Funguje na principu zpracování HTTP požadavků a generování HTML stránek. Tvoří vrstvu mezi HTTP požadavkem od webového klienta a databází nebo aplikací na jiném serveru. Servletem je každá Java třída, která implementuje interface javax.servlet.Servlet. Protože ale z praktického hlediska má smysl uvažovat pouze servlety obsluhující protokol HTTP, je důležitější vědět, že HTTP servletem je každá třída, která je potomkem třídy javax.servlet.http.HttpServlet.[1]
Úvod
Základní použití servletů:
- Zpracování dat z HTML formulářů.
- Získávání dat z databáze.
- Řešení bezstavového problému protokolu HTTP.
- Vytváření dynamického obsahu webu.
Java Servlety často slouží ke stejnému účelu jako programy realizované pomocí Common Gateway Interface ( CGI). Ale Servlety nabízejí několik výhod ve srovnání s CGI:
- Výkon je výrazně vyšší.
- Servlety se pouští v adresním prostoru webového serveru. Není tedy nutné vytvářet samostatný proces pro zpracování každého požadavku klienta.
- Servlety jsou nezávislé na platformě, protože jsou psány v Javě.
- Plná funkčnost knihoven jazyka Java je servletům k dispozici. Je možné komunikovat s databází nebo jiným virtuálním strojem pomocí RMI.
Technicky vzato je servlet třída z Java EE, která je v souladu se Java Servlet API. To je standard pro implementaci Java tříd, které reagují na HTTP požadavky a najdeme jej v balíčcích javax.servlet a javax.servlet.http. Servlety by v zásadě mohli komunikovat přes libovolný protokol typu klient-server, ale nejčastěji jsou používány s protokolem HTTP. Běžně generovaný dynamický obsah je HTML, ale může se jednat i o jiné jazyky například XML. Servlety mohou udržovat stav relace pomocí HTTP cookies nebo přepisováním URL.
Struktura
Třída typu Servlet v naprosté většině případů rozšiřuje (klíčové slovo extends) třídu HttpServlet. Dále je nutné přepsat (klíčový pojem @Override) metodu doGet(), která bere parametr typu HttpServletRequest a HttpServletResponse a nevrací žádnou návratovou hodnotu, aby pro nás Servlet vytvořil HTML stránku. Metoda musí propouštět (throws [θrəus]) nebo zpracovávat výjimku IOException. Třída neobsahuje metodu main(), protože všechny metody jsou volány kontejnerem. V případě, že bychom nepřepsali metodu doGet(), museli bychom přepsat jinou metodu, například doPost(). Pro vypsání textu na stránku je nutno vytvořit objekt třídy PrintWriter a přiřadit do našeho objektu volání metody getWriter() na parametru typu HttpServletResponse metody doGet(). Poté jen zavoláme nad objektem typu PrintWriter metodu println() s parametrem typu String, který obsahuje text ve formátu HTML. Kód by mohl vypadat nějak takto:
public class MujServlet extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter print = response.getWriter(); print.println("Text ve formatu HTML"); } }
Rozdíly mezi metodami doGet() a doPost()
Povinností třídy rozšiřující třídu HttpServlet je přepsat minimálně jednu metodu, která zpracovává příchozí HTTP dotaz. Nejvyužívanějšími metodami jsou právě metody doGet() a doPost(). Předpis obou metod je velice podobný:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {}
Tyto metody se liší ve způsobu, jakým zasílají data. Metoda doGet() posílá data pomocí parametrů uvedených na konci URL adresy. Tento způsob není vhodný při vkládání dlouhých textových řetězců a způsobuje opětovné posílání dat při obnově stránky. Metoda doPost() posílá data uvnitř HTTP dotazu. Díky tomu je nám umožněno posílat textové řetězce téměř neomezené délky. Nejsme ovšem schopni přečíst data zvenku, což může být výhodou. Pokud metodu použijeme korektně, tak nedojde k opakovanému posílání dat.
Rozdíly mezi Filtry a Listenery
Servletový Filtr je třída implementující Java třídu Filter a primárně slouží ke sledování žádostí a odpovědí odeslaných resp. přijatých Servletem. Filtr se používá například pro autentizaci uživatele. Naproti tomu Servletový Listener sleduje události ve webovém kontejneru a nějakým způsobem na ně reaguje. Událostí může být například spuštění nebo ukončení aplikace. Příkladem Listeneru může být třída implementující Java třídu HttpSessionListener nebo ServletContextListener.
JSP
Java Server Pages alias JSP jsou textové soubory s příponou .jsp, umístěné ve webové aplikaci, které jsou při prvním požadavku na zobrazení automaticky převedeny servletovým kontejnerem na servlet (.java) a přeloženy do Java třídy (.class). Servlety vzniklé z JSP stránek jsou mapovány na URL původního textového souboru.[2] Server (např. Apache Tomcat) následně předá servletu požadavek HTTP. Psaní kódu v JSP souboru je podobné psaní kódu v jazyce PHP. Hlavní výhodou JSP je násobně menší množství napsaného kódu, než kdyby byl kód napsán ve třídě Servlet. V případě, že se rozhodneme využívat JSTL, množství napsaného kódu se ještě více zredukuje, protože není nutné psát kód v jazyce Java, ale jen používáme tagy z JSTL knihovny. JSTL je knihovna usnadňující časté operace pomocí již vytvořených značek. Pracuje s cykly, vyhodnocováním, formáty či databází (práce s databází z JSP by ale porušila MVC).[3]
Webový Server
Pro použití servletů je potřeba mít webový server, který se také někdy označuje jako servlet kontejner. Nejčastěji se servlety zabalí do WAR archívu a provede se jejich nasazení (deploy) na server. Mezi webové servery patří například Apache Tomcat. Webový server v sobě obsahují i aplikační servery jako GlassFish, JBoss nebo Web Logic.
Životní cyklus servletu
Pro životního cyklu servletu jsou zásadní 3 metody. Jsou to metody init(), service() a destroy(). Jsou implementovány každým servletem a jsou vždy volány v určitý okamžik jeho životního cyklu. Využití metod je patrné v následujícím scénáři.
- Předpokládejme, že uživatel chce navštívit konkrétní URL.
- Webový prohlížeč na tuto URL odešle HTTP request.
- Tento požadavek poslán na příslušný server.
- HTTP je přijat webovým serverem a předán servlet kontejneru.
- Kontejner namapuje požadavek na konkrétní servlet.
- Servlet je dynamicky načten a uložen do adresního prostoru kontejneru.
- Kontejner zavolá metodu
init()
příslušného servletu.- Tato metoda je volána pouze při prvním načtení servletu do paměti.
- Je možné nastavit inicializační parametry pro prvotní konfiguraci servletu.
- Kontejner zavolá metodu
service()
příslušného servletu.- Tato metoda se volá pro zpracování HTTP requestu.
- Servlete může číst data poskytovaná HTTP requestem.
- Servlet může vygenerovat HTTP response (odpověď) pro klienta.
- Servlet zůstává v paměti a je k dispozici pro zpracování dalších HTTP requestů od klienta.
- Metoda
service()
je volána pro každý HTTP request.
- Metoda
- Kontejner se v určitém okamžiku rozhodne odebrat servlet z paměti.
- Algoritmus pro rozhodování o smazání servletu se u jednotlivých kontejnerů liší.
- Kontejner zavolá metodu
destroy()
a ta mu odebere všechny zdroje, které má servlet přiděleny. - Paměť alokovaná pro servlet a jeho objekty pak může být uvolněna garbage collectorem.
Využití v dnešních aplikacích
Ačkoli je možné pomocí servletů generovat HTML, tak se to kvůli přehlednosti a členění kódu nedělá. Dříve se v MVC návrhu používala pro zobrazovací vrstvu technologie Java Server Pages ( JSP), ale dnes spíše převažuje novější technologie Java Server Faces ( JSF). Nad samotnými servlety jsou pak vytvořeny frameworky, které se v dnešní době takřka výhradně používají. Jsou jimi Enterpise Java Beans ( EJB) nebo třeba také Spring.
Reference
- ↑ http://kore.fi.muni.cz/wiki/index.php/Úvod_do_webových_aplikací, Servlet API (česky)
- ↑ http://kore.fi.muni.cz/wiki/index.php/Java_Server_Pages, JSP – Java Server Pages (česky)
- ↑ http://www.linuxsoft.cz/article.php?id_article=1970 Archivováno 18. 5. 2014 na Wayback Machine., Java na Webu II. – Základní stavba : JSP (View) (česky)