Tvorba informačních systémů Michal Krátký, Miroslav Beneš Katedra informatiky VŠB Technická univerzita Ostrava Tvorba informačních systémů, 2005/2006 c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 1/43
Obsah 6. Aplikační rámec JakartaStrutsFramework II,,, Výjimky, Validace vstupu. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 2/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 3/43
Příklad, datové zdroje 1/3 struts-config.xml: <data sources> <data source type= " org. apache. tomcat. dbcp. dbcp. BasicDataSource " > <set p r operty p r operty=" driverclassname " value= "com. mysql. jdbc. D r i v e r " / > <set p r operty p r operty=" u r l " value= " j d b c : m y s q l : / / linux456. vsb. cz / t i s " / > <set p r operty p r operty=" username " value= " t i s " / > c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 4/43
Příklad, datové zdroje 2/3 <set p r operty p r operty=" password " value= " " / > <set p r operty p r operty=" maxactive " value= " 10 " / > <set p r operty p r operty=" maxwait " value= " 5000 " / > <set p r operty p r operty=" defaultautocommit " value= " f a l s e " / > c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 5/43
Příklad, datové zdroje 3/3 <set p r operty p r operty=" defaultreadonly " value= " f a l s e " / > <set p r operty p r operty=" v a l i d a t i o n Q u e r y " value= "SELECT COUNT( ) FROM person " / > < / data source> < / data sources> c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 6/43
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(). 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() pouze vrátíme spojení do poolu! c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 7/43
Příklad, datové zdroje 1/2 Třída roš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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 8/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 9/43
1/2 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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 10/43
2/2 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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 11/43
- jcms.jsp c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 12/43
- klient cs_cz c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 13/43
- klient en_us c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 14/43
- 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. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 15/43
Příklad 1/4, Tiles, index-tiles.jsp <%@ 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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 16/43
Příklad 2/4, Tiles, layout.jsp 1/2 <%@ 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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 17/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 18/43
Příklad 4/4, Tiles c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 19/43
Cascading Style Sheets (CSS) Oddělení obsahu od prezentace HTML. http://www.w3.org/style/css Definice vzhledu pomocí atributů značek. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 20/43
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>... c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 21/43
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 ; } h2 { font f a m i l y : A r i a l Black ; font s i z e : 18 pt ; c o l o r : black ; t e x t a l i g n : l e f t ; } h3 { font s i z e : 16 pt ; c o l o r : b l a c k ; t e x t a l i g n : l e f t ; }... c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 22/43
Deklaratorní zachytávání výjimek Ošetření vstupu. Pomocí konfiguračních souborů, bez zásahu do zdrojových kódů. Příklad: c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 23/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 24/43
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 2006< / t i t l e > < / head> <body bgcolor=" white " > <h1>jcms< / h1> c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 25/43
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 p e r t y = " 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 o p e r t y = " exponent " / > < / td> c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 26/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 27/43
Příklad, registrace FormBean struts-config.xml <form beans>... <form bean name= " ComputePowerForm " type= " jcms. form. ComputePowerForm " / >... < / form beans> c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 28/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 29/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 30/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 31/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 32/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 33/43
Příklad 6. Aplikační rámec JakartaStrutsFramework II c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 34/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 35/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 36/43
Příklad 6. Aplikační rámec JakartaStrutsFramework II c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 37/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 38/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 39/43
Validace vstupu 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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 40/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 41/43
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-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 42/43
Reference Struts - http://struts.apache.org/ CSS - http://www.w3.org/style/css Tiles - http://www.lifl.fr/dumoulin/tiles/index.html c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 43/43