Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

Podobné dokumenty
Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

Tvorba informačních systémů

Tvorba informačních systémů

Tvorba informačních systémů

Tvorba informačních systémů

KIV/PIA 2013 Jan Tichava

DPKOM_06 Dědičnost entit a zpětná volání posluchači

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Databázové systémy Cvičení 5.2

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Databázové a informační systémy

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Enterprise Java Beans 3.0

Java a Caché IV: Manipulace s objekty

STARÁ DOBRÁ JAVA A PERSISTENCE S CACHÉ

Nástroje a frameworky pro automatizovaný vývoj. Jaroslav Žáček jaroslav.zacek@osu.cz

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Object-relational mapping (JPA, Hibernate)

(Enterprise) JavaBeans. Lekce 7

Databáze I. Přednáška 4

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

Použití databází na Webu

Úvod do databázových systémů

NOVINKY V JEE EJB 3.1. Zdeněk Troníček Fakulta informačních technologií ČVUT v Praze

8.2 Používání a tvorba databází

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Spring framework 2.0. Roman Pichlík CZJUG

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Zabezpečení webové vrstvy a EJB projektu Část nastavení specifická pro Glassfish, část dána Java EE

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

Databáze I. Přednáška 7

Verzování a publikace dat na webu za pomoci PostgreSQL

Technologie JavaBeans

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 26.3.

Informační systémy 2008/2009. Radim Farana. Obsah. Jazyk SQL

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

1 Administrace systému Moduly Skupiny atributů Atributy Hodnoty atributů... 4

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jalapeño: pekelně ostrá Java persistence v Caché. Daniel Kutáč Senior Sales Engineer

Tvorba informačních systémů

Abstraktní datové typy: zásobník

Technologie Java Enterprise Edition. Přemek Brada, KIV ZČU

Sada 1 - PHP. 14. Úvod do jazyka SQL

UJO Framework. revoluční architektura beans. verze

Obsah přednášky. Technologie. Enterprise Java Beans. Enterprise Java Beans. EJB kontejner. Enterprise Java Beans (EJB)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Tvorba informačních systémů

Úvod do programovacích jazyků (Java)

Semináˇr Java X J2EE Semináˇr Java X p.1/23

Nasazení Object Relation Mapping nástrojů nad legacy datovým modelem

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Komponenty v.net. Obsah přednášky

Michal Krátký, Miroslav Beneš

Konceptuální modelování a SQL

Tabulka fotbalové ligy

Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

DATABÁZOVÉ A INFORMAČNÍ SYSTÉMY

Michal Krátký, Miroslav Beneš

Ing. Přemysl Brada, MSc., Ph.D. Ing. Martin Dostal. Katedra informatiky a výpočetní techniky, FAV, ZČU v Plzni

KMI / TMA Tvorba mobilních aplikací. 6. seminář ZS 2016/2017 Středa 13:15-15:45

DUM 12 téma: Příkazy pro tvorbu databáze

Vhodnost nasazení jednotlivých webových architektur, sdílení dat, perzistence, webové služby a REST, asynchronnost, messaging

TÉMATICKÝ OKRUH Softwarové inženýrství

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

RMI - Distribuované objekty v Javě

RMI Remote Method Invocation

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Rezervační systém Tvorba WWW stránek

Vybrané partie z jazyka Java Spring a Enterprise JavaBeans (EJB)

Tvorba WWW stránek. přehled technologií používaných na webu principy jednotlivých technologií a možnosti jejich vzájemného kombinování

Tvorba informačních systémů

Architektury informačních systémů

Databáze v Java aplikacích, JPA Handout

Databázové systémy úvod

Další vlastnosti Springu Moduly Springu. Spring Framework. Pavel Mička. Pavel Mička Spring Framework 1/18

Databázové systémy. Cvičení 6: SQL

Základy informatiky. 08 Databázové systémy. Daniela Szturcová

1. Distribuce Javy. 2. Vlastnosti J2EE aplikace. 3. Fyzická architektura J2EE aplikace. Distribuce Javy se liší podle jejího zamýšleného použití:

Návrhové vzory pro J2EE

Kurz Databáze. Přechod na SQL server. Obsah. Vytvoření databáze. Lektor: Doc. Ing. Radim Farana, CSc.

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Technology Entry form Entry up-to-date? Internal links Faulty internal Possible internal links

Databáze II. 1. přednáška. Helena Palovská

Oracle XML DB. Tomáš Nykodým

Vytváření a použití knihoven tříd

Session Beans. Petr Aubrecht CA. Vtipy budou tentokrát o krizi:

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

17. července :51 z moravec@yahoo.com

boolean hasnext() Object next() void remove() Kolekce

Jazyk C# - přístup k datům

Transkript:

Tvorba informačních systémů 1/46 Tvorba informačních systémů Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Tvorba informačních systémů, 2008/2009

Tvorba informačních systémů 2/46 Úvod Obsah Model Objektově-relační mapování () Login a zamezení neoprávněného přístupu k akcím Vzhled aplikace

Tvorba informačních systémů 3/46 Úvod Ukázková aplikace http://www.cs.vsb.cz/kratky/courses/2008-09/tis/ exam/exam6/samplestruts2app.zip

Tvorba informačních systémů 4/46 Model Model Struts2 nedefinuje způsob implementace modelu (tzv. doménových či business objektů) Doménové objekty tedy můžeme implementovat jako: Třídy JavaBean (JB) komponenty Enterprice JavaBean (EJB) komponenty... Doménové objekty nejčastěji reprezentují záznam z tabulky, součástí modelu je i tzv. objektově-relační mapování (), které mapuje relace databáze na tyto objekty. můžeme naimplementovat nebo použijeme nějaký rámec (např. JPA/Hibernate).

Tvorba informačních systémů 5/46 Model Strategie držení spojení s databázovým systémem Při implementaci přístupu můžeme uplatnit tyto strategie: Otevřít spojení pro každý požadavek, vykonat jej a pak spojení zrušit (neefektivní, otevření spojení je časově náročnější operace). Otevřít spojení pro každého uživatele a uchovávat jej v session (pouze pro malý počet uživatelů). Sdílet "pool" otevřených spojení mezi všemi uživateli (nejčastější).

Tvorba informačních systémů 6/46 Na následujících slidech si ukážeme pomocí Hibernate, který bude do Struts2 integrován pomocí rámce Spring. Hibernate následně přistupuje do databáze SQL Server 2008. Poznámka: Využití těchto rámců nad J2EE nevyžaduje instalaci, je reprezentováno jar soubory, které jsou začleněny do projektu resp. do výsledného war souboru.

Tvorba informačních systémů 7/46 Příklad V následující ukázce vysvětlíme všechny kroky nutné pro zobrazení záznamů z tabulky Person v tabulce, formuláře pro vložení nového/editaci existujícího záznamu a akci pro zrušení vybraného záznamu.

Tvorba informačních systémů 8/46 Příklad, sql/create.sql pro SQL Server 2008 CREATE TABLE Person ( i d INT NOT NULL PRIMARY KEY IDENTITY, l o g i n VARCHAR( 6 ) UNIQUE, email VARCHAR( 5 0 ) UNIQUE NOT NULL, password VARCHAR( 2 0 ) NOT NULL, firstname VARCHAR( 2 0 ) NOT NULL, middlename VARCHAR( 2 0 ), secondname VARCHAR( 2 0 ) NOT NULL, email2 VARCHAR( 5 0 ), i n s t i t u t i o n VARCHAR( 1 0 0 ) NOT NULL, web VARCHAR( 7 0 ) ) ; CREATE INDEX Person_login ON Person ( l o g i n ) ; CREATE INDEX Person_email ON Person ( email ) ; CREATE INDEX Person_secondName ON Person ( secondname ) ;

Tvorba informačních systémů 9/46 1 package model ; 2 import javax. persistence. E n t i t y ; 3 import javax. persistence. Id ; 4 @Entity 5 public class Person { 6 @Id 7 private S t r i n g l o g i n ; 8 private S t r i n g email ; 9 private S t r i n g password ; 10 private S t r i n g firstname ; 11 private S t r i n g middlename ; 12 private S t r i n g secondname ; 13 private S t r i n g email2 ; 14 private S t r i n g i n s t i t u t i o n ; 15 private S t r i n g web ; Řádky 4 a 6: Všimněte si tzv. anotací metadat o třídách, atributech případně metodách. Příklad, 1. krok, model.person 1/2 Třída model.person reprezentuje doménový objekt, v tomto případě představuje záznam z tabulky Person.

Tvorba informačních systémů 10/46 Příklad, 1. krok, model.person 2/2 1 public S t r i n g getlogin ( ) { 2 return l o g i n ; 3 } 4 5 public void setlogin ( S t r i n g l o g i n ) { 6 this. l o g i n = l o g i n ; 7 } 8 9... 10 11 public S t r i n g getweb ( ) { 12 return web ; 13 } 14 15 public void setweb ( S t r i n g web ) { 16 this. web = web ; 17 } 18 } Popis: Třída musí obsahovat set/get metody pro všechny atributy, konvence stejná jako u JavaBean.

Tvorba informačních systémů 11/46 Příklad, 1. krok, Popis model.person je tzv. EJB entity bean instance reprezentuje entitu napříč různými session a přístupnou různými klienty. Součást Java Persistence API (JPA) 1 API pro. Entity bean tvoří vrstvu mezi klientem databáze a databázovým systémem (vývojář se nemusí starat o schéma relace, řízení spojení s databází,...). Ve třídě využíváme tzv. EJB3/JPA anotace 2 : @Entity jedná se o perzistentní objekt @Id definuje atribut, který je součástí identity objektu (tedy primární klíč) @GeneratedValue hodnota atributu (často primárního klíče) je generována 1 http://java.sun.com/developer/technicalarticles/j2ee/jpa/ 2 http://www.jpox.org/docs/1_2/jpa/annotations.html

Tvorba informačních systémů 12/46 Řádek 6: Vrat všechny entity poměrně nebezpečná metoda (uživatel v GUI vidí z celé tabulky jen několik záznamů). Řádek 10: Vrat entitu dle hodnoty klíče Příklad, 2. krok, service.personservice Nyní musíme definovat tzv. business logiku, tedy operace které budeme nad entitami stejného typu provádět. Nejprve definujeme rozhraní PersonService: 1 package s e r v i c e ; 2 import java. u t i l. L i s t ; 3 import model. Person ; 4 5 public interface PersonService { 6 public L i s t <Person > f i n d A l l ( ) ; 7 public void update ( Person Person ) ; 8 public void i n s e r t ( Person Person ) ; 9 public void d e l e t e ( S t r i n g l o g i n ) ; 10 public Person f i n d ( S t r i n g l o g i n ) ; 11 }

Tvorba informačních systémů 13/46 Řádky 9 a 13: anotace Příklad, 3. krok, service.personserviceimpl 1/3 Nyní musíme definovat implementaci rozhraní jedná se o EJB session bean (doménový objekt je EJB entity bean). 1 package s e r v i c e ; 2 import java. u t i l. L i s t ; 3 import javax. persistence. EntityManager ; 4 import javax. persistence. PersistenceContext ; 5 import javax. persistence. Query ; 6 import org. springframework. t r a n s a c t i o n. annotation. T r a n s a c t i o n a l ; 7 import model. Person ; 8 9 @Transactional 10 public class PersonServiceImpl implements PersonService { 11 private EntityManager em; 12 13 @PersistenceContext 14 public void setentitymanager ( EntityManager em ) { 15 this.em = em; 16 }

Tvorba informačních systémů 14/46 Příklad, 3. krok, service.personserviceimpl 2/3 1 @SuppressWarnings ( " unchecked " ) 2 public L i s t <Person > f i n d A l l ( ) { 3 Query query = em. createquery ( " s e l e c t p FROM Person p " ) ; 4 return query. g e t R e s u l t L i s t ( ) ; 5 } 6 7 public void update ( Person person ) { 8 em. merge ( person ) ; 9 } 10 11 public void i n s e r t ( Person person ) { 12 em. merge ( person ) ; 13 } Popis: K databázi přistupujeme zprostředkovaně přes entity manager. Řádek 3: Všimněte si SQL dotazu ve kterém figuruje doménový objekt.

Tvorba informačních systémů 15/46 Příklad, 3. krok, service.personserviceimpl 3/3 1 public void d e l e te ( S t r i n g l o g i n ) { 2 Person person = f i n d ( l o g i n ) ; 3 i f ( person! = null ) { 4 em. remove ( person ) ; 5 } 6 } 7 8 public Person f i n d ( S t r i n g l o g i n ) { 9 return em. f i n d ( Person. class, l o g i n ) ; 10 } 11 12 private EntityManager getentitymanager ( ) { 13 return em; 14 } 15 }

Tvorba informačních systémů 16/46 Příklad, View personlist.jsp persondetail.jsp

Tvorba informačních systémů 17/46 Příklad, 4. krok, Akce 1/3 person_list zobrazeni záznamů v tabulce person_delete zrušení vybraného záznamu person_update aktualizace vybraného záznamu person_insert vložení nového záznamu persondetail nabídnutí formuláře s možností aktualizace existujícího popř. vložení nového záznamu

Tvorba informačních systémů 18/46 Příklad, 4. krok, Akce 2/3, personlist.jsp

Tvorba informačních systémů 19/46 Příklad, 4. krok, Akce 3/3, persondetail.jsp

Tvorba informačních systémů 20/46 Příklad, 4. krok, WEB-INF/classes/struts.xml 1/2 1... 2 <constant name= " s t r u t s. o b j e c t F a c t o r y " value= " s p ring " / > 3... 4 < a c t i o n name= " person_ " class=" personaction " method= " { 1 } " > 5 < r e s u l t >WEB INF / pages / person / p e r s o n L i s t. j s p < / r e s u l t > 6 < r e s u l t name= " i n p u t " >WEB INF / pages / person / persondetail. j s p < / r e s u l t > 7 < / a c t i o n >... Řádek 2: Integrace Spring do Struts2. Řádky 4 7: Sdružení akcí person_{list, delete, update, insert}. Pokud kontroler zachytí akci, pak předá řízení objektu personaction a metodě list, delete, update nebo insert. V případě aktualizace/vložení záznamu, může validace detekovat chybně zadanou hodnotu. V takové případě je vrácen persondetail.jsp, jinak je vrácen personlist.jsp.

Tvorba informačních systémů 21/46 Příklad, 4. krok, WEB-INF/classes/struts.xml 2/2 1... 2 < a c t i o n name= " persondetail " class=" personaction " method= " f i n d " > 3 < r e s u l t >WEB INF / pages / person / persondetail. j s p < / r e s u l t > 4 < / a c t i o n > 5... Řádky 2 4: Akce pro zobrazení formuláře pro zadání hodnot atributů (pro možnou aktualizaci/vložení záznamu). Pokud se jedná o aktualizace, metoda find najde instanci Person, jejichž hodnoty jsou zobrazeny ve formuláři. Pokud bychom používali čistý Strut2, pak by hodnotou atributu class byl název akční třídy, např. action.personaction.

Tvorba informačních systémů 22/46 Příklad, 5. krok, WEB-INF/applicationContext.xml 1/2 WEB-INF/applicationContext.xml je soubor pro konfiguraci rámce Spring, který nám zpřístupní Hibernate pro Struts2. 1... 2 <bean i d = " personservice " class=" s e r v i c e. PersonServiceImpl " / > 3 <bean i d = " personaction " scope= " prototype " 4 class=" a c t i o n. PersonAction " > 5 < c o n s t r u c t o r arg r e f = " personservice " / > 6 < / bean> 7... Řádek 3: Definujeme objekt personservice jako instanci třídy service.personserviceimpl (session bean pracující s entitami instancemi Person). Řádky 4 6: Spojíme akční objekt Struts2 personaction (třídy action.personaction) s objektem personservice.

Tvorba informačních systémů 23/46 Příklad, 5. krok, WEB-INF/applicationContext.xml 2/2 Definice entity manageru využívající jako datový zdroj SQL Server 2008. 1 <bean i d = " entitymanagerfactory " 2 class=" org..... orm. jpa. LocalContainerEntityManagerFactoryBean " > 3 < p r o p e r t y name= " datasource " r e f = " datasource " / > 4 < p r o p e r t y name= " persistenceunitname " value= " pun " / > 5 < p r o p e r t y name= " jpavendoradapter " > 6 <bean class = " org..... orm. jpa. vendor. HibernateJpaVendorAdapter " > 7 < p r o p e r t y name= " database " value= "SQL_SERVER" / > 8 < p r o p e r t y name= " showsql " value= " t r u e " / > 9 < / bean> 10 < / p r o p e r t y > 11 < / bean> 12 <bean i d = " datasource " 13 class = " org. springframework. jdbc. datasource. DriverManagerDataSource " > 14 < p r o p e r t y name= " driverclassname " 15 value= " net. sourceforge. j t d s. jdbc. D r i v e r " / > 16 < p r o p e r t y name= " u r l " value= " j d b c : j t d s : s q l s e r v e r : / / win456. vsb. cz " / > 17 < p r o p e r t y name= " username " value= " t i s " / > 18 < p r o p e r t y name= " password " value= " t i s " / >< / bean>

Tvorba informačních systémů 24/46 Příklad, 6. krok, action.personaction 1/5 1 package a c t i o n ; 2 import java. u t i l. L i s t ; 3 import model. Person ; 4 import s e r v i c e. PersonService ; 5 import com. opensymphony. xwork2. Action ; 6 import com. opensymphony. xwork2. Preparable ; 7 import com. opensymphony. xwork2. ActionSupport ; 8 public class PersonAction extends ActionSupport implements Preparable { 9 private PersonService s e r v i c e ; 10 private L i s t <Person > persons ; 11 private Person person ; 12 private S t r i n g l o g i n ; 13 private S t r i n g r e s u l t ; Řádek 10: Uložení kolekce záznamů z databáze (zobrazení v personlist.jsp). Řádek 11: Uložení jednoho záznamu z databáze (pro a z formuláře persondetail.jsp). Řádek 12: Uložení hodnoty klíče (např. pro person_delete).

Tvorba informačních systémů 25/46 Příklad, 6. krok, action.personaction 2/5 1 public PersonAction ( PersonService s e r v i c e ) { 2 this. s e r v i c e = s e r v i c e ; 3 } 4 5 @org. apache. s t r u t s 2. i n t e r c e p t o r. v a l i d a t i o n. S k i p V a l i d a t i o n 6 public S t r i n g l i s t ( ) { 7 this. persons = s e r v i c e. f i n d A l l ( ) ; 8 return Action.SUCCESS; 9 } Řádek 5: Anotace - při této akci nebudou validovány položky vstupního formuláře pravidly ze souboru PersonAction-validation.xml (uložené v person). Řádek 7: Využití metody session bean PersonService vracející všechny záznamy z tabulky Person.

Tvorba informačních systémů 26/46 Příklad, 6. krok, action.personaction 3/5 1 public S t r i n g update ( ) { 2 S t r i n g r e t ; 3 t r y { 4 this. s e r v i c e. update ( person ) ; 5 this. person = new Person ( ) ; 6 setresult ( gettext ( " updatedone " ) ) ; 7 r e t = l i s t ( ) ; 8 } 9 catch ( Exception e ) { 10 setresult ( gettext ( " updatefailed " ) ) ; 11 r e t = Action. INPUT ; 12 } 13 return r e t ; 14 } Řádek 4: Využití metody session bean PersonService vracející všechny záznamy z tabulky Person. Řádky 6 a 10: Nastavení výsledku který se vypíše na výstupním formuláři. Řádky 7 a 11: Nastavení výsledku akce (ve struts.xml jsou pak nastaveny výstupní jsp stránky pro jednotlivé výsledky).

Tvorba informačních systémů 27/46 Příklad, 6. krok, action.personaction 4/5 1 public S t r i n g i n s e r t ( ) { 2 S t r i n g r e t ; 3 4 t r y { 5 this. s e r v i c e. i n s e r t ( person ) ; 6 this. person = new Person ( ) ; 7 8 setresult ( gettext ( " insertdone " ) ) ; 9 r e t = l i s t ( ) ; 10 } 11 catch ( Exception e ) { 12 setresult ( gettext ( " i n s e r t F a i l e d " ) ) ; 13 r e t = Action. INPUT ; 14 } 15 return r e t ; 16 } Obdoba metody update. Problém: V catch se zachytává pouze jeden typ výjimky. Uživateli tedy nenabídneme výpis konkrétní chyby.

Tvorba informačních systémů 28/46 Příklad, 6. krok, action.personaction 5/5 1 @org. apache. s t r u t s 2. i n t e r c e p t o r. v a l i d a t i o n. S k i p V a l i d a t i o n 2 p u b l i c S t r i n g d e l e t e ( ) { 3 s e r v i c e. d e l ete ( l o g i n ) ; 4 r e t u r n l i s t ( ) ; 5 } 6 @org. apache. s t r u t s 2. i n t e r c e p t o r. v a l i d a t i o n. S k i p V a l i d a t i o n 7 p u b l i c S t r i n g f i n d ( ) { 8 i f ( l o g i n! = n u l l ) 9 { 10 person = s e r v i c e. f i n d ( l o g i n ) ; / / update 11 } 12 r e t u r n Action.SUCCESS; 13 } 14... Řádky 1 a 6: Anotace - při této akci nebudou validovány položky vstupního formuláře. Řádky 3 a 10: Využití metod session bean PersonService. Řádek 14: get/set metody pro jednotlivé atributy.

Tvorba informačních systémů 29/46 Příklad, personlist.jsp 1/2 Instanci persons akční třídy můžeme do tabulky vložit ručně, nebo můžeme využít existující značku (nemusíme řešit stránkování apod.). V tomto případě využíváme značku display:tag 3. 1... 2 < d i s p l a y : table name= " persons " pagesize= " 10 " s o r t = " l i s t " 3 requesturi= " " class=" d i v. datatable " > 4 < d i s p l a y : column value= " Delete " u r l = " / person_delete " 5 paramid= " l o g i n " paramproperty= " l o g i n " / > 6 < d i s p l a y : column value= " Update " u r l = " / persondetail " 7 paramid= " l o g i n " paramproperty= " l o g i n " / > Řádky 4 7: Nastavení parametru login pro akce person_delete a persondetail. 3 http://displaytag.sf.net/

Tvorba informačních systémů 30/46 Příklad, personlist.jsp 2/2 1 < d i s p l a y : column p r o p e r t y = " l o g i n " t i t l e K e y = " l o g i n " / > 2 < d i s p l a y : column p r o p e r t y = " email " t i t l e K e y = " email " / > 3 < d i s p l a y : column p r o p e r t y = " password " t i t l e K e y = " password " / > 4 < d i s p l a y : column p r o p e r t y = " firstname " t i t l e K e y = " firstname " / > 5 < d i s p l a y : column p r o p e r t y = " secondname " t i t l e K e y = " secondname " 6 s o r t a b l e = " t r u e " / > 7 < d i s p l a y : column p r o p e r t y = " i n s t i t u t i o n " t i t l e K e y = " i n s t i t u t i o n " / > 8 < / d i s p l a y : table> 9 <s : u r l i d = " newurl " action= " persondetail " >< / s : u r l > 10 <s : a href= "%{newurl } " t a r g e t s = " persons " ><s : text name= "new" / >< / s : a> 11... Řádky 1 8: Nastavení sloupců tabulky výpis jednotlivých atributů instance Person z kolekce persons. Řádek 6: Tabulku bude možné třídit dle příjmení osoby. Řádky 9 10: Naformátování odkazu pro akci persondetail.

Tvorba informačních systémů 31/46 Příklad, persondetail.jsp 1/2 1... 2 <h1><s : text name= " persondetail " / >< / h1> 3 4 <s : p r o p e r t y value= " r e s u l t " / > 5 <s : i f t e s t = "%{person == n u l l } " > 6 <s : set i d = " a c t i o n S t r " value= " person_insert " / > 7 <s : set i d = " l o g i n D i s a b l e d " value= " f a l s e " / > 8 < / s : i f > 9 <s : else> 10 <s : set i d = " a c t i o n S t r " value= " person_update " / > 11 <s : set i d = " l o g i n D i s a b l e d " value= " f a l s e " / > 12 < / s : else> Detekujeme zda metoda find třídy PersonAction vrátila nějakou instanci Person. Pokud ano, tento formulář byl vyžádán pro aktualizaci záznamu (tedy s parametrem login) a požadovaná akce je person_update. Pokud metoda find vrátila null, požadovaná akce je person_insert (požadujeme tedy vložení nového záznamu).

Tvorba informačních systémů 32/46 Příklad, persondetail.jsp 2/2 1 <s : form action= "%{ a c t i o n S t r } " > 2 <s : t e x t f i e l d disabled="%{logindisabled } " name= " person. l o g i n " 3 size= " 6 " key= " person. l o g i n " r e q u i r e d = " t r u e " j a v a s c r i p t T o o l t i p = " t r u e " 4 t o o l t i p = " cccnnn " value= "%{person. l o g i n } " / > 5 <s : t e x t f i e l d name= " person. email " size= " 50 " key= " person. email " 6 r e q u i r e d = " t r u e " value= "%{person. email } " / > 7... 8 < / s : form> 9... Hodnota atributu name specifikuje atribut akční třídy kde bude uložena hodnota z formuláře. V tomto případě očekáváme v akční třídě atribut person s výše uvedenými atributy (jedná se tedy o instanci třídy Person). Atribut value specifikuje hodnotu uvedenou v textovém poli, v tomto případě se jedná o hodnotu atributu instance person z akční třídy. Atribut key definuje popis prvku GUI dle lokalizačních řetězců ze souborů package_properties*.

Tvorba informačních systémů 33/46 Akce person_list User person_list Controler Controler struts.xml struts.xml applicationcontext Localization PersonAction.list() persons PersonService.findAll() personlist

Tvorba informačních systémů 34/46 Proč (ne)použít JPA/Hibernate? : BlackBox problém možné problémy s výkonem. Nutnost výkonnostních testů. +: Je libo MySQL? 1 < p r o p e r t y name= " jpavendoradapter " > 2 <bean class = " org..... orm. jpa. vendor. HibernateJpaVendorAdapter " > 3 < p r o p e r t y name= " database " value= "MYSQL" / > 4... 5 < / bean> 6 < / p r o p e r t y > 7 8 <bean i d = " datasource " class=" org..... DriverManagerDataSource " > 9 < p r o p e r t y name= " driverclassname " value= "com. mysql. jdbc. D r i v e r " / > 10 < p r o p e r t y name= " u r l " value= " j d b c : s m y s q l : / / win456. vsb. cz / t i s " / > 11 < p r o p e r t y name= " username " value= " t i s " / > 12 < p r o p e r t y name= " password " value= " t i s " / > 13 < / bean>

Tvorba informačních systémů 35/46 Přihlášení do aplikace Přihlášení do aplikace Úkoly/problémy: Uložení stavu aplikace (často do session). Generování menu pro přihlášené/nepřihlášené uživatele Zamezení přístupu nepřihlášeným uživatelům k vybraným akcím

Tvorba informačních systémů 36/46 Přihlášení do aplikace Přihlášení, akce login struts.xml: 1 < a c t i o n name= " l o g i n _ " class=" a c t i o n. LoginAction " method= " { 1 } " > 2 < r e s u l t type= " r e d i r e c t " > p e r s o n _ l i s t < / r e s u l t > 3 < r e s u l t name= " i n p u t " > /WEB INF / pages / u t i l / l o g i n. j s p < / r e s u l t > 4 < / a c t i o n > action.loginaction: 1... 2 public S t r i n g execute ( ) throws Exception { 3 i f ( getusername ( )! = null && getpassword ( )! = null ) { 4 / / C a l l user domain bean using a DBMS 5 i f ( username. compareto ( " kra28 " ) == 0 && 6 password. compareto ( " a " ) = = 0 ) 7 { 8 this. session. put ( AppConstant. SessionFieldAuth, 9 new Boolean ( true ) ) ; 10 return SUCCESS; 11 } } 12 return INPUT ; }

Tvorba informačních systémů 37/46 Přihlášení do aplikace Odhlášení, akce logout struts.xml: 1 < a c t i o n name= " l o g o u t " class=" a c t i o n. LogoutAction " > 2 < r e s u l t type= " r e d i r e c t " > l o g i n < / r e s u l t > 3 < / a c t i o n > action.logoutaction: 1... 2 public S t r i n g execute ( ) throws Exception { 3 i f ( session. containskey ( AppConstant. SessionFieldAuth ) ) 4 { 5 session. remove ( AppConstant. SessionFieldAuth ) ; 6 } 7 return SUCCESS; 8 }

Tvorba informačních systémů 38/46 Přihlášení do aplikace Přístup k akcím Pro zabránění neoprávněného přístupu k akcím můžeme definovat tzv. interceptor, struts.xml: 1... 2 <package name= " person " extends= " s t r u t s d e f a u l t " > 3 < i n t e r c e p t o r s > 4 < i n t e r c e p t o r name= " a u t h e n t i c a t i o n I n t e r c e p t o r " 5 class=" i n t e r c e p t o r. A u t h e n t i c a t i o n I n t e r c e p t o r " / > 6 < i n t e r c e p t o r stack name= " d e f a u l t S e c u r i t y S t a c k W i t h A u t h e n t i c a t i o n " > 7 < i n t e r c e p t o r r e f name= " d e f a u l t S t a c k " / > 8 < i n t e r c e p t o r r e f name= " a u t h e n t i c a t i o n I n t e r c e p t o r " > 9 <param name= " excludeactions " > l o g i n, dologin< / param> 10 < / i n t e r c e p t o r r e f > 11 < / i n t e r c e p t o r stack> 12 < / i n t e r c e p t o r s > 13...

Tvorba informačních systémů 39/46 Přihlášení do aplikace Přístup k akcím, AuthenticationInterceptor 1/2 1 package i n t e r c e p t o r ; 2 import com. opensymphony. xwork2. i n t e r c e p t o r. ; 3 import com. opensymphony. xwork2. u t i l. ; 4 import com. opensymphony. xwork2. ; 5 import java. u t i l. ; 6 import u t i l. ; 7 8 p u b l i c class A u t h e n t i c a t i o n I n t e r c e p t o r extends A b s t r a c t I n t e r c e p t o r { 9 p r i v a t e S t r i n g a u t h e n t i c a t i o n S e s i o n F i e l d = new S t r i n g ( 10 AppConstant. SessionFieldAuth ) ; 11 p r i v a t e Set excludeactions = C o l l e c t i o n s.empty_set; 12 13 p u b l i c void s e t A u t h e n t i c a t i o n S e s i o n F i e l d ( 14 S t r i n g a u t h e n t i c a t i o n S e s i o n F i e l d ) { 15 t h i s. a u t h e n t i c a t i o n S e s i o n F i e l d = a u t h e n t i c a t i o n S e s i o n F i e l d ; 16 } 17 p u b l i c void setexcludeactions ( S t r i n g values ) { 18 i f ( values! = n u l l ) { 19 t h i s. excludeactions = 20 T e x t P a r s e U t i l. commadelimitedstringtoset ( values ) ; 21 } 22 }

Tvorba informačních systémů 40/46 Přihlášení do aplikace Přístup k akcím, AuthenticationInterceptor 2/2 1 @Override 2 p u b l i c S t r i n g i n t e r c e p t ( A c t i o n I n v o c a t i o n i n v o c a t i o n ) 3 throws Exception { 4 Map session = i n v o c a t i o n. getinvocationcontext ( ). getsession ( ) ; 5 S t r i n g actionname = i n v o c a t i o n. getproxy ( ). getactionname ( ) ; 6 S t r i n g methodname = i n v o c a t i o n. getproxy ( ). getmethod ( ) ; 7 8 Object a u t h e n t i c a t i o n O b j e c t = session. get ( 9 a u t h e n t i c a t i o n S e s i o n F i e l d ) ; 10 11 i f ( excludeactions. contains ( actionname ) 12 ( a u t h e n t i c a t i o n O b j e c t! = n u l l && 13 a u t h e n t i c a t i o n O b j e c t i n s t a n c e o f Boolean && 14 a u t h e n t i c a t i o n O b j e c t. equals ( Boolean.TRUE ) ) ) { 15 r e t u r n i n v o c a t i o n. invoke ( ) ; 16 } 17 r e t u r n AppConstant. ResultAuthRequired ; 18 } 19 } Metoda intercept je volána před spuštění každé akce.

Tvorba informačních systémů 41/46 Přihlášení do aplikace menu.jsp Menu generujeme na základě existence klíče authenticated v session. 1 <h2>menu< / h2> 2 3 <c : i f t e s t = " $ { not empty sessionscope. a u t h e n t i c a t e d } " > 4 <s : u r l i d = " p e r s o n L i s t U r l " action= " p e r s o n _ l i s t " / > 5 <s : a href= "%{ p e r s o n L i s t U r l } " ><s : text name= " p e r s o n L i s t " / >< / s : a><br / > 6 7 <s : u r l i d = " l o g o u t U r l " action= " l o g o u t " / > 8 <s : a href= "%{ l o g o u t U r l } " ><s : text name= " logoutmenuitem " / >< / s : a><br / > 9 < / c : i f > 10 11 <c : i f t e s t = " $ { empty sessionscope. a u t h e n t i c a t e d } " > 12 <s : u r l i d = " l o g i n U r l " action= " l o g i n _ i n p u t " / > 13 <s : a href= "%{ l o g i n U r l } " ><s : text name= " loginmenuitem " / >< / s : a><br / > 14 < / c : i f >

Tvorba informačních systémů 42/46 Vzhled aplikace Kaskádové styly Můžeme využít kaskádové styly (CSS) a rozdělit aplikaci na 4 části: hlavičku, levý panel (pro menu), obsah a patičku, viz style.css: 1... 2 d i v. headerpanel { 3 Background c o l o r : # b0c4de ; 4 p o s i t i o n : absolute ; top : 0 px ; l e f t : 0 px ; 5 width : 9 6 0 px ; h e i g h t : 8 0 px ; 6 } 7 d i v. contentpanel { 8 Background c o l o r : # f 5 f 5 f 5 ; 9 p o s i t i o n : absolute ; top : 8 0 px ; l e f t : 1 5 0 px ; 10 width : 8 1 0 px ; h e i g h t : 7 0 0 px ; 11 } 12...

Tvorba informačních systémů 43/46 Vzhled aplikace personlist.jsp 1 <%@ page language= " java " contenttype= " t e x t / html ; charset= u t f 8" %> 2 <%@ t a g l i b p r e f i x = " s " u r i = " / s t r u t s tags " %> 3 <%@ t a g l i b p r e f i x = " d i s p l a y " u r i = " /WEB INF / d i s p l a y t a g. t l d " %> 4 5 <html> 6 <head> 7 < t i t l e ><s : text name= " welcomemessage " / >< / t i t l e > 8 < l i n k r e l = " s t y l e s h e e t " type= " t e x t / css " href= " s t y l e. css " > 9 < l i n k r e l = " s t y l e s h e e t " type= " t e x t / css " href= " d i s p l a y t a g. css " > 10 < / head> 11 <body> 12 13 <s : i n c l u d e value= " /WEB INF / pages / u t i l / menu. j s p " / > 14 15 <div class = " contentpanel " > 16... <! Obsah > 17 / div >

Tvorba informačních systémů 44/46 Vzhled aplikace menu.jsp 1 <%@ t a g l i b u r i = " h t t p : / / java. sun. com / j s p / j s t l / core " p r e f i x = " c " %> 2 <%@ t a g l i b p r e f i x = " s " u r i = " / s t r u t s tags "%> 3 4 <div class=" headerpanel " > 5 <h1>sample A p p l i c a t i o n : S t r u t s 2 + SQLServer 2008< / h1> 6 < / div> 7 <div class=" footerpanel " >Write f o o t e r! < / div> 8 9 <div class=" l e f t P a n e l " > 10 <! Menu > 11 < / div>

Tvorba informačních systémů 45/46 Závěr Ukázková aplikace http://www.cs.vsb.cz/kratky/courses/2008-09/tis/ exam/exam6/samplestruts2app.zip

Tvorba informačních systémů 46/46 Závěr Reference http://struts.apache.org/2.x/ http://struts.apache.org/2.x/docs/ core-developers-guide.html http://struts.apache.org/2.x/docs/ validation.html