Beginning Apache Struts Ebook free dowwnload

www.it-ebooks.info

Beginning Apache Struts
From Novice to Professional

■■■

Arnold Doray

www.it-ebooks.info

Beginning Apache Struts: From Novice to Professional
Copyright © 2006 by Arnold Doray
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.
ISBN-13 (pbk): 978-1-59059-604-3
ISBN-10 (pbk): 1-59059-604-8
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence
of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark

owner, with no intention of infringement of the trademark.
Lead Editor: Steve Anglin
Technical Reviewer: Kunal Mittal
Editorial Board: Steve Anglin, Dan Appleman, Ewan Buckingham, Gary Cornell, Jason Gilmore,
Jonathan Hassell, James Huddleston, Chris Mills, Matthew Moodie, Dominic Shakeshaft,
Jim Sumser, Matt Wade
Project Manager: Julie M. Smith
Copy Edit Manager: Nicole LeClerc
Copy Editor: Liz Welch
Assistant Production Director: Kari Brooks-Copony
Production Editor: Katie Stence
Compositor: Susan Glinert
Proofreader: Lori Bring
Indexer: Valerie Perry
Artist: Kinetic Publishing Services, LLC
Cover Designer: Kurt Krames
Manufacturing Director: Tom Debolski
Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor,
New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail orders-ny@springer-sbm.com, or
visit http://www.springeronline.com.

For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA
94710. Phone 510-549-5930, fax 510-549-5939, e-mail info@apress.com, or visit http://www.apress.com.
The information in this book is distributed on an “as is” basis, without warranty. Although every precaution
has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to
any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly
by the information contained in this work.
The source code for this book is available to readers at http://www.apress.com in the Source Code section.

www.it-ebooks.info

To my darling wife Lillian, for her love, encouragement, and constant support,
To my mother for always believing in me,
To my father for showing me by example that you can accomplish almost anything
you put your mind to,
And to the One who gave up His life for us two thousand years ago.

www.it-ebooks.info

www.it-ebooks.info


Contents at a Glance
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xx
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi

PART 1

■■■

Basic Struts

■CHAPTER 1

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

■CHAPTER 2

Servlet and JSP Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

■CHAPTER 3


Understanding Scopes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

■CHAPTER 4

Custom Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

■CHAPTER 5

The MVC Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

■CHAPTER 6

Simple Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

■CHAPTER 7

Processing Business Logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

■CHAPTER 8


Basic Struts Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

■CHAPTER 9

Configuring Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

■CHAPTER 10

More Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

■CHAPTER 11

Uploading Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

■CHAPTER 12

Internationalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

■CHAPTER 13


Review Lab: Editing Contacts in LILLDEP . . . . . . . . . . . . . . . . . . . . . 157

PART 2

■■■

Advanced Struts

■CHAPTER 14

Tiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161

■CHAPTER 15

The Validator Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

■CHAPTER 16

Dynamic Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221


■CHAPTER 17

Potpourri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

■CHAPTER 18

Review Lab: The Collection Facility . . . . . . . . . . . . . . . . . . . . . . . . . . 267

■CHAPTER 19

Developing Plug-ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

■CHAPTER 20

JavaServer Faces and Struts Shale . . . . . . . . . . . . . . . . . . . . . . . . . . 307
www.it-ebooks.info

v


■APPENDIX A

Frameworks for the Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359

■APPENDIX B

Commonly Used Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375

■APPENDIX C

Struts Tag Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381

■APPENDIX D

Answers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469

■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479

vi


www.it-ebooks.info

Contents
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xx
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi

PART 1

■■■

■CHAPTER 1

Basic Struts

Introduction

................................................3

What Is a Web Application? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

What Struts Can Do for You . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
About You . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
How to Read This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

■CHAPTER 2

Servlet and JSP Review

...................................7

Lab 2: Installing Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Servlet Container Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Important Servlet Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
JavaServer Pages (JSP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Deconstructing Hello.jsp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Final Thoughts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16


■CHAPTER 3

Understanding Scopes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Lab 3: Scopes Quiz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Session and Request Scope Internals . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

vii

www.it-ebooks.info

viii

■C O N T E N T S

■CHAPTER 4

Custom Tags

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

Custom Tag Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
How Custom Tags Are Processed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
The Java Handler Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Helper Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
The TLD File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Lab 4: A Temperature Conversion Tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Step 1: Prepare the Development Environment and Scripts . . . . . . 32
Step 2: Write the Java Tag Handler . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Step 3: Writing the Tag Library Descriptor file . . . . . . . . . . . . . . . . . 33
Step 4: Amend web.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Step 5: Write Your JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Step 6: Deploy and Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Professional Java Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

■CHAPTER 5

The MVC Design Pattern

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

The Registration Webapp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Requirement 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Requirement 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Requirement 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Requirement 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Requirement 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Lab 5: MVC Quiz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Which Comes First? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Struts and MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Lifecycle of a Struts Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Frameworks for the Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

■CHAPTER 6

Simple Validation

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

Processing Simple Validations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Anatomy of ActionForm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Using ActionErrors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

www.it-ebooks.info

■C O N T E N T S

Lab 6: ContactForm for LILLDEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Step 1: Prepare the Development Environment and Scripts . . . . . . 62
Step 2: Implement Getters and Setters for ContactForm . . . . . . . . . 63
Step 3: Implement validate() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Step 4: Implement reset() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
What Has Struts Done for You Today? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

■CHAPTER 7

Processing Business Logic

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

1,2,3 Action! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
The Statelessness of Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Subclassing Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Business Logic in the Registration Webapp . . . . . . . . . . . . . . . . . . . . . . . . 70
Complex Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Data Transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Lab 7: Implementing ContactAction for LILLDEP . . . . . . . . . . . . . . . . . . . . 76
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

■CHAPTER 8

Basic Struts Tags

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

Page Processing Lifecycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Evaluation, Replacement, and Sending . . . . . . . . . . . . . . . . . . . . . . . 81
The View Component of the Registration Webapp . . . . . . . . . . . . . . . . . . 82
Declaring and Installing the HTML and Bean Libraries. . . . . . . . . . . 83
Displaying Static Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Forms and Form Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Data Input Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Displaying Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Synopsis of HTML and Bean Tag Libraries . . . . . . . . . . . . . . . . . . . . . . . . 88
Lab 8: Contact Entry Page for LILLDEP . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

■CHAPTER 9

Configuring Struts

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

The Structure of struts-config.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Configuring the Registration Webapp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Declaring Form Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Declaring Global Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Declaring Global Forwards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
www.it-ebooks.info

ix

x

■C O N T E N T S

Declaring Form Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Forwards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Controller Declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Message Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Declaring Plug-ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Lab 9a: Configuring LILLDEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Code Reuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Lab 9b: The MNC Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

■CHAPTER 10 More Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Best Practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
The 2 + 1 Remaining Struts Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
The Logic Tag Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Simple, Nested, Indexed, and Mapped Properties . . . . . . . . . . . . . 111
Conditional Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Flow Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
The Nested Tag Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
JSTL and Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Expression Language (EL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Using EL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
The Tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
The Tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
The and ... Tags . . . . . . . . . . . . . . . . 123
Struts EL Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Lab 10a: The LILLDEP Full Listing Page . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Step 1: Complete ListingAction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Step 2: Complete listing.jsp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Step 3: Amend web.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Step 4: Amend struts-config.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Lab 10b: Simplifying ContactForm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Step 1: Amend ContactForm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Step 2: Amend full.jsp and mnc.jsp . . . . . . . . . . . . . . . . . . . . . . . . . 126
Lab 10c: Using JSTL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Step 1: Install the JSTL and Struts EL Tag Libraries . . . . . . . . . . . 127
Step 2: Amend web.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Step 3: Amend listing.jsp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
www.it-ebooks.info

■C O N T E N T S

■CHAPTER 11 Uploading Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Uploading a Fixed Number of Files at Once . . . . . . . . . . . . . . . . . . . . . . . 131
Uploading Any Number of Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Lab 11: Importing Data into LILLDEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Step 1: Complete ImportForm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Step 2: Complete import.jsp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Step 3: Complete ImportAction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Step 4: Amend struts-config.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Step 5: Compile, Redeploy, and Test Your Application. . . . . . . . . . 142
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

■CHAPTER 12 Internationalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Character Encodings, Unicode, and UTF-8 . . . . . . . . . . . . . . . . . . . . . . . 143
Locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Processing Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Localizing Validations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Localizing Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Processing Translated Application.properties Files . . . . . . . . . . . . 151
Selecting a Locale from the Browser . . . . . . . . . . . . . . . . . . . . . . . . 151
Switching Locales with a Link . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Switching Locales with LocaleAction . . . . . . . . . . . . . . . . . . . . . . . . 154
Lab 12: LILLDEP for the Malaysian Market . . . . . . . . . . . . . . . . . . . . . . . 154
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

■CHAPTER 13 Review Lab: Editing Contacts in LILLDEP . . . . . . . . . . . . . . . 157
Implementing the Edit Facility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

PART 2

■■■

Advanced Struts

■CHAPTER 14 Tiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Installing Tiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Tiles for Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Using Stylesheets with Layouts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Tiles Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Creating a Tiles Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
www.it-ebooks.info

xi

xii

■C O N T E N T S

Example: The “Login” Tiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Getting External Form Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Lab 14: The Find Facility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Step 1: Set Up Tiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Step 2: Write the Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Step 3: Put In the Tiles Action Mapping . . . . . . . . . . . . . . . . . . . . . . 190
Step 4: Make Changes to ContactAction . . . . . . . . . . . . . . . . . . . . . 190
Step 5: Write the Tiles JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Step 6: Write the Tiles Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Step 7: Put In the Find Tile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Step 8: Deploy and Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

■CHAPTER 15 The Validator Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Declaring the Validator Plug-in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Validator DTD Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Using the Validator Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Example: Validating RegistrationForm . . . . . . . . . . . . . . . . . . . . . . . 199
Validating Nested and Indexed Properties . . . . . . . . . . . . . . . . . . . . 203
Using Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Client-Side Validations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
The Standard Validators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Using validwhen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Using validwhen with Indexed Fields . . . . . . . . . . . . . . . . . . . . . . . . 207
Adding Custom Validations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Implementing validate() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Extending the Validator Framework . . . . . . . . . . . . . . . . . . . . . . . . . 210
Implementing the Java Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Migrating Legacy Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Localizing Validations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Lab 15: Using the Validator Framework in LILLDEP . . . . . . . . . . . . . . . . 218
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

■CHAPTER 16 Dynamic Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Declaring Dynamic Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Declaring Simple Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Declaring Indexed Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Declaring Mapped Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Declaring Nested Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
www.it-ebooks.info

■C O N T E N T S

Accessing Dynamic Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Transferring Properties to a JavaBean . . . . . . . . . . . . . . . . . . . . . . . 225
Dynamic Form Disadvantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
When to Use Dynamic Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Validating Dynamic Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
The Registration Webapp with Dynamic Forms . . . . . . . . . . . . . . . . . . . 228
See Ma, No Hands!: LazyValidatorForm (Struts 1.2.6+) . . . . . . . . . . . . . 232
Disadvantages of Using LazyValidatorForm . . . . . . . . . . . . . . . . . . . 234
The Hidden Power of BeanValidatorForm (Struts 1.2.6+) . . . . . . . . . . . 235
Lab 16: Deleting Selected Contacts in LILLDEP . . . . . . . . . . . . . . . . . . . 236
Step 1: Declare the SelectionForm Form Bean . . . . . . . . . . . . . . . . 236
Step 2: Amend listing.jsp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Step 3: Create the Action to Delete Contacts . . . . . . . . . . . . . . . . . 237
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

■CHAPTER 17 Potpourri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
PropertyUtils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Using PropertyUtils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
In a Nutshell... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
DownloadAction (Struts 1.2.6+) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
LocaleAction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
IncludeAction and ForwardAction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
In a Nutshell... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
LookupDispatchAction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
DispatchAction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
MappingDispatchAction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
In a Nutshell... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Using Global Forwards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
In a Nutshell... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Using Wildcards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
In a Nutshell... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Splitting up struts-config.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
In a Nutshell... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266

www.it-ebooks.info

xiii

xiv

■C O N T E N T S

■CHAPTER 18 Review Lab: The Collection Facility . . . . . . . . . . . . . . . . . . . . . 267
Lab 18a: The Main Collect Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Lab 18b: The New Collection Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Lab 18c: The Collection Listing Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Lab 18d: Removing Selected Contacts . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Lab 18e: Adding Selected Contacts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Lab 18f: Up and Down a Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276

■CHAPTER 19 Developing Plug-ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
The Task at Hand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Implementation Road Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
How Struts Processes Form Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Anatomy of a Plug-in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Implementing DynaFormsPlugIn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Reading XML with Apache’s Digester . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Implementing DynaFormsLoaderFactory . . . . . . . . . . . . . . . . . . . . . . . . . 291
DefaultDynaFormsLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Lab 19: Test Driving the DynaForms Plug-in . . . . . . . . . . . . . . . . . . . . . . 302
Extra Credit Lab: Handling . . . . . . . . . . . . . . . . . . . . . . . 303
Solution Outline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306

■CHAPTER 20 JavaServer Faces and Struts Shale . . . . . . . . . . . . . . . . . . . . . 307
JSF Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Shale Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Learning Struts a Waste of Time? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
JavaServer Faces (JSF) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Server-Side UI Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Request Processing Lifecycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Events and Event Listeners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
JSF Tag Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Value and Method Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321

www.it-ebooks.info

■C O N T E N T S

Example: The Registration Webapp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Configuring JSF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Message Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
The User Backing Bean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
The View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Where to Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Lab 20: The Struts-Faces Integration Library . . . . . . . . . . . . . . . . . . . . . 337
Step 1: Preparing the Development Environment . . . . . . . . . . . . . . 337
Step 2: Install JSF, JSTL, and the Struts-Faces
Integration Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Step 3: Edit web.xml and struts-config.xml. . . . . . . . . . . . . . . . . . . 338
Step 4: Migrate Your Struts JSP Pages . . . . . . . . . . . . . . . . . . . . . . 339
Step 5: Migrate the s and Inputs . . . . . . . . . . . . . . . . . . 341
Step 6: Make Entry Points Forward to *.faces . . . . . . . . . . . . . . . . . 341
Step 7: Amend Actions if Necessary. . . . . . . . . . . . . . . . . . . . . . . . . 342
Step 8: Put in the Necessary Declarations . . . 342
In a Nutshell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Struts Shale Preview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
ViewController . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Dialog Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Integration with the Validator Framework . . . . . . . . . . . . . . . . . . . . 350
JNDI Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Reusable Views with Clay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
Server-Side Ajax Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
Test Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
JSF vs. Shale vs. Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358

■APPENDIX A Frameworks for the Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
Getting the Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Lisptorq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Lab A: Test Driving Lisptorq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Step 1: Preparing the Development Environment . . . . . . . . . . . . . . 363
Step 2: Writing the Database Schema . . . . . . . . . . . . . . . . . . . . . . . 363
Step 3: Specifying the Database Settings . . . . . . . . . . . . . . . . . . . . 364
Step 4: Generate the Java Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Step 5: Writing the Test Program . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Step 6: Initializing the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Step 7: Running the Test Program . . . . . . . . . . . . . . . . . . . . . . . . . . 365
www.it-ebooks.info

xv

xvi

■C O N T E N T S

Using Torque for the Registration Webapp . . . . . . . . . . . . . . . . . . . . . . . 366
Using Hibernate for the Registration Webapp . . . . . . . . . . . . . . . . . . . . . 367
In a Nutshell... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
Autogenerating LILLDEP Model Classes . . . . . . . . . . . . . . . . . . . . . . . . . . 370
Useful Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373

■APPENDIX B Commonly Used Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
javax.servlet.http.HttpServletRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
javax.servlet.http.HttpSession . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
org.apache.struts.action.ActionMessage . . . . . . . . . . . . . . . . . . . . . . . . . 376
org.apache.struts.action.ActionMessages . . . . . . . . . . . . . . . . . . . . . . . . 377
org.apache.struts.action.ActionErrors . . . . . . . . . . . . . . . . . . . . . . . 377
org.apache.struts.action.ActionMapping . . . . . . . . . . . . . . . . . . . . . . . . . 377
org.apache.struts.action.Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
org.apache.struts.action.ActionForm . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
org.apache.struts.upload.FormFile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
org.apache.struts.tiles.ComponentContext . . . . . . . . . . . . . . . . . . . . . . . 380
org.apache.struts.action.ExceptionHandler . . . . . . . . . . . . . . . . . . . . . . . 380

■APPENDIX C

Struts Tag Reference

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381

The HTML Tag Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Common Attribute Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
The Error Style Attribute Set (Struts 1.2.5+) . . . . . . . . . . . . . . . . . . 386
Struts-EL Tags for the HTML Tag Library . . . . . . . . . . . . . . . . . . . . 386
base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
cancel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
checkbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
hidden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
html . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
img . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
javascript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
link . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404

www.it-ebooks.info

■C O N T E N T S

messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405s
multibox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
radio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
rewrite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
select, with option, options, and optionsCollection . . . . . . . . . . . . . 411
submit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
text/password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
textarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
xhtml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
The Bean Tag Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
Struts-EL Tags for the Bean Tag Library . . . . . . . . . . . . . . . . . . . . . 422
cookie/header/parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
define . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
The Logic Tag Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Common Attribute Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Selector Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
Struts-EL Tags for the Logic Tag Library . . . . . . . . . . . . . . . . . . . . . 437
empty/notEmpty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
equal/notEqual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
forward . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
greaterEqual/lessEqual/greaterThan/lessThan . . . . . . . . . . . . . . . . 441
iterate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
match/notMatch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
messagesPresent/messagesNotPresent . . . . . . . . . . . . . . . . . . . . . 446
present/notPresent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
redirect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
The Nested Tag Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Struts-EL Tags for the Nested Tag Library. . . . . . . . . . . . . . . . . . . . 452
nest. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
writeNesting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456

www.it-ebooks.info

xvii

xviii

■C O N T E N T S

The Tiles Tag Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
Common Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
A Note on Equivalent Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Struts-EL Tags for the Tiles Tag Library . . . . . . . . . . . . . . . . . . . . . 458
insert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
put . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
putList and add . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
get . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
getAsString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
useAttribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
importAttribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
initComponentDefinitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467

■APPENDIX D Answers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Chapter 1: Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Chapter 3: Understanding Scopes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
Chapter 5: The MVC Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Chapter 6: Simple Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Lab 8: Contact Entry Page for LILLDEP . . . . . . . . . . . . . . . . . . . . . . . . . . 472
Lab 9a: Configuring LILLDEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Lab 9b: The MNC Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Chapter 10: More Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
Lab 10a: The LILLDEP Full Listing Page . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Lab 10b: Simplifying ContactForm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Lab 11: Importing Data into LILLDEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Chapter 13: Review Lab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
Chapter 14: Tiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
Chapter 15: The Validator Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
Chapter 17: Potpourri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
Chapter 20: JavaServer Faces and Struts Shale . . . . . . . . . . . . . . . . . . . 477

■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479

www.it-ebooks.info

About the Author

■ARNOLD DORAY is the lead software architect of Thinksquared, an IT
consultancy based in Singapore. He has been developing software
professionally for nearly a decade, and has conducted developer
training courses in the UK and Singapore. This book has its roots in
a Struts course he teaches. Besides coding, Arnold loves physics,
long-distance cycling, and trekking in the jungles of Malaysia.

xix

www.it-ebooks.info

About the Technical Reviewer

■KUNAL MITTAL is a consultant specializing in Java technology, the J2EE
platform, web services, and SOA technologies. He has coauthored
and contributed to several books on these topics. Kunal is a director
in the information technology group within the Domes