- •preface
- •acknowledgments
- •about this book
- •Who should read this book?
- •Roadmap
- •Code conventions
- •Code downloads
- •Author Online
- •About the title
- •About the cover illustration
- •Rethinking the web application
- •A new design for the Web
- •1.1 Why Ajax rich clients?
- •1.1.1 Comparing the user experiences
- •1.1.2 Network latency
- •1.1.3 Asynchronous interactions
- •1.1.4 Sovereign and transient usage patterns
- •1.1.5 Unlearning the Web
- •1.2 The four defining principles of Ajax
- •1.2.1 The browser hosts an application, not content
- •1.2.2 The server delivers data, not content
- •1.2.3 User interaction with the application can be fluid and continuous
- •1.2.4 This is real coding and requires discipline
- •1.3 Ajax rich clients in the real world
- •1.3.1 Surveying the field
- •1.3.2 Google Maps
- •1.4 Alternatives to Ajax
- •1.4.2 Java Web Start and related technologies
- •1.5 Summary
- •1.6 Resources
- •First steps with Ajax
- •2.1 The key elements of Ajax
- •2.2 Orchestrating the user experience with JavaScript
- •2.3 Defining look and feel using CSS
- •2.3.1 CSS selectors
- •2.3.2 CSS style properties
- •2.3.3 A simple CSS example
- •2.4 Organizing the view using the DOM
- •2.4.1 Working with the DOM using JavaScript
- •2.4.2 Finding a DOM node
- •2.4.3 Creating a DOM node
- •2.4.4 Adding styles to your document
- •2.4.5 A shortcut: Using the innerHTML property
- •2.5 Loading data asynchronously using XML technologies
- •2.5.1 IFrames
- •2.5.2 XmlDocument and XMLHttpRequest objects
- •2.5.3 Sending a request to the server
- •2.5.4 Using callback functions to monitor the request
- •2.5.5 The full lifecycle
- •2.6 What sets Ajax apart
- •2.7 Summary
- •2.8 Resources
- •Introducing order to Ajax
- •3.1 Order out of chaos
- •3.1.1 Patterns: creating a common vocabulary
- •3.1.2 Refactoring and Ajax
- •3.1.3 Keeping a sense of proportion
- •3.1.4 Refactoring in action
- •3.2 Some small refactoring case studies
- •3.2.2 Managing event handlers: Observer pattern
- •3.2.3 Reusing user action handlers: Command pattern
- •3.2.4 Keeping only one reference to a resource: Singleton pattern
- •3.3 Model-View-Controller
- •3.4 Web server MVC
- •3.4.1 The Ajax web server tier without patterns
- •3.4.2 Refactoring the domain model
- •3.4.3 Separating content from presentation
- •3.5 Third-party libraries and frameworks
- •3.5.2 Widgets and widget suites
- •3.5.3 Application frameworks
- •3.6 Summary
- •3.7 Resources
- •Core techniques
- •The page as an application
- •4.1 A different kind of MVC
- •4.1.1 Repeating the pattern at different scales
- •4.1.2 Applying MVC in the browser
- •4.2 The View in an Ajax application
- •4.2.1 Keeping the logic out of the View
- •4.2.2 Keeping the View out of the logic
- •4.3 The Controller in an Ajax application
- •4.3.1 Classic JavaScript event handlers
- •4.3.2 The W3C event model
- •4.3.3 Implementing a flexible event model in JavaScript
- •4.4 Models in an Ajax application
- •4.4.1 Using JavaScript to model the business domain
- •4.4.2 Interacting with the server
- •4.5 Generating the View from the Model
- •4.5.1 Reflecting on a JavaScript object
- •4.5.2 Dealing with arrays and objects
- •4.5.3 Adding a Controller
- •4.6 Summary
- •4.7 Resources
- •The role of the server
- •5.1 Working with the server side
- •5.2 Coding the server side
- •5.2.1 Popular implementation languages
- •5.3 The big picture: common server-side designs
- •5.3.1 Naive web server coding without a framework
- •5.3.2 Working with Model2 workflow frameworks
- •5.4 The details: exchanging data
- •5.4.2 Introducing the planet browser example
- •5.5 Writing to the server
- •5.5.1 Using HTML forms
- •5.5.2 Using the XMLHttpRequest object
- •5.5.3 Managing user updates effectively
- •5.6 Summary
- •5.7 Resources
- •Professional Ajax
- •The user experience
- •6.1 Getting it right: building a quality application
- •6.1.1 Responsiveness
- •6.1.2 Robustness
- •6.1.3 Consistency
- •6.1.4 Simplicity
- •6.1.5 Making it work
- •6.2 Keeping the user informed
- •6.2.1 Handling responses to our own requests
- •6.2.2 Handling updates from other users
- •6.3 Designing a notification system for Ajax
- •6.3.1 Modeling notifications
- •6.3.2 Defining user interface requirements
- •6.4 Implementing a notification framework
- •6.4.1 Rendering status bar icons
- •6.4.2 Rendering detailed notifications
- •6.4.3 Putting the pieces together
- •6.5 Using the framework with network requests
- •6.6 Indicating freshness of data
- •6.6.1 Defining a simple highlighting style
- •6.6.2 Highlighting with the Scriptaculous Effects library
- •6.7 Summary
- •6.8 Resources
- •Security and Ajax
- •7.1 JavaScript and browser security
- •7.1.1 Introducing the “server of origin” policy
- •7.1.2 Considerations for Ajax
- •7.1.3 Problems with subdomains
- •7.2 Communicating with remote services
- •7.2.1 Proxying remote services
- •7.2.2 Working with web services
- •7.3 Protecting confidential data
- •7.3.1 The man in the middle
- •7.3.2 Using secure HTTP
- •7.3.3 Encrypting data over plain HTTP using JavaScript
- •7.4 Policing access to Ajax data streams
- •7.4.1 Designing a secure web tier
- •7.4.2 Restricting access to web data
- •7.5 Summary
- •7.6 Resources
- •Performance
- •8.1 What is performance?
- •8.2 JavaScript execution speed
- •8.2.1 Timing your application the hard way
- •8.2.2 Using the Venkman profiler
- •8.2.3 Optimizing execution speed for Ajax
- •8.3 JavaScript memory footprint
- •8.3.1 Avoiding memory leaks
- •8.3.2 Special considerations for Ajax
- •8.4 Designing for performance
- •8.4.1 Measuring memory footprint
- •8.4.2 A simple example
- •8.5 Summary
- •8.6 Resources
- •Ajax by example
- •Dynamic double combo
- •9.1 A double-combo script
- •9.2 The client-side architecture
- •9.2.1 Designing the form
- •9.2.2 Designing the client/server interactions
- •9.3 Implementing the server: VB .NET
- •9.3.1 Defining the XML response format
- •9.4 Presenting the results
- •9.4.1 Navigating the XML document
- •9.4.2 Applying Cascading Style Sheets
- •9.5 Advanced issues
- •9.5.2 Moving from a double combo to a triple combo
- •9.6 Refactoring
- •9.6.1 New and improved net.ContentLoader
- •9.7 Summary
- •Type-ahead suggest
- •10.1 Examining type-ahead applications
- •10.1.2 Google Suggest
- •10.2.1 The server and the database
- •10.3 The client-side framework
- •10.3.1 The HTML
- •10.3.2 The JavaScript
- •10.3.3 Accessing the server
- •10.5 Refactoring
- •10.5.1 Day 1: developing the TextSuggest component game plan
- •10.5.3 Day 3: Ajax enabled
- •10.5.4 Day 4: handling events
- •10.5.6 Refactor debriefing
- •10.6 Summary
- •11.1 The evolving portal
- •11.1.1 The classic portal
- •11.1.2 The rich user interface portal
- •11.2 The Ajax portal architecture using Java
- •11.3 The Ajax login
- •11.3.1 The user table
- •11.4 Implementing DHTML windows
- •11.4.1 The portal windows database
- •11.4.3 Adding the JS external library
- •11.5 Adding Ajax autosave functionality
- •11.5.1 Adapting the library
- •11.5.2 Autosaving the information to the database
- •11.6 Refactoring
- •11.6.1 Defining the constructor
- •11.6.2 Adapting the AjaxWindows.js library
- •11.6.3 Specifying the portal commands
- •11.6.4 Performing the Ajax processing
- •11.6.5 Refactoring debrief
- •11.7 Summary
- •Live search using XSLT
- •12.1 Understanding the search techniques
- •12.1.1 Looking at the classic search
- •12.1.3 Examining a live search with Ajax and XSLT
- •12.1.4 Sending the results back to the client
- •12.2 The client-side code
- •12.2.1 Setting up the client
- •12.2.2 Initiating the process
- •12.3 The server-side code: PHP
- •12.3.1 Building the XML document
- •12.3.2 Building the XSLT document
- •12.4 Combining the XSLT and XML documents
- •12.4.1 Working with Microsoft Internet Explorer
- •12.4.2 Working with Mozilla
- •12.5 Completing the search
- •12.5.1 Applying a Cascading Style Sheet
- •12.5.2 Improving the search
- •12.5.3 Deciding to use XSLT
- •12.5.4 Overcoming the Ajax bookmark pitfall
- •12.6 Refactoring
- •12.6.1 An XSLTHelper
- •12.6.2 A live search component
- •12.6.3 Refactoring debriefing
- •12.7 Summary
- •Building stand-alone applications with Ajax
- •13.1 Reading information from the outside world
- •13.1.1 Discovering XML feeds
- •13.1.2 Examining the RSS structure
- •13.2 Creating the rich user interface
- •13.2.1 The process
- •13.2.3 Compliant CSS formatting
- •13.3 Loading the RSS feeds
- •13.3.1 Global scope
- •13.3.2 Ajax preloading functionality
- •13.4 Adding a rich transition effect
- •13.4.2 Implementing the fading transition
- •13.4.3 Integrating JavaScript timers
- •13.5 Additional functionality
- •13.5.1 Inserting additional feeds
- •13.5.2 Integrating the skipping and pausing functionality
- •13.6 Avoiding the project’s restrictions
- •13.6.1 Overcoming Mozilla’s security restriction
- •13.6.2 Changing the application scope
- •13.7 Refactoring
- •13.7.1 RSS reader Model
- •13.7.2 RSS reader view
- •13.7.3 RSS reader Controller
- •13.7.4 Refactoring debrief
- •13.8 Summary
- •The Ajax craftsperson’s toolkit
- •A.1 Working smarter with the right toolset
- •A.1.1 Acquiring tools that fit
- •A.1.2 Building your own tools
- •A.1.3 Maintaining your toolkit
- •A.2 Editors and IDEs
- •A.2.1 What to look for in a code editor
- •A.2.2 Current offerings
- •A.3 Debuggers
- •A.3.1 Why we use a debugger
- •A.3.2 JavaScript debuggers
- •A.3.3 HTTP debuggers
- •A.3.4 Building your own cross-browser output console
- •A.4 DOM inspectors
- •A.4.1 Using the Mozilla DOM Inspector
- •A.4.2 DOM inspectors for Internet Explorer
- •A.4.3 The Safari DOM Inspector for Mac OS X
- •A.5 Installing Firefox extensions
- •A.6 Resources
- •JavaScript for object-oriented programmers
- •B.1 JavaScript is not Java
- •B.2 Objects in JavaScript
- •B.2.1 Building ad hoc objects
- •B.2.2 Constructor functions, classes, and prototypes
- •B.2.3 Extending built-in classes
- •B.2.4 Inheritance of prototypes
- •B.2.5 Reflecting on JavaScript objects
- •B.2.6 Interfaces and duck typing
- •B.3 Methods and functions
- •B.3.1 Functions as first-class citizens
- •B.3.2 Attaching functions to objects
- •B.3.3 Borrowing functions from other objects
- •B.3.4 Ajax event handling and function contexts
- •B.3.5 Closures in JavaScript
- •B.4 Conclusions
- •B.5 Resources
- •Ajax frameworks and libraries
- •Accesskey Underlining Library
- •ActiveWidgets
- •Ajax JavaServer Faces Framework
- •Ajax JSP Tag Library
- •Ajax.NET
- •AjaxAC
- •AjaxAspects
- •AjaxCaller
- •AjaxFaces
- •BackBase
- •Behaviour
- •Bindows
- •BlueShoes
- •CakePHP
- •CL-Ajax
- •ComfortASP.NET
- •Coolest DHTML Calendar
- •Dojo
- •DWR (Direct Web Remoting)
- •Echo 2
- •FCKEditor
- •Flash JavaScript Integration Kit
- •Google AjaxSLT
- •Guise
- •HTMLHttpRequest
- •Interactive Website Framework
- •Jackbe
- •JPSpan
- •jsolait
- •JSON
- •JSRS (JavaScript Remote Scripting)
- •LibXMLHttpRequest
- •Mochikit
- •netWindows
- •Oddpost
- •OpenRico
- •Pragmatic Objects
- •Prototype
- •Qooxdoo
- •RSLite
- •Ruby on Rails
- •Sack
- •SAJAX
- •Sarissa
- •Scriptaculous
- •SWATO…
- •Tibet
- •TinyMCE
- •TrimPath Templates
- •Walter Zorn’s DHTML Libraries
- •WebORB for .NET
- •WebORB for Java
- •XAJAX
- •x-Desktop
- •XHConn
- •index
- •Symbols
- •Numerics
504CHAPTER 13
Building stand-alone applications with Ajax
In the last four chapters, we’ve developed a range of neat Ajax applications and shown the client-side and server-side code for each. In this chapter, we don’t need to present you with any server-side code, because we’re not going to write any. This may come as a surprise to most people, but we can run Ajax applications directly against any web server-based stream of data, including those that are generated by third-party applications. We can develop a rich user interface for a web page that acts like a client application.
Many websites offer XML feeds in the formats of Really Simple Syndication (RSS), Resource Descriptor Framework (RDF), or Atom, which are the three most common syndication feeds that we see. The information contained in these syndication feeds can be daily news articles, comics, weblogs (blogs), jokes, weather, and so on. With Ajax we have the ability to get the syndication information without having to visit these websites or buy a client application that will read the XML syndication feeds on our computers.
In this chapter, we develop our own client application, an XML reader that obtains feeds from various websites. It can be run in the browser on any computer that has an active Internet connection.
13.1 Reading information from the outside world
An XML syndication feed consists of articles that are freely available for the public to read and display on other websites. A blog is good example of a syndicated XML feed for our purposes because it is so widely available. These XML feeds are different from plain old articles on a website since they can be shared and displayed in multiple formats. It is like finding a newspaper or magazine that fits perfectly on your table as you eat your morning breakfast. You can eat and read at the same time without having to shift everything around and spilling your coffee. The syndicated feeds can be formatted in any style that fits your needs, allowing you to obtain just the information you want.
We can view the contents of an XML syndication feed in several ways. For instance, for a single blog, we could go to the website where the XML feed is located. To view several feeds at once, we could go to sites such as JavaCrawl.com, which allow us to view multiple XML feeds without going to multiple sites. We can also view the RSS feed in its raw unedited form by directly opening up the path of the XML file directly in our web browser, or we can use downloadable software to organize and format the feeds we want to see.
A new option is to use Ajax to view the syndication feeds. Without Ajax, we were stuck with downloading a client application or having to visit a website to
Reading information from the outside world |
505 |
|
|
grab this information, but with Ajax we do not have to download anything or visit a website. Instead we are able to develop a JavaScript-based RSS reader that can be run directly on our desktop with just a browser. In this chapter, we build an application that obtains multiple RSS feeds from multiple sources and allows us to view them in an orderly fashion. We also integrate transition effects to add to the flashiness of the user interface. But before we develop this application with Ajax, we need to understand the format of an XML feed and where we can find XML feeds.
13.1.1Discovering XML feeds
One of the most popular places to find an XML feed is on a blog. Many people today publish blogs, for all kinds of reasons. They can contain information such as a personal diary, personal musings, news articles, jokes, or technology discussions. Let’s look at one example of a blog by Eric Pascerello, in figure 13.1.
Eric’s blog is accessible, which means that it can be linked to by anyone. While many people simply read it on the JavaRanch site, it can also be accessed as a syndication feed. We can read this feed by accessing it directly in its native XML form, or we can go to other websites (such as JavaLobby) that obtain the syndication feed and display it in their format.
Figure 13.1 Eric Pascarello’s blog, which has an accessible RSS feed
506CHAPTER 13
Building stand-alone applications with Ajax
In figure 13.1, we see in the upper-right corner of the screen that there are links to RSS, RDF, and Atom. As we mentioned earlier, these are the most common XML syndication feeds that we can find.
Each of the syndication feeds has a different XML specification. That means if we were to look at the different XML files, we would see different naming schemes for the elements. Each feed has a specification clarifying what information must be defined in the feed. Since we are dealing with different formats, the easiest way to address it is to pick a single format and design the reader around it.
One of the most popular syndication feeds is Really Simple Syndication, better known as the RSS feed.
13.1.2Examining the RSS structure
Before we create our Ajax XML reader, let’s examine the structure of the RSS file. Knowing the structure allows us to navigate the XML DOM more efficiently to obtain the information that we want to display. The RSS document has two parts: the channel and the items. The channel gives us the information about where the RSS feed is from, and the items are the articles that we can read.
The channel elements
The channel can be considered to be the header information of the RSS feed. The channel elements tell the user where the RSS feed is coming from, what the title of the document is, when it was last updated, and so on. Only a few items are required by the RSS specification, as shown in table 13.1.
Table 13.1 Channel required elements
Element |
Description |
Example |
|
|
|
description |
Phrase describing the channel. |
Weird thoughts from Eric’s Head |
|
|
|
link |
The URL to the HTML website referring to |
http://radio.javaranch.com/pascarello |
|
the channel. |
|
|
|
|
title |
The name of the channel and how people |
Eric’s blog on JavaRanch.com |
|
refer to the service. The name should be |
|
|
related to the name of the website. |
|
|
|
|
The three required elements in table 13.1 give us the basic information about the RSS feed. The RSS feed’s required elements tell us where the RSS channel is from, what the title of the channel is, and what the channel is about. If we want to obtain other information about the RSS feed, we need to check for optional elements.
Reading information from the outside world |
507 |
|
|
The RSS feed can contain any number of the optional channel elements. The RSS feed developer can select none, one, or all 16. The optional elements (table 13.2) give us more options to learn about the feed.
Table 13.2 Optional channel elements
Element |
Description |
Example |
|
|
|
category |
Specifies which categories the chan- |
Programming |
|
nel belongs to. |
|
|
|
|
cloud |
Allows processes to register with a |
|
|
cloud so they can be notified of |
|
|
updates to the channel, implementing a |
|
|
lightweight publish-subscribe protocol. |
|
|
|
|
copyright |
The copyright notice for the content in |
Eric Pascarello |
|
the channel. |
|
|
|
|
docs |
A URL that points to the documenta- |
http://backend.userland.com/rss |
|
tion for an RSS feed. |
|
|
|
|
generator |
A string that indicates what program |
Pebble |
|
was used to generate the protocol. |
|
|
|
|
image |
Specifies an image that can be dis- |
http://pebble.soundforge.net/common/ |
|
played along with the feed. |
images/powered-by-pebble.gif |
|
|
|
language |
The language the channel is written in. |
En |
|
|
|
lastBuildDate |
The last time the content was changed. |
|
|
|
|
managing editor |
Email address for person who is |
pascarello@javaranch.com |
|
responsible for the editorial content. |
|
|
|
|
pubDate |
The publication date for the content. |
|
|
|
|
rating |
The PICS rating for the channel. See |
|
|
http://www.w3.org/PICS/. |
|
|
|
|
skipDays |
Informs aggregators what days they |
|
|
can skip checking for updates. |
|
|
|
|
skipHours |
Informs aggregators what hours they |
|
|
can skip checking for updates. |
|
|
|
|
textInput |
Specifies a text input box that can be |
|
|
displayed. |
|
|
|
|
continued on next page
508CHAPTER 13
Building stand-alone applications with Ajax
Table 13.2 Optional channel elements (continued)
Element |
Description |
Example |
|
|
|
ttl |
Indicates the Time to Live (TTL), or |
|
|
number of minutes the channel can be |
|
|
cached before it is updated. |
|
|
|
|
webmaster |
Email address for the person who is |
webmaster@javaranch.com |
|
responsible for technical issues. |
|
|
|
|
Some of the element options include email addresses in case we have problems with the feed’s content or layout. There is also information that explains when the syndication feed is updated.
The channel’s required and optional elements describe the content of the RSS feed so that we can determine the characteristics of the feed. Just like the channel, the item elements have optional elements as well.
The item elements
The RSS feed can contain multiple item elements, similar to the way a newspaper consists of multiple articles. Each item element is required to have at least one of the following two elements: the title or the description. Only one is needed, according to the RSS specifications, but both are allowed in an item element.
There are also eight other optional elements that can be added to the item. Returning to the newspaper analogy, an article normally contains the story, the author, the source, and a title. In the same way, each item element in an RSS feed can have separate titles, authors, sources, and so on. All of the optional elements that are available for the item element are shown in table 13.3.
Table 13.3 Item elements
Element |
Description |
Example |
|
|
|
author |
The item author’s |
Pascarello@javaranch.com |
|
email address |
|
|
|
|
category |
Includes the item in |
Programming |
|
one or more catego- |
|
|
ries |
|
|
|
|
comments |
The URL of the page |
http://radio.javaranch.com/pascarello/2005/05/25/ |
|
for comments that |
1117043999998.html#comments |
|
relates to this item |
|
|
|
|
|
|
continued on next page |