Home
Interests
Photos
Favorites

How to Bring Eclipse 3.1, J2SE 5.0, and Tomcat 5.0 Together

Eclipse is the most popular Open Source IDE on the Java market and the latest 3.1 release supports all the new language elements of J2SE 5.0.

In this article I'll show you see how to create a Web project that has Java classes located in different packages and how to use ANT to build this project and JUnit to test it. I assume that you have J2SE 5.0 installed and are familiar with Ant and JUnit.

Building Java 5.0 Applications with Eclipse
We'll build a servlet that will demo some new Java 5.0 features and do some basic tasks like creating a session to track user visits to multiple Web pages. This code can easily be extended to store a user ID in the session that will travel with her as the site is navigated. The value of the visit counter is stored in the session so multiple visits to the page will be counted (this includes the page refreshes after pressing the browser's "Reload" button). If the counter goes over five, the counter gets cleared.

Installing Tomcat
I've used Tomcat 5.0, which is available at http://jakarta.apache.org/tomcat/. Installation is a breeze, and it's smart enough to find your installation of J2SE 5.0. It also lets you test Java servlets easily on your own machine. Other that making you restart the server every time a new servlet is deployed, Tomcat is a great server for what we're doing and many other tasks.

Creating a New Project in Eclipse
To create our servlet, start by creating a new Java project by selecting the menus File, New, and Other. Then specify the name of the project, say, MyJavaProject, (make sure that J2SE 5.0 is selected as the default JRE), and click Finish. Actually, Eclipse lets you select a different version of the Java runtime at any time using the menus Windows, Preferences, Java > Installed JRE's. You can also set the compiler compliance level on the project level by selecting Java Compiler under the project's properties.

Since the standard J2SE 5.0 SDK doesn't support servlets, let's add the servlet.jar that comes with Tomcat. It's in its directory common\lib\servlet-api.jar. To add this external jar to an Eclipse project, right-click on MyJavaProject, select properties, Java Build Path, and under the Libraries tab add this external jar. Now our servlets will compile.

Eclipse by itself doesn't support debugging with Tomcat unless you add some custom Web development plug-ins to it, such as Web Tools Project (WTP). It's possible to debug Tomcat applications using Eclipse remote debugging capabilities. For more information see the Java Developer's Journal at http://java.sys-con.com/read/44918.htm.

Some of the New J2SE 5.0 Features
Let's create several supporting classes that will be used by our servlet and demonstrate some of the J2SE 5.0 capabilities. It's always a good idea to keep classes in separate packages based on functionality or some other criteria. Let's call the package "support." Just right-click on the project name, select "New Package," and enter the package name.

Autoboxing
Create a new class called Boxer that will support Java 5.0 enhanced boxing and unboxing operations. Right-click on the Java project, and select a New Class (un-check creation of the main method). Enter the source code of the class as shown in Listing 1 at the end of the article.

Just press Ctrl-S and the class is saved and compiled. As you can see, it has three methods for boxing, unboxing, and simplified adding to a collection.

Generics
Now create another class called Generic that shows how to eliminate the need for casting when retrieving elements from a collection by introducing generic collection types. You can specify the type of collection elements during its creation (see Listing 2). Generic types let objects of the same class operate safely on objects of different types. For example, they provide compile-time assurances that a List<String> always contains Strings and a List<Integer> always contains Integers.

Eclipse can handle both generic and non-generic types:

  • Generic types can be safely renamed.
  • Type variables can be safely renamed.
  • Generic methods can be safely extracted from or inlined into generic code.
  • Code assist can automatically insert appropriate type parameters in parameterized types.
In addition, a new refactoring option has been added. "Infer Generic Type Arguments" can infer type parameters for every type reference in a class, a package, or an entire project.

Enhanced For Loop
The next useful feature of J2SE 5.0 provides support for the enhanced "for" loop. This spares us from creating an iterator, navigating it, and retrieving elements from it. Create this class in Eclipse in the same package support (see Listing 3).

Java printf Function
Now, C-lovers, you can use the printf function in Java so create one more class as in Listing 4.

Methods with Variable Number of Arguments (varargs)
Java 5.0 lets you create methods with a variable number of arguments as in Listing 5. This method's signature is pretty similar to the public static String[] format(String str, Object[] args), however, it's more elegant to invoke since multiple arguments can be just passed on the command line rather than having to construct a whole new array.

Don't forget to create this class in the package support.

Static Imports
Allows importing static constants and methods, saves on extra mentioning of static classes (see Listing 6).

Creating a Servlet
Now that we've created all the supporting classes, let's create a servlet. First, we create a new package called servlet in our project.

Then, we can just create a SampleServlet class by selecting HttpServlet as a superclass in the Eclipse class creation window.

Servlets can handle all the HTTP protocol invocation types. GET and POST are the most common ones, through. Servlet code is in Listing 7.

 

As one can see from the code, the servlet first tries to create an Http session by calling request.getSession(true), which means that a new session will be created if one doesn't exist already, then we'll get the "sessiontest.counter" attribute from the session, which will be assigned 0 if it's null, increment it, and set it back to the session. The session will be invalidated (all attributes removed from it) when counter goes above five. We'll get an HTTP request header called "Cookie" and a reference to the HTTP response writer and pass them to the SampleProgram class (see Listing 8) that will perform the logic described below.

Creating a Test Class and JUnit Test Case
For our servlet to work, we'll create one more supporting class SampleProgram with a main method that can test all these supporting classes and will be eventually called by the servlet too.

As you can see, the program in Listing 8 uses all our classes. It can also be tested from the command line (without having to deploy a servlet in Tomcat) by creating a JUnit test case.

To create a JUnit test case in Eclipse, right-click on the class SampleProgram and select the menus New, Other, Junit, and Junit Test Case. It'll add the junit.jar to the classpath, if needed, and a window pops up asking how we want to create our test case.

Select setUp() and tearDown() methods to set up the test environment and tear it down when finished. Also select create main method and allow Swing UI so we can run our test visually. On the next screen select methods to test: main and testClasses.

Once finished, a SampleProgramTest class is generated and we can test it by selecting Run As - JUnit test from the context menu. JUnit will test to see if any exceptions occur and display them as errors. It will also display failures if any of our assertion tests fail. Below is the source code of our sample JUnit test (see Listing 9).

In both test methods, we've added method calls with arguments to make sure there are no exceptions. We also do an assertion that will definitely fail to demonstrate the JUnit failure detection capability:

junit.framework.ComparisonFailure: expected:<1> but was:<2>
at junit.framework.Assert.assertEquals(Assert.java:81)
at junit.framework.Assert.assertEquals(Assert.java:87)

Coding Web.xml Deployment Descriptor
Web applications require a Web.xml deployment descriptor (see Listing 10), which should be put under the WEB-INF directory.

In our deployment descriptor, we've included our SampleServlet and the index.html as a welcome page.

Deploying Servlet Using ANT
Eclipse 3.1 comes with built-in ANT support so you can execute XML-based scripts to deploy your application in a specific application server. In our case, we're deploying under Tomcat 5.0 server, which also has built-in support for Ant for the following tasks:

  • Deploying WAR files
  • Reloading WAR files
  • Undeploying WAR files
It makes deploying, redeploying, or undeploying an application easier. With Eclipse support for Ant, it's easy to create build an XML file with Ant tasks in it using Ant executor.

To take advantage of this support, we have to add Eclipse to the external catalina-ant.jar (which is located under the $TOMCAT\server\lib directory and contains support for Tomcat Ant tasks) to the runtime class-path before running Ant tasks. Select the menus Run, External Tools, and External Tools and double-click on the Ant-build.

Running Ant tasks is simple in Eclipse. Just right-click on your build file (you have to create a build.xml file containing your Ant tasks as in Listing 11) and select Run As - Ant Build, then select tasks to create-a war file, and deploy the application.

As you can see from Listing 11, there are four major tasks in the build:

  • Creating the WAR file
  • Deploying the WAR file to Tomcat
  • Reloading the application
  • Undeploying the WAR file from Tomcat
The file also contains variables used by these tasks. The notable ones are:
  • "build" - where to build a WAR file
  • "path" - the context root of the Web application, in this case "myapp"
  • "url" - the url of the Tomcat administrative application (which comes with Tomcat and provides an inter-face for deploying/undeploying applications)
  • username - the user name for the Tomcat admin application (in our case it's "admin")
  • password - the password for the Tomcat admin application (in our case it's "admin")
The file also contains various "taskdef" entries that point to the Java classes inside catalina-ant.jar that define the execution of the particular tasks.

Using the Eclipse interface (right-click on build.xml file and select Run As - Ant Build...), these tasks can be executed one at a time or all together. Note that "Deploying the WAR file to the Tomcat" task is dependent on "Creating WAR file" task, so execute the "create-war" task first, then "deploy" task.

It's time for us to start the Tomcat server and deploy our application. In Windows, simply go to Control Panel - Services and start the Apache Tomcat service. In Unix, you can execute the $TOMCAT\bin\startup.sh script.

Once it's deployed (the ANT deployment task has been completed), just point your browser at http://localhost:8080/myapp/SampleServlet/ and you should see the output as in Figure 1.

Conclusion
In this article, I've shown you some of the new J2SE 5.0 elements and covered the creation of a Web application using simple tools available in Eclipse 3.1 and Tomcat 5.0, such as Java wizards, JUnit, and Ant. There are more advanced tools that can streamline and automate this development. One such extension to Eclipse is called Web Tools Project WTP (www.eclipse.org/Webtools), which I'll cover in a future article.

 

2005 SYS-CON Media Inc.

Questions or problems regarding this web site should be directed to abeckman@outdoorssite.com.

Copyright 2008 Art Beckman. All rights reserved.

Last Modified: March 9, 2008