850 likes | 976 Vues
Join Ted Husted, lead author of "Struts in Action", for an insightful session on Struts, a popular Model-View-Controller framework from Jakarta. This presentation is designed for newcomers and those seeking a refresher, covering the fundamental components of Struts, and how to bootstrap an application step by step. Explore the separation of business logic and presentation and learn how to effectively structure your development process. With hands-on examples and a clear roadmap, you’ll gain the knowledge to confidently work with Struts and develop robust web applications.
E N D
Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Building an application … with Struts! • What is this presentation layer framework that has gained such widespread popularity? • Struts, a Model-View-Controller framework from Jakarta, allows clean separation between business logic and its presentation. • This session will introduce Struts to those new to it or want a refresher on the basics.
Goal Learn the basics of the Struts framework in the context of bootstrapping an application
About Ted Husted • Lead author, Struts in Action • Struts forum manager for JGuru • Struts Committer (team member) • Member, Apache Software Foundation • Working developer (just like you)
About You • Developed web applications
About You • Developed web applications • Developed Java web applications
About You • Developed web applications • Developed Java web applications • Developed Struts applications
About You • Developed web applications • Developed Java web applications • Developed Struts applications • Read Struts articles
About You • Developed web applications • Developed Java web applications • Developed Struts applications • Read Struts articles • Visited Struts website
About You • Developed web applications • Developed Java web applications • Developed Struts applications • Read Struts articles • Visited Struts website • Read Struts books
About You • Developed web applications • Developed Java web applications • Developed Struts applications • Read Struts articles • Visited Struts website • Read Struts books
Learning Objectives • Recognize a MVC architecture • Fit Struts into an overall development plan • Build a Struts application step by step • Work with fundamental Struts components, like ActionForms and Action classes • Grok the Struts workflow
Talk Roadmap • What are we building it with? • What do we build first? • What do we build next? • Struts: A mile-high view
Model 1 versus MVC/Model 2 • Model 1 – JSP contains business and presentation logic • Model 2 – Servlet contains business logic; JSP contains presentation logic
MVC Stereo System • Media – Model • Speakers – View • Receiver - Controller
Model 1 Stereo System • Walkman • Something breaks; cheaper to replace unit • With MVC/Model 2, if you blow a speaker, you can replace a speaker
Presentation versus Business Logic • Presentation Logic – HTML/JSP • <bean:write name="custBean" property="discount"/> • Business Logic – Java/JDBC • custBean.setDiscount(db.Rate(custKey));
Selecting a MVC framework • Several good choices • Barracuda • JPublish • Mustang • Tapestry • Turbine • WebWorks / Open Symphony
Selecting a MVC framework • Struts – Jack of all trades • Complete enough • Easy enough
Selecting a MVC framework • Struts – Jack of all trades • Complete enough • Easy enough • And, gosh, people like it!
Talk Roadmap • What are we building it with? • What do we build first? • What do we build next? • Struts: A mile-high view
Storyboard • Visio / graphical storyboard • HTML • Submit to next page • <form action="result.html"> • Hardcode a result • Static page with realistic data
What do we build first? • Storyboard • Struts Blank • It’s about the actions • Page 1, Mapping 1
Struts Blank • Empty, semi-complete application • Getting started config files • Initial file structure • Rename WAR to app name • e.g. “building.war”
Struts Blank • web.xml • bootstrap • application.properties • text messages (i18n) • struts-config.xml • framework core • index.jsp, Welcome.jsp
web.xml <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>application</param-name> <param-value>ApplicationResources</param-value> </init-param> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param><!-- … -->
web.xml <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <taglib> <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri> <taglib-location>/WEB-INF/struts-bean.tld</taglib-location> </taglib> <!-- . . . -->
struts-config.xml <form-beans> <!-- properties of data-entry forms <form-bean name="logonForm" type="org.apache.struts.example.LogonForm"/> --> </form-beans> <global-forwards> <!-- workflow destinations <forward name="logon" path="/pages/logon.jsp"/> --> </global-forwards>
struts-config.xml <action-mappings> <!-- Default "Welcome" action --> <!-- Forwards to Welcome.jsp --> <action path="/Welcome" forward="/pages/Welcome.jsp"/>
struts-config.xml <!-- Example logon action <action path="/logon" type="org.apache.struts.example.LogonAction" name="logonForm" scope="request" input="/pages/logon.jsp"> </action> --> <!-- Example logoff action <action path="/logoff" type="org.apache.struts.example.LogoffAction"> <forward name="success" path="/pages/index.jsp"/> </action> --> </action-mappings>
application.properties index.title=Struts Starter Applicationindex.heading=Hello World!index.message=To get started on your own application …
Index.jsp <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <logic:redirect forward="welcome"/> <%-- Redirect default requests to Welcome global ActionForward. By using a redirect, the user-agent will change address to match the path of our Welcome ActionForward. --%>
welcome.jsp • index.jsp is registered as welcome page • Struts logic tag redirected to “welcome” forward • Welcome forward = “/pages/Welcome.jsp” • Client requests welcome.jsp, retains session, can now use cookies
Template pattern • Struts is a base-line, “fill-in-the-blanks” framework • Not an omnibus toolkit • Many developer extensions available • Place to plug-in your own extensions • Custom JSP tags or Velocimacros • Data transformations • Workflow heuristics • Business objects
What do we build first? • Storyboard • Struts Blank • It’s about the actions • Page 1, Mapping 1
It’s about the actions • <form action=“client-story”> • Our one and only extension point • HTTP request – GET or POST • Action processes request • Returns response to browser
What do we build first? • HTML Storyboard • Struts Blank • It’s about the actions • Page 1, Mapping 1
Page 1, Mapping 1 • Rename from search.html, result.html • Change actions to result.do and search.do • <form action="/building/search.do"> • <form action="/building/result.do"> • Add "/search" and "/result" mappings • <action path="/search" forward="/search.jsp"/> • <action path="/result" forward="/result.jsp"/> • Click-through – Voila! She works
What do we build first? • Capture client stories • Build storyboard • Bring over pages from storyboard • Migrate HTML actions to action-mappings
Talk Roadmap • What are we building it with? • What do we build first? • What do we build next? • Struts: A mile-high view
What do we build next? • Forms and Tags • Action Classes
Forms and Tags • ActionForm • Parameter to JavaBean conversion • Validator extension point
Forms and Tags • SearchForm • HTML tags • Net result: Roundtrip
Forms and Tags • SearchForm • Input Properties • county, facility, permit, beforeDate, afterDate • Input Validation • Tests • Messages
SearchForm private String countyCode = null; public String getCountyCode() { return this.countyCode; } public void setCountyCode(String countyCode) { this.countyCode = countyCode; } private String countyName = null; public String getCountyName() { return this.countyName; } public void setCountyName(String countyName) { this.countyName = countyName; }