Tvorba informačních systémů Michal Krátký, Miroslav Beneš Katedra informatiky VŠB Technická univerzita Ostrava Tvorba informačních systémů, 2007/2008 c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 1/46
Obsah 6. Aplikační rámec Struts II,, Šablony, Výjimky, Validace vstupu. c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 2/46
6. Aplikační rámec Struts II Strategie spojení s databází: Otevřít spojení pro každý požadavek, vykonat jej a pak spojení zrušit. Otevřít spojení pro každého uživatele a uchovávat jej v rámci session. Sdílet "pool" otevřených spojení mezi všemi uživateli. Struts udržuje tzv. connection pool (implementace třetí strategie). c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 3/46
Příklad, datové zdroje 1/3 struts-config.xml: <data sources> <data source type= " org. apache. tomcat. dbcp. dbcp. BasicDataSource " > <set p r o p e r t y p r o p e r t y = " driverclassname " value= "com. mysql. jdbc. D r i v e r " / > <set p r o p e r t y p r o p e r t y = " u r l " value= " j d b c : m y s q l : / / linux456. vsb. cz / t i s " / > <set p r o p e r t y p r o p e r t y = " username " value= " t i s " / > Pozor na nekompatibilitu typu datových zdrojů (hodnota atributu type elementu data-source). c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 4/46
Příklad, datové zdroje 2/3 <set p r o p e r t y p r o p e r t y = " password " value= " " / > <set p r o p e r t y p r o p e r t y = " maxactive " value= " 10 " / > <set p r o p e r t y p r o p e r t y = " maxwait " value= " 5000 " / > <set p r o p e r t y p r o p e r t y = " defaultautocommit " value= " f a l s e " / > c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 5/46
Příklad, datové zdroje 3/3 <set p r o p e r t y p r o p e r t y = " defaultreadonly " value= " f a l s e " / > <set p r o p e r t y p r o p e r t y = " v a l i d a t i o n Q u e r y " value= "SELECT COUNT( ) FROM students " / > < / data source> < / data sources> c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 6/46
6. Aplikační rámec Struts II Po inicializaci bude connection pool uložen jako contextová proměnná servletu pod jménem specifikovaném atributem key. Implicitní název je Action.DATA_SOURCE_KEY. DataSource datasource = (DataSource) servlet.getservletcontext().getattribute( Action.DATA_SOURCE_KEY); Před začátkem práce s databází je nutné datový zdroj otevřít: datasource.open(). c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 7/46
6. Aplikační rámec Struts II Je vytvořen počet spojení odpovídající mincount, podle potřeby jsou vytvářena další spojení až do počtu maxcount. Po provedení dotazu je nutné volat datasource.getconnection().close() Neuzavřeme spojení s databází, pouze vrátíme spojení do poolu. c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 8/46
Příklad, datové zdroje 1/2 Třída rozšiřující org.apache.struts.action.action. javax. s q l. DataSource datasource ; java. s q l. Connection connection= n u l l ; t r y { datasource = getdatasource ( request ) ; connection = datasource. getconnection ( ) ; Statement stmt = connection. createstatement ( ) ; ResultSet r s t = stmt. executequery ( " s e l e c t from person " ) ; while ( r s t. next ( ) ) { System. out. p r i n t l n ( r s t. g e t S t r i n g ( "name" ) ) ; } r s t. close ( ) ; c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 9/46
Příklad, datové zdroje 2/2 stmt. close ( ) ; } catch ( SQLException sqle ) { g e t S e r v l e t ( ). log ( " Connection. process ", sqle ) ; } f i n a l l y { t r y { connection. close ( ) ; } catch ( SQLException e ) { g e t S e r v l e t ( ). log ( " Connection. close ", e ) ; } } c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 10/46
1/2 6. Aplikační rámec Struts II zobrazovaných textů chybové zprávy, texty v uživatelském rozhraní. Nastavení struts-config.xml: <message-resources parameter="messageresources"/> jsp: <html:html locale= true > Automatický výběr podle nastavení klienta MessageResources.properties MessageResources_en_US.properties MessageResources_cs_CZ.properties c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 11/46
2/2 6. Aplikační rámec Struts II JSP <h1><bean:message key="jcms.login"/></h1> Není nutné definovat všechny zprávy <message-resources parameter="messageresources" null="false"/> MessageResources MessageResources_en_US.properties: jcms.login = login MessageResources_cs_CZ.properties: jcms.login = Uživatelské jméno c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 12/46
- jcms.jsp c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 13/46
- klient cs_cz c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 14/46
- klient en_us c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 15/46
, poznámky Nevýhody popsané lokalizace je řízena nastavením klienta. Často budeme chtít lokalizaci realizovat výběrem jazyka klientem ve webové aplikaci implementace vlastních uživatelských značek. Localizace tlačítka na stránce < html:submit> <bean:message key= " button. submit " / > < / html:submit> c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 16/46
Šablony - knihovna značek Tiles Sada značek JSP Oddělení formátu stránky od obsahu. Možnost změny formátu nastavení vzhledu uživatelem. Opakovaně použitelné definice šablona parametrizovaná stránka, instance šablony konkrétní obsah. Umožňuje dynamické vytváření stránky při předávání stránky klientovi. c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 17/46
Příklad 1/4, Tiles, index-tiles.jsp Vložení instance šablony. <%@ t a g l i b u r i = " /WEB INF / s t r u t s t i l e s. t l d " p r e f i x = " t i l e s " %> < t i l e s : i n s e r t page= " / l a y o u t. j s p " f l u s h = " t r u e " > < t i l e s : p u t name= " t i t l e " value= " T i t l e " / > < t i l e s : p u t name= " header " value= " / header. j s p " / > < t i l e s : p u t name= " f o o t e r " value= " / f o o t e r. j s p " / > < t i l e s : p u t name= "menu" value= " / menu. j s p " / > < t i l e s : p u t name= " body " value= " / body. j s p " / > < / t i l e s : i n s e r t > c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 18/46
Příklad 2/4, Tiles, layout.jsp 1/2 Definice vzhledu. <%@ t a g l i b u r i = " /WEB INF / s t r u t s t i l e s. t l d " p r e f i x = " t i l e s " %> <html > <head> < t i t l e >< t i l e s : g e t A s S t r i n g name= " t i t l e " / >< / t i t l e > < / head> <body> < t a b l e width="100%" > < t r > < td colspan= " 2 " > < t i l e s : i n s e r t a t t r i b u t e = " header " / > < / td>< / t r > c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 19/46
Příklad 3/4, Tiles, layout.jsp 2/2 < t r > < td width=" 120 " > < t i l e s : i n s e r t a t t r i b u t e = "menu" / > < / td> < td> < t i l e s : i n s e r t a t t r i b u t e = " body " / > < / td>< / t r > < t r > < td colspan= " 2 " >< t i l e s : i n s e r t < / t r > < / t a b l e > < / body> < / html> a t t r i b u t e = " f o o t e r " / >< / td> c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 20/46
Příklad 4/4, Tiles 6. Aplikační rámec Struts II c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 21/46
Cascading Style Sheets (CSS) Oddělení obsahu od prezentace HTML. http://www.w3.org/style/css Definice vzhledu pomocí atributů značek. c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 22/46
Příklad, CSS, html soubor <!DOCTYPE HTML PUBLIC " //W3C/ / DTD HTML 3. 2 / /CZ" > <html > <head> < t i t l e >Tvorba informacnich systemu< / t i t l e > <meta name= "AUTHOR" CONTENT= " Michal Kratky " > <meta http equiv= " Content Type " content=" t e x t / html ; charset=iso 8859 2" > < l i n k r e l = " s t y l e s h e e t " type= " t e x t / css " h r e f = " s t y l e. css " > < / head> <body> <h1>tvorba informacnich systemu< / h1> < d i v class= r i g h t >Text< / d i v >... c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 23/46
Příklad, CSS, style.css body { background c o l o r : #d5d5d5 ; c o l o r : b l a c k ; font f a m i l y : A r i a l ; } h1 { font f a m i l y : A r i a l Black ; font s i z e : 25 pt ; c o l o r : blue ; t e x t a l i g n : c e n t e r ; } d i v { font f a m i l y : A r i a l ; c o l o r : black ; t e x t a l i g n : j u s t i f y ; } d i v. r i g h t { font f a m i l y : A r i a l Black ; c o l o r : blue ; font s i z e : 12 pt ; t e x t a l i g n : r i g h t ; margin: 1mm } th { background c o l o r : #aabbcc ; c o l o r : w h i t e ; t e x t a l i g n : l e f t ; } a : l i n k { c o l o r : g r e e n ; t e x t decoration:none ; } a : v i s i t e d { c o l o r : b l u e ; t e x t decoration:none ; }... c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 24/46
Zachytávání výjimek Ošetření vstupu. Deklaratorní zachytávání výjimek - pomocí konfiguračních souborů, bez zásahu do zdrojových kódů. Příklad: c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 25/46
Příklad, přesměrování index.jsp: <%@ t a g l i b u r i = " / tags / s t r u t s l o g i c " p r e f i x = " l o g i c "%> < l o g i c : r e d i r e c t forward= " compute " / > WEB-INF/struts-config.xml: <global forwards>... <forward name= " compute " path= " / compute. j s p " / >... < / global forwards> c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 26/46
Příklad, compute.jsp 1/3 <%@ page language= " java " contenttype= " t e x t / html ; charset=windows 1250" %> <%@ t a g l i b u r i = " / tags / s t r u t s html " p r e f i x = " html " %> <%@ t a g l i b u r i = " / tags / s t r u t s bean " p r e f i x = " bean " %> <%@ t a g l i b u r i = " / tags / s t r u t s l o g i c " p r e f i x = " l o g i c " %> < h t m l : h t m l l o c a l e = " t r u e " > <head> < t i t l e >Ukazkova aplikace, TIS 2008< / t i t l e > < / head> <body bgcolor=" white " > <h1>jcms< / h1> c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 27/46
Příklad, compute.jsp 2/3 < l o g i c : p r e s e n t name= " computepower " > <bean:message key= " computepower. r e s u l t " / > : < b e a n : w r i t e name= " computepower " p r o perty=" r e s u l t " / > < / l o g i c : p r e s e n t > < html:form a c t i o n = " solve. do " > < t a b l e > < t r > < td><bean:message key= " computepower. exponent " / > : < / td> < td> < h t m l : t e x t name= " ComputePowerForm " p r operty=" exponent " / > < / td> c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 28/46
Příklad, compute.jsp 3/3 < t r > < td>< html:submit / >< / td> < / t r > < / t a b l e > < / html:form> < / body> < / h t m l : h t m l > c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 29/46
Příklad, registrace FormBean struts-config.xml <form beans>... <form bean name= " ComputePowerForm " type= " jcms. form. ComputePowerForm " / >... < / form beans> c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 30/46
Příklad, FormBean - ComputePowerForm package jcms. form ; import org. apache. s t r u t s. a c t i o n. ActionForm ; public class ComputePowerForm extends ActionForm { private S t r i n g exponent ; } public ComputePowerForm ( ) { } public void setexponent ( S t r i n g exp ) { exponent = exp ; } public S t r i n g getexponent ( ) { return exponent ; } c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 31/46
Příklad, Model - ComputePower package jcms. common ; public class ComputePower { private i n t exponent ; private i n t r e s u l t ; } public ComputePower ( ) { } public void setexponent ( i n t exp ) { exponent = exp ; } public i n t getexponent ( ) { return exponent ; } public void setresult ( i n t res ) { } public void docompute ( ) { r e s u l t = ( i n t ) Math. pow ( 2, exponent ) ; } public i n t getresult ( ) { return r e s u l t ; } c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 32/46
Příklad, přiřazení akce k FormBean struts-config.xml <action mappings>... < a c t i o n path= " / solve " type= " jcms. a c t i o n. ComputePowerAction " name= " ComputePowerForm " scope= " request " / >... < / action mappings> c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 33/46
Příklad, Controller - ComputePowerAction 1/2 package jcms. a c t i o n ; import javax. s e r v l e t. h t t p. HttpServletRequest ; import javax. s e r v l e t. h t t p. HttpServletResponse ; import javax. s e r v l e t. h t t p. HttpSession ; import org. apache. s t r u t s. a c t i o n. ; import jcms. common. ; import jcms. form. ; public class ComputePowerAction extends A c t i o n { public ActionForward execute ( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) { c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 34/46
Příklad, Controller - ComputePowerAction 2/2 ComputePowerForm powercomputeform = ( ComputePowerForm ) form ; S t r i n g exponent = powercomputeform. getexponent ( ) ; ComputePower computepower = new ComputePower ( ) ; computepower. setexponent ( I n t e g e r. p a r s e I n t ( exponent ) ) ; computepower. docompute ( ) ; } } request. s e t A t t r i b u t e ( " computepower ", computepower ) ; return mapping. findforward ( " compute " ) ; c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 35/46
Příklad 6. Aplikační rámec Struts II c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 36/46
Příklad, deklaratorní zpracování výjimek struts-config.xml <global exceptions>... <exception key= " exception. f a t a l " path= " / compute. j s p " scope= " request " type= " java. lang. Exception " / >... < / global exceptions> Při chybném vstupu je uživateli předán prázdný formulář. c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 37/46
Příklad, compute.jsp... < / l o g i c : p r e s e n t > < h t m l : e r r o r s / > < html:form a c t i o n = " solve. do " >... MessageResource_en_US.properties: exception.fatal = Error Input! c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 38/46
Příklad 6. Aplikační rámec Struts II c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 39/46
Deklaratorní zpracování výjimek v rámci akce struts-config.xml <action mappings> < a c t i o n path= " / solve " type= " jcms. a c t i o n. ComputePowerAction " name= " ComputePowerForm " scope= " request " > <exception key= " exception. f a t a l " path= " / compute. j s p " type= " java. lang. Exception " / > < / a c t i o n > < / action mappings> c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 40/46
Zachycení výjimky v rámci akce, ComputePowerAction... t r y {... computepower. setexponent ( I n t e g e r. p a r s e I n t ( exponent ) ) ;... } catch ( NumberFormatException e ) { A c t i o n E r r o r s e r r o r s = new A c t i o n E r r o r s ( ) ; e r r o r s. add ( A c t i o n E r r o r s.global_error, new A c t i o n E r r o r ( " e r r o r. f a t a l " ) ) ; saveerrors ( request, e r r o r s ) ; }... c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 41/46
Validace vstupu 6. Aplikační rámec Struts II struts-config.xml <action mappings> < a c t i o n path= " / solve " type= " jcms. a c t i o n. ComputePowerAction " name= " ComputePowerForm " scope= " request " > v a l i d a t e = " t r u e " i n p u t = " / compute. j s p " > <exception key= " exception. f a t a l " path= " / compute. j s p " type= " java. lang. Exception " / > < / a c t i o n > < / action mappings> c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 42/46
Validace vstupu, ComputePowerForm... p u b l i c A c t i o n E r r o r s v a l i d a t e ( ActionMapping mapping, HttpServletRequest request ) { A c t i o n E r r o r s e r r o r s = new A c t i o n E r r o r s ( ) ; t r y { I n t e g e r. p a r s e I n t ( exponent ) ; } catch ( NumberFormatException e ) { e r r o r s. add ( A c t i o n E r r o r s.global_error, new A c t i o n E r r o r ( " e r r o r. f a t a l " ) ) ; } r e t u r n e r r o r s ; }... c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 43/46
Validace vstupu - plugin Validate validation.xml <form v a l i d a t i o n > <formset>... < / formset> < / form v a l i d a t i o n > c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 44/46
Ukázková aplikace 6. Aplikační rámec Struts II http://www.cs.vsb.cz/kratky/courses/2007-08/tis/ exam/exam6/jcmswebapp3.zip c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 45/46
Reference 6. Aplikační rámec Struts II Struts - http://struts.apache.org/ CSS - http://www.w3.org/style/css Tiles - http://www.lifl.fr/dumoulin/tiles/index.html c 2006-2008 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 46/46