Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

JavaBeans, Junit, JavaDoc

Podobné prezentace


Prezentace na téma: "JavaBeans, Junit, JavaDoc"— Transkript prezentace:

1 JavaBeans, Junit, JavaDoc
Lumír Návrat Katedra informatiky FEI VŠB-TUO A-1018 /

2 Obsah Úvod do komponent JavaBeans komponenty JUnit JavaDoc

3 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

4 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

5 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)

6 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

7 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.

8 Specifikace komponenty
Stav Vlastnosti – čtení, nastavení Chování Operace – volání, parametry, výsledek Interakce s okolím Události – registrace, oznámení

9 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

10 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, …

11 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

12 Scénáře použití (2)

13 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

14 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 ); }

15 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

16 Demo Ukázka vytvořené komponenty Její použití v GUI Zdrojové soubory:

17 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

18 Příklad komponenty Counter
vlastnosti CounterBean int value void clear() void increment() metody

19 Vlastnosti – Přístupové metody (1)
public int getValue() private int value; public void setValue(int val) PTE - Kompnentní technologie

20 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ě 

21 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();

22 Indexované vlastnosti
public int getValue(int index) private int[] value; public void setValue(int index,int val)

23 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á

24 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

25 Ú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.

26 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

27 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í

28 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

29 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)

30 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;

31 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

32 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.

33 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

34 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

35 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

36 Adaptér (2) class CounterAdapter implements CounterEventListener {
public void reset(CounterEvent e) {} public void limitReached(CounterEvent e) } PTE - Kompnentní technologie

37 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

38 Úkol Vytvořte komponentu, která bude představovat zásobník.
Podrobné zadání:

39 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

40 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

41 Co je to chyba? Jakýkoliv problém, snižující kvalitu programu.
Funkcionalita Užitná hodnota Spolehlivost Výkon Požadavky uživatele

42 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ů.

43 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

44 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

45 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

46 Ú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).

47 Ú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.

48 Ú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

49 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.

50 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ů

51 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ů.

52 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.

53 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í...

54 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)

55 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);

56 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 {…}

57 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);

58 Demo Spuštění vytvořených testů, odhalení chyby

59 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ů

60 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ů.

61 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ů.

62 Ú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ě.

63 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: 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();

64 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.

65 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ů

66 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ů

67 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ů

68 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ů

69 Testování programů – Refaktorizace (2)

70 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í.

71 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;

72 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á 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

73 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

74 Program javadoc Dokumentace ve speciálních poznámkách
/** * Dokumentační poznámka */ Dokumentační značky + HTML @author x Popis parametru x Rozšíření – generování zdrojových textů pomocí šablon - XDoclet

75 Konvence - pořadí @param (třídy, rozhraní, metody a (jen synonymum přidané v Javadoc (třídy a rozhraní, (třídy a @serial @deprecated

76 Program javadoc /** * Konstruktor zlomku.
* Naplní čitatele a jmenovatele a převede * zlomek do normalizovaného tvaru. citatel Čitatel zlomku. jmenovatel Jmenovatel zlomku. */ public Zlomek(int citatel, int jmenovatel) { this.citatel = citatel; this.jmenovatel = jmenovatel; normalizuj(); }

77

78 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>

79 Generování (2) - IDE

80 Úkol Již dříve vytvořené třídy doplňte o Javadoc komentáře.

81 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 / (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava

82 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

83 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

84 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

85 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

86 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

87 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

88 Reprezentace požadavku
ServletRequest remoteHost, … parameter(name) reader - context path HttpServletRequest contextPath header(name) cookies[] HttpSession attribute(n) removeAttribute(n) invalidate() session * 1 Technologie JSP

89 Reprezentace odpovědi
ServletResponse contentType writer outputStream HttpServletResponse header(name) addCookie(cookie) addHeader(name, value) sendError(sc, msg) Technologie JSP

90 Struktura webové aplikace
Servlety .class Statický obsah .html, .jpg, .gif, … JSP .jsp Knihovny tříd .jar WEB-INF classes lib web.xml images index.jsp Technologie JSP

91 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

92 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

93 Příklad 1 page contentType=“text/html; charset=iso ” %> 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

94 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

95 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

96 Předdefinované proměnné
HttpServletRequest request <%= request.getRemoteHost() %> HttpServletResponse response HttpSession session PrintWriter out ServlerContext application ServletConfig config PageContext pageContext page (= this) Technologie JSP

97 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

98 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

99 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

100 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

101 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

102 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

103 Příklad – tis-taglib.tld
<?xml version="1.0" encoding=“iso ” ?> <!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

104 Příklad – tags.jsp taglib uri="/WEB-INF/tis-taglib.tld" prefix=“tis" %> Dnes je <tis:datum/> Technologie JSP

105 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

106 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

107 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

108 Literatura Marty Hall: Java servlety a stránky JSP. Neocortex, Praha, 2001, ISBN Technologie JSP


Stáhnout ppt "JavaBeans, Junit, JavaDoc"

Podobné prezentace


Reklamy Google