JavaBeans, Junit, JavaDoc Lumír Návrat Katedra informatiky FEI VŠB-TUO A-1018 / 597 323 252 http://www.cs.vsb.cz/navrat/ lumir.navrat@vsb.cz
Obsah Úvod do komponent JavaBeans komponenty JUnit JavaDoc
Motivace Vývoj Distribuce Údržba Opakovaná použitelnost Snadnost testování Možnost specializace výrobců Distribuce Rychle uvedení na trh Nezávislost na dodavateli Údržba Snížení nákladů na údržbu Zaměnitelnost – tlak odběratelů na standardizaci
Co je to komponenta? (1) Stavební jednotka se smluvně definovanými: rozhraními; explicitními kontextovými vazbami Napájení Mobilní telefon IKeyboard GSM modul IBluetooth
Co je to komponenta? (2) Může být použita nezávisle na prostředí, pro které byla vytvořena, prostředí, ve kterém byla vytvořena. MS Office Print MyApp MPEG Player (C++) Home Video (Java) Movie Library (PHP)
Co je to komponenta? (3) Je určena pro integraci třetí stranou Autor komponenty Neví, kdo a k čemu bude jeho komponenty využívat Musí dodržet stanovené rozhraní Autor aplikace Neví, kdo bude dodávat komponenty Komunikuje přes stanovené rozhraní Integrátor Propojí aplikaci s vhodnými komponentami
Požadavky na komponenty Úplná dokumentace Důkladné testování Robustní kontrola platnosti vstupů Vracení dostatečných informativních chybových zpráv Vycházet s toho, že komponenta bude použita k předem nepředpokládaným účelům.
Specifikace komponenty Stav Vlastnosti – čtení, nastavení Chování Operace – volání, parametry, výsledek Interakce s okolím Události – registrace, oznámení
Java Beans “Write once, run anywhere, reuse everywhere” Přidávání funkcí bez nutnosti přepisovat úplně všechno Provádění na všech platformách Použití v různých scénářích – aplikacích, jiných komponentách, dokumentech, www stránkách, nástrojích pro vývoj aplikací, … Komponenta jako stavební blok Kontejnery – kombinace komponent do struktur Principy manipulace a komunikace s komponentami z vnějšího prostředí Introspekce Zpracování událostí Persistence
Typy komponent Vizuální komponenty Nevizuální komponenty Mají vizuální reprezentaci zabírající prostor v okně aplikace Příklad: tlačítko, tabulka, rolovací seznamy Podpora ve vizuálních nástrojích Nevizuální komponenty Příklad: časovač, databázové spojení, kontrola pravopisu, …
Scénáře použití (1) Využití grafického návrhového prostředí Rozložení komponent v okně aplikace Nastavení vlastností komponent Barva, typ písma, klávesové zkratky, … Využití editorů vlastností (property editor) Propojení komponent a zápis metod pro zpracování událostí Testování Vytvoření instalace aplikace včetně komponent
Scénáře použití (2)
Scénáře použití (3) Použití v ručně psaném programu Vytvoření instancí komponent a nastavení jejich rozměrů a pozic Nastavení vlastností komponent Vytvoření metod pro zpracování událostí Registrace metod pro zpracování událostí Testování Vytvoření instalace aplikace včetně komponent
Scénáře použití (4) import java.awt.Color; import javax.swing.JLabel; import java.io.Serializable; public class SimpleBean extends JLabel implements Serializable { public SimpleBean() { setText( "Hello world!" ); setOpaque( true ); setBackground( Color.RED ); setForeground( Color.YELLOW ); setVerticalAlignment( CENTER ); setHorizontalAlignment( CENTER ); }
Scénáře použití (4) JTextField textovePole = new JTextField(); JButton okTlacitko = new JButton(); SimpleBean nasBean = new SimpleBean(); private void jbInit() throws Exception { textovePole.setCaretColor(Color.orange); textovePole.setText(“Přednastavená hodnota”); okTlacitko.setText(“&Ok"); okTlacitko.addActionListener( new Aplikace_OKTlacitko_actionAdapter(this)); this.add(nasBean); this.add(textovePole); this.add(okTlacitko); } public void okTlacitko_actionPerformed(ActionEvent e) { //TODO: obsluha stisknutí Tlačítka
Demo Ukázka vytvořené komponenty Její použití v GUI Zdrojové soubory: http://www.cs.vsb.cz/navrat/ctc/cviceni1/SimpleBean.java http://www.cs.vsb.cz/navrat/ctc/cviceni1/buildSimpleBean.xml
Struktura komponenty Vlastnosti (properties) Metody (methods) Přístup prostřednictvím přístupových metod (čtení, zápis hodnoty), ne přímo Metody (methods) Operace nad komponentami Události (events) Vazby mezi komponentami
Příklad komponenty Counter vlastnosti CounterBean int value void clear() void increment() metody
Vlastnosti – Přístupové metody (1) public int getValue() private int value; public void setValue(int val) PTE - Kompnentní technologie
Přístupové metody (2) public class CounterBean implements Counter { private int value; public int getValue() { return this.value; } public void setValue(int val) { this.value=val; //Pokračovaní kódu příště
Přístupové metody (3) Vlastnosti určené pouze pro čtení Mají pouze metodu getXXX() Vlastnosti určené pouze pro zápis Mají pouze metodu setXXX() Vlastnosti typu boolean Metoda pro čtení se může jmenovat isXXX() public boolean isEmpty();
Indexované vlastnosti public int getValue(int index) private int[] value; public void setValue(int index,int val)
Speciální vlastnosti Vázané vlastnosti (bound proprties) Generují událost PropertyChange, pokud se mění jejich hodnota Vlastnosti s omezením (constrained properties) Generují událost VetoableChange, pokud se mění jejich hodnota Změna může být zakázaná
Použití vlastností komponent Atributy objektů ve skriptovacích jazycích JavaScript, El-expresion language Programový přístup přes veřejné přístupové metody Přístup přes formuláře (property sheets) v návrhových prostředích Čtení a zápis do perzistentní paměti PTE - Kompnentní technologie
Úkol Rozšiřte komponentu Counter o následující vlastnosti: Název vlastnosti Typ Přístup Popis jeNula boolean Čtení Test zda Counter je ve výchozí hodnotě. pocetPrekroceni int Čtení, bounded Každé dosažení maxima, zvýší hodnotu o jedna Maximum Čtení/zápis, constrained Maximální hodnota čítače. Po dosažení bude čítač vynulován.
Metody Za metody komponenty se považují všechny veřejné (public) metody třídy public void clear() { val=0; } public void increment() { val++; Miniúkol: Přidejte metodu: increment
Události (1) Zdroj událostí Posluchač (listener) Objekt, který generuje události Spravuje seznam registrovaných posluchačů Posluchač (listener) Objekt, který chce být o události informován Musí být registrován u zdroje událostí Musí implementovat dohodnuté rozhraní
Události (2) Registrovaní posluchači Posluchač registrace Posluchač Zdroj událostí registrace Posluchač addEventListener vznik události nastala událost (e) Informace o události EventObject e
Zpracování událostí Posluchač se zaregistruje u zdroje událostí (např. u tlačítka, na jehož stisknutí čeká) Uživatel stiskne tlačítko – vznikne událost Zdroj události (tlačítko) projde seznam registrovaných posluchačů a každému z nich oznámí vznik události: Zavolá dohodnutou metodu rozhraní posluchače Metodě předá informace o události (podtřída java.util.EventObject)
Informace o události //Objekt přenášející informace i vygenerované public class CounterEvent extends EventObject { public CounterEvent(Counter source) { super(source); } public Counter getCounter() { return (Counter)source;
Posluchač (1) public interface CounterEventListener extends EventListener { //byla překročena maximální hodnota void limitReached( CounterEvent event); void reseted(CounterEvent event); } Miniúkol: Přidejte událost: Reseted
Posluchač (2) class MyListener implements CounterEventListener { public void limitReached(CounterEvent event){ System.out.println(“Čítač vynulován“); } public void reset(CounterEvent e) { System.out.println(“Překročen limit!“); //Pokračování, pokud máme více událostí Miniúkol: Implementujte pro předchozí události příslušné reakce.
Registrace posluchače (1) public class CounterBean implements Counter{ //Slíbené pokračování třídy public void addCounterEventListener( CounterEventListener listener) { //registrace posluchačů } public void removeCounterEventListener( CounterEventListener listener) //zrušení registrace posluchače
Registrace posluchače (2) class MyListener implements CounterEventListener { void run() { Counter counter = new CounterBean(); counter.addCounterListener(this); counter.clear(); // … } public void limitReached(CounterEvent event){//…} public void reset(CounterEvent e) {//…} PTE - Kompnentní technologie
Adaptér (1) Rozhraní EventListener pro konkrétní komponentu může obsahovat mnoho metod Chceme-li reagovat jen na některé události: Musíme buď implementovat prázdné reakce na ostatní události Nebo použijeme adaptér jako bázovou třídu a implementujeme jen zvolené metody Adaptér implementuje implicitní odezvu na všechny události PTE - Kompnentní technologie
Adaptér (2) class CounterAdapter implements CounterEventListener { public void reset(CounterEvent e) {} public void limitReached(CounterEvent e) } PTE - Kompnentní technologie
Adaptér (3) Counter counter = new Counter(); //použití anonymní vnitřní třídy counter.addCounterListener( new CounterAdapter { public void reset(CounterEvent e) { System.out.println(“Reset”); } }); PTE - Kompnentní technologie
Úkol Vytvořte komponentu, která bude představovat zásobník. Podrobné zadání: http://www.cs.vsb.cz/navrat/vyuka/ctc/cviceni2/cviceni2.html
Persistence Automatická Vlastní Implementace rozhraní Serializable Pomocí klíčového slova transient Metody readObject() a writeObject() private void writeObject(java.io.ObjectOutputStream out) throws IOException; private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; Implementace rohraní Externalizable
Další informace Introspekce – automatická analýza komponenty, pomocí níž získáme informace o vlastnotech, metodách, událostech Property editory – možnost editovat vlastnosti v rámci jejich editorů (v GUI apod) BeanContext – vazby mezi komponentami a prostředím, ve kterém běží Odkazy na domovské stránky k Java Beans http://java.sun.com/products/javabeans/ http://java.sun.com/docs/books/tutorial/javabeans/
Co je to chyba? Jakýkoliv problém, snižující kvalitu programu. Funkcionalita Užitná hodnota Spolehlivost Výkon Požadavky uživatele
Testování programů (1) Verifikace Validace Ověřování interní konzistence produktu (zda produkt odpovídá návrhu, návrh analýze, analýza požadavkům) Formální verifikace – často obtížná Validace Ověřování (externím nezávislým zdrojem), zda celé řešení splňuje očekávání uživatelů nebo klientů.
Testování programů (2) Cíl: Snížení rizika výskytu chyby Nutný pesimismus! Výskyt chyby je třeba očekávat. Nejdůležitější pravidlo pro testování je dělat ho. (B. Keringham a R. Pike – The Practice of Programming) Opakované testování (re-testing) Kontrola, zda jsme chybu odstranili. Regresní testování Kontrola, zda jsme úpravou nevnesli nove chyby
Typy testů (1) Rozdělení na testy, které: jsou součástí výsledného produktu; jsou odděleny od výsledného produktu (náplní této kapitoly). Rozdělení dle množství informací, které máme pro testování. black box testing – osoba, která vytváří test nemusí mít informace o tom, jak funguje aplikace na úrovni, na které je test vytvářen. white box testing – pro vytváření testů je nutné znát informace o fungování testované části
Typy testů (2) „Ruční“ testování Automatické testování náročné není opakovatelné snadno se přehlédnou chyby Automatické testování generování testů – zajištění maximálního pokrytí zdrojového textu
Úrovně testování (1) Jednotkové testy (Unit tests) Jsou vytvářeny pro malé části produktu – „jednotky“. Co to je jednotka závisí na konkrétním produktu, programovacím jazyce,… (třída, metoda třídy, funkcionalita tvořené aplikace,…) Při testování testují jen konkrétní jednotku. Neočekává se, že k testování bude použit zbytek aplikace. Simulují například činnost databáze, síťové zdroje a podobně. Obvykle pojmenované jako TestXXX (kde XXX je jméno testované jednotky).
Úrovně testování (2) Integrační testy Systémové testy Testují větší moduly vytvářené aplikace. Systémové testy Obvykle vytvářeny „testry“ Testují systém jako by byl nainstalován uživateli. Očekává se, že jsou přítomny všechny prostředky nutné pro běh aplikace (databáze, síťové zdroje,…). Testy funkcionality, uživatelského rozhraní, bezpečnosti,… Zákaznický test (Customer tests, Acceptance tests) Testují hotový systém. „Black-box testing“ celého produktu, výsledkem je zda je produkt možno předat zákazníkovi.
Úrovně testování (3) Alfa Beta Gama Provádí se před zveřejněním produktu Vývojáři „Výstupní kontrola“ Beta Poskytnutí produktu vybrané skupině externích uživatelů, získání zpětné vazby. Gama Kompletní dílo, které zcela neprošlo interní kontrolou kvality
Funkce prostředí pro testování Prostředí pro testování by minimálně mělo: umět spustit série testů; rozhodnout, zda testy proběhly úspěšně. Jednotlivé testy by měly být prováděny nezávisle na ostatních; v případě, že test skončil chybou určit proč; sumarizovat získané výsledky. V ideálním případě by prostředí pro testování by mělo být nezávislé na vlastních testech.
Příprava před testováním Plánování testů Rozdělení do skupin podle toho, jaké části aplikace testují. Rozdělení do skupin tak, aby mohly být testy prováděny paralelně. Příprava dat Simulace různých zdrojů – databáze,… Generování náhodných dat. Příprava prostředí pro testování. Definování zodpovědnosti za části tvořené aplikace. Nástroje pro tvorbu programů
Spuštění testů Provedení jednoho, nějaké skupiny, všech testů. Jsou-li testy prováděny paralelně a nebo jsou některé činnosti prováděny na pozadí může být nutné tyto činnosti synchronizovat. Pokud používáme více počítačů a nebo více platforem může nám prostředí pro testování pomoct při řízení těchto strojů a nebo stírá rozdíly mezi platformami. Uchování výstupu nebo vstupu testů.
Po skončení testování Vygenerování zprávy, která shrnuje výsledky testu. Přehledný, úplný, flexibilní,… Měl by poskytovat přehled, které soubory a jak byly testovány. Měli bychom být schopni rozlišit mezi neúspěšně provedeným testem a chybě při testování. Měli bychom být schopni uměle vytvořit nalezenou chybu.
JUnit (1) prostředí Java, varianty i pro jiné jazyky (NUnit, CPPUnit,…) programátorské rozhraní pro tvorbu testů různé nástroje pro automatické provádění testů grafické rozhraní příkazový řádek, akce pro Ant podpora v řadě IDE využití reflexe pro vyhledání testů uvnitř tříd rozšíření pro testování webových aplikací, servletů, databázových aplikací...
JUnit (2) import junit.framework.TestCase; public class TestXYZ extends TestCase { } void setUp() {…} inicializace void tearDown() {…} finalizace void testX() {…} krok testu assertTrue(podmínka), assertFalse(…) assertEquals(x,y), assertNotNull(x) …
JUnit (3) package cviceni3; import junit.framework.TestCase; public class TestZlomek extends TestCase { protected Zlomek z1 = new Zlomek(1, 3); protected Zlomek z2 = new Zlomek(2, 6); protected Zlomek z3 = new Zlomek(2, 3); protected void setUp() { } protected void tearDown() { } public void testEquals() { assertEquals(z1, z1); assertEquals(z1, z2); } public void testAdd() Zlomek result = Zlomek.plus(z1, z2); assertEquals(result, z3);
Junit (4) JUnit verze 4.x Java 1.5 Použity anotace Testy Inicializace @Test public void testVyhledej() { … } Inicializace @Before protected void setUp() throws Exception {…} @After protected void tearDown() throws Exception {…}
JUnit (5) import static org.junit.Assert.*; public class PoleTest { @Before protected void setUp() throws Exception { pole = new Pole(); } @After protected void tearDown() throws Exception { pole = null; @Test public void vratPocet() { … assertEquals("return value", expectedReturn, actualReturn);
Demo Spuštění vytvořených testů, odhalení chyby http://www.cs.vsb.cz/navrat/ctc/cviceni3/cviceni3.zip
Jak napsat testy v JUnit(1) Obecně chceme, aby testy ověřovaly funkcionalitu nějaké části vyvíjeného produktu. Informace co testovat získáme spíše z popisu funkcionality než ze zdrojových kódů. Test by měl odhalit, pokud testovaná část neimplementuje „popsané“ funkce. Nástroje pro tvorbu programů
Jak napsat testy v JUnit(2) Příklad: Testujeme metodu isEmpty() třídy Vector. Metoda vrátí true v případě, že vektor je prázdný a false v případě že není. Můžeme test napsat takto: public void testIsEmpty () { Vector vector=new Vector(); assertTrue(vector.isEmpty()); } Špatné řešení! Takováto implementace metody isEmpty by testem prošla a přitom neodpovídá popisu! public boolean isEmpty() { return true;} Lepší řešení by bylo otestovat obě varianty výstupů.
Jak napsat testy v JUnit(3) Konkrétní řešení závisí na testovaném problému! Obecné rady Pokud testovaná metoda vrací víc „typů“ výsledku (například metoda compareTo() třídy Integer vrací -1, 0, 1) otestujte všechny varianty. Obvykle nejsme schopni otestovat všechny varianty vstupů a výstupu. Ověříme nejčastěji používané. Otestujeme „krajní meze“ vstupů a výstupů.
Úkol Vytvořte sadu testů, které budou pokrývat testy vaši komponentu Zasobnik Měli by jste testovat činnost následujících metod: E pop() Otestujte i výjimku, kterou tato metoda generuje. E peek() Otestujte i výjimku, kterou tato metoda generuje. Při řešení předpokládejte, že konstruktor i metoda push již byly otestovány a fungují správně.
Další vlastnosti JUnit (1) Testy lze „združovat“ pomocí třídy TestSuite Výsledek testu lze získat pomocí třídy TestResult Další informace naleznete na:http://junit.sourceforge.net/javadoc/ Aplikace ke stažení na: http://xprogramming.com/software.htm public static Test suite() { TestSuite suite = new TestSuite(); suite.addTestSuite(cviceni2.TestPredmet.class); suite.addTestSuite(cviceni2.TestPredmetIO.class); return suite; } TestResult result = new TestResult(); suite.run(result); result.wasSuccessful();
Další nástroje pro testování aplikace (1) Analyzátory paměti Uchovává informace o tom, jak a kolik paměti bylo při běhu aplikace použito. Purify, Electric Fence, … Coverage tools Nástroje zjišťující jak velká část aplikace je použita při testování. Výsledek může být zdrojový kód, který nebyl při testování použit. Další možností (branche coverage) je, které části podmínek nebyly provedeny respektive, které větve programu nebyly použity.
Další nástroje pro testování aplikace (2) Testování výkonnosti Sledování počtu volání určitých funkcí Sledování času stráveného výpočtem různých částí programu podklad pro optimalizaci změnou algoritmu Nástroje označované jako profilery. Bývají součástí vývojových prostředí. Profilaci může podporovat překladač a nebo lze použít samostatný program jako: gprof. Nástroje pro tvorbu programů
Další nástroje pro testování aplikace (3) Analyzátory kódu (static code analyzers) Testují různé statické vlastnosti zdrojových kódů Jak přesně splňují normy pro daný programovací jazyk (ANSI C). Bezpečnost – hledá potencionálně nebezpečné příkazy. Korektnost – některé jazyky umožňují matematicky dokazovat vlastnosti (funkcionální jazyky) nebo hledají vzory častých chyb (FindBug) Velikost případně komplexnost Analýzy dokumentace, která je součástí zdrojových kódů. „Stabilita“ API – jak často se v čase mění Nástroje pro tvorbu programů
Vývoj řízený testy (TDD) Napíšeme testy Napíšeme program Spustíme automatizované testování Provedeme refaktorizaci Opakujeme až do odstranění všech chyb Hlavním cílem je dosáhnout toho, aby všechny testy prošly Mohou být ale chybné testy! Nástroje pro tvorbu programů
Refaktorizace (1) Transformace zdrojového kódu, která vede ke zlepšení jeho čitelnosti nebo struktury, avšak bez změny významu nebo chování. Přejmenování proměnné Vytvoření podprogramu ze zadaného úseku programu. Nahrazení posloupnosti příkazu if polymorfismem. … Důležitá součást metodiky TDD, XP Nástroje pro refaktorizaci bývají součástí IDE. Nástroje pro tvorbu programů
Testování programů – Refaktorizace (2)
Sledování chyb (1) Nástroj, který umožňuje uložit informace o chybách a rozliší jednotlivé chyby (jednoznačně je identifikuje). Nástroj využívají všichni členové týmu. Nástroj pomáhá celé skupince lidí pracovat na řadě malých problémů (jednotlivých chybách). Celá řada nástrojů Bugzilla, GNATS, FogBugs, JIRA, TestTrack,… Většina nástrojů jsou informační systémy, které pro uložení dat používají databázi a nejčastěji komunikují přes webové rozhraní.
Sledování chyb (2) Dobrý nástroj pro sledování chyb by měl: uchovávat informace o chybě, včetně stavu ve kterém je (nevyřešena, řešena, …); umět pracovat se skupinami chyb (odstranění komplexnějšího problému); vyhledat chyby a sledovat aktuální změny; generovat statistiky a komplexnější zprávy o sledovaných chybách; podporovat historii jednotlivých chyb a být schopen spojit chyby s příslušnou verzí dané aplikace (integrace s SCM); rozlišovat závažnost chyby; …
Sledování chyb – Bugzilla Asi nepoužívanější volně dostupný nástroj pro sledování chyb. Napsána v Perlu, komunikuje přes internetový prohlížeč a používá email ke komunikaci. Implementuje běžné funkce očekávané od nástroje pro sledování změn. Vyhledávání - regulární výrazy, boolovské výrazy LDAP, historie změn každé chyby, podpora závislostí mezi chybami, „hlasování“ pro určení „otravných“ chyb …
Generování dokumentace Dokumentace je vytvářena současně s aplikací Oddělená dokumentace problémy s aktualizací nutnost uvádět kompletní specifikace Dokumentace určená pro: uživatele aplikace; pro potřeby tvůrců aplikace. Dokumentace jako součást zdrojového textu snadnější údržba (např. včetně verzování) literární programování (D. Knuth) dokumentační značky - javadoc
Program javadoc Dokumentace ve speciálních poznámkách /** * Dokumentační poznámka */ Dokumentační značky + HTML @author <a href=mailto:joe@mit.edu>Joe</a> @param x Popis parametru x http://java.sun.com/j2se/javadoc/writingdoccomments/ Rozšíření – generování zdrojových textů pomocí šablon - XDoclet
Konvence - pořadí @param (třídy, rozhraní, metody a konstruktory) @return (jen metody) @exception (@throws synonymum přidané v Javadoc 1.2) @author (třídy a rozhraní, povinné) @version (třídy a rozhraní, povinné) @see @since @serial (nebo @serialField nebo @serialData) @deprecated
Program javadoc /** * Konstruktor zlomku. * Naplní čitatele a jmenovatele a převede * zlomek do normalizovaného tvaru. * @param citatel Čitatel zlomku. * @param jmenovatel Jmenovatel zlomku. */ public Zlomek(int citatel, int jmenovatel) { this.citatel = citatel; this.jmenovatel = jmenovatel; normalizuj(); }
Generování (1) - Ant <javadoc packagenames="com.dummy.test.*" sourcepath="src" excludepackagenames="com.dummy.test.doc-files.*" defaultexcludes="yes" destdir="docs/api" author="true" version="true" use="true" windowtitle="Test API"> <doctitle><![CDATA[<h1>Test</h1>]]></doctitle> <bottom><![CDATA[<i>Copyright © 2000 Dummy Corp. All Rights Reserved.</i>]]></bottom> <tag name="todo" scope="all" description="To do:"/> <group title="Group 1 Packages" packages="com.dummy.test.a*"/> <group title="Group 2 Packages" packages="com.dummy.test.b*:com.dummy.test.c*"/> <link offline="true" href="http://java.sun.com/j2se/1.5.0/docs/api/" packagelistLoc="C:\tmp"/> <link href="http://developer.java.sun.com/developer/products/xml/docs/api/"/> </javadoc>
Generování (2) - IDE
Úkol Již dříve vytvořené třídy doplňte o Javadoc komentáře.
Technologie Java Server Pages Architektury informačních systémů Technologie Java Server Pages doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava
Obsah přednášky Java Servlets Struktura webové aplikace Java Server Pages Komponenty Java Beans Uživatelské značky Knihovny značek (JSTL / Jakarta Struts) Technologie JSP
Java Servlet Container Java Servlets Standardní metoda rozšiřování webových serverů o dynamické generování obsahu Základní rozhraní pro aplikace s tenkým klientem (webový prohlížeč) Web Browser Java Servlet Container Servlet Servlet Technologie JSP
Výhody servletů Perzistence mezi voláními – rychlejší odezva na požadavky, sdílení dat CGI – opakované zavádění Přístup k celému Java API JDBC – databáze JAXP – práce s XML JNDI – adresářové služby Technologie JSP
Servletový kontejner Zajišťuje běh servletu JVM Správa sezení Udržování kontextu Konfigurační informace Perzistence Různí dodavatelé – standardizace Java Servlet API 2.4 Technologie JSP
Typy servletových kontejnerů Rozšíření WWW serveru Apache/JServ S vestavěným WWW serverem Jetty (Mortbay.com) WebSphere (IBM) Samostatné aplikační servery Apache Tomcat Sun Application Server /Glassfish JBoss Technologie JSP
Java Servlet API GenericServlet servletInfo init() service(request, response) destroy() ServletConfig servletName getInitParameter(n) servletConfig 1 1 * servletContext 1 ServletContext attribute(n) getInitParameter(n) HttpServlet lastModified doGet() doPost() … javax.servlet.* javax.servlet.http.* Technologie JSP
Reprezentace požadavku ServletRequest remoteHost, … parameter(name) reader http://www.lib.com/catalog - context path HttpServletRequest contextPath header(name) cookies[] HttpSession attribute(n) removeAttribute(n) invalidate() session * 1 Technologie JSP
Reprezentace odpovědi ServletResponse contentType writer outputStream HttpServletResponse header(name) addCookie(cookie) addHeader(name, value) sendError(sc, msg) Technologie JSP
Struktura webové aplikace http://www.lib.com/catalog Servlety .class Statický obsah .html, .jpg, .gif, … JSP .jsp Knihovny tříd .jar WEB-INF classes lib web.xml images … index.jsp http://www.lib.com/catalog/WEB-INF/... Technologie JSP
Java Server Pages Oddělení prezentace od aplikační logiky Zjednodušení realizace stránek Servlety na všechno Statický obsah HTML + servlety pro akce Dynamický obsah v rámci statického Možnost editace HTML editory Kompilace na Java servlet Při prvním požadavku, kontrolují se změny Technologie JSP
Prvky JSP Direktivy Vložený úsek programu Výraz Vestavěné značky akcí <%@ page contentType=“text/html” %> Vložený úsek programu <% out.println(“x : “ + x); %> Výraz x : <%= x %> Vestavěné značky akcí <jsp:include page=“/headers/header.jsp” /> Uživatelem definované značky <my:Date /> <% @ taglib uri=http://lib.com/tags prefix=“my” %> Technologie JSP
Příklad 1 <%@ page contentType=“text/html; charset=iso-8859-2” %> <%@ page import=“java.util.*” %> <html> <head> <title>První pokus</title> </head> <body> <h1>Vítejte na mé stránce</h1> <p> Dnešní datum je <%= new Date().toString() %> </p> </body> Technologie JSP
Příklad 2 <%@ page contentType="application/vnd.ms-excel" %> out.println("x\tx^2"); for(int i = 1; i <= 10; i++) { out.println(I + "\t“ + (i * i)); } %> Technologie JSP
Příklad 3 <% Iterator i = cart.getItems().iterator(); <% Iterator i = cart.getItems().iterator(); while (i.hasNext()) { ShoppingCartItem item = (ShoppingCartItem)i.next(); BookDetails bd = (BookDetails)item.getItem(); %> <tr> <td align="right” bgcolor="#ffffff"> <%=item.getQuantity() %> </td><td bgcolor="#ffffaa"> <strong><a href="<%=request.getContextPath()%> /bookdetails?bookId=<%=bd.getBookId()%>"> <%=bd.getTitle()%></a></strong> </td> ... <% // End of while } Technologie JSP
Předdefinované proměnné HttpServletRequest request <%= request.getRemoteHost() %> HttpServletResponse response HttpSession session PrintWriter out ServlerContext application ServletConfig config PageContext pageContext page (= this) Technologie JSP
Komponenty Java Beans Konstruktor Vlastnosti (properties) Metody public StringBean() {} Vlastnosti (properties) private String msg = “Nic”; public String getMsg() { return msg; } public void setMsg(String m) { msg=m; } Metody public void clear() { msg = “Nic”; } Události (events) Technologie JSP
Příklad package cviceni2; import java.util.Hashtable; import java.util.Collection; public class SeznamUzivatelu { private Hashtable tabulka = new Hashtable(); public void uloz(Uzivatel u) { tabulka.put(u.getLogin(), u); } public Uzivatel hledej(String login) { return (Uzivatel)tabulka.get(login); } public Collection getSeznam() { return tabulka.values(); } } Technologie JSP
Použití JavaBeans v JSP Zavedení komponenty <jsp:useBean id=“sb” class=“StringBean“ /> Přístup k vlastnostem <jsp:getProperty name=“sb” property=“msg” /> Nastavení vlastnosti <jsp:setProperty name=“sb” property=“msg” value=“Ahoj” /> <jsp:setProperty name=“sb” property=“msg” param=“message” /> <jsp:setProperty name=“sb” property=“*” /> Technologie JSP
Sdílení komponent <jsp:useBean id=“…” class=“…” scope=“…”/> scope=“page” (implic. hodnota) v objektu PageContext scope=“application” v objektu ServletContext sdílí se všemi servlety ve stejné aplikaci scope=“session” v objektu HttpSession scope=“request” v objektu ServletRequest Technologie JSP
Uživatelské značky Třída obslužného programu (handler) rozhraní javax.servlet.jsp.tagext.Tag metody doStartTag(), doEndTag() Deskriptor knihovny značek soubor xxx.tld ve formátu XML Soubor JSP používající značky <%@ taglib uri=“xxx.tld” prefix=“xxx”%> <xxx:znacka param=“…”> … </xxx:znacka> Technologie JSP
Příklad – DatumTag.java package tis.tags; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class DatumTag extends TagSupport { public int doStartTag() { try { JspWriter out = pageContext.getOut(); out.print(new java.util.Date()); } catch( java.io.IOException e ) {…} return SKIP_BODY; } Technologie JSP
Příklad – tis-taglib.tld <?xml version="1.0" encoding=“iso-8859-2” ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>tis</shortname> <uri></uri> <info>Testy pro TIS</info> <tag> <name>datum</name> <tagclass>tis.tags.DatumTag</tagclass> <info>Vloží dnešní datum</info> </tag> </taglib> Technologie JSP
Příklad – tags.jsp <%@ taglib uri="/WEB-INF/tis-taglib.tld" prefix=“tis" %> Dnes je <tis:datum/> Technologie JSP
JSTL – JavaServer Standard Tag Library Core výrazy <c:out value=“…”/> tok řízení <c:forEach var=“…“ items=“…">…</c:forEach> práce s URL <c:url var=“…” value=“…”/> XML analýza <x:parse …/> transformace <x:transform xslt=“…” xml=“…”/> I18n (Internationalization) formátování textů <fmt:message key=“…”/> formátování čísel a data/času <fmt:formatDate …/> Database volba zdroje dat <sql:setDataSource dataSource=“…”/> SQL dotazy a transakce <sql:query var=“…>…</sql:query> Technologie JSP
Apache Struts Tag Library bean definice a zpřístupnění JavaBeans z různých zdrojů html HTML formuláře a další prvky uživ. rozhraní logic řízení toku aplikace template práce se šablonami stránek tiles tvorba stránek z komponent Technologie JSP
Příklad <%@ page contentType="text/html; encoding=iso-8859-2" %> <%@ taglib uri="/WEB-INF/c.tld" prefix="c" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <jsp:useBean id="uzivatele" class="cviceni2.SeznamUzivatelu" scope="session"> <% uzivatele.uloz(new Uzivatel("wal314", "Johnny", "Walker")); %> </jsp:useBean> <html:html> <body> <h2>Seznam uživatelů</h2> <table border="1"> <c:forEach var="uziv" varStatus="st" items="${uzivatele.seznam}"> <tr> <td><c:out value="${st.count}"/></td> <td><c:out value="${uziv.login}"/></td> <td><c:out value="${uziv.jmeno}"/> <c:out value="${uziv.prijmeni}"/></td> </tr> </c:forEach> </table> </body> </html:html> Technologie JSP
Literatura Marty Hall: Java servlety a stránky JSP. Neocortex, Praha, 2001, ISBN 80-86330-06-0 http://java.sun.com/products/jsp http://www.jboss.org http://jakarta.apache.org Technologie JSP