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