Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Beginning Apache Struts - From Novice To Professional (2006)

.pdf
Скачиваний:
56
Добавлен:
17.08.2013
Размер:
11.68 Mб
Скачать

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