Appendix 1:
Other Features of Java
THIS TEXTBOOK does not claim to cover all the features of the Java programming language, or even to give comprehensive coverage to the features that it does cover. The primary purpose of the book is to explain programming, not Java. Nevertheless, it can serve as a good starting point for learning Java. This appendix briefly surveys some of the features of Java that were not covered in the book. It will acquaint you with some of the terms you might hear when people discuss Java, and it will point you towards some of the things you might want to learn more about as you continue your study of Java programming.
JAR Files and Resources
Each programming example in this book uses just a few class files, at most. A large Java project might use hundreds. People might hesitate to welcome a program that comes in hundreds of small files onto their hard drives. Fortunately, Java makes it possible to combine a collection of files into a single Java archive file, or "JAR" file. If all the class files needed to run a Java program are placed into a JAR file, then only that one file will be needed. Many Java programming environments can be configured to make JAR files when they compile a program. The command-line programming environment, in which the "javac" command is used for compilation, also has a "jar" command for making JAR files. For example, the following command makes a JAR file named "myprog.jar" and copies all the class files in the current directory into that JAR file:
jar cfv myprog.jar *.classThe "cfv" means "Create a jar archive as a File and be Verbose about telling me what you are doing." The "*.class" matches all files that end with ".class". The contents of a JAR file are compressed, by default, so the JAR file actually takes up less space than the files it contains.
A JAR file can be used for an applet. It just has to be specified in the <applet> tag:
<applet archive="myprog.jar" code="MyApplet.class" width=200 height=100> </applet>A JAR file can be used for a stand-alone application by specifying it as part of the "classpath":
java -classpath myprog.jar MyApplicationIn addition to class files, a JAR file can contain images, sounds, and other resource files needed by a program. It's fairly easy to load such resources into a program. An image resource, for example can be loaded in almost the same way as an independent image file, using the getImage() method of an applet or a Toolkit. The location of the resource just has to be specified differently. For example, if an applet class named MyApplet is loaded from a JAR file, and that file contains an image file named "icon.gif", then the following command will load the image:
Image icon = getImage( MyApplet.class.getResource("icon.gif") );The getResource() method is used to locate a resource. It returns a URL that specifies the location of the resource. (The getResource() method in this example is an instance method in an object, MyApplet.class, that represents the class to which the applet belongs. Objects that represent classes are another feature of Java that I haven't mentioned before. The idea is that the system will look for the image file in the same places it looked for the class and will find it in the same JAR file.)
Graphics2D
All drawing in Java is done through an object of type Graphics. The Graphics class provides basic commands for drawing shapes and text and for selecting a drawing color. These commands are adequate in many cases, but they fall far short of what's needed in a serious computer graphics program. Java has another class, Graphics2D, that provides a larger and more serious set of drawing operations. Graphics2D is a sub-class of Graphics, so all the old routines from the Graphics class are also available in a Graphics2D.
The paintComponent() method of a JComponent gives you a graphics context of type Graphics that you can use for drawing on the component. In fact, the graphics context actually belongs to the sub-class Graphics2D (in Java version 1.2 and later), and can be type-cast to gain access to the advanced Graphics2D drawing methods:
public void paintComponent(Graphics g) { Graphics2D g2; g2 = (Graphics2D)g; . . // Draw on the component using g2. . }Drawing in Graphics2D is based on shapes, which are objects that implement an interface named Shape. Shape classes include Line2D, Rectangle2D, Ellipse2D, Arc2D, and CubicCurve2D, among others. CubicCurve2D can be used to draw Bezier Curves, which are used in many graphics programs. Graphics2D has commands draw(Shape) and fill(Shape) for drawing the outline of a shape and for filling its interior. Advanced capabilities include: lines that are more than one pixel thick, dotted and dashed lines, filling a shape with a texture (this is, with a repeated image), filling a shape with a gradient, and drawing translucent objects that will blend with their background.
In the Graphics class, coordinates are specified as integers and are based on pixels. The shapes that are used with Graphics2D use real numbers for coordinates, and they are not necessarily bound to pixels. In fact, you can change the coordinate system and use any coordinates that are convenient to your application. In computer graphics terms, you can apply a "transformation" to the coordinate system. The transformation can be any combination of translation, scaling, and rotation.
Javadoc
A program that is well-documented is much more valuable than the same program without the documentation. Java comes with a tool called javadoc that can make it easier to produce the documentation is a readable and organized format. Javadoc is especially useful for documenting classes and packages of classes that are meant to be used by other programmers. A programmer who wants to use pre-written classes shouldn't need to search through the source code to find out how to use them. If the documentation in the source code is in the correct format, javadoc can separate out the documentation and make it into a set of web pages. The web pages are automatically formatted and linked into an easily browseable Web site. Sun Microsystem's on-line documentation for the standard Java API was produced using javadoc.
Javadoc is actually very easy to use. In a source code file, javadoc documentation looks like a regular multi-line comment, except that it begins with "/**" instead of with "/*". Each such comment is associated with some class, member variable, or method. The documentation for each item must be placed in a comment that precedes the item. (This is how javadoc knows which item the comment is for.) The comments can include certain special notations. For example, the notation "@return" is used to begin the description of the return value of a function. And "@param <parameter-name>" marks the beginning of the description of a parameter of a method. For example, here is a short utility method with a javadoc comment:
/** * Return the real number represented by the string s, * or return Double.NaN if s does not represent a legal * real number. * * @param s String to interpret as real number. * @return the real number represented by s. */ public static double stringToReal(String s) { try { return Double.parseDouble(s); } catch (NumberFormatException e) { return Double.NaN; } }Sun's Java Software Development Kit includes javadoc as a program that can be used on the command line. This program takes one or more Java source code files, extracts the javadoc comments from them, and prepares Web pages containing the documentation. Integrated development environments for Java typically include a menu command for generating javadoc documentation.
Internationalization
If the World-Wide Web -- and information technology in general -- is to be a truly global phenomenon, it shouldn't be tied to one country's language or customs. An internationalized computer program or applet is one that can adapt itself to the locale where it is being run. A locale in Java is specified as a language together with a country. These, in turn, are designated by standard two-letter codes, such as "en" for English, "es" for Spanish, "US" for the United States, "ES" for Spain, and "MX" for Mexico. The locale determines not only the language that is used but also details such as the output format of dates and numbers. A Java virtual machine has a default locale built into it. If it's running in the United States, the default locale is probably en_US. In Mexico, it would be es_MX.
The classes java.text.DateFormat and java.text.NumberFormat make it possible to display dates and numbers in a form that is appropriate for the default locale (or some other locale if you want). For example, the commands
DateFormat df = DateFormat.getDateTimeInstance(); String now = df.format( new Date() ); System.out.println(now);print the current date and time (as returned by "new Date()"), formatted according the conventions of the default locale. The output will look different in different countries.
Any text that is displayed to the user by a program -- labels on buttons, commands in menus, messages in dialog boxes, and so on -- should be in the language that is appropriate for the locale where the program is being run. Java makes it possible to put all the strings used by a program into a resource bundle and to use a different resource bundle for each locale. The actual strings do not appear in the program itself. They are in separate files. One file might contain the strings in English; another file, the same strings translated into Spanish; and a third file, the same strings in Japanese. The program can then be run in English, Spanish, and Japanese locales, and it will use a different language in each local. To make the program run correctly in a French locale, it's only necessary to create a new resource bundle, with the strings translated into French. It's not necessary to modify the program in any way. The class java.util.ResourceBundle represents a set of strings to be used by a program, and makes it possible to load the set of strings that is most appropriate for the default locale. When the program wants to display a string, it gets the string from the resource bundle. The string will be in the appropriate language for the default locale, assuming that a resource bundle for that language is available.
Pluggable Look-And-Feel
Macintosh programs don't look quite the same or work quite the same as Windows programs. Linux and UNIX have several different GUI styles, but none of them look or work exactly like Macintosh or Windows. Java programs are supposed to work on any computing platform. Ideally, they should have the right look-and-feel for the platform where they are running. In Swing, this is made possible by pluggable look-and-feel, or PLAF. The look-and-feel of a Swing interface can be managed using the class javax.swing.UIManager, which contains static methods for setting the default look-and-feel of newly created JComponents and for determining what look-and-feels are installed on the computer where the program is running. To change the look-and-feel of a JComponent that already exists, you can call its updateUI() method (after calling UIManager.setLookAndFeel()). To change the look-and-feel of a component and all the components that it contains, you can use SwingUtilities.updateComponentTreeUI(comp), where comp is the component.
Java has a cross-platform look-and-feel called "Metal" that will look about the same on all platforms. Other look-and-feels might be available, depending on the platform and the Java virtual machine that is being used. On MacOS X, for example, the default look-and-feel for Java is similar to the Mac's "Aqua" interface.
PLAF is supported by the basic architecture of Swing components. Swing uses a Model-View-Controller architecture in which the model (that is, the data) for a component is separate from the view (that is, the on-screen visual representation of the data). The data for a JButton is stored in an object of type ButtonModel. The data for a JTextComponent is stored in an object of type Document. When the look-and-feel is changed, the model is not affected, but the view can change. Most of the time, you don't need to be aware of the distinction between components and their models, but in some cases you need access to the model. For example, if you want to install a listener to respond to each change that is made to the contents of a JTextComponent, you have to register a DocumentListener with the text component's model: textinput.getDocument().addDocumentListener(listener).
JavaBeans
A JavaBean is a component that can be combined with other components to make a complete program. JavaBeans can be assembled into a program using a visual development environment, which allows a programmer to add beans to a program, configure them, and set up interactions between them by dragging icons, using menus, clicking buttons, and so on. Sophisticated programs can be assembled with little or no programming. If you use an integrated development environment for Java programming, there's a good chance that it has some support for visual programming.
JavaBeans are objects, not classes. Many JavaBeans are GUI components, but this is not a requirement and a JavaBean might have no visual representation at all. Objects belonging to Java's standard GUI component classes are JavaBeans and can be used in visual development environments.
JavaBeans can be defined by any class that follows a few rules. The class should have a default constructor (one with no parameters). This allows a visual development environment to create a new bean in a default state without providing any information to the constructor. To be useful, a bean should have one or more properties, which are just values associated with the bean. Beans are configured by setting the values of their properties. A visual development environment recognizes a property by the fact that there are "get" and "set" methods for the bean. For example, if a bean has methods:
String getTitle(); void setTitle(String title);then the bean has a property named "Title" of type String. You don't have to do anything else to define a property; just provide the "get" and "set" methods. Beans can, optionally, use PropertyChangeEvents to communicate. When a property of a bean is changed, it can emit an event. Other beans can register to listen for these events, so that they can respond when the property changes. Of course, beans might also generate other types of events, such as ActionEvents. A visual development environment should make it possible to route these events to other beans or possibly to write some code to respond to the events.
JavaBeans exist to enable the production of reusable objects and to promote the development of an "object economy" in which such objects are widely distributed and readily available.
Distributed Computing
Java is a language that was designed from the beginning to work in a networked computing environment. Applets can be downloaded over a network, and basic network communication is supported by the java.net package. But this is just the beginning. Java has built-in support for distributed computing. In distributed computing, a program uses more than one computer. Different parts of the program run on different computers and communicate over a network. The program has access to much larger computing resources than are available on any one computer.
In Java, this is made possible by allowing a method that is running on one computer to call a method in an object that is on another computer. The parameters for the method are transmitted across the network, and the return value is sent back after the method has completed.
Java has support for two types of distributed object computing. RMI (Remote Method Invocation) is used for communication between two Java objects running on different computers. Java also supports CORBA (Common Object Request Broker Architecture), a standard that allows communication between objects written in different programming languages.
Servlets and JSP
Java is most visible on the client side of the Web, in the form of applets running in Web browsers. However, Java is also very useful on the server side. A servlet is a Java program that is meant to be executed by a Web server. This is similar to the way that applets are executed by a Web browser. If a Web server is capable of executing servlets, then its capabilities can be extended indefinitely by writing new servlets for it. Java is certainly not the only programming language used in this way, but it is an attractive choice because of its security, network-awareness, and large collection of APIs.
Servlets are often used to generate Web pages. Many Web pages are static -- they are simple, unchanging HTML files. When a server receives a request for such a page from a Web browser, all it has to do is send the HTML file to the browser. However, there are also dynamic Web pages. A dynamic web page is generated on demand each time the page is requested. The content of the page can be different each time it is requested. This can happen, for example, because the content depends on data that was typed into a Web form by the user or on information from a database. To serve up a dynamic page, the server has to run a program. Servlets can be used in this way. The servlet decides what should be on the page and creates the HTML code for displaying that content. The server then sends this HTML code to the Web browser that requested the page.
The task of writing dynamic Web pages can be simplified by using Java Server Pages (JSP) instead of servlets. A Java server page is an HTML file with some Java code embedded in it. When a Web server receives a request for the page, the Java code is executed to generate the dynamic part of the page. JSP is used on many Web sites. You can recognize a JSP page because the file name for the page will end with ".jsp".
Servlets and JSP are not part of the standard edition of Java, J2SE, but they are included in the enterprise edition, J2EE.
More Features
Java has APIs (Application Programming Interfaces) for many more features, and the list seems to be growing all the time. It's unlikely that any one person can master them all. What can be mastered are the principles and techniques on which they are all built. After that, it's just a matter of poking around in the documentation.... Here are a few more of the things you might run into:
- Multimedia. The packages java.awt.image and javax.swing.sound contain classes for manipulating images and sounds.
- Drag-and-Drop. Drag-and-drop refers to dragging an item that is to be processed and dropping it onto the item that you want to process it. An example is dragging a file and dropping it into the trash. Drag-and-Drop support in Java is provided in the package java.awt.dnd.
- Accessibility. Not everyone can see a computer screen, hear sounds, use a mouse, and type on a keyboard. A typical user interface is not accessible to these people. Java has an infrastructure that can be used to make programs accessible. It is defined in the package javax.accessibility.
- Security. The package java.security can be used for secure, encrypted network communication.
- Database. JDBC (Java DataBase Connectivity) refers to set of classes that is used to connect to databases and retrieve information from them. The basic classes are defined in the package java.sql (but to use them, you also need a "driver" for the specific type of database that you want to connect to).
- XML. XML is a data representation format that is similar to HTML. Like HTML, it can be used to describe documents. But it is also used to represent arbitrary structured data. With the release of Java Version 1.4, XML is a standard part of Java. Currently, XML is probably generating more excitement and hype than any other single computing technology.