The preceding discussion provides a brief introduction to servlets and JSP pages, but says nothing about how you actually use a server to run them. This section describes how to install Tomcat, a JSP-aware web server. Tomcat is part of the Jakarta Project, which like Apache is a development effort of the Apache Software Foundation.
As described earlier, servlets execute inside a container, which is an engine that communicates with or plugs into a web server to handle requests for pages that are produced by executing servlets. Some servlet containers can operate in standalone fashion, such that they function both as container and web server. That is how Tomcat works, so by installing it, you get a fully functioning server with servlet-processing capabilities. In fact, Tomcat is a reference implementation for both the servlet and JSP specifications, so it also acts as a JSP engine, providing JSP-to-servlet translation services. The servlet container part is named Catalina, and the JSP processor is named Jasper.
It's possible to use the container part of Tomcat in conjunction with other web servers. For example, you can set up a cooperative arrangement between Apache and Tomcat under which Apache acts as a frontend that passes servlet and JSP requests through to Tomcat and handles other requests itself. You can find information about setting up Apache and Tomcat to work together this way on the Jakarta project web site.
To run a Tomcat server, you need three things:
This is required because Tomcat needs to compile Java servlets as part of its operation. You most likely already have an SDK installed if you've been compiling Java programs while reading earlier chapters. If you don't have an SDK, see Recipe 2.2 for information on obtaining and installing one.
Tomcat is available from the Jakarta Project site, http://jakarta.apache.org. A fair amount of Tomcat documentation is available there, too. In particular, if you're a newcomer to Tomcat, I recommend that you read the Introduction and the Application Developer's Guide.
Tomcat configuration files are written as XML documents, and many scripting elements within JSP pages follow XML syntax rules. If you're new to XML, the "XML and XHTML in a Nutshell" sidebar in Recipe 16.1 describes some of its characteristics in comparison to HTML.
B.2.1 Installing a Tomcat Distribution
Currently, Tomcat is available in 3.x and 4.x versions. This section describes Tomcat 4.x, which is what I recommend you install. If you use 3.x, be prepared for some differences. For example, the directory structures used by 3.x and 4.x servers are not quite the same.
To install Tomcat, get a binary distribution from jakarta.apache.org. (I assume you don't intend to build it from source, which is more difficult.) Tomcat distributions are available in several file formats, distinguished by filename extension:
.tar.gz
Indicates a compressed tar file, usually used for Unix installs.
.zip
Indicates a ZIP archive, applicable to either Unix or Windows.
.rpm (RedHat Package Manager)
These files can be used on Linux systems.
.exe
Signifies an executable installer, used on Windows only.
For a distribution packaged as a tar or ZIP file, you should place it in the directory under which you want to install Tomcat, then run the installation command in that directory to unpack the distribution there. RPM files contain internal installation location information, so you can run the installation command from anywhere. The Windows .exe installer prompts you to indicate where to install Tomcat, so it too can be run from any directory. The following commands are representative of those needed to install each distribution type. (Change the version numbers in the filenames to reflect the actual Tomcat distribution that you're using.)
To install Tomcat from a compressed tar file, unpack it like this:
% tar zxf jakarta-tomcat-4.0.4.tar.gz
If you're unpacking a Tomcat tar file distribution under Mac OS X, use gnutar rather than tar. Both programs are available, but tar has some problems with long filenames that gnutar does not. It may also be necessary to use a GNU-compatible version of tar under Solaris.
If your version of tar doesn't understand the z option, do this instead:
% gunzip jakarta-tomcat-4.0.4.tar.gz | tar xf -
If you use a ZIP archive, you can unpack it with the jar utility or any other program that understands ZIP format (such as the Windows WinZip application). For example, to use jar, do this:
% jar xf jakarta-tomcat-4.0.4.zip
Linux users have the option of installing from RPM files. Two RPMs must be installed. The first contains the server software, the second contains several applications. (The other distribution formats consist of a single archive file that includes the applications.) Typically you must run the RPM installation commands as root:
# rpm --install tomcat4-4.0.4-full.2jpp.noarch.rpm # rpm --install tomcat4-webapps-4.0.4-full.2jpp.noarch.rpm
Depending on the version of Tomcat, you may also need to install other prerequisite distributions, such as the regex, servletapi, and xerces RPM files. If these are necessary, rpm will tell you when you install the Tomcat RPMs.
After installing the RPM files, edit /etc/tomcat4/conf/tomcat4.conf to set the value of JAVA_HOME to the pathname of the directory in which your Java SDK is installed.
The Windows .exe distribution is directly executable. Launch it, then indicate where you want to place Tomcat when the installer prompts for a location. If you use this installer, be sure that you already have a Java SDK installed first; the installer puts some files into the SDK hierarchy, an operation that fails if the SDK isn't present. For versions of Windows that have service management (such as Windows NT, 2000, or XP), the .exe installer gives you the option of installing Tomcat as a service so that it starts automatically at system boot time.
Most of the installation methods create a directory and unpack Tomcat under it. The top-level directory of the resulting hierarchy is the Tomcat root directory. I'll assume here that the Tomcat root is /usr/local/jakarta-tomcat under Unix and D:jakarta-tomcat under Windows. (The actual directory name likely will have a version number at the end.) The Tomcat root contains various text files containing information that is useful in the event that you have general or platform-specific problems. It also contains a number of directories. If you want to explore these now, see Recipe B.2.3. Otherwise, proceed to the next section, Recipe B.2.2, to find out how to run Tomcat.
Note that if you installed Tomcat from RPM files, you may find that the distribution is somewhat spread out, rather than installed with everything under a single directory. For example, you might find most of the components under /var/tomcat4 and the documents under /usr/doc/tomcat4. To determine where the contents of a given RPM file were installed, use the following command:
% rpm -qpl rpmfile
(That's the lowercase letter "l," not the number "1.")
B.2.2 Starting and Stopping Tomcat
Tomcat can be controlled manually, and also set to run automatically when your system starts up. It's good to become familiar with the Tomcat startup and shutdown commands that apply to your platform, because you'll probably find yourself needing to stop and restart Tomcat fairly oftenat least while you're setting it up initially. For example, if you modify Tomcat's configuration files or install a new application, you must restart Tomcat to get it to notice the changes.
Before running Tomcat, you'll need to set a couple of environment variables. Make sure JAVA_HOME is set to the pathname of your SDK so that Tomcat can find it, and set CATALINA_HOME to the pathname of the Tomcat root directory. (Tomcat 3.x uses TOMCAT_HOME rather than CATALINA_HOME, and you may also need to set CLASSPATH.)
To start and stop Tomcat manually under Unix, change location into the bin directory under the Tomcat root. You can control Tomcat with the following two shell scripts:
% ./startup.sh % ./shutdown.sh
To run Tomcat automatically at system boot time, look for a startup script such as /etc/rc.local or /etc/rc.d/rc.local (the pathname depends on your operating system) and add a few lines to it:
export JAVA_HOME=/usr/local/java/jdk export CATALINA_HOME=/usr/local/jakarta-tomcat $CATALINA_HOME/bin/startup.sh &
These commands will run Tomcat as root, however. To run it under a different user account, change the last command to invoke Tomcat with su instead and specify the username:
su -c $CATALINA_HOME/bin/startup.sh user_name &
If you use su to specify a username, make sure that Tomcat's directory tree is accessible to that user or you will have file permission problems when Tomcat tries to access files. One way to do this is to run the following command as root in the Tomcat root directory:
# chown -R user_name .
Linux users who install Tomcat from RPM files will find that the installation creates a script tomcat4 in the /etc/rc.d/init.d directory that can be used manually or for automatic startup. To use the script manually, change location into that directory and use these commands:
% ./tomcat4 start % ./tomcat4 stop
For automatic startup, you must activate the script by running the following command as root:
# chkconfig --add tomcat4
The Linux RPM installation also creates a user account with a login name of tomcat4 that is intended to be used for running Tomcat.
For Windows users, a pair of batch files is provided in the bin directory for controlling Tomcat manually:
C:> startup.bat C:> shutdown.bat
If you elected to install Tomcat as a service for versions of Windows that have service management, such as Windows NT, 2000, or XP, you should control Tomcat using the services console. You can use this to start or stop Tomcat, or to set Tomcat to run automatically when Windows starts. (The service name is Apache Tomcat.)
To try out Tomcat, start it up using whatever instructions are applicable to your platform. Then request the default page using your browser. The URL will look something like this:
http://tomcat.snake.net:8080/
Adjust your hostname and port number appropriately. For example, Tomcat normally runs on port 8080 by default, but if you install from RPM files under Linux, Tomcat may use a port number of 8180. If your browser receives the page correctly, you should see the Tomcat logo and links to examples and documentation. It's useful at this point to follow the examples link and try out a few of the JSP pages there, to see if they compile and execute properly.
If you find that, despite setting the JAVA_HOME variable, Tomcat can't find your Java compiler, try setting your PATH environment variable to explicitly include the directory containing the compiler. Normally this is the bin directory under your SDK installation. You probably already have PATH set to something already. If so, you'll want to add the bin directory to the current PATH setting:
export PATH=${PATH}:/usr/local/java/jdk/bin (sh, bash, etc.) setenv PATH ${PATH}:/usr/local/java/jdk/bin (csh, tcsh, etc.) set PATH=%PATH%;D:jdkin (Windows)
B.2.3 Tomcat's Directory Structure
For writing JSP pages, it's not strictly necessary to be familiar with the hierarchy of Tomcat's directory layout. But it certainly doesn't hurt, so change location into the Tomcat root directory and have a look around. You'll find a number of standard directories, which are described below, grouped by function. Note that your installation layout may not be exactly as described here, particularly if you're using Tomcat 3.x rather than 4.x. Even for Tomcat 4.x, some distribution formats omit a few of the directories, and the logs and work directories may not be created until you've started Tomcat for the first time.
B.2.3.1 Application directories
From the point of view of an application developer, the webapps directory is the most important part of Tomcat's directory hierarchy. Each application context has its own directory, which is placed within the webapps directory under the Tomcat root.
Tomcat processes client requests by mapping them onto locations under the webapps directory. For a request that begins with the name of a directory located under webapps, Tomcat looks for the appropriate page within that directory. For example, the following two requests would be served using the index.html and test.jsp pages in the mcb directory:
http://tomcat.snake.net:8080/mcb/index.html
http://tomcat.snake.net:8080/mcb/test.jsp
Requests that don't begin with the name of a webapps subdirectory are served out of a special subdirectory named ROOT, which provides the default application context.[B] For the following request, Tomcat would serve the index.html page from the ROOT directory:
[B] The webapps/ROOT directory is distinct from the Tomcat root directory, which is the top-level directory of the Tomcat tree.
http://tomcat.snake.net:8080/index.html
Applications typically are packaged as web archive (WAR) files and Tomcat by default looks for WAR files that need to be unpacked when it starts up. Thus, to install an application, you generally copy its WAR file to the webapps directory, restart Tomcat, and let Tomcat unpack it. The layout of individual application directories is described in Recipe B.3.
The Java Servlet Specification defines a web application as follows: "A web application is a collection of servlets, html pages, classes, and other resources that make up a complete application on a web server." Essentially what this means for Tomcat is that an application is everything under a subdirectory of the webapps directory. Because contexts are kept separate by servlet containers like Tomcat, one practical implication of this structure is that scripts in one application directory can't mess with anything in another application directory.
B.2.3.2 Configuration and control directories
Two directories contain configuration and control files. The bin directory contains control scripts for Tomcat startup and shutdown, and conf contains Tomcat's configuration files, which are written as XML documents. Tomcat reads its configuration files only at startup time. If you modify any of them, you must restart Tomcat for your changes to take effect.
The most important configuration file is server.xml, which controls Tomcat's overall behavior. Another file, web.xml, provides application configuration defaults. This file is used in conjunction with any web.xml file an application may have of its own. The tomcat-users.xml file defines credentials for users that have access to protected server functions, such as the Manager application that allows you to control applications from your browser. (See Recipe B.2.4.) This file can be superceded by other user information storage mechanisms. For example, you can store Tomcat user records in MySQL instead. For instructions, look in the tomcat directory of the recipes distribution.
B.2.3.3 Class directories
Several Tomcat directories are used for class files and libraries. They differ in function according to whether you want to make classes visible to applications, to Tomcat, or to both:
classes
These class files are visible to applications but not to Tomcat.
common
This directory has two subdirectories, classes and lib, for class files and libraries that should be visible both to applications and to Tomcat.
lib
These class libraries are visible to applications but not to Tomcat.
server
This directory has two subdirectories, classes and lib, for class files and libraries that are visible to Tomcat but not to applications.
Tomcat 3.x uses a different class loading algorithm than Tomcat 4.x, and has a different class directory structure. In particular, Tomcat 3.x has no common directory.
B.2.3.4 Operational directories
If they weren't set up as part of the Tomcat installation process, Tomcat creates two additional directories that serve operational purposes when you start it for the first time. Tomcat writes log files to the log directory and uses a work directory for temporary files.
The files in the logs directory can be useful for diagnosing problems. For example, if Tomcat doesn't seem to start up properly, the reason usually will have been written into one of the log files.
When Tomcat translates a JSP page into a servlet and compiles it into an executable class file, it stores the resulting .java and .class files under the work directory. (When you first begin working with JSP pages, you may find it instructive to have a look under the work directory to compare your original JSP pages with the corresponding servlets that Tomcat produces.)
B.2.4 Restarting Applications Without Restarting Tomcat
If you modify a JSP page, Tomcat recompiles it automatically when the page is next requested. But if the page uses a JAR or class file under the application's WEB-INF directory and you update one of them, Tomcat normally won't notice the change until you restart it.
One way to avoid restarts for an application is to provide a element for the application in Tomcat's server.xml file that specifies a reloadable attribute of true. That will cause Tomcat to look for changes not only in JSP pages that are requested directly, but also for changes in classes and libraries under the WEB-INF directory that the pages use. For example, to write such a element for an application named mcb, you could add a line like this to Tomcat's server.xml file:
The element attributes tell Tomcat four things:
path
Indicates the URL that maps to pages from the application context. The value is the part of the URL that follows the hostname and port number.
docBase
Indicates where the application context directory is located, relative to the webapps directory in the Tomcat tree.
debug
Sets the context debugging level. A value of zero disables debug output; higher numbers generate more output.
reloadable
Specifies Tomcat recompilation behavior when a client requests a JSP page located in the application context. By default, Tomcat recompiles a page only after noticing a modification to the page itself. Setting reloadable to true tells Tomcat to also check any classes or libraries stored under the application's WEB-INF directory that the page uses.
After modifying server.xml to add the element, restart Tomcat to make the change take effect.
Having Tomcat check for class and library changes can be extremely useful during application development to avoid repeated restarts. However, as you might expect, automatic class checking adds a lot of processing overhead and incurs a significant performance penalty. It's better used on development systems than on production systems.
Another way to get Tomcat to recognize application changes without restarting the entire server is to use the Manager application. This allows you to reload applications on request from a browser, without the overhead caused by enabling the reloadable attribute. The Manager application is invoked using the path /manager at the end of the URL by which you access your Tomcat server. The URL will also include the command you wish to execute. For example, the following request shows which contexts are running:
http://tomcat.snake.net:8080/manager/list
To shut down and reload the mcb application without restarting Tomcat, use a URL like this:
http://tomcat.snake.net:8080/manager/reload?path=/mcb
For more information on using the Manager application and what its allowable commands are, see the Manager App HOW-TO:
http://jakarta.apache.org/tomcat/tomcat-4.0-doc/manager-howto.html
This document may also be available locally by following the documentation link on your Tomcat server's home page. Note particularly the part that describes how to set up a Tomcat user with the manager role, because you'll need to provide a name and password to gain access to the Manager application. By default, user records are defined in Tomcat's tomcat-users.xml configuration file. The tomcat directory of the recipes distribution contains some information on storing Tomcat user records in MySQL instead.
Using the mysql Client Program
Writing MySQL-Based Programs
Record Selection Techniques
Working with Strings
Working with Dates and Times
Sorting Query Results
Generating Summaries
Modifying Tables with ALTER TABLE
Obtaining and Using Metadata
Importing and Exporting Data
Generating and Using Sequences
Using Multiple Tables
Statistical Techniques
Handling Duplicates
Performing Transactions
Introduction to MySQL on the Web
Incorporating Query Resultsinto Web Pages
Processing Web Input with MySQL
Using MySQL-Based Web Session Management
Appendix A. Obtaining MySQL Software
Appendix B. JSP and Tomcat Primer
Appendix C. References