Foundation Flex for Developers Data-Driven Applications with PHP, ASP.NET, ColdFusion, and LCDS Sas Jacobs with Koen De Weggheleire Foundation Flex for Developers Data-Driven Applications with PHP, ASP.NET, ColdFusion, and LCDS Copyright © 2008 by Sas Jacobs with Koen De Weggheleire 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-894-8 ISBN-10 (pbk): 1-59059-894-6 ISBN-13 (electronic): 978-1-4302-0443-5 ISBN-10 (electronic): 1-4302-0443-5 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. 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 [email protected], or visit www.springeronline.com. For information on translations, please contact Apress directly at 2855 Telegraph Avenue, Suite 600, Berkeley, CA 94705. Phone 510-549-5930, fax 510-549-5939, e-mail [email protected], or visit 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. Java™ and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc., in the US and other countries. Apress, Inc., is not affiliated with Sun Microsystems, Inc., and this book was written without endorsement from Sun Microsystems, Inc. The source code for this book is freely available to readers at www.friendsofed.com in the Downloads section. Credits Lead Editors Production Editor Chris Mills, Matthew Moodie Elizabeth Berry Technical Reviewer Compositor Charles Brown Diana Van Winkle Editorial Board Proofreaders Steve Anglin, Ewan Buckingham, Tony Campbell, Patrick Vincent, April Eddy Gary Cornell, Jonathan Gennick, Jason Gilmore, Kevin Goff, Jonathan Hassell, Matthew Moodie, Indexer Joseph Ottinger, Jeffrey Pepper, Ben Renow-Clarke, Odessa&Cie Dominic Shakeshaft, Matt Wade, Tom Welsh Artist Project Manager Diana Van Winkle Beth Christmas Cover Image Designer Copy Editor Corné van Dooren Nancy Sixsmith Interior and Cover Designer Associate Production Director Kurt Krames Kari Brooks-Copony Manufacturing Director Tom Debolski For my partner David, who has supported and loved me while writing this book. And for our son, whose birth interrupted the writing process. I love you both. Sas Jacobs CONTENTS AT A GLANCE About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix About the Technical Reviewer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi About the Cover Image Designer . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii Acknowledgments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii PART 1 FLEX APPLICATION BASICS Chapter 1 Introduction to Flex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Chapter 2 Working with ActionScript 3.0 in Flex 3 . . . . . . . . . . . . . 17 Chapter 3 Creating Custom Components . . . . . . . . . . . . . . . . . . . . . 47 Chapter 4 Interacting with Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Chapter 5 Interacting with the Web Browser . . . . . . . . . . . . . . . . . 119 Chapter 6 Working with Data in Flex Applications . . . . . . . . . . . . . 147 Chapter 7 Introduction to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Chapter 8 Using XML in Flex Builder . . . . . . . . . . . . . . . . . . . . . . . . 227 Chapter 9 Flex Data-Driven Controls . . . . . . . . . . . . . . . . . . . . . . . 267 Chapter 10 Debugging Flex Applications . . . . . . . . . . . . . . . . . . . . 311 PART 2 DATA-DRIVEN APPLICATIONS Chapter 11 XML Case Study . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Chapter 12 ColdFusion Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 Chapter 13 ASP.NET Case Study . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 Chapter 14 PHP Case Study . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 PART 3 LIVECYCLE DATA SERVICES Chapter 15 Introduction to LiveCycle Data Services . . . . . . . . . . . 469 Chapter 16 LiveCycle Data Services Case Study . . . . . . . . . . . . . . . 511 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 v CONTENTS About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix About the Technical Reviewer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi About the Cover Image Designer . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii Acknowledgments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii PART 1 FLEX APPLICATION BASICS Chapter 1 Introduction to Flex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Understanding web applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Understanding the role of Flex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Understanding the role of MXML and ActionScript 3.0 . . . . . . . . . . . . . . . . . . . . . . 6 Understanding MXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Understanding ActionScript 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Understanding the major changes in ActionScript 3.0 . . . . . . . . . . . . . . . . . . . . . 9 Working with applications in Flex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Working with data in Flex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Flex tools for working with data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 The application development process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Useful resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Chapter 2 Working with ActionScript 3.0 in Flex 3 . . . . . . . . . . . . . . 17 Working with ActionScript 3.0 in Flex applications . . . . . . . . . . . . . . . . . . . . . . . . 18 Using inline ActionScript statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Using the <mx:Script> element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Using the source attribute in <mx:Script> . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Using include inside an <mx:Script> element . . . . . . . . . . . . . . . . . . . . . . . . . 27 Creating custom class files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Understanding packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Understanding custom classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Working through an example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 vii CONTENTS Creating ActionScript projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Working with a minimal Flex interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Additional points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Understanding ActionScript 3.0 events . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Creating bindable properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 What happened to trace? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 ActionScript 3.0 best practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Declaring data types appropriately . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Importing classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Creating appropriate packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Chapter 3 Creating Custom Components. . . . . . . . . . . . . . . . . . . . . . 47 Creating components using MXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Example: Creating a country ComboBox component . . . . . . . . . . . . . . . . . . . . . 49 Passing a value to the component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Binding a property in the component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Dispatching events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Creating a custom event class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Creating a composite component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Creating components using ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Working through examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Passing values to ActionScript components . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Dispatching custom events in ActionScript components . . . . . . . . . . . . . . . . . . . 66 Deciding on MXML or ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Creating simple components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Creating composite components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Creating nonvisual components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Modifying component behavior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Creating a new component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Using the code-behind approach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Sharing components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Distributing SWC files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Using SWC files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Distributing Runtime Shared Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Chapter 4 Interacting with Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Working with the Alert control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Adding a message and title . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Adding buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Setting the parent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Adding a closeHandler method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Setting the iconClass argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Setting the defaultButtonFlag argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 A simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Changing the appearance of the alert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Changing the size of the alert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 viii CONTENTS Changing the button labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Changing the button size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 A simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Working with pop-ups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 A simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Passing values from the pop-up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Passing values to the pop-up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Responding to pop-up events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Working with forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Understanding the Form container . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Working with a data model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Using the <mx:Model> tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Determining required values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Validating user input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Working with the CreditCardValidator . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 Working with the CurrencyValidator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 Working with the DateValidator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 Working with the EmailValidator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Working with the NumberValidator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Working with the PhoneNumberValidator . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Working with the RegExpValidator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Working with the SocialSecurityValidator . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Working with the StringValidator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Working with the ZipCodeValidator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Adding validation to a form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Validating with validator events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Validating with ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Formatting user input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Using the CurrencyFormatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Using the DateFormatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Using the NumberFormatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Using the PhoneFormatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Using the ZipCodeFormatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Applying the formatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Adding formatters to a form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Chapter 5 Interacting with the Web Browser . . . . . . . . . . . . . . . . . 119 Loading a web page from Flex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Sending variables when calling a web page . . . . . . . . . . . . . . . . . . . . . . . . . 121 Calling JavaScript with navigateToURL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Working through a simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Sending variables into a SWF file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Using querystring parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 Modifying the Flex wrapper files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 Accessing querystring variables in Flex . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Working through an example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Using flashVars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 ix CONTENTS Understanding the External API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Scripting the ExternalInterface class . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Calling a JavaScript function using ActionScript . . . . . . . . . . . . . . . . . . . . . . . 131 Calling an ActionScript function with JavaScript . . . . . . . . . . . . . . . . . . . . . . . 135 Working through a two-way communication example . . . . . . . . . . . . . . . . . . . 139 Limitations of the External API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Understanding Flash Player security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Chapter 6 Working with Data in Flex Applications . . . . . . . . . . . . . 147 Sources of external data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Working with the HTTPService class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Creating an HTTPService request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Making the request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Receiving a response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Specifying a return type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Accessing loaded content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Sending variables with the request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Specifying a request method and format . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Properties of the HTTPService class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Methods of the HTTPService class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Events of the HTTPService class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Understanding the URLLoader class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Creating a URLLoader request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Making the request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Receiving a response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Specifying a return type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Sending variables with the request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Specifying a request method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Properties of the URLLoader class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Methods of the URLLoader class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Events of the URLLoader class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Comparing the HTTPService and URLLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Loading information from text files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Using the <mx:HTTPService> tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Using the HTTPService class with ActionScript . . . . . . . . . . . . . . . . . . . . . . . . 159 Using the URLLoader class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Loading information stored in variable pairs . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Using variable pairs with the HTTPService class . . . . . . . . . . . . . . . . . . . . . . . 161 Using variable pairs with the URLLoader class . . . . . . . . . . . . . . . . . . . . . . . . 162 Using the <mx:HTTPService> tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 Using the HTTPService class with ActionScript . . . . . . . . . . . . . . . . . . . . . . . . 164 Using the URLLoader class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Sending data to the server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 Sending variables with the HTTPService class . . . . . . . . . . . . . . . . . . . . . . . . 166 Sending variables with the URLLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 Other considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Working through an example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Updating content with the HTTPService class . . . . . . . . . . . . . . . . . . . . . . . . 167 x CONTENTS Updating content with the URLLoader class . . . . . . . . . . . . . . . . . . . . . . . . . 172 Understanding Flash Player 9 security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Understanding security sandboxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Creating a cross-domain policy file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Proxying data locally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Separating data from presentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 Working with the <mx:Model> tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Using ActionScript to work with complex data structures . . . . . . . . . . . . . . . . . 179 Understanding data binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 Binding with curly braces syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 Including a calculation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 Concatenating values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 Adding conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 Using an ActionScript function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 Binding with the <mx:Binding> tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 Including a calculation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Concatenating values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Adding conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Using an ActionScript function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Working through an example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Binding with ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Using bindProperty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Using bindSetter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Working through a scripted binding example . . . . . . . . . . . . . . . . . . . . . . . . 198 Adding validators and formatters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Understanding validators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Creating a custom validator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Understanding formatters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 Creating a custom formatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 Chapter 7 Introduction to XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Understanding XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 What is an XML document? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 Understanding the XML framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 A brief history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 Understanding why you should use XML . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 Simplicity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 Flexibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 Readability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Accessibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Platform and vendor independence . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Using XML information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Understanding the structure of an XML document . . . . . . . . . . . . . . . . . . . . . . . 214 The document prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 The XML declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Processing instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 Document Type Definitions (DTDs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 xi CONTENTS The document tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 The document root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 Entities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 CDATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 White space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 A simple MXML document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Understanding the term “well-formed” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Element structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Elements must be closed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 Elements must nest correctly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 Use quotes for attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 Chapter 8 Using XML in Flex Builder . . . . . . . . . . . . . . . . . . . . . . . . 227 Working with XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 Understanding E4X expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 Understanding the XML and XMLList classes . . . . . . . . . . . . . . . . . . . . . . . . . 231 Properties of the XML class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 Methods of the XML class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Manipulating XML content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 Changing node and attribute values . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 Adding new nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Copying nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Deleting nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Working with the <mx:XML> tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 Loading an external XML document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 Using the <mx:HTTPService> tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 Using the HTTPService class with ActionScript . . . . . . . . . . . . . . . . . . . . . . . . 242 Using the URLLoader class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Problem solving . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 Binding XML content with E4X expressions . . . . . . . . . . . . . . . . . . . . . . . . . 244 Working through an example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Consuming web services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 Working with the WebService class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 Properties of the WebService class . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 Methods of the WebService class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Creating the web service request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Specifying the operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Making the request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 Receiving a response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Accessing the web service response . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Understanding data types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Consuming a web service with the <mx:WebService> tag . . . . . . . . . . . . . . . . . 259 Consuming a web service with ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . 263 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 xii