Beginning Apache Struts - From Novice To Professional (2006)
.pdfx |
■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 <c:out> Tag. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
The <c:forEach> Tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
The <c:if> and <c:choose>...<c:when> 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
■C O N T E N T S xi
■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
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
■C O N T E N T S |
xiii |
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
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 <set-property> . . . . . . . . . . . . . . . . . . . . . . . 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
■C O N T E N T S |
xv |
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 <forward>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 <managed-bean> 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
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
■C O N T E N T S |
xvii |
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
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
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