Java Server-side Štěpán Kuchař stepan.kuchar@vsb.cz VŠB-TUO FEI Katedra informatiky
Trocha historie 500 před n. l. Pythagoras založil bratrstvo vyznávající reinkarnaci, vegetariánství, mystický význam čísel a odmítání fazolí (beans) jako potravy (obsahují duše zemřelých) 850 n. l. arabský pasák koz Kaldi zjistil, že se jeho stádo chová divně a objevil kávu a účinky kofeinu. konec 17. století pěstování kávových zrn na ostrově Java, spojení názvu s kávou obecně 1995 jazyk Oak firmy Sun má problémy s názvem, zvolen název Java a spojení produktů s kávou
Java Editions J2SE Standard Edition standardní Java API, jak ho znáte J2ME Micro Edition okleštěná SE pro mobilní zařízení J2EE Enterprise Edition dodatečné knihovny a nástroje pro enterprise aplikace součástí jsou i knihovny pro tvorbu serverside webových aplikací
Java Server-side Java Servlet specifická Java třída obsahuje metody, kterými zpracovává příchozí HTTP požadavky a generuje na ně odpovědi JSP webová stránka rozšířená o speciální značky vykonávající určitou logiku JSF nádstavba nad JSP mocnější UI komponenty, event-driven přístup
Java Servlet normální třída dědící z třídy javax.servlet.http.httpservlet (J2EE) obsahuje zpracování příchozích požadavků a generuje na ně HTTP odpovědi void doget(httprequest request, HttpResponse response) void dopost(httprequest request, HttpResponse response) void dohead(httprequest request, HttpResponse response) void doxyz(httprequest request, HttpResponse response)
Java Servlet příklad import java.io.*; import javax.servlet.http.*; public class Priklad extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response){ response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<html>"); out.println(" <head>"); out.println(" <title>hello</title>"); out.println(" </head>"); out.println("<body>"); out.println(" <h1>hello World Wide Web</h1>"); out.println("</body>"); out.println("</html>"); } }
Servlet Container komponenta webového serveru zajišťuje chod Servletů typy kontejnerů rozšíření webového serveru (Apache/JServ,...) s vestavěným web serverem (Jetty,...) aplikační server (Tomcat, JBoss,...) HTTP požadavek Web server klient Servlet container HTTP odpověď Servlet Servlet
Nasazení Servletů nutnost dodržet specifickou adresářovou strukturu při nasazení webové aplikace webovou aplikaci je pak možné zabalit do war souboru (web archive) war archív = přejmenovaný zip s konkrétní strukturou war se pak nasadí rovnou do servlet kontejneru (v Apache Tomcat do adresáře webapps)
Struktura webové aplikace povinný adresář WEB-INF adresář classes přeložené třídy aplikace adresář lib potřebné jar knihovny soubor web.xml konfigurace aplikace veškerý obsah WEB-INF je nepřístupný klientovi (nejde se na něj dostat přes URL) nepovinný adresář META-INF soubor MANIFEST.MF kdy/kdo/čím vytvořil
Konfigurace webové aplikace web.xml XML soubor obsahující veškerou konfiguraci <?xml version="1.0" encoding="utf-8"?> <web-app> <display-name>příklad</display-name> <description>příklad servletu</description> <servlet> <servlet-name>pojmenovani_servletu</servlet-name> <servlet-class>cz.vsb.cs.priklad</servlet-class> </servlet> <servlet-mapping> <servlet-name>pojmenovani_servletu</servlet-name> <url-pattern>/hello.do</url-pattern> </servlet-mapping> </web-app>
HTTP Sessions rozhraní javax.servlet.http.httpsession součást objektu HttpRequest /* nastavení atributu do session (metoda getsession automaticky session vytvoří, pokud ještě neexistuje) */ request.getsession().setattribute( nazevattr, hodnota ); // získání hodnoty atributu ze session Object value = request.getsession().getattribute( nazevattr ); // zrušení session request.getsession().invalidate(); // nastavení délky neaktivity před zrušením v sekundách request.getsession().setmaxinactiveinterval(300); // tento atribut je možné nastavit i ve web.xml
Vlastnosti Servletů přístup k Java API možnost vrstvit aplikace rozdělením logiky do více tříd tvorba kódu stránky přímo ve třídě prezentační část je součástí logiky spousta zbytečného kódu jeden Servlet odpovídá jednomu URL složitá konfigurace
Java Server Pages webová stránka se speciálními značkami možnost psát do stránky přímo Java kód podobnost s PHP opačný přístup k webu než Servlety Servlet je logika, která generuje stránku JSP je stránka, která obsahuje logiku JSP jsou však nakonec kompilovány na Servlety
Prvky JSP direktivy informace pro překladač do Servletů <%@ page contenttype= text/html; charset=utf-8 %> <%@ page import= java.util.* %> <%@ include file="include.jsp" %> scriptlety - kód ve stránce <% libovolný Java kód %> <%= výpis na výstup %> <%! definice metody %> JSP značky
Scriptlety v JSP <%@ page contenttype= text/html; charset=utf-8 %> <html> <head> <title>první pokus</title> </head> <body> <table> <% for( int i = 0; i < 10; i++){ %> <tr> <td><% out.print(i); %></td> <td><%= i*i %></td> </tr> <% } %> </table> </body> </html>
JSP značky možnost definice speciálních XML značek provádějících nějakou logiku logika značek je popsána Java třídami dědícími z tříd v balíku javax.servlet.jsp.tagext oddělení prezentace od logiky možnost tvorby vlastních značek mnohem přehlednější než scriptlety několik základních značek nedostačující volně použitelné knihovny značek podobnost s komponentním programováním
JSTL knihovna Java Server Pages Standard Tag Library knihovna základních užitečných značek programové struktury - <c:if>, <c:foreach>,... internacionalizace - <fmt:message>,... práce s databází - <sql:query>, <sql:update>,... práce s XML - <x:parse>, <x:transform>,... nahrazují nejčastější operace ze scriptletů k popisu výrazů používá speciální jazyk výrazů Expression Language
Expression Language (EL) zapisuje se pomocí ${...} všude, kde je třeba pracovat s výrazy, proměnnými, apod. popisuje všechny potřebné operace aritmetické, logické, relační, ternární operátory práce s poli, kolekcemi, zobrazeními, objekty implicitní objekty request, session,... získávání hodnot z formuláře <c:out value= ${param.jmeno} />
Příklad s JSTL značkami <%@ page contenttype="text/html; charset=utf-8" %> <%@ taglib uri="jstl/core" prefix="c" %> <html> <body> <table> <c:foreach begin="1" end="10" var="i"> <tr> <td><c:out value="${i}" /></td> <td><c:out value="${i*i}" /></td> </tr> </c:foreach> </table> </body> </html>
Java Beans komponentní technologie Javy JavaBean je jednoduchá komponenta, která poskytuje data a zpracovává události struktura JavaBean implementace Serializable rozhraní konstruktor bez parametrů getter/setter metody podle Java konvence (getname/setname, kde name je atribut beanu) listeneři na události
Java Beans v EL EL umí pracovat s daty obsaženými v beanech jednoduchý přístup přes tečkovou konvenci převádí se na volání getter/setter metod příslušného atributu <c:out value= ${mybean.name} /> <% out.write(mybean.getname()); %> <c:set target= ${mybean} property= name value= newname /> <% mybean.setname( newname ); %>
Nasazení JSP JSP stránky umístěny kdekoli mimo adresáře WEB-INF a META-INF musí být přístupné klientovi přes URL popisné soubory značek *.tld v adresáři WEB-INF rozšíření konfigurace web.xml <taglib> <taglib-uri>uri z direktivy taglib</taglib-uri> <taglib-location>cesta k TLD</taglib-location> </taglib>
Vlastnosti JSP scriptlety logika je součástí prezentace malá přehlednost a těžká spravovatelnost nepoužitelné pro velké projekty značky oddělení logiky od prezentace ne vše pokryjí knihovní značky pracnost složité vrstvení aplikace
Kombinace JSP a Servletů Servlet pracuje s daty, JSP zobrazuje data striktní oddělení prezentace od logiky v JSP jen knihovny pro zobrazování obsahu JSTL core + knihovny s grafickými prvky Servlet přidá zpracovaná data do atributů požadavku a přesměruje jej na JSP klient HTTP požadavek Servlet rozšířený HTTP požadavek HTTP odpověď JSP
Kombinace JSP a Servletů public class SimpleServlet extends HttpServlet { public void doget(request, response) { request.setattribute("mydata","nejaka moje data"); RequestDispatcher dispatcher = request.getrequestdispatcher("/view.jsp"); dispatcher.forward(request, response); } }... <p> data ze servletu: <c:out value= ${mydata} /> </p>... JSP Servlet
Nasazení JSP a Servletů *.class soubory Servletů jsou umístěny do WEB-INF/classes JSP se často umisťují i do adresáře WEB-INF je to umožněno tím, že na JSP se neodkazuje přímo uživatel, ale Servlet vhodné kvůli schování JSP před uživatelem, protože JSP vyžaduje pro správnou funkčnost data, která naplní Servlet web.xml prvky pro Servlety i JSP v jednom
MVC Frameworky návrhový vzor Model-View-Controller zjednodušují práci s JSP/JSF a Servlety jediný Servlet slouží jako řadič provádí přesměrování všech requestů slouží jako jediný vstupní bod upravuje formát dat v requestu, provádí validaci dat, apod. Jakarta Struts, Spring framework,...