Rozšíření CGI – webserver předá požadavek dané externí aplikaci (např. PHP), která daný požadavek obslouží Oddělení webového a aplikačního serveru. Běží zde několik aplikací. 4 vrstvá architektura 1) klientská vrstva 1. webový klient (HTML) 2. plný klient (non-HTML, desktop aplikace) 2) webová vrstva 1. Java EE server-side 2. JSP, servlety 3) bussiness vrstva 1. Java EE server, aplikační server 2. enterprise beans 4) databázová vrstva 1. enterprise information system (EIS) Webový kontejner − obsahuje servlety − JSP stránky EAR − zabalení všech vrstev aplikace do jednoho balíčku − obsahuje v sobě další balíčky, které mají zabalené jednotlivé vrstvy (.war, .jar, .rar) − obsahuje deskriptory sloužící k popisu jednotlivých balíčku (ve formátu .xml) WAR − − − − −
webová jednotka schopná deploymentu na server standardní deskriptor (web.xml, sun-web.xml, *.tld) lib – většinou .jar knihovny classes - .class soubory tags - .tags soubory
Web.xml − mapování URL − chování při výskytu chyby − definice zdrojů (enterprise beans, data sources) − globální parametry − listenery − filtry Základní komponenty − EJB, servlety, JSP, JSTL − frameworky (JSF, Struts, …) − JMS (třídy a rozhraní pro posílání, příjímání a čtení zpráv) − JTA (Java Transaction API) – transakce
− − − − − −
JavaMail – posílání emailů JAXP (Java API for XML Processing) – zpracování XML, SAX, DOM, XSLT JDBC – přístup k relačním databázím JPA – mapování mezi objekty a relační databází JNDI – rozhraní poskytující pojmenování objektů a vyhledávání JAAS – autorizace, autentikace uživatelů
Applet − část javovské aplikace, která umí běžet v prostředí webového prohlížeče Servlet − javovská třída − rozšiřuje schopnost serveru obsloužit http požadavek − vždy pouze jedna instance daného servletu − rozšířeno o javax.servlet.http.HTTPServlet − problém: několik vláken přistupuje ke stejné části kódu najednou – potřeba synchronize – metoda service musí být thread-safe, prostředky pro řízení přístupu − životní cyklus 1) nahrání třídy 2) vyrobení instance 3) iniciování instance pomocí metody init() 4) poté je předán request a response metodě service() 5) pokud je servlet volán opakovaně – volá se už pouze metoda service() 6) pro odstranění z kontejneru – metoda destroy() Vzájemné volání servletů − pomocí objektu RequestDispatcher − include() - řízení se předá zpět − forward() - předávající stránka nemůže nic vypsat do output streamu, může modifikovat request a response Sdílení informací mezi servlety − Web context – žije tak dlouho jako webová aplikace – kontext celé aplikace − Session – svázáno s prohlížečem − Request – svázáno s jedním dotazem (vydrží I forward) − Page – svázáno s konkrétní stránkou (data k dispozici pouze u jedné stránky, po forwardu se maže) − pomocí statické proměnné Cookie = JSESSIONID − reprezentace pomocí objektu HttpSession − invalidate() - zničí session request.getServletPath() - vrací URL servletu request.getContextPath() - vrací kontext, ve kterém servlety běží
JavaServerPages – JSP − textový dokument − obsahuje statická data, většinou XHTML kód − verze: standard a XML − direktivy - %@ – globální informace pro kompilátor − akce – informace pro fázi obsluhy dotazu (XML značky) − skriptovací elementy – kus java kódu (scriptlety, deklarace, výrazy - <%, <%! , <%=) − životní cyklus − v okamžiku prvního zpracování je JSP stránka zkompilována na servlet − dále se vykonává jen servlet z JSP − při každém dalším dotazu na JSP stránku se kontroluje, zda stránka není novější než servlet − pokud ano => provede se kompilace − pokud ne => vykonán existující servlet Objekty v JSP − pageContext – kontext konkrétní stránky − application – aplikační kontext − out – posílání dat na výstup − exception − config − page − request − response JavaBeans − označení pro java třídu − standardizovaný formát − cíl: jednoduchá znovupoužitelnost − často řeší jeden konkrétní problém − musí mít konstruktor bez parametrů − nemá instanční proměnné typu public – vše se řeší přes gettery a settery − možnost serializace − reprezentace: vizuální komponenty (buttony, ..) nevizuální (časovač, DB spojení) − reprezentace aplikační logiky Serializace − objekty se vytvoří proud bytů a pak je možné je uložit do soubor nebo zabalit do streamu a poslat − transient – označení proměnné, které serializovat nechceme (vlákno, připojení k DB) − writeObject(), readObject() - private metody − serializují se instační proměnné a static Unified Expression Language − jazyk pro získávání a zápist dat do objektů (bean) − umožňuje
− číst data − zapisovat data − volat metody objektů − počítat aritmetické operace − výraz začíná $ - okamžité vyhodnocení (immediate evaluation) – backslash ruší interpretaci − výraz začíná # - odložené vyhodnocení (deferred evaluation) − volá se později – může zavolat framework JSTL – JSP Standard Tag Library − kompatibilní se syntaxí XML − existuje několik standardních knihoven značek (Core, XML, SQL, Functions, i18n) − značky obsahují prefix + URI <%@ taglib prefix=”c” uri=”http://java.sun.com/jstl/core_rt”> − sada standardizovaných knihoven např.
− c: je namespace Resource bundle − textový soubor, který obsahuje sadu klíčů a hodnot − používá se pro vícejazyčné aplikace − .properties soubory − defaultní soubor – bundle.properties − další soubory – bundle_cs.properties – zakončené národní značkou Tag Handler − třída sloužící pro implementaci uživatelských značek − když je v JSP stránce nalezena značka, překladač udělá: − vytvoří instanci TagHandleru − zavolá setJspContext(), setParent() − inicializuje atributy značky − vyrobí objekt typu JspFragment a zavolá setJspBody() − zavolá metodu doTag() - vykoná veškerou práci − možnost použití tzv. dynamických atributů – nejsou definovány v .tld souboru ale “za běhu” Tag Library Descriptor − XML soubor, který informuje kontejner o tom, jaké uživatelské značky jsou dostupné − .TLD soubor Google Web Toolkit − překladač z jazyka Java do JavaScriptu ₊ HTML − klientská I serverová část jsou napsané v Javě a pomocí nástroje je klientská přeložena − a zároveň je vytvořeno rozhraní, které dovolí asynchronní komunikaci se serverem − sada JavaScript a Java tříd − vývojové prostředí SDK Entry Point − třída, která se má spustit v okamžiku deploymentu projektu − implementuje rozhraní EntryPoint
− v metodě onModuleLoad() je vytvářeno UI – buttony, labely, .. ale i listenery (v tomto případě handlery) pro obsluhu tlačítek apod. − handlery jsou implementovány pomocí vnitřních anonymních tříd (ale lze vytvořit i pomocí klasické třídy v Javě) GWT moduly − projekty se dělí na moduly − mají deskriptor − obsahují − zděděné moduly − používá I soubor gwt.properties – informace potřebné pro překlad − dynamické zavádění tříd – na základě podmínky, si určím, kterou třídu použiju GWT RPC (Remote Procedure Call) − z klientského kodu je zavolán serverový kód – komunikace pomocí AJAX − pro komunikace jsou potřeba serializovatelné objetky − synchronní rozhraní – definuje interface – implementace na serveru Zavádění kódu − prohlížeč nahraje HTML stránku − <script src=”ModuleName_nocache.js”> - nahrání JavaScriptu − příslušná verze .cache.html vytvoří skrytý <iframe> a nahraje se do něj − po nahrání se spustí vlastní kód aplikace Deferred binding − v okamžiku překladu aplikace kompilátor zjistí “charakteristické rysy” pro daný prohlížeč a vygeneruje přesnou specifickou verzi aplikace podle těchto “požadavků” prohlížeče GWT – práce se session − metoda getThreadLocalRequest() př. getThreadLocalRequest().getSession.setAttribute() GWT a historie v prohlížeci − iframe, ve kterém se historie bude schovávat − odchytávání událostí v UI – tato událost bude nastavena jako bod návratu − vytvoříme nějaký String – reprezentuje daný bod v historii − v historii je vyhledán příslušný String a podle něj je aplikace nastavena do příslušného stavu JavaServer Faces − framework pro vytváření UI − v zásadě řeší životní cyklus stránky (formuláře), UI si pamatuje svůj stav − UI komponenty − server-side validace, konverze dat − události − i18n − navigace − vlastní značky
JSF aplikace − .jsp stránky − obsahuje “backing beans” - JavaBeana, která je spřažena s funkčností stránky − konfigurační soubory – soubor JSF Faces Configuration (XML soubor) – faces-config.xml − další objekty – validátory, konvertory, listenery − první přístup k formuláři poprvé – Initial Request − každý formulář představuje na serveru datovou strukturu ve formě Beany − využití deferred evaluation => value = “#{Osoba.jmeno}” Konverze a validace − řeší se převod Stringu (formulář) na objekt (Java), ale I opačně − u základní datových typů probíhá konverze automaticky − validace – kontrola správnosti dat − nejprve konverze, pak validace − vlastnost immediate (true, false) − vlastnot komponenty, u které se přeskočí konverze a validace − použití u akcí, které nezpracovávají data formuláře popř. ty které zpracovávají jen část formuláře Životní cyklus – initial request – postavení stromu – vytvoření odpovědi (render response) – postback request – postavení stromu – vyčtení parametrů z formuláře – konverze a validace (při alespoň jedné chybě se rovnou přejde na render response) – uložení hodnot (model – Backing beana) – akce a navigace – vytvoření odpovědi JSF komponenty – Tag – inputText, selectOneRadio, … – UIComponent – reprezentace ve stromu – UIInput, UISelectOne, … – Renderer – “vykreslí” komponentu v HTML – Listbox, Text, Radio JDBC − definuje 4 typy ovladačů − typ 1 − použití ODBC protokolu (JDBC-ODBC bridge) − je vyžadován specifický ovladač pro danou databázi
− typ 2 − tento ovladač má za úkol překládat požadavky z JDBC do určitého spec. ovladače, který je určen právě pro jeden typ databáze − typ 1 je podmnožinou tohoto typu ovladače − stejné výhody/nevýhodu jako u typu 1 − typ 3 − mezi aplikací a databází existuje server, který představuje rozhraní − typ 4 − databáze je napsaná v Javě, platformově nezávislé − není třeba žádného prostředníka Třída DriverManager − má na starost dostupné ovladače a spojení s DB − musí znát − ovladače, které jsou k dispozici − URL databáze Třída DataSource a ConnectionPoolDataSource − DataSource je zdroj, který chce přistupovat k databázi − ConnectionPool je sada těchto zdrojů a přistupuje k DB jako celek − šetření prostředků – paměť, čas − v souboru web.xml je potřeba vytvořit odkaz na daný DataSource JNDI − − − − −
spojení s DB lze zaregistrovat do JNDI (Java Naming and Directory Interface) kdo se potřebuju spojit s DB, nejprve vyhledá toto spojení v JNDI vytvoření iniciálního kontextu pro hledání a vyhledání v adresáři Context c = new InitialContext(); dataSource = (DataSource) c.lookup("java:comp/env/jdbc/Y36TW2Pool");
SQLException − zřetězená sada všech výjimek, které nastaly − další výjimky se získavají metodou getNextException() Statement – třída pro práci s databází – Statement získáme voláním metody třídy Connection – metody – executeUpdate() - create, insert, update, delete, executeQuery() - select, vrací ResultSet, … Typy ResultSetů – TYPE_FORWARD_ONLY – procházení pouze metodou next() – TYPE_SCROLL_INSENSITIVE – procházení metodami next() i previous() – neprojeví se změny, které mezitím vznikly v databázi
– TYPE_SCROLL_SENSITIVE – procházení metodami next() i previous() – změny, které mezitím vznikly v databázi se okamžitě projeví Locking a izolace − serializable – pokud transakce manipuluje s daty, transakce ho uzamkne a ostaní musí čekat − pesimistic locking − zamykání všech záznamů, kterou mohou být transakcí ovlivněny − optimistic locking − nezamyká se nic − očekává se, že nedojde k paralelnímu přístupu ke stejným datům Enterprise Beans − bussiness logika na straně serveru − tři typy EJB − session bean − reprezentují aplikační logiku − stateless (jsou obecné, nezávislé na klientovi) − nemusí se ukládat − statefull (jsou svázány s danou session a dokáží si něco zapamatovat) − musí se ukládat − zatěžují více server − vhodné na velké objemy dat − singleton – jako stateless ale v poolu je pouze jedna EJB − entity bean − objekty rezprezentující persistenci − jsou navázány na databázi − objektový přístup k datům − message driven bean − zpracovávají události generované jinými aplikacemi − asynchronní volání − jsou bezestavové − EJB žije v kontejneru – zde jsou ty beany − přístup jak z webové tak z stand-alone aplikace Anotace − aditivní procesní instrukce − přidání metadat k metodám, proměnným, interfacům − @Resource(name = “CustomerDB”), @EJB, @Stateless Reflexe − je schopnost jazyka zjišťovat informace o svých vlastních objektech (za běhu programu) EJB 3.x − beana je POJO (Plain Old Java Object) – třída má prázdný konstruktor, gettery a settery − kontejner řídí životní cyklus této beany
− lokální a vzdálené rozhraní Stateful používat pouze pro desktopové aplikace, v případě webové aplikace – použít HttpServlet. Stateless lze používat u obou. Message Driven Beans − listener, který zpracovává zprávy − 1.způsob - zprávy jsou posílány (asynchronně) do fronty a tato beana je postupně odebírá a zpracovává (point to point, fronta) − 2.způsob – existuje prostředník, který rozhoduje na kterou beanu zprávy zašle ke zpracování – více příjemců (publish / subscribe) − jsou podobné stateless EJB − nejsou stavové − jsou zaměnitelné JMS – Java Message Service − definuje několik typů zpráv − zpráva má hlavičku, vlastnosti a tělo JPA – Java Persistence API − práce na objektové úrovni s relační databází − mapování tabulek a záznámů na POJO − ORM = Object – Relational Mapping − automatické mapování pomocí jmen − anotují se pouze výjimky − v objektech funguje dědičnost − existuje několik interpretací tohoto JPA (Hibernate, Oracle Toplink) Přímá práce s databází pomocí JDBC − zvyšuje chybovost − snižuje přenositelnost kódu − míchají se dvě logické úrovně Entity Manager − stará se o práci s entitama, s připojením (injekcí nebo pomocí factory) − metody – flush() - zapsání do DB, persist(entity) – uložení entity, remove(entity), ... − v něm žijí instance na jednotlivé řádky v tabulce v databáze − připojení pomocí konfiguračního souboru persistence.xml − má své vlastní metody − detached stav − pokud se entita zpropaguje až někam k servletu, tak změna entity v servletu nemá vliv na změnu v databázi − zajistí se pomocí metody EntityManager.merge(obj)
Entita − − − − −
měla by být serializovatelná nesmí být final a ani její metody a atributy nesmí být final musí mít primární klíč @Id musí mít prázdný public nebo protected kontruktor anotovat lze atributy třídy instance nebo její metody (ke getteru) – nelze kombinovat!
Vztahy mezi entitami – unidirectional – jen jedna strana (vlastník) ví o té druhé – @ManyToOne() – bidirectional – obě strany o sobě vzájemně ví – jedna je vlastníkem - @ManyToOne() Spring – IoC (Inversion of Control) – návrhový vzor, který umožňuje uvolnit vztahy (závislosti) mezi svázanými komponentami (vrstvami aplikace) – třída nevytváří sama instance dalších tříd, ale jsou jí dodány nějakým způsobem z vnějšku – constructor injection – setter injection – interface injection – Dependency Injection – jedná se o konkrétní techniku pro vkládání závislostí – využití hollywoodského principu - “Nevolejte nám, my se ozvěme” – IoC kontejner se stará o sestavení jednotlivých komponent dohromady RMI (Remote Method Invocation) – volání vzdálených metod – volání skrze sockety je mnoho režijního kódu => vytvořeny knihovny implementující techniku volání metod umístěných na vzdálených systémech – pouze pro platformu Java – aplikace založena na architektuře klient-server – volání je synchronní a blokovací – klient pracuje se stubem – lokální zástupný objekt – server pracuje se skeletonem – skutečný objekt na serveru Postup vytváření aplikace se vzdáleným objektem 1) definice rozhraní vzdáleného objektu (rozhraní dědí z rozhraní java.rmi.Remote) 2) implementace vzdáleného objektu 3) vygenerování stubů a skeletonů (výstupem jsou .class soubory tříd pro vzdálený objekt) 4) vytvoření instance vzdáleného objektu na serveru (publikování do jmenné služby) 5) získání přístup ke vzdálenému objektu u klienta (Naming.lookup(String))
Další technologie podobné RMI – RPC – platformově závislé – CORBA – platformově nezávislé – DCOM Webové služby – technologie pro tvorbu webových a distribuovaných aplikací – standard pro komunikaci dvou aplikací – využívá protokoly SOAP, HTTP a jazyk XML, WSDL SOAP (Simple Object Access Protocol) – protokol sloužící pro výměnu zpráv založených na formátu XML přes síť (zejména tedy přes HTTP) – definuje jak volat vzdálené procedury (RPC) a jak posílat dokumenty WSDL (Web Services Definition Language) – jazyk pro popis webových služeb – založen na formátu XML – definuje – popis služby (co dělá) – jak danou službu používat – kde službu najít – struktura – portType – abstraktní definice služby – způsob volání služby – SOAP, JMS, přímé volání – ports – kde se dá ke službě přistoupit UDDI (Universal Description, Discovery and Integration) – registr dostupných webových služeb (adresářová služba) – slouží k vyhledání dané služby včetně jejího popisu ve formátu WSDL – popis nám říká, jakým způsobem lze danou službut volat REST (Representational State Transfer) – způsob komunikace s webovou službou – pro komunikaci se využívá metod protokolu HTTP (get, post, put, delete) – služby využívají REST se skládají ze zdrojů a každý je jednoznačně identifikován (URI)
Typy testů – podle automatizace – ruční (je nebo není dostupná specifikace aplikace) – automatické – podle zaměření – unit testy (aplikace i kódu) – systémové testy – integrační testy – zátěžové testy – penetrační testy (simuje roli hackera – snaží se odhalit slabá místa) – regresní testy – crash testy – podle fáze projektu – alfa testy – beta testy Klasifikace chyb – bugy – špatná práce s aplikací, ztráta/poškození dat – nesoulad aplikace se specifikací – špatné pochopení procesu/aplikace uživatelem