Beginners Stuts tutorial

Sound knowledge of Struts Framework with hands-on experience in developing applications based on Struts , is a skill that is very much in demand now. Struts Framework was developed by Craig McLanahan in 2002 and subsequently handed over to Apache Jakarta project group. As Sun Micro Systems, works in close collaboration with Jakarta-Tomcat group, Struts has acquired semi-official status, though , it is not officially endorsed by JCP, yet. Craig McLanahan is also the architect of Tomcat4, which is the 'Reference implementation' of Servlet & JSP API by Sun. And the recently introduced JSF (Java Server Faces) also is the contribution of Craig McLanahan. What is more, Craig is also the Implementation Architect for Sun's Java Web Services Development Pack (JWSDP). That is sufficient enough list of credentials, to indicate the backing from Sun. There have been dissenting voices too, against Struts , partly because , it is somewhat difficult to learn and implement. And even an acknowledged spokesman & member of Struts Development Team and author of Struts Tutorial , Ted Husted, had to admit that the Struts naming of its classes leaves much to be desired. (for instance, instead of 'ActionServlet', it could have been called 'Controller' . Adding 'action' to everything in Struts like 'ActionForm', 'ActionServlet', 'Action', 'ActionForward' and even 'ActionErrors' etc tends to make the beginners grudge that' there is too much action here !' to their liking!). And it appears that, of late, some leading Architects feel that Struts is likely to give way to other Open-Source technologies from the same Apache group ,like Turbine and Torque( which are even more obscure and less documented).Judging by the number of latest job-advertisements calling for Struts skills, it is a bit difficult to concur with that perception. Struts appears to have become 'defacto' standard, like SAX, though one wishes that everything had been done within JCP ,so that developers will always be dealing with officially approved standards, rather than maverick standards, however good they might be. ( by the way, the correct term is 'struts' and not 'structs', as is mis-spelt often). ---------------------------------------------Here are some of the points listed by Author John Carnell ('Professional Struts Applications'Wrox press-2003) in favour of adopting Struts. To paraphrase....

**i)Senior developers and Architects in large software houses are extremely over-worked and the main job of in-house senior programmers is developing business-logic and not application-framework! ii) Struts framework was built by some of the finest developers in the Industry, and is opensourceand free. iii)It has been tested and debugged by hundreds of expert volunteers, thus giving it a high degree ofQuality Assurance. If a company tries to build a similar framework by itself, it will take thousands ofexpert man-hours and millions of dollars! ---------------------------------------------A good understanding and practical knowledge of Servlets, JSP, JavaBeans, Tag Library, MVC Architecture ,XML conifig files and Tomcat server , is required before a learner could even attempt understanding Struts.(It is for this reason, that we covered our own MVC implementation in the last edition). And it has to be supplemented with real practical work, to get it going. Without sufficient labexperience, a hundred things can go wrong! Just a bit of careless 'casing' and package names and we are confronted with stubborn compile errors. Remembering the fact that xml files also are 'case-conscious', would save us a lot of frustrating delay. And it is so easy to get lost in the paths and class paths of Java, especially with 'Struts'! Struts is a framework for building really complex Enterprise-level web applications. Note the emphasis on 'Enterprise-level'. Such applications are by necessity, multi-tier. Carnell makes a neat distinction between Enterprise-services like Transaction management, Resource pooling, Load Balancing and Security and Application-services like Data-validation , error-handling, Application navigation and screen-layout and personalization. While EJB takes care of Enterprise-services, the task of developing easily alterable and maintainableApplication-services in a really large web-application, could be a maddeningly

chaotic and tangled 'web'( literally) and such problems are NOT tackled by EJB. Enterpriselevel projects are developed by teams and unless there is a well-known and standard framework, the teams? work would fail to dovetail. The business-tier, Data-tier and presentationtier,all have to be co-ordinate seamlessly. This requires that all the teams and team-members know and practice a given standard. This point has been forcefully stressed in web-forums. As Struts has acquired wide awareness & acceptance, it fulfils this need admirably. Carnell lists the challenges of Web Development as : 1. Stateless nature of HTTP. 2. Limited User Interface of HTML. ( this is addressed effectively by WebForms in ASP.net and JSF). 3. 4. thousands of concurrent users huge number of inter-related navigation options.

Many companies have web-based applications where the number of screens that the user can navigate to, is in thousands! (SAP user-interface is composed of over 1,50,000 screens, reports and dialog boxes!--- and they were reported to be converting them into java-GUI .to provide platform independence.) (p.376 of Java Web Services by Hendricks..WROX). For all these reasons and more, Application-services are important and daunting to develop! -----------------In the true spirit of MVC, the Struts framework separates the View, Controller and Model. It does notconcern itself with the implementation details of business-logic and data-access tiers. ---------------------------That said, the very fact that it is an Enterprise-level framework, presumes( or it should) that we are using some form of EJB and some type of well-proven method of separation of Data-tier and business-logic tier. Though, Struts has provision for local data access, it is not advisable to use

(ie) The layers should be de-coupled from each other.. ties our application . to a strut-walker!).' and JDO is the recommended method.(Java Server Programming by Allama Raju of WebLogic-WROX press). the moment we speak of products like Oracle/SqlServer/MySql in our code .(BMP introduces SQL in java code while CMP & JDO adopt declarative management for database and query.(We can easily imagine. it is sql). as well as RDBMS. As Carnell rightly points out. ( bmp persistence code need not necessarily be sql but in most cases. inextricably with Oracle .0 version .In a well-designed system. how dangerous a brittle struts is. This enables us to use Object Databases too(JDO). Standard Design Patterns. advocating the use of stateless-bean for simplicity and speed. Some authorities from BEA-WebLogic. such as a. unless we are careful in implementing separation . but going further in separation of Model into delegation.. And a design based on such stateless-session bean can easily be exposed as XML-WebService by simple drop-in deployment in Axis. The EJB3. service-location.). though it may involve sql in code itself. Service Locator Pattern c. which preclude changes. Control and Model. Thus.is said to favor JDO strongly. Oracle/PL-SQL if used in EJB code.that facility for Enterprise-level work. BMP seems to have been less of a success. Business Delegate Pattern b. as much as possible. the recommended method is to use a stateless EJB for data access directly or as a facade for CMP or JDO. The advantage of CMP and JDO . is that details of the actual database product used . do not find a place in code. even a Struts applications may become brittle.( see DeveloperIQ. if the yardstick is 'avoidance of SQL & vendor specific features of SQL.This is undesirable.to be released shortly . each of these tiers should be pluggable (ie) any change in one tier should not affect other tiers. data access and data itself. Session Facade Pattern . we get locked with vendor-specific details.not merely between View . At present. nor does it recommend it. According to a number of authors. are even. business logic .April & May -2004).

.when using servlets. We have been doing 'URL-pattern' in Tomcat4. it would illustrate 'Facade Pattern'. Design Patterns.xml file. J2EE students are expected by the Industry. in this lesson. we can enumerate the following points.based on Struts. we had used a simple utility bean.'Gang of Four') b. by editing the concerned XML files. to keep the example simple. It is well to bear this in mind while reading books).. it would be an example of 'Service Locator'. I. . we should provide for all the above three patterns and implement them. Ideally.: Elements of Reusable Object-Oriented Software" by -ERICH GAMMA & three others ( known as GoF. in an Enterprise application . All requests are passed through a controller servlet. typically. a. this facilitates 'centralized-declarative change management'. And if that ejb happened to be a stateless bean connecting with a CMP . we are using 'business delegation' alone. Developing Struts Application If we are asked to give a very brief outline of Struts. And in j2ee webserver like Tomcat. known as Action-servlet. for carrying out a specific function. CORE J2EE PATTERNS ( J2EE BLUEPRINTS) by SUN MICROSYSTEMS (Some Struts authors are intent in showing that the Struts design follows some standard design patterns. That would be a case of 'Business Delegation'. without touching the source or class files of the servlets or Struts Actions. to have read two famous and essential books on Design Patterns. In an earlier part of this J2EE tutorial .are some of the patterns recommended in the 'model' region of Struts work!. while Carnell is concerned with suggestions for implementing Design patterns in the Model stages of Struts application. though . This is achieved by suitable 'url-mapping' in web. If such a bean is used as a client for an EJB.

There are many actionforms but only one ActionServlet(because. generated. query. Many tutorials. Our focus in this tutorial is actual implementation. in this demo. 'Eclipse' etc. ii.jsp QueryForm. in that sequence too. We use tags in input side and also for output view. In an illustration. iii. Sometimes. VII. which have their own learning curve! Our aim is to avoid such things and yet develop a useful lesson. Details about various action classes.)( Struts-tags) VIII.(The input form also belongs to 'view' category in MVC. The ActionServlet.we should not introduce more than one 'unfamiliar' tool or concept.xml). action-forwards etc are given in strutsconfig. All data submitted by user are sent to corresponding ActionForm.java(derived from Action) . the data submitted has to be validated and error messages .( an instance of ActionForward).(and hence ActionMapping) VI. populates this bean with data and sends the bean to the View JSP. it is the controller). (ActionErrors). creates an instance of valuebean.xml IX. The action object carries out the business logic either directly or through helper classes . V. The details about the ActionServlet and other servlets if any . IV. -------------------------------------------We use the following six files.java(derived from ActionForm) QueryAction. bring in tools like 'Ant'. The important and distinctive feature of this arrangement is that the entire thing is done by'Declarative-Management'.II.(as specified in strutsconfig. examines the source of request and extracts the data from specified actionform and sends it to a specified instance of Action class.in our application are given inweb. i.xml --------------------------------------------It is now the right time ( & 'high time' at that!)to take up a simple and practical example.forms. III.

xml in this demo. Otherwise.jsp'. (for simplicity. This is not JSTL but Struts Tag Library.iv.jsp ( besides the web. sqlbean. The truth is that . getter and setter methods for each of the controls in the form. v. we need hardly set our eyes on web.do'. This is achieved by the FormBean.java ( a value bean) result. silently supervising things.or on the source code of ActionServlet. We provide. We do not subclass it.jsp'. We should note the following very carefully. It remains unobtrusively in the background .xml files) Where is the much-spoken-about ActionServlet? That is provided by Struts Framework itself. It is a Struts-specific class known as 'ActionForm'. we are using simple text rather than password control). which is invoked by the URL. (the case is extremely important!). so that he need not fill up the form again but needs to make only the required corrections. vi. except for advanced work. ------------------------------------In our example.java ( a utility bean) resultbean.There is automatic conversion of action from 'Query' to 'Query. the query is executed. In our example. the starting point is ' query. the form is presented back to the user with the values already entered by him intact. many developers leave it alone. these are 'password' and 'query'. ================================= .xml & struts-config. We are also using struts-tags named as 'html' tags.If the password is 'ADMINISTRATOR'. As Ted Husted says. The name of the form is given as 'queryForm' & action is 'Query'..'http://localhost:8080/sam/query.The user fills up a form giving password and also an sql query.Note the taglib directive.

jsp <%@ taglib uri="/WEB-INF/struts-html.( see web. The corresponding formbean is given below.do'. are automatically directed to the StrutsServlet(ie) ActionServlet.tld" prefix="html"%> <html> <body bgcolor=yellow> This is query page <br> <html:form action="Query" name="queryForm" type="demo1.do'. ========================================= All actions with extensions of '*.xml file provided by the Struts application. in normal html forms. it is known as 'property'. the control has a 'name' attribute. In the default web. the actionservlet is given 'URL-pattern' as '*. But in html:text.) .xml)as given below.// query.QueryForm"> Are you the Administrator?<br> Your password please!<br> <html:text property="password" /> <br> query <br> <html:text property="query" size="60" /> <br> <html:submit /> </html:form> </body> </html> ============================================== Usually.

we have tag-library descriptors for struts custom-tag-libs like 'html'. It is already available in the Struts application.ActionServlet </servlet-class> <init-param> ..(shown in bold).struts. 'bean' etc. ------------------------------web..This is followed by servletmapping.xml.xml =========================================== <?xml version="1..'logic'. <!-. It is equally important that we should not corrupt this file carelessly! It is best left alone.------------------------------(We need not type even a single line of web. ..action. as already mentioned..where the 'config' param is indicated as 'strutsconfig.ActionServlet configuration mentions the name of the servlet as 'action' and gives the fully qualified class-name of servlet...xml in WEB-INF folder of the application."?> . it will only look forbidding.. the relevant portion alone is shown here.Finally.. So.. This is followed by init-parameters section....apache. It is worth mentioning again that we do not have to type this file.. ......) If the full file is printed here.0" .....Action Servlet Configuration --> <servlet> <servlet-name>action</servlet-name> <servlet-class> org.

. ....Struts Tag Library Descriptors --> <taglib> <taglib-uri>/tags/struts-bean</taglib-uri> <taglib-location>/WEB-INF/struts-bean..do</url-pattern> </servlet-mapping> .........Standard Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.... .tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-html</taglib-uri> <taglib-location>/WEB-INF/struts-html.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-logic</taglib-uri> ...xml</param-value> </init-param> .... <!-.............. ... <!-...<param-name>config</param-name> <param-value> /WEB-INF/struts-config. .....

jsp.tld</taglib-location> </taglib> . </web-app> ============================================== When the user submits the query.apache.*..<taglib-location>/WEB-INF/struts-logic. .. the formbean is automatically filled up with the values from the jsp-page and the flow goes to the ActionServlet.*.. public class QueryForm extends ActionForm { String password =null.servlet.. //------------------------------ public String getPassword() { return password. // QueryForm.http. import org... import javax.action. } //----------------------------- public String getQuery() . String query =null.java package demo1. } public void setPassword(String b) { password=b..struts.

we make two entries.xml file. -----------------------------------------( this is the part dealing with the formbean) <form-beans> <form-bean </formbeans> name="queryForm" type="demo1. query=null. HttpServletRequest request) { password=null.As the entry for 'query action' makes a reference to 'query form'.The struts-config.} //--------------------------- public void reset(ActionMapping mapping.(WEB-INF\classes\demo1\QueryForm.QueryForm" /> -----------------------------------This means that our formbean is named 'queryForm' and is available in demo1 subfolder of classes folder.} public void setQuery(String a) {query=a. } } ============================================== In the struts-config.xml file in WEB-INF folder is created by us and is the nerve-center of customized functionality.{return query.class) . let us first see the details of the entry for 'query form'. One entry is for the instance of QueryForm bean and the other entry is for the instance of QueryAction class.

given separately. unless we are careful. (ie) QueryAction. It is the same name given in the instance of QueryForm class. we can never even get started with invoking the form! ----------------------------------The next segment of mapping in struts-config.(all the authors follow uniform pattern of naming the bean.QueryAction" name="queryForm" scope="session" input="/query.Since all these are inter-dependent.jsp" /> <forward name="failure" path="/query. as it appears in QueryAction.Carefully note the name of the bean. The class name begins with capital letter and the instance begins with lowercase).jsp" > <forward name="success" path="/result1.xml deals with the action mapping for the instance of Action class. <action-mappings> <action path="/Query" type="demo1.jsp" /> </action> .java.

the Struts code looks unfamiliar and frightening. Finally.do". if(a. it says that the matching form to be used is 'queryForm'. processing goes on.The input is coming from query. (the code snippet from QueryAction. ------------------------------------------------QueryForm queryForm =(QueryForm) form. String b = queryForm. this declarative manipulation . is a really clever and inspired innovation. why. the returned ActionForward in the action class is "failure" and we have mapped this string to query.equals("ADMINISTRATOR")) { --------------------------------------------( Though. users get addicted!) Otherwise. it sounds like a song! Perhaps. Therefore.jsp. the corresponding action class is QueryAction class in demo1 subfolder of classes folder of webserver. the reason. at first. If the user had correctly entered the password as 'ADMINISTRATOR'. the action class extracts the properties from queryForm and does some validation according to our code.getQuery().jsp (ie) going back to the opening form itself! We must admit that . String a = queryForm.</action-mappings> ----------------------------------------------------It means that the request comes from the path "/Query. on repeated reading and familiarity. By . in flow management.javais as given below).getPassword().

. if(a.println (" now in QueryAction ========"). import java. . but the same effect is obtained. String r= bean1.java package demo1.println("bean1 ready").*. // business delegation System.http.servlet.util. ----------------------------------------// QueryAction. the behaviour of the program can be easily changed.io. HttpServletRequest request.*.action. The full code for QueryAction has been given below.getresult(b).getPassword(). sqlbean bean1 = new sqlbean().simply changing the entry in this struts-config file. ServletException { QueryForm queryForm =(QueryForm) form.*.out.out.*. String a = queryForm. ActionForm form. public class QueryAction extends Action { public ActionForward execute(ActionMapping mapping. RequestDispatcher class instances are NOT explicitly mentioned anywhere.HttpServletResponse response) throws IOException.*.servlet. import javax.equals("ADMINISTRATOR")) { System. import org.struts. String b = queryForm.apache. import java.getQuery(). import javax.

println("verifying..out. session. This type of delegating the work to a functionbean is the recommended practice. System. System."+r).println("value is. HttpSession session=request.toString()). System.println("mathew bean created").println ("function invoked on bean1").out. mathew. return (mapping.println ("value set for mathew").out. System.out. System.out.setValue(r)."+v).out.out.getValue(). }else{ return (mapping. } } } ====================================== If the password is correct.getSession().out. resultbean bean=(resultbean)session.println(m).getValue()..mathew).println("verifying the value").out. System.println ("--------ok -------------")... resultbean mathew = new resultbean().System.println ("now sending mathew to result.setAttribute("result".findForward("failure")).findForward("success")). String v=bean.getAttribute("result"). System. String m = mathew.out.jsp"). System.out.println("attribute for 'result' set as mathew"). the processing proceeds to create an instance of 'sqlbean'.println(bean. Instead we create an instance of functionbean and just invoke a method on it by passing the parameter and .. System. System. We are advised not to let the Action class itself do any business-processing directly.

getConnection(url). } return r.out. while(rs. public class sqlbean { public String getresult(String sql) { String r = "".println(""+e1).*. } } catch(Exception e1) {System. // sqlbean. ResultSet rs = statement.getString(2).executeQuery(sql). String b = rs.createStatement(). r=r+a+"<br>"+b+"<br>"+"---------"+"<br>". We illustrated the same method in the tutorial on MVC in the last edition too and so it should not be difficult to follow. Connection connection=DriverManager.io.getting the return value.next()) { String a = rs. String url = "jdbc:odbc:dbdemo".odbc.jdbc. } } ============================================== .JdbcOdbcDriver").forName("sun. Statement statement=connection.*. import java. try { Class.sql. import java.getString(1).java package demo1.

public resultbean(){ value=" ". the code creates an instance of valuebean known as 'resultbean'.. public class resultbean { String value. The name of this bean has been given as 'mathew'.Thus. -------------------------------------------------------------// resultbean.jsp.jsp In result.And mathew's value is set as 'r'. we have used just jsp-tags like <jsp:useBean..> Carefully note the syntax. some authors frown upon it ). The 'id' is NOT 'mathew' but 'result'!. just to make it standout from the crowd. } public String getValue(){ return value. we are passing the bean itself to the destination (ie) result.After getting the result from the utilitybean.> and <jsp:getProperty. } } =================================== We now create a session context( though. and set the sessionattribute of "result" as mathew! Thus.. This has just one property (ie) value. We just extract the value and automatically display it..java package demo1. we have met the stringent . especially the 'id' and 'name'.. } public void setValue(String v){ value=v.

understanding the code is one thing ( and the easier thing at that) and actually executing the program .resultbean" /> <jsp:getProperty name="result" property="value" /> <br> ok here </body> </html> Testing Struts Application It will be noticed that there are a lot of 'system.Intentionally so! The step by step progress gets printed in the Tomcat console and is very instructive.out.is quite a different thing altogether! We must do each step with maximum care.jsp <html> <body bgcolor=orange> <jsp:useBean id="result" scope="session" class="demo1. When trouble occurs. it aids in diagnosis greatly.It also gives us a clear understanding. ------------------------------------------ But.requirement that our view pages should be absolutely free from 'scriptlets'.println's in the action class code. -----------------------------------------// result. -----------------------------------------We begin by creating a folder( say) g:\examplestruts> . to avoid a lot of problems.

java . iii.java QueryAction. --------------------------------- How do we instal Struts in our system? ----------------steps. v.java result. ------------1. cd to g:\examplestruts\demo1 --------------------------Create the following six files in demo1 folder. .java sqlbean. unless we first install Struts in our system. So create a subfolder named 'demo1'. query.jsp QueryForm.jsp ----------------------------------We cannot compile QueryForm.java resultbean.java & QueryAction.Our proposed package name is demo1. vi. i.1 zip file from DeveloperIQ CD to g:drive. ii. transfer jakarta-struts1. iv.

3. open webapps folder.txt ----------------------------------------------6. we will find the following war files there. It got unzipped as jakarta-struts1.2. ---------------------------------------------We get three folders and 3 files 4.1 folder. a) readme. 7. unzip it into c:\unzipped. copy struts-blank.txt b) license.war into: .txt c) instal.( web-application-archives) a )struts-blank b)struts-documentation c) struts-example d) struts-exercise-taglib e) struts-template f) struts-upload g) struts-validator ---------------------------------------------- 8. The 3 folders are a) contrib b) lib c) webapps ============ The 3 files are: 5.

In a DOS window. and let .jsp ----------------------------------------------- 15. ---------------------------------------------- 9.g:\tomcat41\webapps folder.jsp ---------------------------------------------- 16. If you expand struts-blank folder. start the browser and type the url as : http://localhost:8080/struts-blank/index. check up that struts-blank. Place it in your container's "webapp" folder (or equivalent). 13. copy the struts-blank.4 11. Now in another dos window . i) META-INF ii) WEB-INF iii) pages There is also an index. You will get the corresponding display as follows: Welcome! To get started on your own application. tomcat server gets started . cd to g:\tomcat41\bin 10. startup -------------------------------------------- 12. >set JAVA_HOME=D:\JDK1.war to a new WAR file using the name for your application.war has automatically expanded by the server and we get a folder named struts-blank. there are 3 subfolders there. 14.

========================================== Inside the WEB-INF folder.tld 2) struts-html. and you are on your way! (You can find the application.tld 5) struts-tiles. sub-folders i)classes ii) lib iii) src ----------------------files =============== tld files ( 6 files) =============== 1) struts-bean. restart your container. ----------------------------------------------- Thus.your container auto-deploy the application.tld 4) struts-template. we have the following subfolders and files.tld ------------------- xml files ( 5 files). Edit the skeleton configuration files as needed. .tld 6) struts-nested.properties file with this message in the /WEB-INF/src/java/resources folder. we have correctly installed struts in our tomcat server.tld 3) struts-logic.

=========================================== When we want to build our own application. And restart the Tomcat server.jar vii) commons-validator.jar was copied to c:\quick folder for easily remembering the classpath.xml v) validator-rules.jar ii) commons-collections.jar vi) commons-logging.========================== i) web.jar iii) commons-digester. struts. we first copy struts-blank folder in the webapps folder of tomcat & Rename the folder . i) commons-beanutils.jar v) commons-lang.xml ============================= There are a number of jar files available in lib folder.jar ix) struts. .xml ii) struts-config.xml iv) validation.jar iv) commons-fileupload.(say) sam.jar viii) jakarta-oro.xml iii) tiles-defs.jar ------------------------------------- All this is just for information.

dtd"> <struts-config> <form-beans> <form-bean .demo1>javac QueryAction.demo1>javac QueryForm.jar .java . we will be able to compile easily. After compiling.jsp to: 'g:\tomcat41\webapps\sam' now in another dos window...0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation// DTD Struts Configuration 1.demo1>javac resultbean.c:\quick\struts.org/struts/ dtds/struts-config_1_1.d:\tomcat41\common\lib\servlet.jsp & result.d:\jdk1.xml edit the struts-config.java .jar.============================================== Now.1//EN" "http://jakarta.apache.java .4\bin >set classpath=g:\examplestruts. We are now in g:\examplestruts\demo1 >set path=c:\windows\command.xml as follows: ========================================== <?xml version="1.. copy all the class files in this folder to: g:\tomcat41\webapps\sam\WEB-INF\classes\demo1 copy query.demo1>javac sqlbean. in this sequence. cd to: g:\tomcat41\webapps\ sam\WEB-INF\struts-config.. we are ready to begin compiling.java ( if we compile the files one after the other.

restart the Tomcat server. So. this far. If we get.jsp' You should get a form with orange background.name="query path ty scope=&q name="que path="/Query" <action type="demo1. our adventure with Struts has had a happy ending.& articles. we can and must build up further by in-depth study of books. the page appears to be not responding just showing whatever we typed. If we type the password as 'ADMINISTRATOR' and the sql as 'select * from table1'. ( Ofcourse.jsp" /> <forward name="failure" path="/query. we will get the query result. we will see advanced Struts topics like : DynaForm Validator Framework Tiles RequestProcessor Scaffold Struts-Tags ------------------------ . If the password is wrong.jsp" <forward name="success" path="/result. Type the URL in browser as: 'http://localhost:8080/sam/query. the example presumes the usual creation of a simple Access database named 'dbdemo' with just table1 having two fields ( name.</struts-config> </struts-config> After all these steps. In the forthcoming installments.QueryAction name="queryForm" scope="session" input="/query. so that the settings become effective.jsp" />sp. etc. place) and registering it in ODBC.

It is but a simple introduction . 'Understanding Struts Framework' by Manoj Kothale ( DeveloperIQ... Respectful Acknowledgements to: 1.This tutorial cannot be a substitute for hundreds of articles and dozens of books on Struts . Struts in Action . Mastering Jakarata Struts by James Goodwill (Wiley/DreamTexh) 3..August-2003) ================================== Suggested Reading: 1. Professional Struts Applications by John Carnell ( Wrox ) ============================================== .. by Ted Husted ( Manning press/ DreamTech publication) 2. 'Struts your Applications' by Piyush SriVasthava ( DeveloperIQ---November-2002) 2.

it may be that only a combination of Struts and JSF. plain JSP.1 version.Struts Validator Framework .com' & 'www. We had seen an introduction to Struts in Jan-2005 issue of DeveloperIQ. Most learners find getting started with Struts . Struts is still very important for developers and students. rather than pure JSF.moreservlets. . In this hands-on tutorial . will be adopted by developers and software houses. the author explains how we can use this readymade framework. As Struts involves every one of the preceding technologies.coreservlets. JSTL. with a lab-oriented lesson.Another book is 'Mastering Jakarta Struts' by James Goodwill with some modifications. companies seem to be exploring JSF.As a large number of applications have already been built using Struts. MVC. We will adopt the same method .com').In this first part. a simple struts demo with non-framework based validation . Struts has been widely adopted and despite the emergence of more 'official' JSF last year (2004). because. is developed.It may take some time before JSF completely replaces Struts. the Validation Framework has been bundled with Struts1. JSP using beans. The exception is the tutorial by Marty Hall ( 'www. rather than beginning with a lengthy theoretical treatment of Struts. We will now have a brief and practical recapitulation of a typical Struts-based application and then proceed to illustrate the use of Validator framework. partly because of the books and articles in circulation. Since its introduction in 2001. right now.lab oriented lesson Struts & validation Validation is an essential feature in any web-application and to make it easier.STRUTS and JSF. very difficult and confusing.Thus. a good knowledge of Struts is equivalent to competence in J2EE Web-Tier. Java webserver technology has progressed through Servlets. Struts is still holding its ground and only recently. Taglibrary. it gives more importance to hands-on procedure.

Any typical struts-based application. we find a folder named 'webapps'.When we expand the folder. We get a folder by the same name.war' files ( web-archive files). We are using d:\JDK1. we give the command. we rename the struts-blank folder as (say) modelapp.1 into C:\unzipped. will have the following six files .2 and then startup This will automatically expand the war file to create a folder in e:\tomcat41\webapps named as 'struts-blank'.This is the quickest and best method to develop a strutsbased application.war and paste it in 'e:\tomcat41\webapps' folder.java .4.We should create a subfolder under 'classes' folder and name it as 'modelpack' (for package). e:\tomcat41\bin>shutdown.jsp 2) modelForm.One such file is 'struts-blank. we can turn our attention to the files in our modelapp.We will find a 'resources' folder already there.4. Expand this folder and we find a number of '*. To shutdown the Tomcat server. We can cd to e:\tomcat41\webapps\modelapp\WEB-INF\classes folder. With these preliminaries over. We copy struts-blank.war'. we will find the standard j2ee directory structure and all the necessary framework files in-place. After shutting down the tomcat server. 1) modelSubmit.If we open modelapp folder.HOW TO INSTAL STRUTS? Unzip Jakarta-Struts1.2 and we cd to e:\tomcat41\bin and set JAVA_HOME=D:\JDK1.

. the forward path should be to modelOutput.jsp("success") and otherwise. e:\tomcat41\common\lib\servlet.jar ( we have copied struts.2\bin >set classpath=g:\mydir.java 6) modelOutput. This mapping specifies that if the path began with '/model'. It also says that if any validation logic succeeds. c:\quick\struts. It looks into the struts-config.jsp ("failure"). When he submits this page . We have to set path & classpath for this command window as follows: >set path=c:\windows\command.3) modelHelper.jsp Our project folder is g:\mydir.java 4) modelResult.4. We create all the above six files in this folder. d:\jdk1.jsp is the opening page invoked by the user. the controller should collect the data from modelSubmit.jsp.) modelSubmit.jar from modelapp\WEB-INF\lib folder into c:\quick for ease. The modelAction class collects the data from modelForm instance and invokes the modelHelper to carry out the business-logic.xml file where action-mapping has been mentioned by us. (this is the package name ). populate the modelForm bean with these data and then pass the bean to modelAction class. it should be modelSubmit.jar. cd to modelpack.java 5) modelAction. cd to g:\mydir and md modelpack.the ActionServlet(controller) is invoked.

we need give particular attention to <html:errors /> tag now. We will now create the required files.xml file .xml file. the ActionServlet simply controls the flow depending on the settings entered by us in the struts-config.jar ---------------------------------We are using Struts-specific tag library. . If we had been following the earlier tutorial on Struts. e:\tomcat41\common\lib\servlet. We are now in g:\mydir\modelpack folder. It then creates a session context and passes this bean as its 'result' attribute..So. The business logic .jar.the jsp) and C(controller. The Tag-library-descriptor files (tld) are already in place in our WEB-INF folder.xml file. Therefore. as follows. it is advisable not to tamper with the web. The entire thing allows Declarative change management through the struts-config.The Action class does not do anything except invoking the helper and setting the value for result bean. is preferably executed by a helper class ( a function bean).helper) V(view . For smooth work. So.2\bin set classpath=g:\mydir. the modelOutput. c:\quick\struts. set path=c:\windows\command. Finally. The modelAction then creates an instance of modelResult ( a value bean) and sets its value.4.(model. in the correct order.Action servlet) do their respective jobs.The helper carries out the job and returns the value to the modelAction. we have effectively implemented MVC pattern where M. no special steps are necessary. d:\jdk1.jsp collects this result and displays it without using any scriptlet...

in our case.java'.This is for displaying any error messages. named as 'modelForm.jsp.tld" %> <%@ taglib prefix="logic" uri="/WEB-INF/struts-logic. this is not just the usual javabean . we have to derive it from Strut's ActionForm class.modelForm"> <html:text property="name"/> <br> <html:text property="code"/> <br> <html:submit/> </html:form> </body> </html:html> =========================================== After creating this input file.( Shortly . we provide setter and getter methods for all the fields in the modelSubmit. when we use the validator framework. but Struts-specific bean. ---------------------------------// g:\mydir\modelpack\modelSubmit. we have to create a javabean.jsp <%@ taglib prefix="html" uri="/WEB-INF/struts-html. we .For this reason.tld" %> <%@ taglib prefix="bean" uri="/WEB-INF/struts-bean. This is an attribute bean and sometimes known as formbean. However. 'name' and 'code'. namely.tld" %> <html:html> <body bgcolor=pink> <html:errors /> <html:form action="/model" name="modelForm" type="modelpack.Following the standard javabean naming convention. There are two fields.

all the Struts classes are based on Servlet API and we need to import 'javax.http. Special attention can be given to the validate method.servlet.We have written some rudimentary validation check to see if the field is empty and if so an error instance is created with the 'key' (errors.servlet.action. In order to derive it from Struts ActionForm. we have to import 'org.apache. Moreover.nullname=<li> ENTER YOUR NAME</li> errors. import org.*. import javax. This may be kept in mind).nullname). Similarly (errors. ===================================== errors. There is a file known as 'Application.apache.struts.java package modelpack.action.will be deriving our modelForm not from ActionForm but from ValidatorForm.nullcode=<li>ENTER YOUR CODE</li> errors.*.*' also.http.properties' in 'WEBINF\classes\resources' and at the end of that file we will add the following lines.nomatch=<li>DOES NOT MATCH</li> Therefore.( when we base our modelForm on ValidatorForm.*'. public class modelForm extends ActionForm . we won't be providing this method).struts. we will get the specified error messages.nullcode). ******************************************* //g:\mydir\modelpack\modelForm.

HttpServletRequest { ActionErrors errors = new ActionErrors(). public String getName() { return } public void setName(String { name=s. s) name. if( name. } //------------------------------public String getCode() { return } public void setCode(String { code=s. mapping.length()==0) . null. HttpServletRequest s) code. } public request) { name code } public ActionErrors validate (ActionMapping request) = = null. void reset (ActionMapping mapping.{ String String name code = = null. null.

new ActionError("errors. This enables 'de-coupling' of various stages. they are given ahead of modelAction class. This is not to be confused with the ActionServlet class of the Struts framework. The ActionServlet is the controller and works in the background.{ errors.nullcode")). As the 'modelAction' class makes use of 'modelHelper' and 'modelResult' beans. } if(code. The modelAction class collects the data from the modelform bean.add("name". new ActionError("errors. in simple demo applications. But. given below. It simply collects data from modelSubmit. we compare the name and code and if they match. =========================================== The modelAction class is derived from Action class of Struts.jsp. The 'tom' bean is set as the session-attribute "result". Sometimes. populates the modelForm with those values and then sends the form to the modelAction.With this note.jsp . the action class itself may carry out the business logic and directly send the result to the output.length()==0) { errors. } return } } errors. Just for a very simple illustration. the helper class bean is asked to 'inform' and the resulting string returned by this helper bean is set as value for the valuebean instance 'tom'.nullname")). .add("code". we can easily understand the code. the preferred method is to use a function bean ( a helper class) such as modelHelper.

------------------------------------// g:\mydir\modelpack\modelHelper..". public class modelResult { String value. public class modelHelper { public { return "Correct } } Code!..java package modelpack. setValue(String v) value. getValue() . String inform() ------------------------------------// g:\mydir\modelpack\modelResult. } public String { return } public void { value = v.java package modelpack. public { modelResult() value = " "..

getCode(). modelResult tom = new modelResult(). .servlet. a = modelform.inform().equals(b)) { modelHelper helper = new modelHelper(). request. import java. import java.servlet.action.*. ServletException { modelForm String String modelform = (modelForm) form. import javax.util.http.io.*.apache. if(a. import javax.} } ******************************************* // g:\mydir\modelpack\modelAction.java package modelpack. import org. public class modelAction extends Action { public ActionForward execute mapping.*. String r = helper.getName().struts.*.*. b = modelform. form. response) (ActionMapping ActionForm HttpServletRequest HttpServletResponse throws IOException.

} } } ======================================= Finally.jsp. which simply collects the data from the bean and display it. return(mapping. } else { ActionErrors errors = new ActionErrors().jsp ******************************************* ( We can also write the modelOutput.getSession(). errors.GLOBAL_ERROR. session.findForward("failure")). HttpSession session = request. we takeup the modelOutput.errors). we used JSP tags only).jsp // ( second version) . saveErrors(request. return(mapping.setAttribute("result".setValue(r).jsp as given below. new ActionError("errors.add (ActionErrors.findForward("success")). we are using Strutsspecific tags . -------------------------------------// g:\\mydir\modelpack\modelOutput. In this method.tom.nomatch")). whereas in the previous method. --------------------------------------// g:\mydir\modelpack\modelOutput. tom).

tld" %> <%@ taglib prefix="bean" uri="/WEB-INF/struts-bean.<%@ taglib prefix="html" uri="/WEB-INF/struts-html. Are we ready to test our program? NOT YET! . we can compile without any difficulty.java -------------------------------------If we had followed the steps carefully. compile the four java classes >javac *. Next.tld" %> <%@ taglib prefix="logic" uri="/WEB-INF/struts-logic.jsp and modelOutput.jsp to: 'e:\tomcat41\webapps\modelapp' folder. we copy the four class files to: 'e:\tomcat41\webapps\modelapp\WEB-INF\classes\modelpack' folder. We copy modelSubmit.tld" %> <html:html> <body bgcolor=yellow> <bean:write name="result" property="value" /> </body> </html:html> ====================================== After creating all the above files.

properties file. The required entries have been given below.A -----------------------------------//e:\tomcat41\webapps\modelapp\web-inf\struts-config.xml & b) application.sample end sample --> <form-bean name="modelForm" type="modelpack.We have to make entries in : a) struts-config.jsp" scope = ?session? .======== Form Bean Definitions --> <form-beans> <!-.modelAction" name = "modelForm" input = "/modelSubmit.xml <struts-config> <!-.modelForm"/> </form-beans> <action path = "/model" type = "modelpack.

validate="true" >

<forward name="success" path="/modelOutput.jsp"/>

<forward name="failure" path="/modelSubmit.jsp"/>

</action>

</action-mappings>

/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/>

<!-- ================================ Message Resources Definitions --> ****************************************** // e:\tomcat41\webapps\modelapp\web-inf\classes\resources\ application.properties
# -- standard errors -# -- validator -errors.invalid={0} is invalid. errors.maxlength={0} can not be greater than {1} characters.

# -- myerror-messages -errors.nullname=<li> ENTER YOUR NAME</li> errors.nullcode=<li>ENTER YOUR CODE</li> errors.nomatch=<li>DOES NOT MATCH</li>

******************************************* We are now ready to test our application. First, start the tomcat4 server e:\tomcat41\bin>SET JAVA_HOME=D:\JDK1.4.2 e:\tomcat41\bin>startup This will start the tomcat server. Now, we type the Url as : 'http://localhost:8080/modelapp/modelSubmit.jsp' We will get the entry form with two fields. If we click the submit button, without entering name or code, we are taken back to modelSubmit.jsp with the message 'ENTER YOUR NAME' /'ENTER YOUR CODE'. If we enter SAM for name and TOM for code, we get the error message 'DOES NOT MATCH'.but if same values are given for name and code, we get the output jsp which says that 'code is correct!'. Thus, we have developed a simple struts demo with validation. With this background, it is now very easy to understand the next example which makes use of Validator framework. This, we take up in part-2.

USING THE VALIDATOR FRAMEWORK
Validator framework requires two XML files, namely, 1. alidator-rules.xml & 2. validation.xml

( we are using struts1.1)

These files are already available in WEB-INF folder , along with web.xml and strutsconfig.xml. So, no special installation is necessary, to use the Validator framework. The validator-rules.xml file provides the rules for the ready-made validations available in the framework. The validation.xml file is meant for specifying our requirements. It is advisable not to tamper with the validator-rules.xml( just as we need not meddle with web.xml file). The Validator framework provides ready-made facility for the following: 1. RequiredField validation

2. Regular-Expression validation(mask) 3. email validation 4. credit-card validation 5. date validation 6. minvalue validation

7. maxvalue validation 8. range validation 9. byte, short, int, long validation 10. float, double validation. ---------------------------------When we use the Validator Framework, we get the bonus of client-side Javascript validation also,automatically, with messagebox and all! Otherwise, we will have to write very laborious and clumsy javascript functions for routine validations. Client-side validation, though not very reliable, saves the round-trip time and so is better appreciated by clients. However, the framework gives server-side validation always. ------------------------------Let us now take up a comprehensive demo for illustration. We shall name this as 'validsapp'! The example will be easy to follow, since we have already covered the usual pattern in our previous lesson.

i.java is derived from ValidatorForm and not from ActionForm. 1. Finally.struts.As the focus of this second part of the tutorial is on the method of using the Validator framework. ii. we have to add a few key-value pairs for the error messages in application.jsp & 2. The validsForm. Therefore we have to import ' 'org. .java & 2. there is no need to provide validate method in the validsForm class file. validsSubmit.*.java ----. let us skip the helperbean and resultbean. We should not forget to make entries for form-bean and action-mapping in strutsconfig. we rename 'struts-blank' as 'validsapp' and create 'validspack' folder in validsapp\WEB-INF\classes\' folder. Since the framework takes care of form-validation.apache. Thus. as per the requirements specified by us in thevalidation. validsAction.validator. the other files follow the usual pattern.'.xmlfile.There are just a few changes required. as before.jsp and two java classes. iv.xml' file available in WEB-INF\ folder. We have to make suitable entries in 'validation. validsForm. vi.----------------------As before. validsOutput. Readers may refer to part-1 for exact procedure. this demo requires just two jsp files. Apart from these. 1. iii.propertiesfile in WEB-INF\classes\resources folder. v.xml file.

e:\tomcat41\common\lib\servlet.jsp: onsubmit="return validateValidsForm(this). Carefully note that the two following lines in validsSubmit. validsForm. ------------------------1. d:\jdk1.We now create a folder 'validspack' in 'g:\mydir'.java 3.jar -------------------------- We create the following files in : 'g:\mydir\validspack' folder.jsp 2. validsSubmit.jsp ------------------------------------------ The files have been given below.java 4. in that order. validsAction.2\bin set classpath=g:\mydir."> <html:javascript formName="validsForm" /> (The above two lines enable the javascript validation in client-side. cd to g:\mydir\validspack' set path=c:\windows\command. c:\quick\struts. validsOutput. when we use the Validator framework) .4.

tld" %> <%@ taglib prefix="logic" uri="/WEB-INF/struts-logic."> NAME: <html:text property="name"/> <br> PASSWORD:<html:text property="password"/> <br> MAIL-ID <html:text property="mail_id" /> <br> DATE: <html:text property="date"/> <br> PINCODE:<html:text property="pincode"/> <br> <html:submit/> </html:form> <html:javascript formName="validsForm" /> </body> </html:html> .jsp <%@ taglib prefix="html" uri="/WEB-INF/struts-html.validsForm" onsubmit="return validateValidsForm(this).tld" %> <%@ taglib prefix="bean" uri="/WEB-INF/struts-bean.*************************************** // code-1 // g:\mydir\validspack\validsSubmit.tld" %> <html:html> <body bgcolor=pink> <html:errors /> <html:form action="/valids" name="validsForm" type="validspack.

*.apache.struts. String pincode = null.http. public class validsForm extends ValidatorForm { String name = null.validator. import org.action.servlet.struts.apache. } public void setPassword(String b) { password=b. } public void setName(String a) { name=a.java package validspack.*. } //------------------------------ public String getMail_id() . public String getName() { return name.// code-2 // g:\mydir\validspack\validsForm. String date = null. import org. import javax. String password = null.*. String mail_id = null. } //---------------------------- public String getPassword() { return password.

} //------------------------------- public void reset(ActionMapping mapping. mail_id = null. pincode = null. } } . HttpServletRequest request) { name = null. } public void setPincode(String e) { pincode=e. } public void setDate(String d) { date=d. } public void setMail_id(String c) { mail_id=c. date = null. } //---------------------------- public String getDate() { return date. } //------------------------------- public String getPincode() { return pincode. password = null.{ return mail_id.

*.*.getName(). String s2 = validsform. HttpServletResponse response) HttpServletRequest request. .servlet.io. import java. import org. import java. import javax.java package validspack.getMail_id().getPassword().*.============================================ // code-3 // g:\mydir\validspack\validsAction.length()!=0) { String r =s1+"<br>"+ s2+"<br>"+s3+"<br>"+ s4+"<br>"+s5.action.getDate(). String s3 = validsform. String s4 = validsform. String s1 = validsform. public class validsAction extends Action { public ActionForward execute (ActionMapping mapping.*. import javax.http.*. HttpSession session = request.util.getPincode(). if(s1.getSession().servlet. ServletException { validsForm validsform =(validsForm) form. String s5 = validsform. ActionForm form. throws IOException.struts.apache.

r).jsp <html> <body bgcolor=lightgreen> <% String r= (String)session. out.global")). new ActionError("errors. return(mapping. return(mapping.println(r). } } } ===================================== // code-4 // g:\mydir\validspack\validsOutput.getAttribute("result").GLOBAL_ERROR. errors. } else { ActionErrors errors = new ActionErrors().session.setAttribute("result".errors).findForward("failure")). We are in g:\mydir\validspack .add(ActionErrors.findForward("success")). %> </body> </html> ========================================== We are now ready to compile and deploy. saveErrors(request.

******************************************* // code-5-.jar) ------------------------------ >javac *. We copy validsSubmit.c:\quick\struts.jar. e:\tomcat41\common\lib\servlet. ( c:\windows\command.end sample --> <form-bean name="validsForm" type="validspack.class and validsAction.class to: 'e:\tomcat41\webapps\validsapp\WEB-INF\classes\validpack' folder.java We now copy validsForm. ------------------------We have to make the following entries in: e:\tomcat41\weebapps\validsapp\WEB-INF\struts-config.xml file.d:\jdk1.end samples --> .4.jsp to : 'e:\tomcat41\webapps\validsapp' folder.validsForm" > </form-bean> </form-beans> <!-----.jsp and validsOutput.Checkup the path.2\bin) Checkup classpath (g:\mydir.

validsAction" scope="session" validate="true"> <forward name="success" path="/validsOutput.xml in : 'e:\tomcat41\webapps\validsapp\WEB-INF' folder --// code-6 end example form --> <form name="validsForm"> <field property="name" depends="required"> <arg0 key="validsForm.mask"> <arg0 key="validsForm.name" /> </field> <field property="password" depends="required. and devote more attention to the crucial entries in validation.jsp" name="validsForm" type="validspack.minlength.jsp" /> <forward name="failure" path="/validsSubmit.password" /> <var> <var-name>minlength</var-name> <var-value>6</var-value> </var> <var> <var-name>mask</var-name> .jsp" /> </action> </action-mappings> ***************************************** As these are exactly the same pattern as in part-1.<action path="/valids" input="/validsSubmit. we can skip detailed explanation.

mask"> <arg0 key="allvalidsForm.email"> <arg0 key="validsForm.date"> <arg0 key="validsForm.pincode" /> <var> <var-name>maxlength</var-name> <var-value>6</var-value> </var> <var> <var-name>mask</var-name> <var-value>^\d{5}\d*$</var-value> </var> </field> </form> </formset> </form-validation> ============================================== And finally.mail_id" /> </field> <field property="date" depends="required.maxlength.<var-value>^[0-9a-zA-Z]*$</var-value> </var> </field> <field property="mail_id" depends="required. we add the following lines in: .date" /> <var> <var-name>datePattern</var-name> <var-value>MM/dd/yyyy</var-value> </var> </field> <field property="pincode" depends="required.

. errors.prefix=<LI> errors.integer={0} must be an integer. errors.float={0} must be an float.standard errors -- errors.validator -errors. ******************************************* // code-7 # -.byte={0} must be an byte.long={0} must be an long.required={0} is required. errors. errors.suffix=</LI> errors.footer=</UL> # -. errors.header=<UL> errors.minlength=password can not be less than 6 characters.double={0} must be an double.date={0} is not a date. errors.invalid={0} is invalid.range={0} is not in the range {1} through {2}.properties.maxlength=pincode can not be greater than 6 characters. errors. errors.e:\tomcat41\webapps\validsapp\WEB-INF\classes\ resources\application. errors. errors.

short={0} must be an short.email={0} is an invalid e-mail address. # -.global="NO NAME HAS BEEN GIVEN" validsForm.creditcard={0} is not a valid credit card number. # -. and you are on your way! (You can find the application.mail_id=MAIL_ID validsForm. errors. and let your container auto-deploy the application.general=The process did not complete. restart your container. errors. Details should follow.name=NAME validsForm. Place it in your container's "webapp" folder (or equivalent).token=Request could not be completed.errors.war to a new WAR file using the name for your application. errors.date=DATE validsForm.pincode=PINCODE ************************************************ .detail={0} errors.cancel=Operation cancelled. Edit the skeleton configuration files as needed.other -- errors.message=To get started on your own application.welcome -- welcome.title=Struts Blank Application welcome. copy the struts-blank.) #----------------------------------------errors.password=PASSWORD validsForm. Operation is not in sequence. errors.properties file with this message in the /WEB-INF/src/java/resources folder.heading=Welcome! welcome.

we will get the submit form. This is the client-side Required-Field validation. ( If we get a lot of javascript along with the controls. we will get error message. without making any entries. we have specified three conditions. Finally. for pin-code. For the password. it means that we have made some mistakes in the xml files. The date pattern has been given as 'mm/dd/yyyy'.It is self-explanatory. . we will get a messagebox as shown. Nor can we use capital letters. We open another command window and cd to: e:\tomcat41\bin Then set JAVA_HOME=D:\JDK1. specific validation is done only after the required field condition in all the controls is met. if we type the date as '31/01/2005'.com ( we are not supposed to provide space either before or after @ ).2 >startup ----------------------Start the browser and type the Url as : 'http://localhost:8080/validsapp/validsSubmit.xml file. because. it should not be blank. We can test for this error one by one after putting some letters in all the fields.) If we submit the form. namely.jsp' If all goes well. it should not have less than 6 characters and finally we have given a regular expression which means that the characters can be lowercase or uppercase or numearals ( ie) no special characters are allowed. So. we have provided a regular expression as well as maxlength condition.4. The error condition for wrong mail-id can be easily simulated by giving it as tom @ dom.We shall first run the demo and then have some explanation for the entries in the validation.see shot 4.

chapter-12..we can provide further validation code in action class which is known as 'action-validation'.If all these are apparently correct. the results of client-side validation may differ from Server-side validation. there is no client-side java-script validation. Programming Jakarata Struts by Chuck Cavaness (OReilly) -chapter-11 3. the creator of the Validatorframework and so is authoritative). STRUTS IN ACTION by TED HUSTED & OTHERS ( the chapter on Validator framework . has been co-authored by David Winterfeldt.. STRUTS SURVIVAL GUIDE by Srikanth Shenoy ******************************************** . it may be confusing but that is how things stand now. (Sometimes.If due to some reason. As Husted points out. ( Manning / DreamTech) 2.( see screen shots given here)..) ============================================== Reference books: ----------------------------------1. we get server-side validation messages for all the above conditions.

java package roseindia. Here is code of our Action Class: LoginAction. import org. Model Part of Login form Example: Model is basically data of you application.apache.servlet. This article will explain how to develop login form in struts. A collection of Java beans and other helper classes that you use for your application In Login Form Example .http.servlet. /** * @Author Sushil Pal * @Web http://www.apache. Action class 2. It was originally created by Craig McClanahan and donated to the Apache Foundation in May.com * @Copyright RoseIndia. Struts adopts an MVC architecture. . 2000.http. ActionForm class Action Class: The action class is the link between the Struts framework and your business application logic.struts.How To Develop Login Form In Struts Apache Struts is an open-source framework for developing J2EE web applications.struts.ActionForm.jsp.action.net * @Email pal_sushil@hotmail.roseindia.Action. Our Action class returns the ActionForward called "loginAction".HttpServletRequest.net */ import javax. import javax.action. which is defined in the struts-config. import org.the following classes will be used-1. The purpose of Action Class is to translate the HttpServletRequest to the business logic.web.xml file . It uses and extends the Java Servlet API to encourage developers to adopt an MVC architecture. this Action class only forwards the login.HttpServletResponse.action.java. In this example our Action class is LoginAction.struts.

jsp otherwise to failure.getUsername(). ActionForm maintains the session state for web application and the ActionForm object is automatically populated on the server side with data entered from a form on the client side.action.equals("password")) { // we are in return mapping. } else { // not allowed return mapping. ActionForm Class: An ActionForm is a JavaBean that extends org.findForward("failure"). HttpServletResponse response) throws Exception{ LoginForm loginform = (LoginForm) form. import org. and create the corresponding HTTP response and Return an ActionForward instance describing where and how control should be forwarded.struts. public class LoginAction extends Action { public ActionForward execute( ActionMapping mapping.getPassword().ActionMapping.The ActionForm class is pre-populated with form data when the form is submitted.apache.findForward("success"). if (loginform. It must have setters and getters for all the form fields.apache.web. ActionForm form.java package roseindia. } } } Action Class process the specified HTTP request.struts.equalsIgnoreCase("username") && loginform.struts. Here is code of our ActionForm Class: LoginForm.apache.struts.java. In our login action class if username field value will be 'username' and password will be 'password' then the mapping will forward to success.jsp.action.ActionForm.import org. HttpServletRequest request.action. In this example our ActionForm class is LoginForm.action.ActionForward. .

HttpServletRequest.password=password.apache.roseindia.com * @Copyright RoseIndia. private String usertype=null. public class LoginForm extends ActionForm { private String action="add".net * @Email pal_sushil@hotmail.http. } public void setUsername(String username){ this. * */ import javax.net */ /** * Form bean for the Login Entry Screen.password.username=username.action=action.*.action. private String password=null. } public void setPassword(String password){ this. private String username=null. } public String getUsername(){ return this. import org.action. } public String getAction(){ return this.struts./** * @Author Sushil Pal * @Web http://www. } public String getPassword(){ return this.servlet. } public void setUsertype(String usertype){ . public void setAction(String action){ this.username.

this. } public void reset(ActionMapping mapping.value. HttpServletRequest request){ this.action="add".username.jsp.jsp. JSP pages can contain static HTML (or XML).length==0){ alert("Please enter UserID!").plus the ability to insert dynamic content based on the interpretation of special action tags. } public String getUsertype(){ return this.focus(). objForm. } } View Part of Login form Example: The View portion of a web application is most often constructed using JavaServer Pages (JSP) technology.usertype=null.usertype=usertype.title"/></title> <html:base/> <script language="javascript"> function validate(objForm){ if(objForm.username=null.this.jsp. In this example our JSP pages are login.jsp <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <html:html locale="true"> <head> <title><bean:message key="welcome.usertype. success. Here is code of our JSP pages: login.password=null. return false. . this. this.username. failure.

"><center> <table width="400" border="1" align="center" cellpadding="0" cellspacing="0"><tr><td> <table border="0" cellspacing="2" cellpadding="1" width="100%" > <tr bgcolor="#eaeac8"> <td align="left" colspan="2"><font size="5"> User Login</font></td></tr> <tr><td colspan="2"><p>&nbsp.value. return false. } if(objForm.focus().password.selectedIndex == 0 ){ alert("Please Select User Type!").focus(). } return true. objForm.length==0){ alert("Please enter Password!"). objForm. } </script> </head> <body bgcolor="white"> <html:form action="/login" method="post" onsubmit="return validate(this).} if(objForm.password. return false.usertype.</p></td></tr> <tr align="center"> <td align="right">User ID:</td> <td><html:text property="username" size="30" maxlength="30"/></td></tr> <tr align="center"> <td align="right">Password:</td> <td><html:password property="password" size="30" maxlength="30"/></td> .usertype.

jsp <%@page import="java.*"%> <%@page import="javax.*"%> <% //getting value String username=request.util. String password=request.io.*"%> <%@page import="javax. .sql.</tr> <tr align="center"> <td align="right">Login As:</td> <td> <html:select property="usertype"> <option>---------------Login As---------------</option> <option value="Buyer">Buyer</option> <option value="Seller">Seller</option> <option value="Guest">Guest</option> </html:select> </td> </tr> <tr><td colspan="2"><p>&nbsp.*"%> <%@page import="javax.getParameter("username").sql.*"%> <%@page import="java.naming.*"%> <%@page import="java.servlet.getParameter("password").</p></td></tr> <tr> <td align="center" colspan="2"><html:submit> Login Now !</html:submit></td></tr></table> </td> </tr> </table> </center> </html:form> <body> </html:html> success.

jsp"><font size="3" color="blue">Retry click here!</font></html:link></p></center> </body> </html:html> Controller Part of Login form Example: The Controller part is focused on receiving requests from a web browser.getParameter("usertype").xml. and then delegating responsibility for producing the next phase of the user interface to an appropriate View component. The main component of the Controller in the framework is a servlet of classActionServlet.Defining the mapping for our example. %> <html> <head> <title>Success</title> </head> <body> <p> Hi . deciding what business logic function is to be performed. Put the following code in struts-config.String usertype=request.jsp <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <html:html locale="true"> <head> <title><bean:message key="welcome. <%=username%><p> <p align="center"><font size="3" >You Are Successfully Loged in as <font color="red"><%=usertype%></font> </font></p></body></html> failure.</form-beans> . Put the following codes within the <form-beans> --------.title"/></title> <html:base/> </head> <body bgcolor="white"> <p align="center"><font size="3" color="red"> Sorry your UserId/Password is incurrect</font></p> <center><p><html:link page="/pages/login. This servlet is configured by defining a set of ActionMappings.

The restart the tomcat. and compile application using ant.struts.action.web.xml. You browser window should look like: . Now your login application is ready.jsp"/> </action> How to run this Example: Installing Struts Application: Download latest version of Struts from the site of Struts http://jakarta.LoginAction" name="LoginForm" scope="request" validate="true" input="/pages/login.</actionmappings> section.struts.LoginForm"/> </form-beans> Put the following codes within the <action-mappings> --------.web. <action path="/login" type="roseindia.jsp"> <forward name="success" path="/pages/success.section.org/struts. <form-bean name="LoginForm" type="roseindia. Now open Internet Explorer and type http://localhost:8080/strutsblank/ and press Enter.apache.war to tomcat webapps directory.action. Start tomcat. Make necessary changes in the struts-config. Tomcat automatically extracts the file and loads the application. Copy struts-blank. Download the code from here and then integrate it with the struts-blank application.jsp"/> <forward name="failure" path="/pages/failure.

2 using STRUTS FRAMEWORK.2 My aim is to write about EJB2. ..0 in JBOSS3.. Struts integration with EJB in JBOSS3. Hi . Sorry your UserId/Password is incorrect Retry click here! In this tutorial you have learned how to develop simple login application with struts.Now click on the link Login Page Example the following window will open. username You Are Successfully Loged in as Buyer If you enter incorrect user id and password the failure page will display. Now type User Id as 'username' and password as 'password' and select a login option then press login button. The success page will display.

Entity Bean 3. MessageDriven Bean (MDB) Session Bean .WebLogic Server JBoss Application server IBM … . Different kinds of Enterprise Beans are 1. Typical services provided by the EJB Container are as follows. 1. Session Bean 2.Connection pooling 5.Support for messaging services The most famous EJB-Servers in the market are:     BEA .The EJB specification provides Enterprise-level services.Persistence 2..Security 4.2 & 4 are OpenSource and Free. JBoss 3.Declarative transactions 3.WebSphere-5 Oracle AS Of these . JBOSS application sever has become recognized leader in the java application server market and to date is the major application server.

( CMP is an ORM technology ( Object-Relational Mapping Technology … like Hibernate. BMP (Bean Managed Persistence). persistence code need not be written by the programmer.Session Bean can be defined as function bean called in RMI-IIOP style from Enterprise container. MDB have no conversational state with the client and can be pooled like stateless session bean. Two types of session bean are stateless session bean. Messaging is like email whereas RPC is like phone call. MDB have no home or remote interfaces. What is Struts? . A stateless session bean does not maintain conversation state but stateful session bean maintains conversation state Entity Bean Entity Bean is a value bean with setter and getter methods representing one row of data in a table.CMP is not satisfactory for really complex enterprise situations. stateful session bean. and Hibernate is considered to be better than CMP). In such situations messaging is more reliable. Message Driven Bean Session Bean and Entity bean are based on RPC mechanism. But. Unlike other types of EJB. In CMP. Two types of Entity Beans are CMP (Container Managed Persistence). invoked in RMI style from Enterprise container in Enterprise data store. Message Driven Bean is based on Asynchronous messaging . In enterprise environment there will be heavy traffic and RPC may fail to create connection. But In BMP Persistence code has to be written by the programmer .

Here „ kala ‟ folder is our . In Struts1.war file to c:\tomcat5\webapps. there is a folder name called lib. is struts-blank. ( validation test is passed). For the View. Struts works well with JavaServer Pages.war.Struts is a very famous ready made framework which implements MVC (Model View Controller) Architecture. as well as Velocity Templates. There are many war files.. If there is no error. Start the tomcat server.. including JSTL and JSF. if the values entered by the user are wrong then the user must be presented with the same page with suitable error messages and the values already entered by the user should be preserved. like Hibernate. It is open source and free.1 folder. Copy that struts-blank folder and paste it in desktop. Now struts-blank folder is created . Struts is a frame work for building really complex Enterprise level applications Struts provide its own Controller component and integrates with other technologies to provide the Model and the View. place that folder( „ kala ‟ ) in c:\tomcat5\webapps. Struts frame work was developed by Craig MacLanahan in 2002 subsequently handed over to Apache Jakarta projects group.( Assuming that we have installed tomcat5 in C drive). or Object Relational Bridge. Rename the folder as „ kala ‟ . Now. One of the war file names. iBATIS. and other presentation systems Purpose of the Struts When the user fills the form and submits the form. For the Model.1 is zip file. XSLT. like JDBC and EJB. as well as most any third-party packages. Installation Struts1. Copy that struts-blank. Extract it. Struts can interact with standard data access technologies. then the business logic is executed.

D:\strutsejbdemo>md demo1 Here demo1 is our package D:\strutsejbdemo>cd demo1 Next we create a batch file to set path and classpath D:\strutsejbdemo\demo1>edit setpath.4. We require jboss3.. Open the Browser.2 and JDK1. Create a folder „ strutsejbdemo ‟ in D drive. We have installed jboss3.bat .4. This is our working directory. We have already created the context „ kala ‟ in tomcat5 as mentioned above. For this we have created the two folders namely demo and demo1 in D:\jboss32\server\default\deploy\kala.2 and JDK1.2 in D:\drive . Restart the tomcat server. This means that our installation process is correct.2 server through a Struts-based program. . Now the „ welcome ‟ page will appear.war In this lesson. we have created two packages namely demo and demo1.war\web-inf\classes to copy the class files D:\>cd strutsejbdemo D:\strutsejbdemo> When we use struts the concept of package is very important. type the URL as „ http://localhost:8080/kala.2 for developing this exercise The following lesson illustrates the method of connecting to a stateless session bean in jboss3.context. Copy that „ kala ‟ context folder to E:\jboss32\server\default\deploy as kala.

d:\jboss32\client\jboss-system-client.jar.jar.jar.jar.jar.d:\jboss32\client\jboss-common-client. Checkup as follows: D:\strutsejbdemo\demo1>path D:\strutsejbdemo\demo1>echo %classpath% Now edit the following files . Give the following command: d:\strutsejbdemo\demo1>setpath This will set the path for the window d:\strutsejbdemo\demo1>setcpath ( This will set the classpath for the window ).jar.d:\jboss32\client\Log4j.bat set classpath=d:\ejbdemo.4.d:\jdk1. When we use package we giveclasspath to parent directory.jar.) Usually we give a class path to working directory.d:\jboss32\client\jbossj2ee. This is very important. D:\strutsejbdemo\demo1\edit setcpath.d:\jboss32\client\jbossclient.d:\jboss32\client \jnp-client.d:\jboss32\client \jboss-transaction-client. If you are using Windows-2000.d:\jboss32\client\jbosssx-client.d:\bea\weblogic700\server\bin ( I am using WindowsXP. the path to edit program should be :c:\winnt\system32. After creating batch files in the working folder.set path=c:\windows\system32.jar.2\bin.

cityHome. import java. cityguide.util. vector1.java 4.*. vector1. public class cityguide { public String listcities(String a) { Vector vector1=new Vector(). } if(a. if(a.equals("KERALA")) { .1.addElement("Trichy").java 2.java D:\strutsejbdemo\demo1>edit cityguide.addElement("Madurai"). ciyRemote.java package demo1. cityBean.addElement("Madras").equals("TAMILNADU")) { vector1.java 3.

addElement("Mysore"). vector1.j++) { String v=(String)vector1.equals("KARNATAKA")) { vector1.addElement("Bangalore").size().addElement("Hubli"). vector1. } . for(int j=0.addElement("Trivandrum").vector1.addElement("Cochin").elementAt(j). } if(a.addElement("Quicon"). } String r="". } return r. r=r+v+"<br>". int n=vector1.j<n. vector1. vector1.

public interface cityRemote extends EJBObject { public String showcities(String s) throws RemoteException. import java.} //---------------------------------------------------------------------------------------------------------D:/strutsejbdemo/demo1>edit cityRemote.rmi.java package demo1.*. import java.*. public interface cityHome extends EJBHome { public cityRemote create() .ejb.java package demo1.*. import javax. import javax.rmi. } //---------------------------------------------------------------------------------------------------------D:/strutsejbdemo/demo1>edit cityHome.*.ejb.

String r = guide1. } //--------------------------------------------------------------------------------D:/strutsejbdemo/demo1>edit cityBean.java package demo1. import javax. RemoteException.listcities(s).ejb.throws CreateException. } public void ejbCreate() {} public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sc) {} .*. public class cityBean implements SessionBean { public String showcities(String s) { cityguide guide1= new cityguide(). return r.

com/dtd/ejb-jar_1_1.META-INF not meta-inf Now edit the ejb-jar.0"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems. Compile all the above files D:\strutsejbdemo\demo1>javac *.xml <?xml version="1.war\webinf\classes\demo1 D:\strutsejbdemo>demo1\cd. D:\strutsejbdemo>md META-INF When we use package META-INF folder is created in parent folder. It should be in uppercase ie.xml in META-INF D:\strutsejbdemo\META-INF>edit ejb-jar.java D:\ejbstrutsdemo\demo1>copy *.class d:\jboss32\server\default\deploy\kala..//DTD Enterprise JavaBeans 1.sun.dtd"> <ejb-jar> <enterprise-beans> <session> ..1//EN" "http://java. Inc.xml and jboss.} //---------------------------------------------------------------------------------------------------------We have already set the specified path and classpath.

xml <?xml version="1.<ejb-name>city</ejb-name> <home>demo1.cityBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> //-------------------------------------------------------------------------------------------------D:\strutsejbdemo\META-INF >edit jboss.0" encoding="UTF-8"?> <jboss> <enterprise-beans> <session> <ejb-name>city</ejb-name> <jndi-name>cityJndi</jndi-name> </session> </enterprise-beans> .cityHome</home> <remote>demo1.cityRemote</remote> <ejb-class>demo1.

</jboss> //---------------------------------------------------------------------------------Now.2 D:\jboss3. The development of the EJB and its deployment in JBOSS server is over.2\bin\>run The server will start now. D:\ejbstrutsdemo>md demo D:\ejbstrutsdemo>demo . cd back to D:\strutsejbdemo\ Create the jar file as follows: D:\strutsejbdemo\>jar cf city. D:\strutsejbdemo> copy city.jar D:\jboss32\server\default\deploy Start the jboss server as shown below Go to new window to start the jboss server.xml Carefully note that the jar file is created in parent directory.class META-INF\*. we copy the jar file to the jboss folder as shown below.jar message will appear in the server.jar demo1\*. //----------------------------------------------------------------------------------------------------------Now we develop the Struts client program for the above EJB.jar is deployed correctly deployed city. Now. D:\jboss32\bin\>set JAVA_HOME=D:\JDK1. If our jar file namely city.4.

jsp <%@ taglib uri="/WEB-INF/struts-html. D:\strutsejbdemo\demo>setcpath We use the following six files.bat set classpath=%classpath%.java ( a utility bean) 5.e:\struts1.java ( a value bean) 6.struts-config. kalaresult. 1.jsp 2. in this demo package.jsp ( besides the web.java(derived from Action) 4.tld" prefix="html" %> <html> <body bgcolor=cyan> <center> <h1>STRUTS CLIENT FOR STATELESS</h1> </center> <html:errors/> . kalaForm.properties file) D:\ejbstrutsdemo\demo1>edit kalaSubmit.d:\strutsejbdemo. kalaOutput. kalaAction.xml files & application.D:\strutsejbdemo\demo>edit setcpath. kalahelper.java(derived from ActionForm) 3.jar.xml .1\lib\struts. kalaSubmit.

D:\strutsejbdemo\demo>edit kalaForm. import javax. <html:errors/> tag is used to displaying error messages.servlet.*.kalaForm" > State <br> <h1>Whick State Do you want to tour?</h1> <h2>TAMILNADU?KERALA?KANADA?</h2> <html:text property="state" /> <br> <html:submit /> </html:form> </body> </html> //---------------------------------------------------------------------------------------------------------When the user submits the kalaSubmit. .<html:form action="kala" name="kalaForm" type="demo.jsp.http. the formbean is automatically filled up with the values from the jsp-page and the flow goes to the ActionServlet.java package demo.

} public void reset(ActionMapping mapping.apache.import org.struts. } public ActionErrors validate (ActionMapping mapping. } public void setState(String a) { state=a.action.*. HttpServletRequest request) { state=null. public String getState() { return state. public class kalaForm extends ActionForm { String state =null. HttpServletRequest request) { .

} } //---------------------------------------------------------------------------------------------------------D:\strutsejbdemo\demo>edit kalahelper. import javax.*. if( state. new ActionError("errors.io. } return errors. public class kalahelper { .rmi.*.add("state".rmi. import javax.*. import java.*.ActionErrors errors = new ActionErrors(). import java.ejb.naming.util.*. import java.nullstate")).java package demo.*. import javax.length()= =0) { errors.

Context context=new InitialContext(props).out. props.").println("Please Wait.put(Context. System. System.cityRemote remote= home.lookup("cityJndi").create().out.public String callejb(String s) { String r.interfaces"). props. .put(Context.jboss.out.INITIAL_CONTEXT_FACTORY.PROVIDER_URL..jnp.out. try { System.interfaces."localhost").println("HOME LOCATED"). System.cityHome home= (demo1..cityHome)context.jnp. props.NamingContextFactory").put(Context.naming:org.URL_PKG_PREFIXES. Properties props=new Properties(). demo1. "org. demo1.println("Connection OK").println("REMOTE READY"). "org.

r=remote.java package demo. public kalaresult() { value=" ". public class kalaresult { String value. } } //------------------------------------------------------------------------------------------------D:\strutsejbdemo\demo>edit kalaresult.showcities(s). } . } catch(Exception e1){ r=""+e1. } return r. } public String getValue(){ return value.

import java.struts.*.apache.servlet.*. } } //---------------------------------------------------------------------------------------------------The Action Class is part of the Model and is a wrapper around the business logic.*. public class kalaAction extends Action { public ActionForward execute(ActionMapping mapping.*.action. D:\strutsejbdemo\demo>edit kalaAction. import javax. import org. the action class instance is using a helper to perform the business logic.io. This is the bettter and recommended practice.*.util.public void setValue(String v){ value=v. import java. import javax.java package demo.http. The purpose of Action Class is to translate the HttpServletRequest to the business logic In our case.servlet. .

callejb(a).findForward("success")). HttpServletResponse response) throws IOException.getValue().getSession(). String r = helper.equals("TAMILNADU") || a.ActionForm form. String m = kr. System.out.setValue(r).equals("KARNATAKA")) { kalahelper helper = new kalahelper().equals("KERALA") || a. String a = kalaform. return (mapping.kr). kr.getState(). ServletException { kalaForm kalaform =(kalaForm) form.println(m). HttpSession session= request. } . kalaresult kr = new kalaresult(). if(a. HttpServletRequest request. session.setAttribute("result".

errors. saveErrors(request.add (ActionErrors.errors).wrongname")). return(mapping. } } } D:\strutsejbdemo\demo>edit kalaOutput.findForward("failure")).GLOBAL_ERROR. new ActionError("errors.else { ActionErrors errors = new ActionErrors().kalaresult" /> <br> <jsp:getProperty name="result" property="value" /> </h1> .jsp <html> <body bgcolor=orange> <h1> <jsp:useBean id="result" scope="session" class="demo.

cd to D:\jboss32\server\default\deploy\kala. -----------------------------------------( this is the part dealing with the formbean) <form-bean name="kalaForm" type="demo.xml In the struts-config. One entry is for the instance of kalaForm and the other entry is for the instance of kalaAction class.</body> </html> Now we are ready to compile the above programs.class d:\jboss32\server\default\deploy\kala.war\web-inf>edit struts-config.war D:\strutsejbdemo\demo>copy *.jsp d:\jboss32\server\default\deploy\kala.kalaForm" /> The next segment of mapping in .war\web-inf\classes\demo The deployment process is over Go to another window. we make two entries.xml file.java D:\strutsejbdemo\demo>copy *.class path are already specified D:\strutsejbdemo\demo>javac *.

Start the jboss server as usual.kalaAction" name="kalaForm" input="/kalaSubmit.wrongname=<li><h1>SORRY … ..jsp"/> <forward name="failure" path="/kalaSubmit.jsp"/> </action> There is a file known as 'Application. <action path="/kala" type="demo. SERVICE NOT PROVIDED FOR THIS STATE</h1> </li> Therefore. .xml deals with the action mapping for QueryAction.nullstate=<li><h1> ENTER YOUR STATE<h1></li> errors.properties' in 'WEB-INF\classes\resources' and at the end of that file we will add the following lines. we will get the specified error messages.jsp" scope="session" validate= ” true ” > <forward name="success" path="/kalaOutput..struts-config. errors.

As the main purpose of this note is just to explain how to connect to stateless ejb using Struts. I am leaving out Validation Framework details.0 in WEBLOGIC-7 using STRUTS FRAMEWORK.S.Security 4.jsp Type the name of the state ( TAMILNADU/KERALA/KARNATAKA)in the text box & then click 'submit '. 1) Packaged EJB by Farihah Noushene.Open the browser and type URL as http://localhost:8080/kala/kalaSubmit.Ramaswamy ************************************************************************** Struts integration with EJB in WEBLOGIC7 My aim is to write about EJB2.Persistence 2. Otherwise the home page remains with the values entered and also with the error message. 1. Typical services provided by the EJB Container are as follows.Support for messaging services .Declarative transactions 3. It the name of the sate is correct then result will be displayed.Connection pooling 5. Acknowledgements: The following articles from back issues of DeveloperIQ. The EJB specification provides Enterprise-level services. 2) Developing EJB in Weblogic 7 by R.

The most famous EJB-Servers in the market are:     BEA . I am now writing about WebLogic-7 and later. Two types of Entity Beans areCMP (Container Managed Persistence). In CMP. Session Bean 2.2 & 4 are OpenSource and Free… However. stateful session bean. I will cover JBoss3.WebSphere-5 Oracle AS Of these .( The latest version of Weblogic is WL-9).Therefore. But In BMP Persistence code has to be written by the programmer . Entity Bean 3..2 in a separate lesson.WebLogic Server JBoss Application server IBM…. JBoss 3. A stateless session bean does not maintain conversation state but stateful session bean maintains conversation state Entity Bean Entity Bean is a value bean with setter and getter methods representing one row of data in a table. BMP (Bean Managed Persistence).. BEA has the longest record and used by many enterprises and hence a standard. persistence code need not be written by the programmer. MessageDriven Bean (MDB) Session Bean Session Bean can be defined as function bean called in RMI-IIOP style from Enterprise container. invoked in RMI style from Enterprise container in Enterprise data store. Two types of session bean are stateless session bean.CMP is not satisfactory for really complex enterprise . Different kinds of Enterprise Beans are 1.

. It is open source and free. iBATIS. Messaging is like email whereas RPC is like phone call. In enterprise environment there will be heavy traffic and RPC may fail to create connection. But. as well as most any third-party packages. MDB have no home or remote interfaces. as well as Velocity Templates. Struts can interact with standard data access technologies. Unlike other types of EJB. if the values entered by the user are wrong then the user must be presented with the same page with suitable error messages and the values already entered by the user should be preserved. Message Driven Bean is based on Asynchronous messaging . Struts is a frame work for building really complex Enterprise level applications Struts provide its own Controller component and integrates with other technologies to provide the Model and the View. and Hibernate is considered to be better than CMP). Message Driven Bean Session Bean and Entity bean are based on RPC mechanism. like Hibernate. XSLT. like JDBC and EJB. Struts frame work was developed by Craig MacLanahan in 2002 subsequently handed over to Apache Jakarta projects group. MDB have no conversational state with the client and can be pooled like stateless session bean. Struts works well with JavaServer Pages. including JSTL and JSF. For the View. ( CMP is an ORM technology ( Object-Relational Mapping Technology …like Hibernate. For the Model. What is Struts? Struts is a very famous ready made framework which implements MVC (Model View Controller) Architecture. and other presentation systems Purpose of the Struts When the user fills the form and submits the form.situations. or Object Relational Bridge. In such situations messaging is more reliable.

Installation Struts1. Copy that struts-blank. Now the „welcome‟ page will appear. This is our working directory. there is a folder name called lib. ( validation test is passed).. then the business logic is executed.4. We have installed weblogic7 and JDK1.war file to c:\tomcat5\webapps. Copy that „kala‟ context folder to D:\bea\user_projects\mydomain\applications In this lesson. We have already created the context „kala‟ in tomcat5 as mentioned above. Extract it.2 for developing this exercise /----------------------------------------------------------------------------------------------------------The following lesson illustrates the method of connecting to a stateless session bean in weblogic7 server through a Struts-based program.1 folder. In Struts1. There are many war files. is struts-blank.. One of the war file names.( Assuming that we have installed tomcat5 in C drive). Here „kala‟ folder is our context.2 in D:\drive . Open the Browser. Restart the tomcat server. we have created two packages namely demo and demo1.If there is no error..4. Start the tomcat server. We require weblogic7 and JDK1. Now struts-blank folder is created . Now. place that folder(„kala‟) in c:\tomcat5\webapps. This means that our installation process is correct.1 is zip file. Rename the folder as „kala‟. Copy that struts-blank folder and paste it in desktop. Create a folder „strutsejbdemo‟ in D drive. type the URL as „http://localhost:8080/kala. For this we have created the two folders namely demo and demo1 in :D\bea\user_projects\mydomain\applications\kala\web-inf\classes\ to copy the class files D:\>cd strutsejbdemo .war. .

4. This is very important. d:\bea\weblogic700\server\lib\weblogic. Give the following command: d:\strutsejbdemo\demo1>setpath This will set the path for the window .D:\strutsejbdemo> When we use struts the concept of package is very important. When we use package we giveclasspath to parent directory.jar After creating batch files in the working folder.) Usually we give a class path to working directory. the path to edit program should be :c:\winnt\system32.d:\strutsejbdemo.bat set classpath=d:\strutsejbdemo\demo1.d:\jdk1.d:\bea\weblogic700\server\bin ( I am using WindowsXP. D:\strutsejbdemo\demo1\edit setcpath.bat set path=c:\windows\system32. D:\strutsejbdemo>md demo1 Here demo1 is our package D:\strutsejbdemo>cd demo1 Next we create a batch file to set path and classpath D:\strutsejbdemo\demo1>edit setpath. If you are using Windows-2000.2\bin.

*.java 2.util.cityHome.java package demo1.java 3.cityguide.java D:\strutsejbdemo\demo1>edit cityguide.cityBean.equals("TAMILNADU")) . public class cityguide { public String listcities(String a) { Vector vector1=new Vector(). if(a.java 4. import java.d:\strutsejbdemo\demo1>setcpath ( This will set the classpath for the window ). Checkup as follows: D:\strutsejbdemo\demo1>path D:\strutsejbdemo\demo1>echo %classpath% Now edit the following files 1.ciyRemote.

{ vector1.addElement("Madras"); vector1.addElement("Trichy"); vector1.addElement("Madurai"); } if(a.equals("KERALA")) { vector1.addElement("Cochin"); vector1.addElement("Quicon"); vector1.addElement("Trivandrum"); } if(a.equals("KARNATAKA")) { vector1.addElement("Mysore"); vector1.addElement("Bangalore"); vector1.addElement("Hubli"); } String r=""; int n=vector1.size();

for(int j=0;j<n;j++) { String v=(String)vector1.elementAt(j); r=r+v+"<br>"; } return r; } } //---------------------------------------------------------------------------------------------------------D:/strutsejbdemo/demo1>edit cityRemote.java package demo1; import javax.ejb.*; import java.rmi.*; public interface cityRemote extends EJBObject { public String showcities(String s) throws RemoteException; } //----------------------------------------------------------------------------------------------------------

D:/strutsejbdemo/demo1>edit cityHome.java package demo1; import javax.ejb.*; import java.rmi.*; public interface cityHome extends EJBHome { public cityRemote create() throws CreateException, RemoteException; } //--------------------------------------------------------------------------------D:/strutsejbdemo/demo1>edit cityBean.java package demo1; import javax.ejb.*; public class cityBean implements SessionBean { public String showcities(String s) { cityguide guide1= new cityguide(); String r = guide1.listcities(s);

xml and weblogic-jar.java D:\ejbstrutsdemo\demo1>copy *. } public void ejbCreate() {} public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sc) {} } //---------------------------------------------------------------------------------------------------------We have already set the specified path and classpath.xml in META-INF D:\strutsejbdemo\META-INF>edit ejb-jar. Compile all the above files D:\strutsejbdemo\demo1>javac *. It should be in uppercase ie..META-INF not meta-inf Now edit the ejb-jar.xml . D:\strutsejbdemo>md META-INF When we use package META-INF folder is created in parent folder.class d:\bea\user_projects\mydomain\applications\kala\web-inf\classes\demo1 D:\strutsejbdemo>demo1\cd..return r.

sun.1//EN" "http://java.0"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems.cityBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> //-------------------------------------------------------------------------------------------------D:\strutsejbdemo\META-INF >edit weblogic-jar.cityRemote</remote> <ejb-class>demo1.dtd"> <ejb-jar> <enterprise-beans> <session> <ejb-name>city</ejb-name> <home>demo1. Inc.cityHome</home> <remote>demo1.0"?> .xml <?xml version="1.<?xml version="1.com/dtd/ejb-jar_1_1.//DTD Enterprise JavaBeans 1.

xml Carefully note that the jar file is created in parent directory.jar demo1\*. we copy the jar file to the WebLogic folder as shown below.jar d:\bea\user_projects\mydomain\applications . Inc.jar city1.com/servers/wls700/dtd/weblogic-ejb-jar. cd back to D:\strutsejbdemo\ Create the jar file as follows: D:\strutsejbdemo\>jar cf city.dtd"> <weblogic-ejb-jar> <weblogic-enterprise-bean> <ejb-name>city</ejb-name> <jndi-name>cityJndi</jndi-name> </weblogic-enterprise-bean> </weblogic-ejb-jar> //---------------------------------------------------------------------------------Now.ejbc city.0 EJB//EN" "http://www.class META-INF\*. Now we check up the jar file as follows D:\strutsejbdemo>java weblogic.<!DOCTYPE weblogic-ejb-jar PUBLIC "-//BEA Systems.//DTD WebLogic 7.0. D:\strutsejbdemo>copy city1.jar If there are no problems . we get the “ejbc successful” message Now.bea.

D:\strutsejbdemo\demo>setcpath We use the following six files.jar will be deployed by the server. kalaresult.struts-config. The development of the EJB and its deployment in WebLogic server is over.jsp ( besides the web. in this demo package.e:\struts1.bat set classpath=%classpath%.xml . 1.java ( a value bean) 6.java(derived from ActionForm) 3.java ( a utility bean) 5. kalahelper. kalaForm.jsp . kalaAction.d:\strutsejbdemo.Start the weblogic server as start->programfiles->BEA weblogic->user_projects->mydomain>start server The city1.java(derived from Action) 4.jar. D:\ejbstrutsdemo>md demo D:\ejbstrutsdemo>demo D:\strutsejbdemo\demo>edit setcpath. //----------------------------------------------------------------------------------------------------------Now we develop the Struts client program for the above EJB.xml files & application. kalaSubmit.1\lib\struts.properties file) D:\ejbstrutsdemo\demo1>edit kalaSubmit.jsp 2. kalaOutput.

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <html> <body bgcolor=cyan> <center> <h1>STRUTS CLIENT FOR STATELESS</h1> </center> <html:errors/> <html:form action="kala" name="kalaForm" type="demo.kalaForm" > State <br> <h1>Whick State Do you want to tour?</h1> <h2>TAMILNADU?KERALA?KANADA?</h2> <html:text property="state" /> <br> <html:submit /> </html:form> </body> </html> .

jsp.http. } .action.java package demo. D:\strutsejbdemo\demo>edit kalaForm. the formbean is automatically filled up with the values from the jsp-page and the flow goes to the ActionServlet.servlet.apache. public String getState() { return state.//---------------------------------------------------------------------------------------------------------When the user submits the kalaSubmit. <html:errors/> tag is used to displaying error messages.*. public class kalaForm extends ActionForm { String state =null.struts. } public void setState(String a) { state=a. import org. import javax.*.

nullstate")).length()= =0) { errors.java package demo. } } //---------------------------------------------------------------------------------------------------------D:\strutsejbdemo\demo>edit kalahelper. } public ActionErrors validate (ActionMapping mapping.public void reset(ActionMapping mapping. } return errors.*. . if( state. HttpServletRequest request) { state=null. new ActionError("errors.util. import java.add("state". HttpServletRequest request) { ActionErrors errors = new ActionErrors().

io. import javax.ejb..*. props.WLInitialContextFactory").jndi. Context context=new InitialContext(props).PROVIDER_URL.0. String url="t3://127.import javax.*. import javax.println("Please Wait.rmi. try { System.INITIAL_CONTEXT_FACTORY. Properties props=new Properties().naming.out.").*. import java.put(Context.*.. "weblogic.0.1:7001". public class kalahelper { public String callejb(String s) { String r. props.*.url).rmi.put(Context. . import java.

cityRemote remote= home. public class kalaresult { String value.lookup("cityJndi"). . System. demo1.cityHome home= (demo1.out.out.cityHome)context.java package demo. r=remote. } return r.println("Connection OK"). demo1. } } //------------------------------------------------------------------------------------------------- D:\strutsejbdemo\demo>edit kalaresult. } catch(Exception e1){ r=""+e1.println("REMOTE READY").println("HOME LOCATED").out. System.showcities(s).System.create().

} public String getValue(){ return value.*.io. This is the bettter and recommended practice. import java.public kalaresult() { value=" ". } public void setValue(String v){ value=v. D:\strutsejbdemo\demo>edit kalaAction. The purpose of Action Class is to translate the HttpServletRequest to the business logic In our case. the action class instance is using a helper to perform the business logic. } } //---------------------------------------------------------------------------------------------------The Action Class is part of the Model and is a wrapper around the business logic. .java package demo.

*.http. ServletException { kalaForm kalaform =(kalaForm) form.*.*.import java.servlet.servlet. if(a.equals("TAMILNADU") || a. public class kalaAction extends Action { public ActionForward execute(ActionMapping mapping. import javax. HttpServletResponse response) throws IOException.util.equals("KARNATAKA")) { kalahelper helper = new kalahelper(). String r = helper.callejb(a).struts.getState().action. import javax. ActionForm form. kalaresult kr = new kalaresult(). .equals("KERALA") || a. import org.*.apache. String a = kalaform. HttpServletRequest request.

errors).setAttribute("result".jsp <html> .GLOBAL_ERROR.kr.println(m). System.wrongname")). errors. return (mapping.add (ActionErrors.kr). String m = kr.getValue(). } else { ActionErrors errors = new ActionErrors(). saveErrors(request. HttpSession session= request. session.findForward("failure")). new ActionError("errors.out.setValue(r). } } } D:\strutsejbdemo\demo>edit kalaOutput.findForward("success")). return(mapping.getSession().

java D:\strutsejbdemo\demo>copy *. One entry is for the instance of kalaForm and the other entry is for the instance of kalaAction class.class path are already specified D:\strutsejbdemo\demo>javac *.<body bgcolor=orange> <h1> <jsp:useBean id="result" scope="session" class="demo.xml file.kalaresult" /> <br> <jsp:getProperty name="result" property="value" /> </h1> </body> </html> Now we are ready to compile the above programs. cd to D:\bea\user_projects\mydomain\applications\kala\web-inf>edit struts-config. ------------------------------------------ .xml In the struts-config.jsp d:\bea\user_projects\mydomain\applications\kala D:\strutsejbdemo\demo>copy *.class d:\bea\user_projects\mydomain\applications\kala\web-inf\classes\demo The deployment process is over Go to another window. we make two entries.

jsp"/> </action> .jsp" scope="session" validate=”true”> <forward name="success" path="/kalaOutput.jsp"/> <forward name="failure" path="/kalaSubmit.xml deals with the action mapping for QueryAction.kalaAction" name="kalaForm" input="/kalaSubmit.kalaForm" /> The next segment of mapping in struts-config. <action path="/kala" type="demo.( this is the part dealing with the formbean) <form-bean name="kalaForm" type="demo.

In another article soon. 2) Developing EJB in Weblogic 7 by R. As the main purpose of this note is just to explain how to connect to stateless ejb using Struts.properties' in 'WEB-INF\classes\resources' and at the end of that file we will add the following lines. If the name of the state is correct then result will be displayed. I will extend this concept to connect to Hibernate from the Stateless ejb. Acknowledgements: The following articles from back issues of DeveloperIQ.Ramaswamy ************************************************************************** .wrongname=<li><h1>SORRY…. Start the weblogic server as usual. SERVICE NOT PROVIDED FOR THIS STATE</h1> </li> Therefore.jsp Type the name of the state ( TAMILNADU/KERALA/KARNATAKA)in the text box & then click „submit‟.. Otherwise the home page remains with the values entered and also with the error message.. 1) Packaged EJB by Farihah Noushene. we will get the specified error messages. I am leaving out Validation Framework details. Open the browser and type URL as http://localhost:7001/kala/kalaSubmit.S.nullstate=<li><h1> ENTER YOUR STATE<h1></li> errors. There is a file known as 'Application. errors..

450/94.422438 ..422438 .79./.422438 -0.7  .209014/07 8.422438 10:54. ./.422438 /08907 . .7 .6:.40.   0- 2  897:98 .3:98 .885. 8.7108.947 7:08 2    %070.9807.943 01789.431 2  908 /018 2 .7990%42. . 474 ..7    988:8914731472...14/071470. .8.7  ..7 .7 .947 .70.870202-07390.7 .7  897:98 .2 3/7089.558 14/0741942. .55.45897:98 -.3994-:/4:743.422438 ...314/073900-.3 .422438 43 .7 .3:2-0741..9 #03..9438 ../.-03-14/07    .7. .943 2 ..07  897:98 .943     030./ . .9  .

9.425090108430.4/3$    %!897:98 .9.431 2..3 .2  343.... /024.431 2  0/990897:98 . 10.. /024.5588.5588....3 .34907/483/4 ..7 /024.456:07 85 708:9 8594  942.86-0..422.42500..3/// -3 809..  4 0..45.90-./94 942.897:98 .90-..558 8..4253 ..42243-807.431!&  .250897:98/024 8095...90.4253  0.943 .885.. /024..8810839814/0794  942..-094.":07472 ..90-.8  1907.703430./94-03..7070.1907904907 398806:03.2 .90.8808/024 .81448   2..708:9-0.6:.07843 03.2 897:98 .0 0-0.":07.09 .250897:98.7/942....3/48.

.

943..5.0$419.704:3/.

.

943 .%$97:98431:7.

.

 995.

.

79.. .5..0 47..

897:98.

/9/8.

897:98 .431** /9/ 897:98 .38 1472 -0.3 .431 1472 -0.

206:073..95.206:0.9.943 5.3.

":07 9950/024 ":07.9433.206:07472 8.450808843 35:9.450 68.

7/3.6:07 85 147..208:.9.0885.

708:9 85.

:705.9.7/3.201. 147.

6:07 85.

85.

431 .897:98 .

4200110.431 1907..908089058 7089.0  %5090&#3-74807.7990%42.9807.07 849.8  995.9.990809938-0.897:98 .

.

.489  .4.

8.2.

20/ /-/024 9 :899.08847 $.20 5.80 3.3/2:89-:/:51:7907-3 /05989:/41-448 .3/708907393  1905.4:780  900.-0 009906:07708:9   1.088/..30-.8847/.7894-0349708543/3:89843. 10950905..8 800.114/ $97:98 %.7 0.8.-0.039:709 $97:98.803.5503/3   1009 981.0.8250.3.79.9 17429.74:3/ 09.1472947.9477.39410/8 3.0 .472 '...3/9086..6:07 85   4:84:/09.08 390 1479..8847/8743  905.070950/ $4 4:7.8 $%#% # .20398 0800.9.70.-.2047 %08 #06:089!74.../.423389.2505708:20890:8:.3.94341.550./././.0/$97:98945.90.8  ..

3/3$97:987.3//403841-44843$97:98 98 -:9.08.91:..89.943  #0850.3449..79.340/02039894   $97:984:755.02-07      &3/0789.04507" ::89      $:0890/#0.8:-899:90147:3/70/841..%89:947.9438  - !:8$7'.0 0..3349-0. 0.33357088.943  - %0/:890/ .82503974/:.04507" 4./3   $97:983..2047  - .

89073..20844/ 0.70.$97:98 - .7.2%0..943    .5:-.9.

70.$97:9855..9438 - 43.2%0    !74108843.730 74   .

3/4370.70.55.2047.07/11.$97:98'.55.79.:80 7.943.308800294-0 05473$ 8.. 039904709.098 .-.39147/0..35:70$ -0.03994.9203941$97:98 9.943 7.9438 0.3/.3/$ 7.202094/  .9079.7307813/099389.8-003-:3/0/9$97:98 ...20844/9842024/1.470807..94341.3.0983974/:.098 .9:703..0790.4./4590/-/0.0/3 90.2047 39817895..098 5./.344.3  88:0410.89073.425090705./.083.4250903.030- %07 %:8  $97:98889.79..- 470390/08843 $97:98 .08420920-01470$.045078 .:..8-003/0.38 %.34408 .3/89:/0398  4890.42-3.04507" 034.7   $97:988894/39874:3/..9090:8041'.3840.10.3/.59:.970.943.9438.- 470390/08843  $3.08247025479.3/8419.33974/:..9477.95..059438909:947..42 -0.30- . 90.080./017.890.:9.0.55.7 ' $% $%#&%$.3/57.9.3/8 439:947.0-807.00/94 :897.../2.44/340/041$97:98806:.94717.94341$97:98.$97:98 -.2047-.090.70.0450/  0.9433  $97:98.:947 05.80/..0/:70 34907 -448 ./...857470880/974:$07./45990 8.80/.3/8 43574.7. $ .2047 ./.3088039.9079.943 %00.:804190 -448.704:808 7934 92.943..0.08$97:98  .3//0859090020703.2047 9./-003-:9:83$97:98 92.094.3/$ 8$97:983.045078..041 2470 411./.3-03339.07843 398.3$! $!:83-0.9.42    2470807.3/942.8250897:98/0249 343 17.../.$97:98 -.79-0.703:2-0741.79.425.807 90'.94394$97:983.0725479.943 '.074304190570..-0 9.431:83 5.   ..039 ../4590/.79 . -701.9438.790/9$97:98 .3/903574.3:809870./8003.943 8/0. -7.

8 897:98 -.3...9807.9:70..2090897:98 -.3/5.8 8.045.209..314/07.089.3/.70....3:2-0741 .3 ...9-38:9/43  19078:993/4390942.90.9807./940942.7. 108 897:98 -.8:-14/07:3/07 .70:83/  .717.088.947897:.55  395..07 0.3/9014/07 013/.55 .0108 308:.3/  0942.20471083 5.7. % $%$%#&%$ &35.5583.943 .45897:98 -.3/90.7084.3/-0892094/94/0...79.422.9903943949010834:724/0.20/ 0-. $97:98 394:3550/  009. .3/ 0.90-./940942.880814/07 013/.08  14/07.14/07-908.55 1 0450324/0.05.90.7 108 0- .7  0.0  9908057023.3/90389.79:5 %8.203..70.07 0703.90-.14/073.80/. 7084:7.8 24/05.8808 14/07..55.70.89093 0942.3/.39:734:7.9-3 .558 5.09014438108   24/0$:-29 85  24/0472 .090.3/3.20 03005.9.90 30.:942.90-.0 %88906:.897:98 -..7/00/70.20/...3 ../9070 084:/.3/ 809'*   .897:98 -..  1475.55824/0. 24/0..55.3/013/.07 0.71094.5514/07 013/9089..14/0730942.558 14/07  0..3/9814/07.3  %48:9/4390%42..943  0.80/..

80  24/0$:-29 85890450335...40/-90:807 0308:-298985..431 210070.422.40/ 944839490897:98 ..9 .422.09 .  24/0 :95:9 85 :75740.3/48.0.8-0032039430/-:8 %82.9.4397407 83.-4.  24/0#08:9 ...943 2.3/ //  -3 809.553850.6:..92/7 .0810839814/07  0.  988905..943$07.3/2/24/05.  0.0 90 ./9424/05.914798.943 .885.  24/0..450/897:98 ..20  .03.42243-807.90.6:. 24/00507 .03..553 ..81448 8095.9.1470.7 0942.70.../942/7.7174224/0.7 0..1089.91905.39 .3/3/4.9-0.0948095.55 -14/07394.09 ..914/0782/7  .897:98 .90.885.

3.774:990-:83088 4.:70  %024/0.40890 24/0050794.3/9035.39 9080/.909024/0472-0.  .9890/.39424/0.7/5.174224/0472389.984:/-09424/0 :95:9 85 8:.00/8 90147. 8:..3.943.40.0.174224/0$:-29 85 545:....848.3/490780 984:/-0 24/0$:-29 85 1./.3/3.24/0 90 ...88 9.8890-0.943.88.088 .9.40.990/.439740784:/.89.9.91..9.9434.

943807.9898 708:9.9.3/48. -7.0 34:7 14/07 $4 34850.997-:90 3.7079:947.808843 .3.77084:9904-.431 210 478244947 98.../35.3 %0-:83088 4.7 /08.9.30 2.09 /490770850..1:3.92/7 .04-8 %00397093..0593.04124/0#08:9 .1.79..:.3 $4 0.99073070 24/0 0507  ' .7.43909..947/07  0.880898-0.0507.3..908./-0031443900.14/07  8095./.990394394 92077478.0 25020390/'5.9...943.:0-0.7 0942.00110.43974890 14/0503/34390809938039070/-:8390897:98 .2507 9900- 210 034.943903 ..88 .897:98 .:90/-.9.9090706:70/108 .703432/724/05.3//85.-00.43$97:98 0300/.8.7.75947108 9/ .88/408 349/4.885.4770.89058...42243-807.-7.70.8994:9:83..05.70:83$97:98 850.7  0.70.0.-0349949.0 9085 .70.908.088.75909 %0701470 90.4397407 .02039974:90897:98 .40. 8570107.943-0.43900507. 9024/0 :95:9 85.3/ //  -3 809.9.898 708:9 .:0147708:9-0.7  10.431 210 %0.3 .09 .480.09825.:0 9903..81448 390..3/5.7030.3.38.:0949024/0.3930.3/8099390.70.9.3/709:73890.7 %0%.3/809898.3/  .3389.6:..70.%00507.943 %024/0.422.943$07.

34  .9.

3077472088.20  3.3/ .20 .08  %070.4/0   .%88147/85.3.709410/8 3.

.

-570192:7.24/0$:-29 85 9..2/724/05.

 .

897:98 92 9/ 9.-5701-0.3:7.

 .

-57014.:7.897:98 -0.3 9/ 9.

 .

44753 92077478.897:98 4. 9/ 9292 -4/-.

. 921472.943.

 24/0472 9290957450793.24/0 3.2024/0472 95024/05.20..

-7 929095745079.4/0.

-7 928:-29.

 .

921472 .

-4/ .

.20/.-0.-0.2047 0 .90.07 988349:8990:8:.3 479870.7/.43.843 0.3 -:9$97:98 850.94717.3 34:7..88 $479 030:8090.3 44390 89.939835:910 0.23../.9292  1907.943472..03943 0574.1.3/099072094/8147.80 3.0 94/07.091742$97:9 8./0809907...33.3.9010/83 9024/0$:-29 85  40........8 24/0472 .-0.3/84209208343..997-:90-0.70. %88.70.3.3/.-0..81472-0.094.

..3.88087084:7.943 574507908 3  ..091742$97:98.3/..943 .07  .943 4704.99003/419.5.-0059 323/ 347/0794/07./.10343.943472 0.09 995 ..09425479 47 .8 55.902094/ 030-...3-0.84  $50.9100.4/0 %0708.34:724/04723491742. 807.804:724/047243 './/901443308   077478 3:3.-0/07././3982094/ 0....90/990 0  077478 3:3.9903943..0 897:98 .20  $2..70-.90$97:98.70.08.09!..7.8808.7 077478 3:.08 .947472 043 9-0574.3/184.947472 %82./.0./.80/43$07.9480019010/80259..20%# &#.307747389.039490.943472-:91742'.07990384207:/2039.3/0300/9425479 .

 077478 3:.4/0%# &# .

9. 077478 342. $ %%.

10/077472088.08   . %0701470 00990850.

.

... 5....5..024/05.943  5:-.09 995  2547947 .0 897:98 .2/724/05. 807...943472 .8824/04720903/8. 25479....24/0472 .

. $9733.203: $973.$97309.208 < .20 $9738   3.20 < 5:-.20  709:733.4/809.4/03: 5:-.

.

4/08 < 5:-.09#06:089 706:089   3.553 2..94377478.4/70809 .90 .553 995$07.553 995$07.5532.943.20 039      ..203: .$973094/0  709:73.4/03: < 5:-../.  5:-.09#06:089706:089   .9437747807747830.94377478 1 3.943..4/8094/0 $9738   .4/0 < 5:-.

40.:0-0.997-:90708:9 9983490 0.8.70.0507.4397407..20 < 1 ./4124/0.20 30..3 .888/07.:08.824/00507 %8 03.0 942 %0 942 -0.38.943-0.03-04  890 24/0.3/1902...4/0...70903.// .4/0 039  077478 .// 3.9437747 077478 3:.3/478390 -.3 389.2047 %0.9..-08 /0 .9437747 077478 3:3.078250 :897..4/0 30.943.88-0.943$07.8898012.9803/90708:994904:95:9 85  :9 9057010770/2094/894:80.943$07..943 $4209208 38250/024.0/1742.3/ 24/0#08:9 -0.943.431:80/990 ..88.17429024/01472-0.3/90708:938973709:730/-980507-0.8:3/0789..0.3/90.1:3...9.3 :89147...9890/.4:53 41.88  ...88 8:.3/ 903803/8901472949024/0.9089024/047299480. 900507.943.09.3 0..80/94 31472 ..943.3//70.4/0 < 709:73077478 < <       %024/0.09890.3.38809.08  %024/0.40.9438 90.174224/0$:-29 85 545:.74:889.4/0 .774:990-:830884..890808843 .03 .38809.9. 077478 .08:8041 24/00507 .943 ..3/.38 90.943 .425.:014790.98/..884190$97:9817.55.943 0.882.20.74:3/  9825.8841$97:98 %8834994-0.

 .

.

 5.2/724/05.8824/00507  5:-... 5:-.94/0  < <   ..024/05...24/00507 ...$97331472  709:734770..

.

.:0...:0  709:73.   .:0  5:-. 5:-...:0 < 5:-.24/0#08:9 . 5.$97309'..24/0#08:9  ..   .2/724/05....4/809'...8824/0#08:9  $973..024/05.:0 $973.:0 < 5:-.

< <  .

.

24/01472 09..94347. 807..5.24/0.943  5:-...... 4  25479...09#085438070854380  9748 .5532.. 807.943  5:-.2/724/05.. :9  25479.8  24/0050705073024/00507 $97370507 31472  24/0#08:99423024/0#08:9       ...05943  24/047224/01472 24/0472 1472 $973.024/05..8824/0. 25479..943.7/00.0 897:98 .09  25479. 5..05943 $07. 06:.9434721472  995$07.:90  .20 $973-24/01472 094/0  1 .9430903/8.09.553  ...09#06:089706:089  995$07..943 .09 995  2547947 .

088 < 080  .40.94377478  *## # 30.0:59024/0 :95:9 85 .:70 < < <    3.9.825.9890/.9437747807747830.942 809'. 8.3. 09.94377478     077478 .// ..3/ /85.553 13/47.9   .7/ 8:.174290-0.553 13/47.9437747 077478 342.077478 706:089 077478  709:73 2..:0 7   995$08843808843706:089 09$08843 808843 809997-:90 708:9 942  709:73 2.9.7/ 1.

.

8.2/724/05.3.03-04 3982094/ 0.843   .70:83$97:98 850.847909024/0 :95:9 85..1.24/0 :95:9 85  0.8 070.8390570..4:82094/ 0:80/$!9.9.

.

24/0 :95:9 85 ..2/724/05.

.

07843  . 80.43/.

-570192 :7.9.

 .

897:98 92 9/  9.-5701-0.3 :7.

 .

 :7.897:98 -0.-57014.3 9/  9.

 .

. 9/  9292 -4/-.37903.:0.20708:95745079.897:98 4.44704 -0.

 .

-4/ .

459014:7..4524/0$:-29 85.55 ../1440/9089058.3.93.90-... ./9490894:75747.3/11..55824/0.. 14/07  0.55824/0.9292  1907.......:9  09 0.90.42509014:7.2 %% .-4.3/24/0 :95:9 8594 0942..70.880824/05.90-.55 14/07  70070.701: 0.8810894 0942.  10..0108 ...425094:9.8808 .

.55.0-003.00397083 .. 897:98 .0.431 2  ..943 57450790810  %0706:70/039708.0942..03-04   .

.

0942.38  8.431 2  897:98 . 24/0472..55824/0.2024/0472 95024/05.550- 31897:98 .431  4720.90-..3 3.30139438  1472 -0.250  1472 -0.25003/8.

 .

.1472 -0.943  5.9.38 .

24/0  95024/05. 24/0..2024/0472  35:9.943  3.

24/0$:-29 85  8.450808843  .

9..7/3.0885./.208:..9097:0  147..

24/0 :95:9 85.

  147.9.:705.7/3.201.

24/0$:-29 85.

  .

.943  ..

.943 2..5538   .

 .

/.947 7:08 2  ...

 .

943 2.../.

080139438   .   088.0#084:7.

.

88087084:7.....3/.55824/0.7.0942.9078   207747 2088.7/077478   .08  077478 3:3.3349-070.3<./  077478 2.947  077478 3.55..550- 31.././ <83.20%# &#.9079.943 574507908  89...90-.08 .039 <..

 077478 3:.4/0%# &# .

9. 077478 342. $ %%.

 .

.703470.7990942.9-389.8 995.9807..9807.79:5 %889... 0.07 4 095090&7..9-3$%'*    0942.55./9490894:7.07 0942.943 789 89.7990942.

.

.489  .4.

24/0.55.

2047 .0 %# &# .9424/0$:-29 859902088.03-.908:-29-:9943 94:90390733.4/0 0..709.24/0$:-29 85  009900397147299410/8 10..

/.:08./.031473..2.070.947 7:08 2    .4770.20    .9 .3/ ..79   &$%'% # # # '.943 2 0.20..943 998-.4/0  00990077472088.74:3/ 9834 .70:83897:98   .70.3/% 147.3/903090.20.89.4/08../.4/0 009904:95:985./.0/0.8.94717.8250897:98/0249.894:3/0789.250.0  $ %% -:918.0450/.2047706:70894108 3.20.0:535.94717.9  %:8 0./.2047 %8 0 9.08:8041'.. %# &#   1003907$1473.

4.../01./.2047 %0.943   #0:.././.:28.089074:3/ 975920.943   2..9438.039 8/0./.759 .943  14.389.0./..94717...943 2.943 94: 349./08907:081479070.39147850..7591:3.894144 83..943.55  %00..30.94717..3/..250-00..943   -90 8479 39 43.943   7..:0.0-4./.943./..088./.2047  %0..-0 8.0770.094790.070/90:8:.08807..943830...9.. 92088././.90.././0.80300/34920//090- 210  %0'.-474:8.2098.9477.../.7/..5.8   09:8349.-0390 17..-03 14/07 .431 2 $4 34850.7 5708843./.%080108.8.:0.:942..8..42570038.4390- 2.943 210820.8 .2047 00990-43:841..07 8/0.3/848-09907.2047.0398 40.../...07 90 17.70./.9907334:7 570.3/897:98 ./.3.9147901443   #06:70/0/./.90/-.00.4:808843  .943   ..2047574.9 /4:-0. 90780 0../.134:7706:7020398 98.943   23.07 .70.8    02.70./....943   /.8.2507990./8.7 94:8090'.943814774:930./.5570..947 7:08 210574..943 08.-0349 949./0870./ 2..0/024147:897.70/9 ./.84 .943   030:8090'.0:5.9438 039 8/0././..947 7:08 2 :89./.../ 2.3/..

.3/ 708:9-0.  ..3/.-03 14/07  084:/34914709942.902094/390 .943 .:05./.9574./8472 ..09425479  47 ..308706:70/        %0..431 210  .0814/07 ./8472 ....3/..70107945./85../8 :95:9 85 ..70:89.09017..08:9.0/:70   .0942../8.7917429080 90490710814490:8:.094.    ..%070.943 2 10.././0782.943 2.   8-01470 0703..08./0.:8419880.90 .8808    .100 ..3.8-01470  5.10.00397081471472 -0.20479.  0.. 14/073 ./8$:-29 85    ..850790706:7020398850.70411472 .0 897:98 .7814790077472088.55..20 897:98 -.794190 9:947./8.8810  .08 3..//..0/1742'..88087084:7.8808 14/07   #0..../8.943 210 9070834300/94574.3/3491742..947   $3...43/5./8472../..3/94..3  %:8 98/024706:708:899485108    ./.55 .94717.5.2047 09:885900507-0.55 .8 ..70..  3.10/- :8390.947472..8/07..3 . 0.5.../.943 .99073 89014../.843902094/41:8390'.79 1470.3../.943 574507908103 .-00397083 .5533897:98 ..943472  %07014700.

90.943 .../.....   8095..9.947/07 .7    0.70.6:../8472 98  92.9./8$:-29 85  438:-29709:73.701:34909.7591472.3/ //  -3 809./8472.70...   ..90'.14/07 ..92/7 .42243-807./85.909014431083  2/7.20./8.   .422.8.09 .0-003.897:98 0942./85.885...3/48..03-04 39./942/7... 14/07     ./8$:-29 85   . 3   2/7  ../8472 ....034../8 :95:9 85   %0108./85.9909414433083 .

-090.947 17.039 8/0 030:8090'./...8.2047  .-4.759..  %0.09430803./.9433.

  .

.

4/0   ..

.

./8$:-29 85 9.../85.2/7..-570192:7.

 .

-5701-0.897:98 92 9/ 9.3:7.

 .

-57014.3 9/ 9.:7.897:98 -0.

 .

897:98 4. 9/ 9292 -4/-.44753 92077478.

943.. 921472.

./8472 438:-29709:73./8472 950.20. ..90'.20../8 3./8472 98   9290957450793.../85./...

8847/.-7 !$$ #9290957450795.

-7   9290957450792.*/.

-7 %929095745079/.90.

4/0.-7 ! 92909574507953.

-7 928:-29.

 .

8.7591472...20../8472.921472 92.

 .

-4/ .

9292 .

.

.

.4/0   .

.

09 995  2547947 ..947   5:-.4/809.. 25479.88.. 5.8847/3: $9732.0.947472  $9733. 807..4/03: 5:-.  3.20< 5:-..903: $97353.5./8472 ..2/7.20 $973../85../..20.20  709:733../84720903/8'......$97309.203: $9735./85./..<  ..943  2547947 .0 897:98 .5.0 897:98 ...*/3: $973/..

.

.4/809!.   5:-.8847/ $973.$97309!. 5.8847/  709:735.8847/< 5:-.8847/-<  .

.

*/  .$97309.   5:-.

 2.4/809.*/.*/< 5:-.*/ $973..<  .709:732.

.

90/<  .90< 5:-.   5:-.4/809.90  709:73/.$97309.90 $973/  /..

.

4/809!3.   5:-.4/0< 5:-.4/0  709:7353.$97309!3.4/00<  ..4/0 $9730  53.

.

203: 5.   5:-.5532.903: 53.4/03: < < .553 995$07.09#06:089706:089   3.*/3: /..4/70809 .8847/3: 2.943.

  .

.

4/0   ..

.

/85..... 25479.90   $9738.05943 $07..88..7/00.... 4  25479../8.*/ $9738.0....9430903/8./81472 09.943   5:-./81472 ....5532./8.0 897:98 ..8847/ $9738./81472 09.2/7./81472 09.09#085438070854380  9748 ../81472 09!3. 807.943 ./8472..05943 .943  5:-./85.94347.5.09 995  2547947 ./81472 09!..9434721472  995$07...4/0 1 8 039  $97378 -7  8 -7 8 -7  8 -7 8 995$08843808843706:089 09$08843    . 5. :9  25479.09#06:089706:089 995$07...:90  ..553 .09  25479... 807.943....09.../8472 1472 $9738.20    $9738.

088 < 080  .9437747807747830.  8.808843 809997-:90 708:9 7  709:73 2.077478 706:089 077478  709:73 2..553 13/47.94377478   077478 .553 13/47.7/ 8:.// .9437747 077478 4-.94377478  *## # 30 .:70 < < <    .7/ 1..

.

.4/0   .

.

/85.44797003 $9737 $973 808843 09997-:90 708:9  4:9 57393 7  .2/7.../8 :95:9 85 92 -4/-...

-4/ .

4250. .3//054   0./85..703470../94.7032/7.92   0.

..55 897:98 .45...8894  0942.558..897:98 .7 0942.7    ./8472 ..885.  034.90-./8.9..55 14/07   0.431 210    ..42243-807.3/.....45.422.9    .88.90-... .:5905.3///  -3  0.3/48./8 :95:9 8594  0942....0942../8.8808.09014430397083  0942.3/.558.09 . 0.55 ../5.900-.:5.558..../8.6:../8. 14/07   0./8$:-29 85.943 .9   2/7.

.

.. ./85./8472950./8472 .20....33.250  1472 -0.4/0  03/8.

1472 -0.3 .

38  03/8.1472 -0.2508  .

.9435..9.

/8 35:9...

.9./8$:-29 85 3.../...20.0885.450808843 .7/3.943 8.208:...9097:0 147. ./8472 950./8./85..

./8 :95:9 85..

 147.201.9.7/3.:705.

../8$:-29 85.

 .

..943 .

7:..5538   89080.558.385/09...99039439490./8../..205.943 2.0/05.79  0.490 2470.99073..9908.943 .3.835..0397083.943 23  0942.55  14/07  .90-.3//0..700.

.

4/0 03/0.2501472  14723./8472 3.../8472 10/57450793.20/0503/8706:70/ .20.20..7 0.

 .

7 0.8847/.8 .10/ 10/57450795./8472 5.8847//0503/8706:70/ 23039 2..

.7 ..7 3. .2023039.

:0.7 .7 3..20 ....

.7 ..:0 ..

.7 ..7 .8..7 3..202.

7 3...20 .

..7 .  ( ..:0) .

.7 ...:0 .

7 ...

*//0503/8706:70/ 02..*/./8472 2.10/ 10/57450792.7 0. .

 .

90/0503/8706:70/ /.90.10/ 10/5745079/.7 0./8472 /..90 .

 .7 ..90!.20/.7 3..99073.

7 .....20 .7 3.:0.

//.

.

7 ..:0 ...

7 ...

4/0.7 0.10/ 10/574507953..8 ./8472 53..039 2.4/0/0503/8706:70/ 2.

.7 3..7 .202. .039.

:0.7 3.7 ...20 ...

:0 .7 ....

7 .202....7 3.8..7 .

7 3..20 .7 .:0)/</ ....

7 ....:0 .

7 ...

10/ .

1472 .

1472809 .

943   3/13..//9014433083 . 0.1472 ./.

08.55../8..558. 0942.943 574507908     .55 ..90-.8808  7084:7..

.

7/077478   077478 0..4/0   89./07&  077478 5701  077478 8:11.3/.

  077478 144907.

9078  077478 230395.3349-070.9078  077478 7.314.8847/..9079.90  077478 /4:-0 <2:89-0..7./.30<974:<  077478 706:70/ <8706:70/  077478 -90 <2:89-0...9  077478 39007 <2:89-0.947  077478 3.03953.339007  077478 43 <2:89-0.4/0.3/4:-0  077478 14..&  ././ <83.343  ...90 <8349..9 <2:89-0.7.3.3349-00889./  077478 2.3..3-90  077478 /.30 <83493907.

355.439.077478 8479 <2:89-0.70/9..:94 /05490./0 2..425090 09..4590897:98 -..943 0.8300/0/ 7089.794.943 108..425090/  507..0390..70/9..943.4:/349-0.33.55. 4:.30 #10:83903.3.3 .%0574./30.55..55.3/4:.790/434:743..088//349.420 2088.420 0.38479  077478 .94383493806:03..420 0.3.3/094:7.794:7.039 .7/ <8349.943 /990800943.943 .420 990$97:98...5514/07 47 06:.201474:7.//7088    4907   077478 .0 507.307 . <8.0934:7.943 !. < 077478 0307.307.7/3:2-07  077478 02.00/  077478 /09.55..313/90 .943 574507908109982088../.884:/144  077478 9403#06:089.70434:7.307 80-.420   0.431:7.439.0%40989..0    0.439.

 .

87.

.

/8472 2./8472 53..8847/!$$ # .0814/07    077478 4-.*/* ../8472 5.20 . $' ..4/0!    .../8472 3./8472 /.90% .7084:7.

8  995.3/3/4./.422./94 0942..943 2 10  04503.7990-74807.3...3/903.94314790039708390.9-3 %03809'*    89.34907.08.3/.0842005.79:5  $9.17897:390/024.3/95090&7.

.

.4.489  .

./8..55.

8-003.00907-0147047.0-4.390891479807747430-430.39..9078.7....3-0407.9010/8 -0.0850..3 984:/ 349..190790706:70/10/..9078./8$:-29 85  1./085..905.30:80.039 8/0#06:70/ 0/.70:...2088.083902108  108:-29901472 94:92..:80  850.02.943 98801 05..3/13.10/9700.3..70 .705708843..703498:55480/94574.8 0 34850..8 22.389.43/9433.19075:99384200990783.1.7..80473:20.8..38 9.90.3-00.439748  920.00889.20 984:/349-0-.7.3039708 009..99073.4397488209  %007747./.90.8942/42 .03.7.20.947  47905.1907 47.0..3.90/-...3.43/9431477432...43/9438 3.03./08420289.42  0.8047:5507.990.9078..43990.882:.8847/ 0.9438/43043.759..4941. 099078 800849  %0/.59.8843 %88 90...4080 009908:-291472  1009.. /.0./.40/  0.

//.

 $4 1095090/.90.8 .

.

.80.705708843./0/.8 2.039.70:. 14753 .0 3.0574.43/943  .4/0 0.  0 09077472088.

70./.0  .8 ./../390710/9 90.4770.943.2047 .3574...943././.. 8..1.4/03.-0.3/34   #010703.43/9438 8008.7039.333.9.07 8/0.07 8/0.039 8/0.8-003..431:83-:99.94717.8 343.039 8/0./01:7907..943  009807.4 .:9479.943 1/:094842070..98493889../.88.90.590743'.5907  .843 9070834.943 8 :890/543984:9 92...2047.70.-4.:9470/-.03 070  $4209208 90708:9841.70038498.94717..0-448     $%#&%$%   - %&$%  %#$ 90..0.3/848.9080.9 0.08147.9432088.759.../11071742$07./././.943 .55.94741 90'.9432.

$97:98 - :.7..70....    !747.223.5907    $%#&%$$&#''& - $7.39$034  ..9.2%0.3088 #0  .

2047147/0..$07.250 4/08-.55.250 901443.04507894.55.0$97:988.2504:7.3'.943 .943.017..  3980..8808 9.90.55.3.3/49070507.943...94347.8808-0:80/    .79.88 43.943 .55...88   .88709:73890.8889497..9434.70.943 .7/890 43 85  :7..34503 84:7.3/4:7-:83088.943..9438 9:808..005... 0- 897:98 .7..0/43.90/-7..888903-0900390$97:9817.943..3//43.7/.9.-0.943 .943..8/0130/3 90897:98 ... 5.38.8..94341..09!9403.  %05:7548041.88  .04:3/.   %8.3...431 210 0708.943.9:70  4/0!.9:70 9.4/0414:7.4:7.7941431472.88 %0..8 473./.90/94905.90.4%40.3'.94::801474:7.2047.88843.../4598.0/0..943.09#06:0899490-:830884.40.7.8843147.9090995$07..414:. 98./459..04530-..074803/..38.943472..943.9433.0454314723897:98 $97:98.943 .943 343472.3494/0.3/ 0903/890.045434723$97:98 5.

 0-995.  :947$:8!.

.

309 .*8:8492.42 4579#4803/. 309 2.5. 74803/. .

943 .5...0 897:98 ... 25479.943 .09 995 995$07..09#06:089 25479. 807.0 897:98 . 807.943 2547947 .943472 ...5.09 995 995$07.09#0854380  2547947 ..

8 5.8847/  .0 897:98 .83470.8847/ 06:..09#085438070854380 9748.7/00.5.20 06:.2547947 .7/ 2547947 .943..80 :8073.05943  43472431472 43472 1472 1 431472 09&8073.5.8843..943..9434721472  995$07.:90  .0 897:98 .943 .943  5:-...94347..553  5:-.9430903/8.20   431472 09!.94347.943 .553  .09#06:089706:089  995$07.5532.

.

0.088  <080 ..7/ 8:.553 13/47.703 709:732.

.

9090.4397484:/-0 147..0.20 .0398/0 9 2:89.0390147288:-2990/  3980.5..9434728.943..0 897:98 .3/099078147...88 43472 .943472.90/9 1472/.943.70.545:.7/948:.881:8073.08890850.90/4390807.4/0414:7.3/90.7/389.3.078/09/.943472.7/ 1..3/5..39.9434722..943472.7-3070.90147210/8 %0.10/%%!706:089 .074803/..08099078.0/08.47708543/3%%! 70854380..3.2504:7.8847/ -0 5..349.389080884389. 0708.55..90903/847 .40/ 709:732.88843472 .088 85490780941.7/0/ 34:743.8847/ 903902.943..553 13/47..:70 85  .943 .14724390.553147.3/..3/4...2010/.9.943 . 0- 897:98 .9434724-0.:942.9.039070/1742.901470-.943472  .88574.39.943472.:70  < < < .:0-0 :8073.88 3.9...3/#09:73. 5..98 .94347.888570 545:..

 .

 :947$:8!. 0-995.

.

42 4579#4803/.*8:8492. .5. 309 2. 74803/. 309 .

 .

  472-0.7003    .31479043397$.

203: 57.943 <  5:-. 807.// 57.5..943  709:7398 ..20:8073..8847/3: 57.. 25479..20 <  5:-.09#06:089 2547947 .943 $973..4/809&8073.20 $973:8073.0 897:98 ..09 995 995$07.4/809..8847/5..943...88434720903/8.90$973:8073.8847/ <  5:-..943  98 ...20  709:7398 :8073...$97309&8073.8847/  709:7398 5.90$9735.90$973:8079503:  5:-.943472  57.8847/ $9735.943.4/809&807950 $973:807950  ..$97309.4/809!.$97309!..20  98 :8073..8847/  98 5.943   5:-.943 < 5:-.20 <  5:-.8847/ <  5:-.90$973.

-99438079/3.203: 98 5..0-.08 43 85 9.% 47 5:890.55.5532...08.943.088 85 1..2.8  3980.08.4/0414:7$! 5.3.439039 -..7941431472..:70 85 0708.389.//  <  < '0!..94341850..2504:7$!5.09#06:089706:089   98 :8073.553  995$07.90/:83.80/439039075709.98 :807950:807950 <  5:-.-:7.439.344 $!5..$97309&807950  709:7398 :807950 <  5:-..250 %0'054794341.4/70809 .943.9438248941903.7043 85 8:.07!.43897:.8847/3: 98 :8079503: 98 .$07.9439.9..08 $!  90.

9.8.

35701-0.897:98 -0.-:7.3 9.

8.9.

420 990./ 990-0..897:98 92570192  92924.32088.097:0 0.000.

.

990 92-.80.

/.759.943.:8  709:731.8003907&807  4-472 :8073.759 1:3.079 !0...20 14.:0 039  .0.3:..8..80 .20 .  8.90 4-472   1 4-472 :8073.

80 <  709:7397:0 < .9&807%50  4-472 :807950 14.079 !0..:8  709:731.80 <  1 4-472 :807950 800.:8  709:731.80$00.8847/ .079 !0.<  1 4-472 5.8847/  4-472 5.8003907!.:0 039  .8847/ 14.90/3/0    .

759  .8.

.44790   921472./  -4/-.0.943.

3019.-0/9 -47/07.3 ./.05..03907 .3.085..3 979/ 9.90 98 .4470.05..//3/9  97-. 9/..485.-0-47/07 .3143980 &80743.432094/5489 438:-29709:73.03907  9.//3 .085.0.

1439.

9/.

35 3-85.97  979/.485.

5.

9/.

97  97.3.03907 9/.379&807.

9/ 9/929095745079:8073.039 .2080  2.

.

9/.

379!.03907 9/.97  97.8847/.3.

9/ 9/925.039 .8847/80  2.8847/57450795.

.

9/ .

.

3.03907 9/.379438.97  97.

95745079:807950 45943 438 .9/ 9/ 92800.

45943 45943..:0:07:07.

45943 45943..:0$007$007.

:0:089:089..45943 45943.

45943 .

92800.9 .

9/ .

485.35 3-85.97  979/.

5.

9/.

485.3.97  97 9/.03907.3928:-29 434.

928:-29.

9/.

97.

9.-0 .

9/ .

97 .

9.-0  .

.03907   .

921472 -4/ .

025479... 4  5.025479. 86  5. 807.9292  8:... 86  5... 3....025479.088 85 5..025479.09    .025479. :9  5.025479.23  5....

.

7..20907 5.7.:0 $973:8073.20907 :8073.20  $9735.8847/  .0993.8847/706:089 09!.20706:089 09!.

$973:807950706:089 09!.20907 :807950    92 0./ 990$:.088..7.

990 .

81439.44770/:807950.0.0881: 40/3.3..205 5./ -4/ 5 :8073.039071439804:70$:.

1439 .

1439.

5.

-4/.

92 1.:70 85 9.-:7.

8.9.

-:7.35701-0.897:98 -0.3 9.

9.8.

097:0 0./ 990-0.000.897:98 92570192  92924.420 990..32088.

.

80.990 92-.

 .

44770/ $4774:7&807/.03907143980.3.0./  -4/-.44790  5.

!.:770.9.8847/83.

1439.

0.5 .0390759235.

5.08.

070.43 85143980 .447-:0#097..

1439.

923.

5.

.03907 .

-4/ .

:80/4370.9-:830884.943894-050714720/ .38 .5531474:70. 1:3..094.3/903/00.431 2  !:9901443.557457.4/0 3897:98 .79814.937085438-9147574/:.3903095. 807.88.9292 4397407!.42543039 %02.425430394190439740739017.09 %8807.4/0893901472 -0.0--74807 /0.943.804190:807 39071.3706:08981742.250 %043974075./3.3.0941.250 !:9901443.5538 0133902.809 41.90'0.20478.431:70/-/0133.3.0..943$07.7941431472.098.

38 .1472 -0.

.3 3.943 43472.2043472 95074803/.943  1472 -0. 0- 897:98 .80.

 .

38 !:9901443..5538 .4/089390.1472 -0.943 2.

.553880.943 5.9..943  ..943 2.

943 43.9097:0 35:9.2043472 8.43 95074803/. 0- 897:98 ./.450706:089 ..943 3..

5.08.

.0885.208:.7/3.9.43 85 147.

5.08.

088 85..8:.

201.7/3.:705.9. 147.

08.5.

:70 85.1.

 .

/.3$97:9855.0784341$97:9817429089041 $97:98995..9089..943 434.250  389..943 4947:398.

.

.79.5. ...0 47.

989010.7.55.9.088.3/4.3/...943:83.794942.3/9033907.431 2 ..55.030..90-.9 %42../890.947  $9..4250.3 .3.308 390897:98 .:942./ 44503390730954707.9..55.909990897:98 -.55.558/70./90 .79942.39 %07089.897:98 45897:98 -...7990942.3/950995.097..943870..9 44:7 43.943 434.4/01742070.943 .

.

4..489  .

897:98 -.3.

3/570883907 4:-748073/484:/440 ..

4345943903 5708843-:9943 %08:.8:07 14:039073.0881:40/3.0/85.    :8073.:705.20 4:70$:.9:807/.4390343!..0/85..20 .3/5.4770.9.2509014433/44503    4950&807/.3/5.8 :8073.3/800.8847/ .8847/901.. 4.8847/.  $4774:7&807/.0885.0.8 5.

2894790.9439897:98  $97:983907..-4:9 3 $$ :83$%#&%$# #  .!.045825043.4:.94393 $$  .730/494/0.00.070 3989:947.9 #097..55.4770..8847/83.

030..38...07 48855.55.47.3   088.3/94/.3 .70 503$4:7.1.9.943807..3   3990.81448   !0788903.709 ..807.07.9438  $0.8-0.307../07390.943807.9435443  $:554791472088.94380.7.:79  4330.0807..07   0-$5070  O O O O 7../0839075780 0.08 %5.55.08574.709.42070.08 %024891.70   $088430.$07..24:8 $07.07  11070393/841390757800./0/-90 439.38.0$ 19080 488  .072.3/700   $$..0.3807.55.%0850.3   $088430.07.70..0  0..943807.430/0.097..943574.0783902.908902..70  0-4..

89:.3.9.70.3-0/0130/.344 -099079.034.3 3990.74320399070-0 0.3.0/3#  !890174239075780 .943-0.39.90 3990.078.0.38247070.439.90 .90088808843-0.80/43#!20.3.3 2..4/0300/349-079903-90 5747.9 #0. 303907578003..901:808843-0..90 .3.43..94714770.2207 :93!!0788903.90088808843-0.70-.039.908.-0 3.2207 !83498.382 :9  088.4330.344  -0.7434:82088..943.39.3/399-0.943.89470 %49508413990.1.38002.94389.3.94382088.07.901:808843-0.3  89.11.94.98$97:98 0-073.3!  088.4/0.70 89.3 &304907950841 .0.3.3 #90.3..438/070/94-0 .38.943 38:.07.38.0 !  0.94389.425003907578089:.43.38-.3/-073.8#!805430.070.553%0.9438   !8..3.030. 89.0/!0788903.0 3! 50788903..97.-0  .0344204770249039071.90-:989.078.80/4383.0/ !0788903.307.43.3.3/4083492.307339075780/.3/099072094/870570803934307441/.078.3-05440/0 89.3/.307 %4950841808843-0.3 $088430. 9.030...3 .3.39809907.70! 439.894-0 79903-905747.3 89..981.90088808843-0..439.9.$088430.:0-0.38.90990..3/#!2.81:3.08  088..40/3#890174239075780 ..

7 459.942.209014/07.90/  459./039070/-90:80784:/-0 570807.20..3 .3.800.558 88:239.08 0-073.9874:5 $97:988.880/ 90390-:830884.82489 ..08890.3/8:-298901472 190.397/ 5.2047147-:/370.071.3/90.3/$ .0389.07!.314/07.0.4250390757800./017.14/073.208 8 897:98 -.33907.914/07  ..33 8:-806:039.943..9:70 98450384:7.0 070 .93/7./2..8 ..7103..0794 5..3/49075708039..9 %025.2047.90.0450/-7.7108  304190.3/.70 2..71094. 17...20 5..3.70743 90390:8072:89-057080390/9908.$07.098:9.3/0/4./098434397407.  3. 14/0784:7 .3/90'0 47904/0  $97:98.90  %$ 47 -0.2047.9897:98 -.08  3..3/1700  $97:9817./.9897:98 -.314/078.$97:988.5740.9089490790.942.9.:/3$%.-0077472088....9#0...8/0.9989.7/0 4790'0 $97:9847809.7990942..07 4897:98 -.80.3/3907.0/- %070.90-.:08039070/-90:807.8'04.99 3$97:98 14/07 90708.90-.558 $9..09.79..943 $97:98 8510 97..7//.795.89093/08945 #03.55..42543039.3440894574..943889028 !:754804190$97:98 0390:80718901472../0 904/0.:08..70.9 807.08.0/ 942.:90/  389.0.9438 $97:98574.80.90..0/  1907083407747  .3/ ..908 $% .3 .24:870...70.   4 5.25020398' 4/0'04397407  7.3/5.943908985.34408 0..0..

.07  5039074807 95090&#..9807.7990942.43909 #089.8  995.

.

4.489  ..

9.89.70. .. 490 0.045398007.059415.0 70.9  0706:70-488 .083..80 %0144308843:897.33-488  807.88108 .90.-4..80/5747. 3942. .14/07 897:980-/024 3 /7.43.0 897:980-/024.90/909414/0783./897:980-/024 897:980-/024 030:80897:9890.3//024 47980..-..07/01.7 %820.4390914/0794-488807...9394..10948095.0725479.885.7 39808843 0.20/024.389.2  0.$97:98 -.9 -.3/  3/7..70- 31.20/024.70.94:7389.0/-488 ..0 .08.90088808843-0.70...8.07/01.39  897:980-/0242//024 070/02484:75.3/ /0243-488807.70.0.0.70.9 .9 .9.43909 .82039430/.9 897:980-/024/0240/98095.0888..07974:./..3/..:9/054.943574.:9/054.420 5.550.90/945.880894. .90.908902094/41..4330....0389.0 %884:7473/70..4770.//024 090.3/  147/0..0 .0   459.4590.947  0.90/90.9.

885.9.885.885.947 %88.039 35 ..7/-488.039 .2:833/48! 14:.9 897:980-/024/0240.42243 .885.039-488 .422.039 ..039 .:5. 807.81448 897:980-/024/0245.7/-488.8095.7/-488.039-488 88902 .947 030:805.039-4888 .0901443..00.0394 .7 1907.07-3 .7/-488.284:/-0 .3/ /897:980-/024/0248095.38.039-488 ..70..0..33988902  &8:.994 5.70:833/48  905.39  897:980-/024/0240/9809.039-488 00 .10839047314/07  .9147903/4 /897:980-/024/024809.9940/95747.0725479.9 -..885.039 .5.9 809.9.4.943 .5.9 40/9901443108 .0-4.994473/70.039 .7/-488.039 -488 97.7/-488.9147903/4  0.7/-488.9/0-/024/-488..93-.0.9 %880990.0.9 %8809905.7039/70.3/4888902//  -3/-0.039 ..

//02039 %7.0.9420 . 5..9:/0  5:-...0/024 25479.//02039 .947 .90.9:/0 .  .   .88.9:/0 .. :9  5:-.8 #   . 897:980-/024/0240/9.947  1 .  < 1 .8  .94730'0...908 $973.   .   .../7..3 . 06:.  .8 %&   ...0.947 ./:7...0..$97389.#02490 ... 06:.0.947.//02039 .947 .   '0.

.3/7:2  < 1 .0.0..0.947 0020399   77 .8 #%   .947 80  147 39 3  $973.0.3. -7 < 709:737 <  .//02039 4.947 .947 .947 .//02039 %7. $973 .3  .//02039 ":.0.947 . 06:.947 .//02039 .470  .0.0.947 .//02039 8470  .0.//02039 :-  < $9737 393.43  .

< .

.

 .

897:980-/024.

/0240/9.908 $9738  9748#02490. 0-  25479.....9#02490 .. 72  5:-. 5.9#024900903/8 -0..05943 < .0.9  5:-.0/024 25479..39071..$97384..

.

 .

897:980-/024.

70.0.....90  .9#02490..39071. 0-  25479.9420 . 72  5:-./0240/9. 5...0/024 25479...94200903/8420  5:-..

974870.05943 #02490.05943 < .90.

.

 .

897:980-/024.

9.4/809$0884343909 $08843439098..88....9:/0  $9737:/0 89. 5.4/0-#024.0/024 25479.$97384..88.3 .90 < 5:-.908 $9738   ..90.325020398$088430.908 8  709:737 < 5:-.. < ....90 < 5:-..9:/0:/030.3  5:-.90 < 5:-./0240/9.90.4/0-!.4/0-...0 < 5:-... 0-  5:-.4/0-70.

< .

.

10/5...703914/07 984:/-03:5507. 31 40/9900- .07843   %!0- .7 2.7 2 2.../80990850.  0.3/. ..88/-488807.:9/054..70.70- 31.9..07/01.. 0-897:98/024/024.9 4250.0108 897:980-/024/024.3/-488 23%  897:980-/024% 0/90- .8808/024 897:980-/024/024. ..885..0% 14/078..45 .80 0 % 349209..7!&  .90.-4.0.70..90/35./  897:980-/0242/%  030:805.

.

.74889028 3.$:3.

.

38 .0...%39075780.

.

 995.

.

.42. 8:3 ...

/9/.

7** /9/ 0- .7 039075780 -0.38 808843 .0- .

9.20.0- 3.

9420.20 420/024 .0- 3.

9#02490.420 702490/024 .

88/024 .702490 0- .90..3.

88 808843 950$9..90088.0- .

38.808843 950 97.943 950439.307..

943 950 .38..97.

808843 .

039075780 -0.38 .

0- .7 .

.

 897:980-/024% 0/9-488 2 2.9.38 808843 0- 3.4/3&%  -488 039075780 -0.20.07843 03.

20.93/.0- 3.20 3/ 3.

3/ 3.20 .

808843 .

039075780 -0.38 .

.

-488 .

.

7039/70.4590.7108.70.07/01.701:34909.07  %0/0.7934 14:7.1.90/35.7 2088.:9/054 $9.0789.9/0540/.9 ..9 .7109490-48814/07.20.7990-488807.710.3/98/05420393 $$807.07  .7990-488807.7103.0784.94897:980-/024 70.07  -488-3809'*    -488 -37:3 %0807..7-488807.9090./-.9 .947  4 0.7.7/024 .81448 897:980-/024.550.88%  2 .07.8843-04 494303/49489.  4 .78/0540/.8843-04  897:980-/024.4770.04520394190.0.9 .990.7390807.45.

.

0  0-897:98/0242//024 0-897:98/024/024 .-4.214790.0395747. 40 /0.04590$97:98.

...0/1742.0   ... :95:9 85 -08/08900- 2 897:98 . .5.0507 ..9..0/1742.9 -.5.-:7.....$:-29 85 9.943 .:99-0. .3   ...9 809..431 2108 .943   .9 0:809014438108 398/0245....885.3   .472 . /07.708:9 .943472   . /07....885.:0-0.7 897:980-/024/024809.943 57450790810  0-897:98/024/0240/9..$:-29 85  .55.897:980-/024/0240/9809...9/897:980-/0240897:98 -897:98 .

 .

897:98 92 9/570192 92 -4/-.3 ..447.03907 $%#&%$% #$%%$$.

 .

.03907 92077478.

 .

.. 3.921472.472 $9.$9..90-7 .9044:.472 950/024 ..20.943.399494:7.

 %&#.

90. 92909574507989.

 -7 928:-29.

 .

921472 .

-4/ .

92 .

.

$:-29 85 901472-0.38.  0390:8078:-29890.09  92077478.:942.943$07..:0817429085 5...3/90144089490.10/:5990 .0.9.

09 995  . 5.0/024 25479..472 ...3077472088..8:80/94/85.9... 807..08  897:980-/024/0240/9.

  89.943.5532.94377478...90   709:7389..90 $973.4/809$9.09#06:089706:089   . < 5:-..2547947 .553  995$07.09#06:089706:089   89.4720903/8.5532.90 .943472  $97389.903: < 5:-.0 897:98 .943.553 995$07.90 < 5:-.943  5:-.4/70809 ..90.$97309$9..903: 5:-../.5.88...

90 30.9437747 077478 3:89.90 039    077478 .// 89.94377478  1 89.9437747807747830.90  < 709:73077478 < < ..

.

 3... :9  25479. 72  25479.0507  . 5. 0-  25479......... 4  5:-.0/024 25479.. 72  25479....0507 ..88..23  25479.  897:980-/024/0240/9.....

5:-.439093039.9#02490702490420 .80.08  43909.70.943   /024 .90  $8902 4:9 57393 # %#  .08 .9420420 /024 .$973.43909 44:5 ..2347 35 39071.947  57458 5:9 43909 !# '#*&# 4..93/  $8902 4:9 57393   %  /024 .9420 ...0.9   !745079085745830!74507908  57458 5:9 43909 %* %%*% #  47 35 39071.43909 57458  $8902 4:9 57393 4330..2343909.$9738   $9737 97  $8902 4:9 57393 !0.489  57458 5:9 43909 &#*!*!#$  47 -488 3.

908 8  < .. .059430 7 0< 709:737 < < .9.7702490 84.

.

88.0/024 5:-.....:0 < ...708:9   ..  897:980-/024/0240/9....:0 < 5:-.708:9  $973.:0  709:73.$97309'.708:9 ...:0 5:-. 5..

 < < .4/809'...:0.  .5:-.:0 $973.

.

. 4  25479.943  5:-..943..09 995  2547947 .94347.943.5532. 5.3/8.. 34:7.5507.553  .. %05:75480 41.0/024 25479.943.80 90.09  25479.....943...88.9. 807.:90 .050794507147290-:830884.38..943  5:-.8885..0 897:98 .9430903/8.7941904/0.. :9  25479.88389..  %0....08:83.42203/0/57.0  897:980-/024/0240/9..5.7/00.09#06:0899490-:830884.3..9090995$07..74:3/90-:830884.7. %8890 -099907. 807..3/70.8889497..943 ...

.09#06:089706:089  995$07.09#085438070854380  9748 .8 %& ..05943 $07.553 13/47.472.. 06:...088  < ..472 1472 $973...1472 ..0507050730.708:9  7 809'..90  1 .05943  .1472 09$9..  ...8 # . 06:.7/ 8:.8 #%   . 06:.:0  $8902 4:9 57393 2  995$08843808843706:089 09$08843  808843 809997-:90 708:9 7  709:73 2.0507  $97370507 .:0 7  $97327 09'.708:9730.9434721472  995$07.09.0.

450808843.9437747807747830.94377478  *## # 30...:70  < < <  897:980-/024/0240/9..080  . :95:9 85  92 -4/-.94377478  077478 .9437747 077478 7433.// .077478 706:089 077478  709:73 2..30  85:800.44747.20  8.3/708:98.7/ 1.88/024 .708:9.553 13/47.

20708:95745079.:0.. -7 8509!7450793.

 .

 .

.

-4/ .

/850.425090.431 210 02.70- 310/9897:98 .041..08884.3/ 9049070397814790389..3 3..39901472-0.88   988905.3.07/01..9.943. .88 /-488807...:9/054.45 85 /-488807...472 950/024 .70.-4. .20..472.. ..094039708  300397814790389.79/0.:9/054./94 -488807.3. .349073/4 .05747...92 40.3  1472 -0.07 494.70.:9/054.472.28 ..70- 31.45 ...431 2 390897:98 .8808/024 %0/0542039574./94.7070.07/01.7 897:980-/024/024.041.10/ 897:980-/024/024.. 897:980-/024/024.885.07/01.

5533 . %0309802039412.

553147":07..9435.897:98 .943  .9432.8990.9.431 2/0..

20.472 35:9... 950/024 ....943 3.

7/3./..9..208:.088 5...90 97:0  147.450808843 .$:-29 85 8.

:95:9 85...

9. 147.7/3.:70 5.201.

..$:-29 85.

 .

90%# &#$%%..943 574507908 3  .//901443308  077478 3:89..9100.88087084:7.3/.8 55..99003/ 419.943 %0708..08 .10343.

 077478 7433.20$ ## $%%.

.

07.7990-488807.08  $9.   $#' %!# ' #%$ .10/077472088.8:8:. %0701470 00990850.

50390-74807.8995.3/950&#.

.

4.489  ..

..

$:-29 85 %50903...20419089.90 %&.

#.

 8:-29 9903..943574.0702...081742-.:79  4330.0807.2047/09..94393  .0 8 902...0  0.1.2041908.08 .807.2.-# $ #.9438  $0./0/-90 439.34:9'.2  $97:983907.84990077472088.:08039070/.3494.2894790.38..340/020398 %01443.99489.08574.7.70.9..88:08410.908.8.8  ..0/  90780904205.08 %5.79.38990.9437.0/-..-4:9 3  :83$%#&%$# #  %0850.900880-:83$97:98 .045330-4.3807.3/.097.4770.35:75480419834908:899405...7.4330./0839075780 0./.2 0.307..4:8030   0.9903708:9-0/85.04507"   !.9435443  $:554791472088.#% 390 909-4 903.81448   !0788903.

70 503$4:7..9008843 %0.234793.2207 !83498.70! 439.38.7.907 .3  088.3  3990.3.3/700 .901:808843-0.709.894-079903-905747.43.307339075780/.0 3 ! 50788903.39..70  0-4.40/3#890174239075780.81:3.7/ %0701470 .9.94714770.47/ O O O O 19080 488  .439..07 .90 3990.3   $088430.07 48855.89470 %4950841 3990.0$ 40.7089.0783902.07488 3.39809907.3.078.307..4/0300/349-079903-905747.07  0-$5070  7.3.9089.0 ! 0.94389.-0 3.4/0 ...3.3.943-0..0/!0788903.38.43.307 %4950841808843-0.3/:80/-2. 9.3.:0-0.3.3/099072094/870570803934307441/.70  $088430.89.439.9.39.3.030.38.4250039075780 .805.0784341 0-4.90088808843-0.3/03.30390757808.0.078.4.%024891.90088808843-0.8   11070393/841390757800.3/.24:8 $07..90-:989.3 $088430.3 3990.981.38.0.2207 :93!!0788903.0.0.8904308970.3/.3 89.-4:9 0-4.943807.3  89.901:808843-0.3-0/0130/.0/3#  !890174239075780 .3/4083492.94389.$07. .0/!0788903.3 2.07.

9438  !8.94382088.943889028 !:754804190$97:98 0390:80718901472.382 :9  0 088.0.0.90  %$ 47 -0.90./098434397407.098:9..-0  .90.030..3 &304907950841  .3440894574.4250390757800.80/4383....08  3.3..24:870.0344204770249039071.9%025.7/0 4790'0 $97:9847809.3/-073.9:70 98450384:7.3..70.43.8'04.42543039.90 .344 -073.943.90088808843-0.3/8:-298901472 190.0450/-7.3/..071.2047147-:/370..9#0./039070/-90:80784:/-0570807..943.7//..8/0..3 $088430.2047.943.3/1700 $97:9817.. 89.039.90990..08 0-073.89:./017.08.80.438/070/94-0-099079.3/0/4.5740.9438 $97:98574..1.3/90'0 47904/0 $97:98.94.088 90.3/90 .0/  .3/.397/ 5.3/399-0. 303907578003.89:.07.79. . 17.33907.33 8:-806:039.3/49075708039.80.0..:08.-0077472088.9089490790.38-.9989.:08039070/-90:807.3/$ ...07!.70743 90390:8072:89-057080390/9908.030...3 #90.795.34408 0.553%0.3-05440/089..034.943 38:.:/3$%.08  088.70-..70.55.908.74320399070-0 0.38002..98$97:98 $97:988.07945./0 904/0.078.382470 70.344  -0.070.3!  088.205.2047.3/ .3/#!2.7434:82088.9 #0..11.$07.07..9./2.4330.80/43#!20.8#!805430.3.908 $% .25020398' 4/0'04397407  7..9874:5 $97:988.97..3 .3/3907..82489.

1907083407747  ..89093/08945 #03.07 4897:98 -.99 3$97:98 14/07 90708.314/07.3 ..209014/07.09.3/5.0/- %070.:90/  389..943 $97:98 8510 97.  4 5.9807.558 88:239..314/078.70 2.0/942.7108  304190./.70.7990942..9897:98 -.7990942.7 459.0389.800..43909 #089.7103.9807.914/07 ..8 ..20...90-.9897:98 -..90/  459.942.14/073.0 070 . 3.943908985.208 8897:98 -.07  5039074807 950 90&#.8 995.942. 14/0784:7.880/ 90390-:830884..9 3/7.3 .90.3.558 $9.90-..71094 ..

.

4..489  .

.3/  147/0.389.9  0706:700-4.943574. 490 0.0888..94:7 389..045398007.4770.420 5..7 %820.550.80 .0.

55.-4.3//024 47980.14/07 897:980-/024 3 /7.4390914/0794-0.4590../897:980-/024 .  %0144308843:897.3..70.70..880894.70./.33 0-4.90/909414/0783..0- 31.3//0243 -0.:807*5740...3/  3/7.90/945.0/0-4.07974:.9.. 3942.88108 .9 .:807*5740.908902094/41.083..0 70.3.82039430/.90.9438 39808843 0.0.20/024..90/90.9438.70...0 %884:7473/70..2  0.0   459.20/024.90088808843-0.0.9394..4330...$97:98 -.0 .947  0.89.807.0389.982/42.55.43909 .80/5747.982/42. .

70.9..9 -.70.7 1907...994 5..9 8095.07-0-4.9/897:980-/024/024/897:980-/024 /-0..9.994473/70.93-... 807.947 %88..2:833/48! 14:.0.0-4.885. 807.-.07-3 .0-4..9 897:980-/024/0240/98095.39  897:980-/0242//024 070/02484:75.885.885..90.9 809.0725479.422.5.9 %8809905.0.00.9 -.284:/-0 .7039/70. .10839047314/07  .9.0725479.10948095.897:980-/024 030:80897:9890.70:833/48  905.//024 090.059415.33988902  &8:.0901443.3/ /897:980-/024/0248095.39  897:980-/024/0240/9809.43..9.9147903/4 .3/4888902//  -3/-0.08.0.885.3/.947 030:805.0 897:980-/024.9940/95747.

  .9 897:980-/024/0240.$97389.:5. 06:.947  1 . 5.4.885.. 897:980-/024/0240/9...81448 897:980-/024/0245.94730'0... :9  5:-...88..9 %880990.9:/0 .  .90.   '0.9420 ...885...  ../897:980-/024/024809..0/024 25479...#02490 .947..0.908 $973.9:/0  5:-.9147903/4  0..5.9:/0 .9 40/9901443108  .8 %&  .3 .

//02039 .947 . 06:.  < 1 .  .0.947 80  .43  .947 .0.//02039 :-  < $9737 393.470  .947 .0.3.0./7.. .947 ./:7.//02039 .947 . 06:.//02039 ":.3/7:2  < 1 .3  .0.//02039 8470  .//02039 %7.947 .//02039 %7.947 .//02039 4.//02039 .8  .0.0.947 .0.947 .8 #%   .0.8 #   .0.

-7 < 709:737 < < .947 0020399   77 .0. $973 .147 39 3   $973.

.

 .

897:980-/024.

.39071..$97384..05943 < .9#02490 ..9#024900903/8 -0..9  5:-. 5....0/024 25479./0240/9. 72  5:-. 0-  25479.908 $9738  9748#02490..0.

.

 .

.

897:980-/024.

..05943 < ..90  974870..9420 .0..70.. 0-  25479.90.94200903/8420  5:-../0240/9.05943 #02490. 72  5:-. 5...39071.0/024 25479.9#02490..

.

 .

897:980-/024.

$97384.../0240/9.90.908 8  .908 $9738   .88.9:/0  $9737:/0 89.3 ..... 0-  5:-. 5.9:/0:/030.90.0/024 25479.325020398$088430...3  5:-.

4/0-#024.90 < 5:-.88..4/0-.4/809$0884343909 $08843439098.. < < .709:737 < 5:-.9.....90 < 5:-.4/0-70.4/0-!..90 < 5:-.0 < 5:-.

.

.10/5.3/0-4..9..  0.88 /-0..9438.0% 14/078...70.0- 31. .9 4250.45 .. ...55.90.3. 0-897:98/024/024.7 23%  897:980-/024% 0/90- .3/.982/42.0...-4.0108 897:980-/024/024.8808/024 897:980-/024/024./80990850..885.70.90/35./  897:980-/0242/%  030:805.7 2.7 2 ..:807*5740.80 0 % 349209. 31 40/9900- ..703914/07 984:/-03:5507.

2.7!&  .07843   %!0- .

.

$:3.74889028 3. .

.

38 .%39075780..0..

.

 995.

.

. 8:3 .42...

/9/.

7 039075780 -0.38 808843 0- 3.7** /9/ 0- .9.0- .20.

9420.0- 3.20 420/024 .

9#02490.420 702490/024 .

.90.88/024 .702490 0- .3.

90088.88 808843 950$9..0- .

.307.38.808843 950 97.943 950439.

.38.943 950 .97.

808843 .

38 .039075780 -0.

0- .7 .

.

 897:980-/024% 0/90-4.7 2 2. .07843  .

0- .7!&  . %!0-4.

.

.$89028 3.

.

%0-4. .

.

 995.

.

.42. -0.

807.078.

8 .

/9/.

7 /9/ 0-4.0-4.7 0-4.3 0- 3. 0- . 0- .20. 039075780 -0.9.

93/.20.0- 3.20 3/ 3.

3/ 3.20 .

3 .0-4. 039075780 -0.

7 . 0- .0-4.

.

9 .9438 .7/024 .55...7.7/-0.8843-04  897:980-/024.71094900-4.4590.7039/70.7 19070.0 4 0.9090.0881: 2088.9 .990.8:.947  40.7108./-.81448 897:980-/024..1.70.:807*5740.7034574-028 00990 0-..9 .94897:980-/024 70..90/35..88%  2 .14/07.9 .982/42. 0-.  4 .45.7.3.710.710.81448 897:980-/024.0.701:34909.0-4..:590.

07 %0.04520394190.2108 0-4.79900-4.0784.$9.79807.807.98 2/42.07  .9 .807.889.07.79 5747.3 89.7-0/0540/-90807.07 %0/0.3/98/05420393 0-4. :807*5740.

.

.55.885.431 2108 .9.5.3   .9/897:980-/0240897:98 -897:98 .:99-0.... /07.9 0:809014438108 398/0245.0/1742.. /07.472 .04590$97:98..0  0-897:98/0242//024 0-897:98/024/024 897:980-/024/0240/9809.214790.7 897:980-/024/024809...5.9 809..943 .$:-29 85  . :95:9 85 -08/08900- 2 897:98 .885..:0-0. 40 /0....0/1742.0   . .$:-29 85 .0507 ...943   .-4.0395747.. ...3   .9 -.943472   ....708:9 ..943 57450790810  0-897:98/024/0240/9..

9.-:7.

 .

.897:98 92 9/570192 92 -4/-.3 .03907 $%#&%$% #$%%$$.447.

 .

.03907 92077478.

 3.90-7 ..472 $9.$9. 921472..9044:..399494:7.20.943..472 950/024 .

 %&#.

90. 92909574507989.

 -7 928:-29.

 .

921472 .

-4/ .

92 .

.

.

0.943$07.  0390:8078:-29890.:942..9.09  92077478.$:-29 85 901472-0.3/90144089490.10/:5990 ...:0817429085 5.38.

 5.943472  $97389..09 995  2547947 .943  5:-.0/024 25479.4720903/8....4/809$9.5..90   709:7389.0 897:98 .472 .3077472088. < .90...9.88. 807.903: 5:-.08  897:980-/024/0240/9....   89.90 < 5:-.8:80/94/85...$97309$9.90 $973..

553  995$07.09#06:089706:089   .9437747807747830.4/70809 .09#06:089706:089   89.90 039    077478 .90 .943.90  < 709:73077478 < < ..5532..943.553 995$07./.903: < 5:-.94377478..5:-.94377478  1 89.9437747 077478 3:89.90 30.5532.// 89.

.

.. 5.0507 .... :9  ...0/024 25479.  897:980-/024/0240/9.

80. 4  5:-.... 72  25479.. 72  25479... 0-  25479...947  $973:79.9   !745079085745830!74507908  57458 5:9 43909 %* %%*% #  0-4.$9738   $9737 97  $8902 4:9 57393 !0.... 3/ 39.25479..43909.0.23  25479. 3.$973.0507  5:-...88..

.

   57458 5:9 43909 !# '#*&# :7  43909.439093039.43909 57458  .

943   /024 . .93/  $8902 4:9 57393   %  /024 .90  $8902 4:9 57393 # %#  7702490 84.9420 .70.908 8  < .059430 7 0< 709:737 < < .43909 44:5 ..$8902 4:9 57393 4330.9#02490702490420 .9.9420420 /024 .

.

....708:9 ....:0 .   897:980-/024/0240/9.88..0/024 5:-..708:9  $973. 5.

...:0.5:-....$97309'.708:9   .:0  709:73. < < .:0 < 5:-.:0 $973.4/809'.  .:0 < 5:-.

.

. 34:7.943..7941904/0..74:3/90-:830884.38. 5. %8890 -099907.80 90..7.050794507147290-:830884.9090995$07.943..  %0.09#06:0899490-:830884.08:83.0  897:980-/024/0240/9.3/70.9.5507.42203/0/57... %05:75480 41...3/8. 4  ..3.8889497.88389.943.8885...943 .0/024 25479.

7/00. :9  25479.472.943  5:-.708:9  .25479.0507  $97370507 .8 #%   .1472 . 06:..9430903/8.943.. 06:..9434721472  995$07.09  25479.553  . 06:.09#06:089706:089  995$07.90  1 .0 897:98 ..88.943  5:-.472 1472 $973.0507050730. 807..  .0.09 995  2547947 ..09.708:9730......5532....5.:90 ..8 # ..94347... 807...05943 $07...1472 09$9.09#085438070854380  9748 ...8 %& .05943  .

:0  $8902 4:9 57393 2  995$08843808843706:089 09$08843  808843 809997-:90 708:9 7  709:73 2.088  < 080  .7/ 1..94377478  *## # 30.077478 706:089 077478  709:73 2.:70  < < < 897:980-/024/0240/9.// .:0 7  $97327 09'.9437747807747830.94377478  077478 . :95:9 85  92 .553 13/47.20  8..553 13/47.7 809'..7/ 8:.9437747 077478 7433.

44747.-4/-.450808843.3/708:98.30  85:800.88/024 ...708:9.

:0.20708:95745079.. -7 8509!7450793.

 .

 .

-4/ .

./94-0.07 494./94.55...431 2 390897:98 .041.:807*5740.. ...3..982/42.45 85/-0.8808/024 %0/0542039574. 897:980-/024/024.88 /-0.0- 310/9 897:98 .08884..88   .9438..3.:807*5740.885.70.9..041.982/42.  897:980-/024/024.....9438.3.55.92 40.472.:807*5740..431 210 02.349073/4 ..55.3./850.0- 31.3.7070.10/ 897:980-/024/024.425090.-4..28 .982/42.70.9438.943.45 .094039708  300397814790389..3/ 9049070397814790389.05747.

3  1472 -0.39901472-0.3 3.472 950/024 .472.79/0.988905...20.

431 2/0.8990.553147":07.9435.5533 897:98 .9.. %0309802039412.943  .9432..

472 35:9..943 3.. 950/024 ....20.

$:-29 85 8...088 5..208:.450808843 .7/3.90 97:0  147./.9..

.. :95:9 85.

9.201. 147.7/3.:70 5.

$:-29 85...

 .

943   ...

3/.08 .8 55.88087084:7.//901443308  077478 3:89.10343.9100.99003/ 419. %0708..943 574507908 3  .90%# &#$%%..

20$ ## $#' %!# ' #%$$%%. 077478 7433.

 .

79900-4.8995.807. %0701470 00990850.3/950&#.  50390-74807.8:8:.10/077472088.08  $9.07.

.

.4.489 .

..

90 %&..20419089.$:-29 85 %50903..

#.

04507"   !.900880-:83$97:98 .4:8030   0.4770.38990.081742-.90174290$9.35:75480419834908:899405.0/  90780904205.34:9'.99489.4330.045330-4...4330.34907..8  3.08443 0903/98..2.0 8 902.88:08410.7.:08039070/.79.0/-.9903708:9-0/85.9437.340/020398 %01443./.900880-  .#% 390 909-4 903.2    .-# $ #.2 0.3494.0702.2047/09.43.8.84990077472088.05994..908.79.3/.20419089.994-073. 8:-29 1903..