Title: JSP Tag Libraries
ISBN: 193011009X
US Price: $35.96
Publication Date: May 2001
Pages: 656
© 2001 Manning Publications Co.

Reviews : Java Books :
JSP Tag Libraries : Chapter 10: Iterating with Tags

10.3 IterateTag

The previous section presented a generic iteration tag infrastructure that we will now use to develop a new iteration tag (named IterateTag) which will be able to iterate over the following types of objects:

  • Arrays of all types
  • Enumerations— objects of type java.util.Enumeration
  • Iterators— objects of type java.util.Iterator.

We're going to put this functionality into a single tag so its users will be able to use one tag for all their iteration chores. They will be able to reference the object they want to iterate in the same way as in chapter 8, using Java reflection. In fact, we'll reuse the reflection code we saw in chapter 8's ReflectionTag to accomplish this. In doing so, our tag will be able to take any bean property value and iterate its objects. For example, we will be able to take a shopping cart with a method such as:

public Enumeration getProducts(); 

and iterate on the Enumeration value returned from it.

10.3.1 Design considerations for IterateTag

Given that we have the generic iteration infrastructure, and that we have a previously built basic reflection tag, implementing our tag should be a breeze (almost codeless, you might expect). But this is not quite the case because a Java class can-not inherit two superclasses (no multiple inheritance, if you recall). Also, our ReflectionTag did not implement BodyTag; instead, it implemented the Tag interface, so it cannot serve as a base class for an iteration-related tag. As a result, our iteration tag will have to reimplement the reflection code that we previously developed. There are ways to share the implementation code between the tags, but for simplicity's sake, we will merely copy and paste the needed code.

10.3.2 Wrapping iterators

We will use the ReflectionTag code from chapter 8 to procure the referenced object from within the iteration tag, but we still need to decide what to do with it; meaning, how are we going to wrap it within an IterationSupport? We choose to create an IterationSupport implementation for each of the different iterator types (Iterator, Enumeration, and Array), then wrap the object within the matching IterationSupport implementation. An IterationSupport wrapper for the Iterator interface was covered in the previous section, so let's now look at the individual wrappers for Array and Enumeration.

ArrayIterationSupport

The first IterationSupport wrapper class we implement will be for Arrays. Implementing IterationSupport is not usually too much of a challenge, yet this case is different due to the requirement to be iteratable on any type of Array (i. e., an Array of Strings, an Array of Dates, etc.). Normally, when the array element type is known, indexing the array elements is a snap, but how do you do that when the element type is unknown?

The answer, as you might have guessed, is reflection. The reflection package contains an Array class with static methods for manipulating array elements and querying the array's length. We make use of this reflection class in our implementation of ArrayIterationSupport, as seen in listing 10.7.

Listing 10. 7 Source code for the ArrayIterationSupport utility class

package book.iteration; 

import java.lang.reflect.Array; 
import javax.servlet.jsp.JspException; 

class ArrayIterationSupport implements IterationSupport { 
	protected Object a = null; 
	protected int pos = 0; 

	ArrayIterationSupport(Object a) 
	{ 
		this. a = a; 
		this. pos = 0; 
	} 
	public boolean hasNext() 
		throws JspException 
	{ 
	return (pos < Array.getLength(a));  
	} 
	
	public Object getNext() 
		throws JspException 
	{ 
		if( hasNext()) { 
		Object rc = null; 
		rc = Array.get(a, pos);  
		pos++; 
		return rc; 
		} 
	
		// Throw an exception 
	} 
} 

Using Array's static method to find the length of the input array.

Using Array's static method to get an indexed value.

The functionality rendered by the Array class is enough for us to be able to have full access to all the array's attributes and elements.

How to Add Java Applets to Your Site

New on the Java Boutique:

New Review:

Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling API boasts simplicity, ease-of-integration, a well-rounded feature set, and it's free!

New Applet:

Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA sequences into three useful formats.

Elsewhere on internet.com:

WebDeveloper Java
Lots of Java information on webdeveloper.com

WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.

ScriptSearch Java
Hundreds of free Java code files to download.

jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.