Servlety jsou skvělé na práci s HTTP protokolem, na psaní HTML jsou ale přinejmenším nevhodné. V dnešním díle seriálu si představíme JavaServlet Pages, tedy nadstavbu servletů sloužící pro tvorbu HTML kódu prokládaného výstupem aplikace.
16.6.2013 14:00 | Petr Horáček | přečteno 12992×
JSP neboli JavaServlet Pages, je technologie postavená na Java servletech sloužící především pro ulehčení zápisu výstupu Java aplikace do HTML souborů. Jak jsme si již v minulém díle naznačili, samotné servlety se pro tento účel příliš nehodí.
JSP se používalo podobně jako PHP v podobě spaghetti kódu, HTML zde bylo prokládáno tzv. scriptlety, které nebyly nic jiného než klasická Java. Jak se ale v tomto článku dozvíte, postupem času vznikla celá řada značek a jejich knihoven, které jsou pro tvorbu webových stránek přímo vytvořeny a řeší většinu základních problémů. A abych nezapoměl, JSP slouží v architektuře MVC jako view.
Jak již bylo řečeno v perexu, JavaServlet Pages je nadstavba servletů. Nejlépe si to ukážeme na životním cyklu těchto souborů. JSP uložené v aplikaci při prvním requestu mířeném na něj prochází těmito fázemi:
O výše uvedené úkony se u Apache Tomcatu stará engine Jasper 2.
JSP je možné prokládat klasickým Java kódem, tzv. scriptlety, k jejich užití slouží značky <% %>, <%= %> a <%! %>. Scriptlety jsou stále podporovány pouze z důvodu jejich výskytu ve starých aplikacích. Následující kód je první a poslední ukázka jejich použití, kterou si v tomto seriálu uvedeme. Funkce je triviální, při každém načtení stránky se zvýší zobrazované číslo o 1.
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <!-- deklarace => tento kód bude umístěn v třídě servletu mimo metodu zpracování requestu, zavolá se tedy pouze jednou --> <%! int c = 0;%> <!-- obyčejný kód Javy provádějící inkrementaci --> <% c++;%> <!-- exprese => užití této konstrukce funguje stejně jako <% out.println(c); %>, jde pouze o zkrácený zápis --> <%= c %> </body> </html>
Servletový ekvivalent tohoto kódu by mohl vypadat takto:
import javax.servlet.http.*; import java.io.*; public class cPlus extends HttpServlet { private int c = 0; @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { c++; PrintWriter out = response.getWriter(); out.println("<!DOCTYPE html><html><head>" + "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'></head>" + "<body>" + c + "</body></html>"); } }
Roli scriptletů elegantně nahrazuje řada tagů (neboli značek). Ty lze použít takřka na veškeré úkony, které budeme v šabloně potřebovat (nezapomeňte: veškerá logika MVC aplikace je umístěna v modelech a controllerech, JSP slouží view, a proto se stará pouze o vykreslování zaslaných dat).
Tagy obstarávají vypisování proměnných, cyklení, formátování textu, vkládání externích šablon, práci s JavaBeany (o kterých ještě bude řeč) ad. Je dokonce možné vytvářet vlastní knihovny tagů a pokrýt tak i specifické nároky aplikace.
EL je v JSP hojně užívaný jazyk, slouží k vypisování hodnot uložených v requestu, session, stránce či aplikaci. Tato data je možné vypisovat přímo do stránky, či jako paramtry do atributů tagů.
EL je schopné, podobně jako jiné jazyky, vyhodnocovat i logické (and, &&, or ||, not, !), aritmetické (+, -, *, /, div, %, mod) a relační (==, eq, !=, ne, <, lt, >, gt, <=, le, >=, ge) operace. Pokud chceme vypsat hodnotu uloženou v poli či JavaBeanu, můžeme využít tečkovanou konvenci nebo k hodnotám přistupovat přes hranaté závorky.
Zde je několik příkladů EL:
${"Ahoj světe"} <!-- vypsání řetězce --> ${ahoj} <!-- vypsání proměnné --> ${zdvorilosti.ahoj} ${zdvorilosti[ahoj]} <!-- dvojí přístup k hodnotě v objektu JavaBean či v poli --> ${5 > 3} <!-- použití relačních operátorů, vrací True -->
Na další možné kombinace a použití určitě přijdete sami.
JSP samo o sobě poskytuje jen několik tagů, pro jejich použití není třeba používat žádné externí knihovny. Zde je jejich seznam:
<jsp:forward page="stranka.jsp" /> <!-- přesměrování na další stránku --> <jsp:include page="stranka.jsp" /> <!-- vložení externí stránky --> <jsp:useBean id="idBeanu" scope="page/application/request/session" class="trida" /> <!-- vložení JavaBeanu, pokud není zadaný Bean nalezen, vytvoří se nový, parametr scope udává rozsah platnosti --> <jsp:setProperty name="idBeanu" property="atribut" value="hodnota" /> <!-- zapíše hodnotu do Beanu, pokud zapisujeme do requestu, použijeme místo atributu value atribut param --> <jsp:getProperty name="idBeanu" property="atribut" /> <!-- získá hodnotu z Beanu -->
Jak vidíte, samotné JSP tagy příliš funkcionalit neposkytují. Pro účely větvení kódu, cyklení, vkládání proměnných, formátování řetězců apod. jsou zde knihovny tagů JSTL (JSP Stanard Tag Library), jmenovitě: Core, Formatting, SQL, XML, JSTL functions.
Tyto knihovny je třeba do aplikace přidat (například v podobě JAR souboru) a v JSP je nutné vložit prefix je zmiňující. Podrobnou dokumentaci můžete nalézt zde: http://www.tutorialspoint.com/jsp/jsp_standard_tag_library.htm.
Tato knihovna obsahuje základní funkce pro vypisování proměnných, větvení kódu, cyklení i práci s URL. Zde je kód pro import knihovny a několik jejích tagů.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!-- tento tag je potřeba umístit na začátek dokumentu pro import knihovny --> <c:out value="<h1>Ahoj</h1>" /> <!-- slouží pro bezpečné vypisování řetězců a proměnných, díky jeho parametru escapeXML, který je primárně zapnutý, tento tag vypíše „<h1>Ahoj</h1>“, tedy <h1>Ahoj</h1> --> <c:catch></c:catch> <!-- pokud se kód mezi těmito tagy nepovede zpracovat, nezobrazí se chybové hlášení, pouze se tento blok přeskočí a nevypíše --> <c:if test="${2 > 1}"> <p>2 je větší než 1<p> </c:if> <!-- pokud se operace zadaná pomocí EL v parametru test ukáže jako pravdivá, vypíše se tělo tagu --> <c:forEach var="z" items="${zmrzliny}"> <c:out value="${z.nazev}"/> <c:out value="${z.barva}"/> </c:forEach> <!-- vypíše vlastnosti všech zmrzlin ze seznamu -->
Knihovna Formatting slouží k formátování zobrazovaných textů, datumů, časů a čísel.
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!-- opět je zde import potřebné knihovny --> <fmt:formatDate pattern="d. M. yyyy H.mm:ss" value="${datum}" /> <!-- vypíše předaný objekt data v zadaném formátu -->
Tuto knihovnu se doporučuje nepoužívat. Stará se o přímou komunikaci s databází, tyto úkony ale do viewu rozhodně nepatří.
Jak název napovídá, pomocí tagů z této knihovny můžeme zpracovávat XML soubory.
Tagy této knihovny slouží převážně k práci s řetězci.
Nejjednoduším formou vlastních tagů jsou soubory s příponou .tag, umístěné ve složce /WEB-INF/tags. Obsah těchto JSP, lze v nich tedy používat další knihovny, EL atd. Tagům je možné předává parametry v pomocí atributů. Pokud jsou parametry příliš dlouhé, lze je umístit do těla tagu.
Pomocí tagů můžeme například vytvořit hlavní šablonu stránky (s hlavičkou a patičkou), dalšími tagy doplníme menu a jiné opakované prvky stránky.
Hlavní soubor index.jsp:
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!-- import vlastní knihovny tagů --> <%@ taglib tagdir="/WEB-INF/tags" prefix="m" %> <!-- otevření vlastního tagu (s předaným atributem titulku), dál se bude nacházet jeho tělo --> <m:Main titulek="Titulek stránky"> <h1>Ahoj světe</h1> <m:Menu/> <!-- vložení tagu Menu --> <p>Vítejte na našem webu</p> </m:Main>
Main.tag:
<!-- přidává povinný atribut Titulek --> <%@ attribute name="titulek" rtexprvalue="true" required="true" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>${titulek}</title> <!-- zadaný parametr se zde vypíše pomocí EL --> </head> <body> <jsp:doBody/> <!-- místo, do kterého se vypíše tělo tagu --> </body> </html>
Menu.tag:
<ul class="menu"> <li>Úvod</li> <li>Kontakt</li> </ul>
Vlastní tagy můžeme vytvořit také implementací třídy SimpleTagSupport, tímto způsobem se dají vytvořit i složitější funkce zapsané přímo Javou. Další možností je tvorba vlastních EL funkcí. Tyto vymoženosti ale nejsou úplně triviální, a proto se jim budeme raději věnovat v samostatném článku.
Tak to je k dnešnímu poněkud rozsáhlejšímu článku všechno. V příštím díle se konečně vrhneme na praktičtější téma, instalaci Javy a vývojového prostředí NetBeans.