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

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