Building an application … with Struts! Presented by Ted Husted [ [email protected] ]

85
Building an application … with Struts! Presented by Ted Husted [ [email protected] ]

Transcript of Building an application … with Struts! Presented by Ted Husted [ [email protected] ]

Page 1: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Building an application … with Struts!

Presented by Ted Husted

[ [email protected] ]

Page 2: 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.

Page 3: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Goal

Learn the basics of the Struts framework in the context of bootstrapping an application

Page 4: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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)

Page 5: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

About You

Developed web applications

Page 6: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

About You

Developed web applications

Developed Java web applications

Page 7: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

About You

Developed web applications

Developed Java web applications

Developed Struts applications

Page 8: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

About You

Developed web applications

Developed Java web applications

Developed Struts applications

Read Struts articles

Page 9: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

About You

Developed web applications

Developed Java web applications

Developed Struts applications

Read Struts articles

Visited Struts website

Page 10: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

About You

Developed web applications

Developed Java web applications

Developed Struts applications

Read Struts articles

Visited Struts website

Read Struts books

Page 11: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

About You

Developed web applications

Developed Java web applications

Developed Struts applications

Read Struts articles

Visited Struts website

Read Struts books

Page 12: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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

Page 13: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Talk Roadmap

What are we building it with?

What do we build first?

What do we build next?

Struts: A mile-high view

Page 14: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Model 1 versus MVC/Model 2

Model 1 – JSP contains business and presentation logicModel 2 – Servlet contains business logic; JSP contains presentation logic

Page 15: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

MVC Stereo System

Media – Model

Speakers – View

Receiver - Controller

Page 16: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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

Page 17: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Presentation versus Business Logic

Presentation Logic – HTML/JSP<bean:write name="custBean" property="discount"/>

Business Logic – Java/JDBCcustBean.setDiscount(db.Rate(custKey));

Page 18: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Selecting a MVC framework

Several good choicesBarracudaJPublishMustangTapestryTurbineWebWorks / Open Symphony

Page 19: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Selecting a MVC framework

Struts – Jack of all tradesComplete enoughEasy enough

Page 20: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Selecting a MVC framework

Struts – Jack of all tradesComplete enoughEasy enoughAnd, gosh,

people like it!

Page 21: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Talk Roadmap

What are we building it with?

What do we build first?

What do we build next?

Struts: A mile-high view

Page 22: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Storyboard

Visio / graphical storyboard

HTML Submit to next page

<form action="result.html">Hardcode a result

Static page with realistic data

Page 23: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Storyboard

Page 24: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 25: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

What do we build first?

Storyboard

Struts Blank

It’s about the actions

Page 1, Mapping 1

Page 26: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Struts Blank

Empty, semi-complete application

Getting started config files

Initial file structure

Rename WAR to app name e.g. “building.war”

Page 27: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Struts Blank

web.xmlbootstrap

application.properties text messages (i18n)

struts-config.xml framework core

index.jsp, Welcome.jsp

Page 28: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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><!-- … -->

Page 29: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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>

<!-- . . . -->

Page 30: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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>

Page 31: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

struts-config.xml

<action-mappings> <!-- Default "Welcome" action --> <!-- Forwards to Welcome.jsp -->

<action path="/Welcome" forward="/pages/Welcome.jsp"/>

Page 32: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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>

Page 33: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

application.properties

index.title=Struts Starter Applicationindex.heading=Hello World!index.message=To get started on your own application …

Page 34: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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.

--%>

Page 35: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 36: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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

Page 37: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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

Page 38: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

What do we build first?

Storyboard

Struts Blank

It’s about the actions

Page 1, Mapping 1

Page 39: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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

Page 40: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

What do we build first?

HTML Storyboard

Struts Blank

It’s about the actions

Page 1, Mapping 1

Page 41: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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

Page 42: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Voila! She works

Page 43: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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

Page 44: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Talk Roadmap

What are we building it with?

What do we build first?

What do we build next?

Struts: A mile-high view

Page 45: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

What do we build next?

Forms and Tags

Action Classes

Page 46: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Forms and Tags

ActionFormParameter to JavaBean conversionValidator extension point

Page 47: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Forms and Tags

SearchForm

HTML tags

Net result: Roundtrip

Page 48: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Forms and Tags

SearchForm Input Properties

county, facility, permit, beforeDate, afterDate Input Validation

TestsMessages

Page 49: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

SearchForm

Page 50: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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; }

Page 51: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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;

}

Page 52: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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.

Page 53: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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>

Page 54: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

FormBeans

<form-beans>

<form-bean

name="searchForm"

type="app.http.SearchForm"

/>

</form-beans>

Page 55: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

ActionMapping

<action path="/search" forward="/search.jsp"/>

<action path="/result" forward="/result.html" name="searchForm" scope="request" validate="true" input="/search.do"/>

Page 56: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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”

Page 57: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 58: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

What do we build next?

Forms and Tags

Action Classes

Page 59: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Action Classes

Input from ActionFormsOutput ActionForwardsPass data through contextBusiness logic adapterList searchPermits(String countyCode, String facilityCode, String permitCode, Date before, Date after);

Page 60: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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;

Page 61: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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");

}

}

Page 62: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Action Classes

Servlet delegate

Singletons

Thread-safe

May be shared by ActionMappingsDecorator pattern

Page 63: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

Struts: A mile high view

Page 64: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 65: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 66: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 67: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 68: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 69: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 70: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 71: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 72: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

validation

Page 73: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 74: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 75: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 76: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 77: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 78: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 79: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 80: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 81: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]
Page 82: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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

Page 83: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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

Page 84: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]

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.

Page 85: Building an application … with Struts! Presented by Ted Husted [ ted@husted.com ]