15.7 Content Handlers
The URLConnection
class is intimately tied to Java's protocol and
content handler mechanism. The protocol handler is responsible for
making connections, exchanging headers, requesting particular
documents, and so forth. It handles all the overhead of the protocol
for requesting files. The content handler deals only with the actual
data. It takes the raw input after all headers and so forth are
stripped and converts it to the right kind of object for Java to deal
with; for instance, an InputStream or an
ImageProducer.
15.7.1 Getting Content
The getContent( ) methods of
URLConnection use a content handler to turn the
raw data of a connection into a Java object.
15.7.1.1 public Object getContent( ) throws IOException
This method is virtually identical to the getContent() method of the URL class. In fact, that
method just calls this method. getContent( )
downloads the object selected by the URL of this
URLConnection. For getContent() to work, the virtual machine needs to recognize and
understand the content type. The exact content types supported vary
from one VM and version to the next. Sun's JDK 1.5
supports text/plain, image/gif,
image/jpeg, image/png,
audio/aiff, audio/basic,
audio/wav, and a few others. Different VMs and
applications may support additional types. For instance, HotJava 3.0
includes a PDF content handler. Furthermore, you can install
additional content handlers that understand other content types.getContent( ) works only for protocols like HTTP,
which has a clear understanding of MIME content types. If the content
type is unknown or the protocol doesn't understand
content types, getContent( ) throws an
UnknownServiceException.
15.7.1.2 public Object getContent(Class[] classes) throws IOException // Java 1.3
This overloaded variant of the getContent( )
method lets you choose what class you'd like the
content returned as in order to provide different object
representations of data. The method attempts to return the content in
the form of one of the classes in the classes
array. The order of preference is the order of the array. For
instance, if you'd prefer an HTML file to be
returned as a String but your second choice is a
Reader and your third choice is an
InputStream, you would write:
URL u = new URL("http://www.thehungersite.com/");
URLConnection uc = u.openConnection( )
Class[] types = {String.class, Reader.class, InputStream.class};
Object o = uc.getContent(types);Then test for the type of the returned object usinginstanceof. For example:
if (o instanceof String) {
System.out.println(o);
}
else if (o instanceof Reader) {
int c;
Reader r = (Reader) o;
while ((c = r.read( )) != -1) System.out.print((char) c);
}
else if (o instanceof InputStream) {
int c;
InputStream in = (InputStream) o;
while ((c = in.read( )) != -1) System.out.write(c);
}
else if (o == null) {
System.out.println("None of the requested types were available.");
}
else {
System.out.println("Error: unexpected type " + o.getClass( ));
}That last else clause shouldn'tbe reached. If none of the requested types are available, this method
is supposed to return null rather than returning
an unexpected type.
15.7.2 ContentHandlerFactory
The URLConnection
class contains a static Hashtable of
ContentHandler objects. Whenever the
getContent( ) method of
URLConnection is invoked, Java looks in this
Hashtable to find the right content handler for
the current URL, as indicated by the URL's
Content-type. If it doesn't find a
ContentHandler object for the MIME type, it tries
to create one using a ContentHandlerFactory (which
you'll learn more about in Chapter 17). That is, a content handler factory tells
the program where it can find a content handler for a
text/html file, an image/gif
file, or some other kind of file. You can set the
ContentHandlerFactory by passing an instance of
the java.net.ContentHandlerFactory interface to
the setContentHandlerFactory( ) method:
public static void setContentHandlerFactory(ContentHandlerFactory factory)You may set the ContentHandlerFactory only once
throws SecurityException, Error
per application; this method throws a generic
Error if it is called a second time. As with most
other setFactory( ) methods, untrusted applets
will generally not be allowed to set the content handler factory
whether one has already been set or not. Attempting to do so throws a
SecurityException.
• Table of Contents• Index• Reviews• Reader Reviews• Errata• AcademicJava Network Programming, 3rd EditionBy
Elliotte Rusty Harold Publisher: O'ReillyPub Date: October 2004ISBN: 0-596-00721-3Pages: 706
Thoroughly revised to cover all the 100+ significant updates
to Java Developers Kit (JDK) 1.5, Java Network
Programming is a complete introduction to
developing network programs (both applets and applications)
using Java, covering everything from networking fundamentals
to remote method invocation (RMI). It includes chapters on
TCP and UDP sockets, multicasting protocol and content
handlers, servlets, and the new I/O API. This is the
essential resource for any serious Java developer.