Java Server-side
Štěpán Kuchař
[email protected]
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(""); out.println(" "); out.println("
Hello"); out.println(" "); out.println(""); out.println("
Hello World Wide Web
"); out.println(""); out.println(""); } }
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, ...) Web server HTTP požadavek
Servlet container
klient 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 <web-app>
Příklad <description>Příklad servletu <servlet> <servlet-name>pojmenovani_servletu <servlet-class>cz.vsb.cs.Priklad <servlet-mapping> <servlet-name>pojmenovani_servletu
/Hello.do
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” %>
První pokus <% for( int i = 0; i < 10; i++){ %> <% out.print(i); %> | <%= i*i %> |
<% } %>
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 -
, , ... – internacionalizace - , ... – 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
Příklad s JSTL značkami <%@ page contentType="text/html; charset=utf-8" %> <%@ taglib uri="jstl/core" prefix="c" %>
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 <% out.write(myBean.getName()); %> <% 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 URI z direktivy taglib cesta k TLD
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 Servlet přesměruje jej na JSP klient HTTP požadavek
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); } } ... data ze servletu:
...
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, ...