Jetty

A servlet is the package defined by Sun to handle HTTP requests and to create web applications.

Jetty is a 100% Java HTTP Server and Servlet Container. Jetty's home page is:

http://jetty.mortbay.org/jetty

You can download Jetty 6.0 at:

http://docs.codehaus.org/display/JETTY/Downloading+Jetty

A simple servlet environment can be created by copying the following jar files from jetty-6.0.1/lib/ to a directory in your CLASSPATH.

Minimal echoing servlet in Jetty

A simple server with one servlet is created with:

        org.mortbay.jetty.Server server =
	    new org.mortbay.jetty.Server( 8080 );

	org.mortbay.jetty.servlet.Context context =
	    new org.mortbay.jetty.servlet.Context( server, "/" );

	context.addServlet( EchoServlet.class , "/*");

        server.start();
        server.join();
    }
}

The "/*" argument to context.addServlet means that any path in the URL will activate the servlet.

The server.start() method call starts the server. The server.join() method call waits for the server to terminate.

doGet

The servlet echos its http request.

    protected void doGet(
        HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        log( "get" );
        response.setContentType("text/plain");
        PrintWriter out = response.getWriter();

	out.println( request );
	out.println( "date = " + (new Date()) );
        out.flush();
    }

The response.getWriter() call returns a writer that transmits any content to the waiting HTTP client.

source for EchoServlet

Assuming that the jar files are placed in the CLASSPATH, the EchoServlet is compiled with:

javac EchoServlet.java
EchoServlet.java
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class EchoServlet extends HttpServlet {

    protected void doGet(
        HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        log( "get" );
        response.setContentType("text/plain");
        PrintWriter out = response.getWriter();

	out.println( request );
	out.println( "date = " + (new Date()) );
        out.flush();
    }

    public static void main(String[] args) throws Exception {
        org.mortbay.jetty.Server server =
	    new org.mortbay.jetty.Server( 8080 );

	org.mortbay.jetty.servlet.Context context =
	    new org.mortbay.jetty.servlet.Context( server, "/" );

	context.addServlet( EchoServlet.class , "/*");

        server.start();
        server.join();
    }
}

The server is run by the command:

java EchoServlet

Serving static content

A Jetty based web server that serves static web content (i.e., files) can be created with:

SimpleServer.java
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.DefaultHandler;
import org.mortbay.jetty.handler.HandlerList;
import org.mortbay.jetty.handler.ResourceHandler;

import org.mortbay.jetty.handler.ContextHandlerCollection;
import org.mortbay.jetty.servlet.Context;

public class SimpleServer {

    public static void main(String[] args)
        throws Exception
    {
        int port = 8880;
	String baseDir = ".";
        if (args.length >= 1 ) {
	    port = Integer.parseInt(args[0]);
	    if (args.length >= 2 ) {
	        baseDir = args[1];
	    }
	}
        Server server = new Server(port);
        
        ResourceHandler resource = new ResourceHandler();
        resource.setResourceBase( baseDir );
        
	ContextHandlerCollection contexts = new ContextHandlerCollection();
	Context servlets = new Context(contexts,"/servlet" );
	servlets.addServlet( EchoServlet.class, "/echo/*" );
	servlets.addServlet( CountServlet.class, "/count/*" );

	server.addHandler( resource );
	server.addHandler( contexts );
	server.addHandler( new DefaultHandler() );

        server.start();
        server.join();
    }
}

In addition to serving any files, it also contains two servlets. These servlets are accessed with the URLs:

servlet/echo
servlet/count

The SimpleServer is compiled with:

javac SimpleServer.java 

File content

The index.html file in the base directory is served with the, /, root path.

index.html
<html>
<head>
<title>Index for simple</title>
</head>
<body>
<p>
Served with Jetty
</p>
<p>
<a href="SimpleServer.java">SimpleServer.java</a> <br>
<a href="servlet/echo">echo</a> <br>
<a href="servlet/count">count</a> <br>
</p>
</body>
</html>

Count servlet

The count servlet is implemented with:

CountServlet.java
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class CountServlet extends HttpServlet {

    private int count = 0;

    protected void doGet(
        HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        String pathInfo = request.getPathInfo();
	out.println( "<h1>" );
	out.println( "count = " + count + " " + (new Date()) );
	out.println( "</h1>" );
	log( "count = " + count );
	count++;
        out.flush();
    }
}