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