View
221
Download
1
Category
Tags:
Preview:
Citation preview
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 architectureFit Struts into an overall development planBuild a Struts application step by stepWork with fundamental Struts components, like ActionForms and Action classesGrok 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 logicModel 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/JDBCcustBean.setDiscount(db.Rate(custKey));
Selecting a MVC framework
Several good choicesBarracudaJPublishMustangTapestryTurbineWebWorks / Open Symphony
Selecting a MVC framework
Struts – Jack of all tradesComplete enoughEasy enough
Selecting a MVC framework
Struts – Jack of all tradesComplete enoughEasy enoughAnd, 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
Storyboard
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.xmlbootstrap
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 POSTAction processes requestReturns 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
Voila! She works
What do we build first?
1) Capture client stories
2) Build storyboard
3) Bring over pages from storyboard
4) 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
ActionFormParameter to JavaBean conversionValidator extension point
Forms and Tags
SearchForm
HTML tags
Net result: Roundtrip
Forms and Tags
SearchForm Input Properties
county, facility, permit, beforeDate, afterDate Input Validation
TestsMessages
SearchForm
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; }
SearchForm
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
required(errors,getCountyCode(),"county");
required(errors,getFacilityCode(),"facility");
required(errors,getPermitCode(),"permit");
required(errors,getBdMonth(),"before");
required(errors,getAdMonth(),"after");
return errors;
}
SearchForm protected void required(ActionErrors errors, String field, String name) {
if ((null==field) || (0==field.length())) { errors.add(name, new ActionError("errors.required",name)); }
}
ApplicationResources.properties{0} is required.
HTML Tags
<tr>
<td>Name of County: </td>
<td>
<html:select property="countyCode">
<html:option value="">- select county-</html:option>
<html:option value="41">Oklahoma</html:option>
<html:option value="42">Magrathea</html:option> </html:select>
</td>
</tr>
FormBeans
<form-beans>
<form-bean
name="searchForm"
type="app.http.SearchForm"
/>
</form-beans>
ActionMapping
<action path="/search" forward="/search.jsp"/>
<action path="/result" forward="/result.html" name="searchForm" scope="request" validate="true" input="/search.do"/>
Roundtripping
If input fails, returns to search.jspAny selection retained by JSP tags via the
SearchForm
If input passes, continues to Struts Action or another location (URI)SearchForm is saved in request scope
under attribute name “searchForm”
What do we build next?
Forms and Tags
Action Classes
Action Classes
Input from ActionFormsOutput ActionForwardsPass data through contextBusiness logic adapterList searchPermits(String countyCode, String facilityCode, String permitCode, Date before, Date after);
Action Classes
public class SearchAction extends Action {
public ActionForward perform(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
SearchForm sf = (SearchForm) form;
Action Classes
List result = Repository.searchPermits( sf.getCountyCode(), sf.getFacilityCode(), sf.String permitCode, sf.getBefore(), sf.getAfter());
if (null==result) return mapping.findForward("failure");
request.setAttribute(“LIST”,list); return mapping.findForward("success");
}
}
Action Classes
Servlet delegate
Singletons
Thread-safe
May be shared by ActionMappingsDecorator pattern
Struts: A mile high view
validation
Summary
In this talk, we walked through the initial steps most people would take in order to start work on a Struts application. We covered:
Selecting a MVC architecture and the web platform
Building a Struts application from storyboards and client stories
The overall Struts architecture and control flow
For more information
Tutorials
Articles and presentations
Books
Seminars
Mailing List Archives
Data Access Systems
Presentation Systems
Code Generators and GUIs
Contributor Taglibs
Projects and Examples
Struts Special Interest Groups
and more.
The best resource for finding our more about Struts is still the Resources page on the Struts web site. It is regularly updated and contains links to everything Struts, including
Conclusion
Make sure that Struts is the right tool for the job
Build your application, then adapt it to Struts
Struts is your presentation layer, but your application
has layers of its own.
Recommended