| Foreword | p. xiii |
| About the Author | p. xv |
| About the Technical Reviewer | p. xvii |
| About the Illustrator | p. xix |
| Acknowledgments | p. xxi |
| Introduction | p. xxiii |
| Setting the Table | |
| An Introduction to Ajax, RPC, and Modern RIAs | p. 3 |
| A Brief History of Web Development: The "Classic" Model | p. 3 |
| Dawn of a Whole New World: The PC Era | p. 5 |
| Yet Another Revolution: Enter the Web | p. 7 |
| What's So Wrong with the Classic Web? | p. 11 |
| Enter Ajax | p. 14 |
| Why Is Ajax a Paradigm Shift? On the Road to RIAs | p. 18 |
| The Flip Side of the Coin | p. 23 |
| Let's Get to the Good Stuff: Our First Ajax Code, the Manual Way | p. 25 |
| A Quick Postmortem | p. 29 |
| Hey, I Thought This Was Ajax?!? | p. 30 |
| Cutting IN the Middle Man: Ajax Libraries to Ease Our Pain | p. 33 |
| Alternatives to Ajax | p. 36 |
| Hmm, Are We Forgetting Something? What Could It Be? Oh Yeah, DWR! | p. 39 |
| Summary | p. 40 |
| Getting to Know DWR | p. 43 |
| First Things First: Why DWR at All? | p. 43 |
| DWR: RPC on Steroids for the Web | p. 45 |
| DWR Architectural Overview | p. 47 |
| Getting Ready for the Fun: Your DWR Development Environment | p. 49 |
| A Simple Webapp to Get Us Started | p. 52 |
| Getting the Lay of the Land: Directory Structure | p. 52 |
| From Code to Executable: Ant Build Script | p. 53 |
| Application Configuration: web.xml | p. 54 |
| The Markup: index.jsp | p. 55 |
| On the Server Side: MathServlet.java | p. 56 |
| The Workhorse: MathDelegate.java | p. 58 |
| It's Alive: Seeing It in Action | p. 60 |
| Adding DWR to the Mix | p. 61 |
| The DWR Test/Debug Page | p. 65 |
| Configuring DWR Part 1: web.xml | p. 67 |
| Configuring DWR Part 2: dwr.xml | p. 70 |
| Built-in Creators and Converters | p. 75 |
| The [left angle bracket]init[right angle bracket] Section | p. 76 |
| The [left angle bracket]allow[right angle bracket] Section | p. 76 |
| The [left angle bracket]signatures[right angle bracket] Section | p. 79 |
| Interacting with DWR on the Client | p. 81 |
| Basic Call Syntax | p. 81 |
| Call Metadata Object Approach | p. 82 |
| A Word on Some Funky Syntax | p. 83 |
| Setting Beans on a Remote Object | p. 83 |
| Extended Data Passing to Callbacks | p. 87 |
| Interacting with DWR on the Server | p. 88 |
| DWR Configuration and Other Concepts: The engine.js File | p. 90 |
| Call Batching | p. 92 |
| A Quick Look at util.js, the DWR Utility Package | p. 92 |
| Summary | p. 94 |
| Advanced DWR | p. 95 |
| Locking the Doors: Security in DWR | p. 95 |
| Deny by Default | p. 96 |
| J2EE Security and DWR | p. 98 |
| When Perfection Is Elusive: Error Handling in DWR Applications | p. 101 |
| Handling Warnings | p. 102 |
| Handling Errors | p. 102 |
| Handling Exceptions | p. 102 |
| Edge Cases: Improper Responses | p. 102 |
| The Mechanics of Handling Exceptional Situations | p. 105 |
| Another Word on Exceptions | p. 106 |
| Help from Elsewhere: Accessing Other URLs | p. 107 |
| Turning the Tables: Reverse Ajax | p. 109 |
| Polling | p. 111 |
| Comet | p. 112 |
| Piggybacking | p. 114 |
| The Code of Reverse Ajax | p. 115 |
| Don't Go It Alone: Integration with Frameworks and Libraries | p. 117 |
| Spring | p. 118 |
| JSF | p. 119 |
| WebWork/Struts 2 | p. 119 |
| Struts "Classic" | p. 120 |
| Beehive | p. 121 |
| Hibernate | p. 122 |
| Something Old, Something New: Annotations | p. 122 |
| Summary | p. 125 |
| The Projects | |
| InstaMail: An Ajax-Based Webmail Client | p. 129 |
| Application Requirements and Goals | p. 129 |
| Dissecting InstaMail | p. 130 |
| Configuration Files | p. 132 |
| The Client-Side Code | p. 134 |
| The Server-Side Code | p. 163 |
| Suggested Exercises | p. 187 |
| Summary | p. 188 |
| Share Your Knowledge: DWiki, the DWR-Based Wiki | p. 189 |
| Application Requirements and Goals | p. 189 |
| FreeMarker | p. 191 |
| Apache Derby | p. 194 |
| Spring JDBC | p. 195 |
| Dissecting DWiki | p. 197 |
| Configuration Files | p. 199 |
| The Client-Side Code | p. 205 |
| The Server-Side Code | p. 230 |
| Suggested Exercises | p. 257 |
| Summary | p. 258 |
| Remotely Managing Your Files: DWR File Manager | p. 259 |
| Application Requirements and Goals | p. 259 |
| dhtmlx UI Components | p. 261 |
| Jakarta Commons IO | p. 268 |
| Jakarta Commons FileUpload | p. 269 |
| Dissecting Fileman | p. 270 |
| Configuration Files | p. 273 |
| The Client-Side Code | p. 278 |
| The Server-Side Code | p. 314 |
| Suggested Exercises | p. 326 |
| Summary | p. 326 |
| Enter the Enterprise: A DWR-Based Report Portal | p. 329 |
| Application Requirements and Goals | p. 329 |
| Spring Dependency Injection (IoC) | p. 331 |
| DataVision | p. 333 |
| Quartz | p. 336 |
| script.aculo.us | p. 337 |
| A Sample Database to Report Against | p. 340 |
| Dissecting RePortal | p. 341 |
| Configuration Files | p. 346 |
| The RePortal Database | p. 351 |
| The Client-Side Code | p. 352 |
| The Server-Side Code | p. 385 |
| Suggested Exercises | p. 416 |
| Summary | p. 417 |
| DWR for Fun and Profit (a DWR Game!) | p. 419 |
| Application Requirements and Goals | p. 419 |
| DWR Annotations | p. 420 |
| Reverse Ajax in Action | p. 421 |
| Anything Else, or Can We Get Goin' Already?!? | p. 422 |
| Dissecting InMemoria | p. 423 |
| Configuration Files | p. 424 |
| The Client-Side Code | p. 426 |
| The Server-Side Code | p. 441 |
| Suggested Exercises | p. 456 |
| Summary | p. 456 |
| Timekeeper: DWR Even Makes Project Management Fun! | p. 457 |
| Application Requirements and Goals | p. 457 |
| HSQLDB | p. 458 |
| Hibernate | p. 459 |
| Ext JS | p. 461 |
| Dissecting Timekeeper | p. 463 |
| Configuration Files | p. 465 |
| The Client-Side Code | p. 471 |
| The Server-Side Code | p. 507 |
| Suggested Exercises | p. 520 |
| Summary | p. 521 |
| Index | p. 523 |
| Table of Contents provided by Ingram. All Rights Reserved. |