|
A Tutorial on Installing and Using Tomcat for Servlet and JSP Development
Integrating Tomcat with a regular Web server is valuable for a deployment scenario, but my goal here is to show how to use Tomcat as a development server on your desktop. Regardless of what deployment server you use, you'll want a standalone server on your desktop to use for development. (Note: Tomcat is sometimes referred to as Jakarta Tomcat since the Apache Java effort is known as "The Jakarta Project"). The examples here assume you are using Windows, but they can be easily adapted for Solaris, Linux, and other versions of Unix. I've gotten reports of successful use on MacOS X, but don't know the setup details. Except when I refer to specific Windows paths (e.g., C:\blah\blah), I use URL-style forward slashes for path separators (e.g., install_dir/webapps/ROOT). Adapt as necessary. The information here is adapted from More Servlets and JavaServer Pages from Sun Microsystems Press. For the book table of contents, index, source code, etc., please see http://www.moreservlets.com/. For information on servlet and JSP training courses (either at public venues or on-site at your company), please see http://courses.coreservlets.com/. To report errors or omissions in this writeup or to inquire about an on-site servlet and JSP training course, please contact Marty at hall@coreservlets.com.
I give extremely detailed instructions in the following sections. If you're pretty experienced and just want a short summary, this section will probably be enough for you.
Your first step is to download and install Java. The servlet 2.3
specification requires Java 2; I suggest JDK 1.3 or later. See the following
sites for download and installation information. Once you've installed Java,
confirm that everything including your
Configuring Tomcat involves six steps:
1. Download the Tomcat SoftwareGo to http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/, select the latest version number, and choose "binary". For example, for Apache Tomcat 4.0.1, this takes you to http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.0.1/bin/. Download the zip file to your PC and unzip it into a location of your choice. You specify the top-level directory (e.g., C:\) and the zip file has embedded subdirectories (e.g., jakarta-tomcat-4.0.1). Thus, C:\jakarta-tomcat-4.0.1 is a common resultant installation directory.Note: from this point forward, I'll refer to that location as install_dir. 2. Change the Port to 80Assuming you have no other server already running on port 80, you'll find it convenient to configure Tomcat to run on the default HTTP port (80) instead of 8080. Making this change lets you use URLs of the form http://localhost/blah instead of http://localhost:8080/blah. Note that you need admin privileges to make this change on Unix.To change the port, edit install_dir/conf/server.xml and change the
<Connector className="org.apache.catalina.connector.http.HttpConnector" port="80" ... ... /> 3. Turn on Servlet ReloadingThe next step is to tell Tomcat to check the modification dates of the class files of requested servlets and reload ones that have changed since they were loaded into the server's memory. This degrades performance in deployment situations, so is turned off by default. However, if you fail to turn it on for your development server, you'll have to restart the server every time you recompile a servlet that has already been loaded into the server's memory.To turn on servlet reloading, edit install_dir/conf/server.xml and add
a <!-- Define properties for each web application. This is only needed if you want to set non-default properties, or have web application document roots in places other than the virtual host's appBase directory. -->and insert the following line just below it: <DefaultContext reloadable="true"/>Be sure to make a backup copy of server.xml before making the above change. 4. Set the
|
Test the Server |
---|
Testing the server involves two steps:
To halt the server, double click on install_dir/bin/shutdown.bat. I recommend that you make shortcuts to (not copies of) the startup and shutdown scripts and place those shortcuts on the desktop or in your main development directory. If you use an IDE, you'll have to tell it where these scripts are.
Eventually, you will almost certainly want to create and use your own Web applications (see Chapter 4 of More Servlets and JavaServer Pages), but for initial testing I recommend that you use the default Web application. Although Web applications follow a common directory structure, the exact location of the default Web application is server specific. With Tomcat 4 and the default Web application, you put HTML and JSP pages in install_dir/webapps/ROOT or install_dir/webapps/ROOT/SomePath and access them with http://localhost/filename or http://localhost/SomePath/filename. Note that Tomcat creates install_dir/webapps/ROOT when the server is first run. So, you must start the server as described above before trying to access the directory.
For your first tests, I suggest you simply take Hello.html(http://www.moreservlets.com/code/Hello.html) and Hello.jsp(http://www.moreservlets.com/code/Hello.jsp) and drop them into the appropriate locations. Right click on the links to download these two files to your system. The code for these files, as well as all the code from the book, is available online at http://www.moreservlets.com/. That Web site also contains book updates, additions, information on servlet and JSP short courses, and the full text of Core Servlets and JavaServer Pages (in PDF).
If you put the files in the top-level directory of the default Web application (i.e., in install_dir/webapps/ROOT), access them with the URLs http://localhost/Hello.html and http://localhost/Hello.jsp, respectively. If you put them in a subdirectory of install_dir/webapps/ROOT, use the URLs http://localhost/directoryName/Hello.html and http://localhost/directoryName/Hello.jsp, respectively.
If neither the HTML file nor the JSP file works (e.g., you get File Not
Found--404--errors), you likely are using the wrong directory for the files. If
the HTML file works but the JSP file fails, you probably have incorrectly
specified the base JDK directory (e.g., with the JAVA_HOME
variable).
Set Up Your Development Environment |
---|
The server startup script automatically sets the server's
CLASSPATH
to include the standard servlet and JSP classes and the
WEB-INF/classes directory (containing compiled servlets) of each Web
application. But you need similar settings, or you will be unable to
compile servlets in the first place. Configuring your server for servlet
development involves the following four steps:
CLASSPATH
Eventually, you will organize this development directory into different Web applications (each with a common structure--see More Servlets and JavaServer Pages Chapter 4). For initial testing of your environment, however, you can just put servlets either directly in the development directory (for packageless servlets) or in a subdirectory that matches the servlet package name. Many developers simply put all their code in the server's deployment directory (within install_dir/webapps). I strongly discourage this practice and instead recommend one of the approaches described in the deployment section. Although developing in the deployment directory seems simpler at the beginning since it requires no copying of files, it significantly complicates matters in the long run. Mixing locations makes it hard to separate an operational version from a version you are testing, makes it difficult to test on multiple servers, and makes organization much more complicated. Besides, your desktop is almost certainly not the final deployment server, so you'll eventually have to develop a good system for deploying anyhow.
For example, one way to make these shortcuts is to go to
install_dir/bin, right-click on startup.bat, and select Copy. Then
go to your development directory, right-click in the window, and select Paste
Shortcut (not just Paste). Repeat the process for
install_dir/bin/shutdown.bat. On Unix, you would use
ln -s
to make a symbolic link to startup.sh,
tomcat.sh (needed even though you don't directly invoke this file), and
shutdown.sh.
CLASSPATH
javac
)
you use for development probably doesn't. So, if you don't set your
CLASSPATH
, attempts to compile servlets, tag libraries, or other
classes that use the servlet API will fail with error messages about unknown
classes. The exact location of the servlet JAR file varies from server to
server, but with Tomcat it is install_dir/common/lib/servlet.jar.
Now, in addition to the servlet JAR file, you also need to put your
development directory in the CLASSPATH
. Although this is not
necessary for simple packageless servlets, once you gain experience you will
almost certainly use packages. Compiling a file that is in a package and that
uses another class in the same package requires the CLASSPATH
to
include the directory that is at the top of the package hierarchy. In this case,
that's the development directory I just discussed. Forgetting this setting is
perhaps the most common mistake made by beginning servlet programmers.
Finally, you should include "." (the current directory) in the
CLASSPATH
. Otherwise, you will only be able to compile packageless
classes that are in the top-level development directory.
Here are two representative methods of setting the CLASSPATH
.
They assume that your development directory is C:\ServletDevel. Replace
install_dir with the actual base installation location of the server.
Also, be sure to use the appropriate case for the filenames. Note that these
examples represent only one approach for setting the CLASSPATH
.
Many Java integrated development environments have a global or project-specific
setting that accomplishes the same result. But these settings are totally
IDE-specific and won't be discussed here.
Windows 98/Me
Put the following in your
autoexec.bat. (Note that this all goes on one line with no spaces--it is
broken here for readability.)
set CLASSPATH=.; C:\ServletDevel; install_dir\common\lib\servlet.jarWindows NT/2000/XP
CLASSPATH
value from the previous bullet.
javax.servlet
packages.
So, open install_dir/webapps/tomcat-docs/servletapi/index.html in your browser and then add it to your bookmarks (Netscape) or favorites (Internet Explorer) list. If Tomcat is running, you can also access the API with http://localhost/tomcat-docs/servletapi/index.html. However, you almost certainly will want access to the API even when the server is not running, so I recommend you open the file directly from disk and bookmark that location.
Compile and Test Some Simple Servlets |
---|
OK, so your environment is all set. At least you think it is. It would be nice to confirm that hypothesis. Verifying this involves the following three steps:
What about install_dir/classes? |
---|
"Hey, wait! Shouldn't I use install_dir/classes
instead of install_dir/webapps/ROOT/WEB-INF/classes?"
Nope. There are two reasons why it is preferable to use install_dir/webapps/ROOT/WEB-INF/classes: 1. It is standard. The ROOT directory follows the normal structure of a Web application (see Section 4.2 of More Servlets and JSP): HTML/JSP files go in the main directory, the web.xml file (see Chapter 5 of More Servlets and JSP) goes in WEB-INF, unjarred Java classes go in WEB-INF/classes, and JAR files go in WEB-INF/lib. So, if you use WEB-INF/classes, you are using a structure that works on all servers that support servlets 2.2 and later. OTOH, install_dir/classes is a Tomcat-specific location that is supported on few other servers. 2. It is specific to a Web application. Once you become comfortable with the basics, you will almost certainly divide your projects up into separate Web applications (see Chapters 4-6 of More Servlets and JSP). By putting your code in WEB-INF/classes, you are ready for this, since your code is already part of a Web application (the default one for Tomcat). So, the code can easily be to another Web application, and it will not interfere with any future applications. OTOH, install_dir/classes results in code that is shared by all Web applications on your server. This is almost never what you want. |
CLASSPATH
settings (see
the
earlier section on this topic)--you most likely erred in listing the
location of the JAR file that contains the servlet classes (i.e.,
install_dir/common/lib/servlet.jar). Once you compile
HelloServlet.java, put HelloServlet.class in
install_dir/webapps/ROOT/WEB-INF/classes. After compiling the code,
access the servlet with the URL http://localhost/servlet/HelloServlet (or
http://localhost:8080/servlet/HelloServlet if you chose not to
change the port number as described
earlier). You should get a simple HTML page that says "Hello". If this URL
fails but the test of
the server itself succeeded, you probably put the class file in the wrong
directory.
moreservlets
package, it should go in
the moreservlets directory both during development and when deployed to
the server. If you get compilation errors, go back and check your CLASSPATH
settings--you most likely forgot to include "." (the current directory).
Once you compile HelloServlet2.java, put HelloServlet2.class in
install_dir/webapps/ROOT/WEB-INF/classes/moreservlets. For now, you can
simply copy the class file from the development directory to the deployment
directory. However, an
upcoming section will provide some options for simplifying the deployment
process.
Once you have placed the servlet in the proper directory, access it with the URL http://localhost/servlet/moreservlets.HelloServlet2. You should get a simple HTML page that says "Hello (2)". If this test fails, you probably either typed the URL wrong (e.g., used a slash instead of a dot after the package name) or put HelloServlet2.class in the wrong location (e.g., directly in install_dir/webapps/ROOT/WEB-INF/classes directory instead of in the moreservlets subdirectory).
moreservlets
package that uses the ServletUtilities
class (http://www.moreservlets.com/code/moreservlets/ServletUtilities.java) to simplify the generation of the DOCTYPE
(specifies the
HTML version--useful when using HTML validators) and HEAD
(specifies the title) portions of the HTML page. Those two parts of the page are
useful (technically required, in fact), but are tedious to generate with servlet
println
statements.
Since both the servlet and the utility class are in the
moreservlets
package, they should go in the moreservlets
directory. If you get compilation errors, go back and check your CLASSPATH
settings--you most likely forgot to include the top-level development
directory. I've said it before, but I'll say it again: your
CLASSPATH
must include the top-level directory of your package
hierarchy before you can compile a packaged class that makes use of another
class from the same package. This requirement is not particular to servlets;
it is the way packages work on the Java platform in general. Nevertheless, many
servlet developers are unaware of this fact, and it is one of the (perhaps
the) most common errors beginning developers encounter.
Once you compile HelloServlet3.java (which will automatically cause ServletUtilities.java to be compiled), put HelloServlet3.class and ServletUtilities.class in install_dir/webapps/ROOT/WEB-INF/classes/moreservlets. Then, access the servlet with the URL http://localhost/servlet/moreservlets.HelloServlet3. You should get a simple HTML page that says "Hello (3)".
Establish a Simplified Deployment Method |
---|
OK, so you have a development directory. You can compile servlets with or without packages. You know which directory the servlet classes belong in. You know the URL that should be used to access them. (Actually, http://hostname/servlet/ServletName is just the default URL; you can also use the web.xml file to customize that URL. Use of web.xml is discussed in detail in Chapter 5 of More Servlets and JavaServer Pages.) But how do you move the class files from the development directory to the deployment directory? Copying each one by hand every time is tedious and error prone. Once you start using Web applications, copying individual files becomes even more cumbersome.
There are several options to simplify the process. Here are a few of the most popular ones. If you are just beginning with servlets and JSP, you probably want to start with the first option and use it until you become comfortable with the development process. Note that I do not list the option of putting your code directly in the server's deployment directory. Although this is one of the most common choices among beginners, it scales so poorly to advanced tasks that I recommend you steer clear of it from the start.
-d
option of javac
.
ant
or a similar tool. ln
-s
) in a manner similar to that for Windows shortcuts.
An advantage of this approach is that it is simple. So, it is good for beginners who want to concentrate on learning servlets and JSP, not deployment tools. Another advantage is that a variation applies once you start using your own Web applications. (See Chapters 4-6 of More Servlets and JSP for details on Web applications). For instance, with Tomcat, you can easily make your own Web application by putting a copy of the install_dir/webapps/ROOT directory into your development directory and renaming it (for example, to testApp). Now, to deploy your Web application, just make a shortcut to install_dir/webapps and copy the entire Web application directory (e.g., testApp) each time by using the right mouse to drag the directory that contains your Web application onto this shortcut and selecting Copy (say Yes when asked if you want to replace existing files). Almost everything stays the same as it was without Web applications: just add the name of the directory to the URL after the hostname (e.g., replace http://locahost/blah/blah with http://locahost/testApp/blah/blah). Just note that you'll have to restart the server the very first time you deploy the directory into install_dir/webapps.
One disadvantage of this approach is that it requires repeated copying if you use multiple servers. For example, I usually have Tomcat, JRun, and ServletExec on my desktop system and regularly test my code with all three servers. A second disadvantage is that this approach copies both the Java source code files and the class files to the server, whereas only the class files are needed. This does not matter on your desktop server, but when you get to the "real" deployment server, you won't want to include the source code files.
-d
Option of
javac
javac
)
places class files in the same directory as the source code files that they came
from. However, javac
has an option (-d
) that lets you
designate a different location for the class files. You need only specify the
top-level directory for class files--javac
will automatically put
packaged classes in subdirectories that match the package names. So, for
example, I could compile the HelloServlet2
servlet as follows (line
break added only for clarity; omit it in real life). javac -d install_dir/webapps/ROOT/WEB-INF/classes HelloServlet2.javaYou could even make a Windows batch file or Unix shell script or alias that makes a command like
servletc
expand to javac -d
install_dir/.../classes
. See http://java.sun.com/j2se/1.3/docs/tooldocs/win32/javac.html
for more details on -d
and other javac
options.
An advantage of this approach is that it requires no manual copying of class
files. Furthermore, the exact same command can be used for classes in different
packages since javac
automatically puts the class files in a
subdirectory matching the package.
The main disadvantage is that this approach applies only to Java class files; it won't work for deploying HTML and JSP pages, much less entire Web applications.
An advantage of this approach, at least in some IDEs, is that it can deploy HTML and JSP pages and even entire Web applications, not just Java class files. A disadvantage is that it is an IDE-specific technique and thus is not portable across systems.
ant
or a Similar Toolant
is a tool similar
to the Unix make
utility. However, ant
is written in
the Java programming language (and thus is portable) and is touted to be both
simpler to use and more powerful than make
. Many servlet and JSP
developers use ant
for compiling and deploying. The use of
ant
is especially popular among Tomcat users and with those
developing Web applications.
For general information on using ant
, see http://jakarta.apache.org/ant/manual/.
See http://jakarta.apache.org/tomcat/tomcat-4.0-doc/appdev/processes.html
for specific guidance on using ant
with Tomcat.
The main advantage of this approach is flexibility: ant
is
powerful enough to handle everything from compiling the Java source code to
copying files to producing WAR files (MSAJSP Section 4.3). The disadvantage of
ant
is the overhead of learning to use it; there is more of a
learning curve with ant
than with the other techniques in this
section.
More Information |
---|
|
|