Writing Java Servlets

Java servlets are a primary way to implement dynamic web pages. This assumes that you have installed the JDK, JSDK, Apache, and Jserv. Servlets are Java programs in the "/servlets" directory of your Apache installation.

Standard Components of Servlets

Skeleton: (Almost every servlet you ever write will include this code)

import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*;
import java.util.*; 

// the class name must agree with the file name
// so this file must be named
// fileName.java
public class fileName extends HttpServlet { 

// you can declare variables here (usually private)

public void init(ServletConfig conf) throws ServletException 
{ 
 super.init(conf); 
} 

// you must declare a doGet, doPost or doService method
// usually doGet

public void doGet(HttpServletRequest req, HttpServletResponse res) 
 throws IOException{ 
   //Get a channel to the Web browser, so we can send output 
   // The next web page the user sees will be what you write
   // to 'out' via print or println commands

  // optionally access a Session via
  // 	HttpSession session = req.getSession(true);
  // 'true' creates a session if none exists
  // if session was created earlier (in another servlet)
  // access the session data via session.getValue(data_name)
  // store data to the session via
  // session.putValue(data_name,value)

   ServletOutputStream out = res.getOutputStream(); 
   res.setContentType("text/html");

  // process form-data via data = req.getParameter(varname) commands

}


A complete sample servlet (used to display team assignments). Note: it is a good idea to encapsulate standard operations in a class.
We, consequently, have a team_io class that performs team I/O:
team_io.java
If you want to write plain-old subroutines (rather than classes and objects), you must put them in a class (Java enforces an object-oriented approach) and declare them to be class-methods (with the static keyword):
teaminfo.java

Here is the display servlet:



package teams;

import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*;
import java.util.*;
import teams.*;

public class show extends HttpServlet { 
    
    public void init(ServletConfig conf) 
	throws ServletException { 
	super.init(conf); 
    } 
    static int maxsize = 7;
   // Instance variables
    private int buffer_size = 0;
    private String[] insert_buffer = new String[30];
    
    public void doGet(HttpServletRequest request, 
		       HttpServletResponse response) 
	throws IOException{
	int team_number=0;
		
	// Get a channel to the browser
	ServletOutputStream out = response.getOutputStream(); 
	response.setContentType("text/html"); // Required for HTTP

	// Get course name
	String course = request.getParameter("course").trim();

	// Print page header
	out.println(web_header("Team Signup for "
			       + course));
	// Print the top of the table
	out.println("<h1 align=\"center\">Team signup page for "
		    + course 
		    + "</h1>");

	// center everything that follows
	out.println("<center>");

	//Create line with all short team names and links
	for (team_number = 0; team_number < teaminfo.number(); team_number++)
	    {
		out.println("<a href=\"#"
			    +teaminfo.short_name(team_number)+ "\">"
			    +teaminfo.short_name(team_number)+ "</a>");
	    }

	// new line
	out.println("<br />");
	out.println("Click on \"Add new name\" to enroll in a team.");
	out.println("<br />");
	out.println("Click on \"*\" to edit your entry.");
	out.println("<br />");

	// horizontal line
	out.println("<hr />");

	// main loop over all teams
	for (team_number=0; team_number < teaminfo.number(); team_number++)
	    {
		int row_number = 0;

		// team_io is a class for accessing the 
		// files of team member names
		team_io t = new team_io(course, team_number,out);

		// load a team file -- parse into member names
		// and email addresses
		t.load();

		// table for file info for this team
		String table_caption = teaminfo.long_name(team_number)
		    + " ("
		    + teaminfo.short_name(team_number)
		    + ")";
		// generate link for top of table to point to
		out.println("<a name="
			    + teaminfo.short_name(team_number)
			    +">");
		out.println(table_caption + "<br />");

		// start new table
		out.println("<table align=\"center\" border=\"4\">");

		// t.number() = number of members in this team
		// t.name(i) and t.email(i) are name and email
		// of i th team member
		for (row_number = 0; row_number < t.number(); row_number++)
		    {
			// start new table row
			out.println("<tr>");
			out.println("<td>" 
				    + "<a href=\"mailto:"
				    + t.email(row_number)
				    + "\">"
				    + t.name(row_number)
				    + "</a>"
				    + "</td>"
				    + "<td>"
				    + gen_options(course,
						  team_number,
						  row_number)
				    + "</td>");
			// finish off this table row
			out.println("</tr>");
		    }

		// number of blank slots in this team
		// is the max size - number of members signed up
		int rest = maxsize - t.number();

		// generate table rows for empty slots
		for (row_number = 0; row_number < rest; row_number++)
		    {
			out.println("<tr>");
			out.println("<td><a href=\""
				    + "/servlets/teams.add?team="
				    + team_number
				    + "&course="
				    + course
				    + "\">Add new name</a>"
				    + "</td>"
				    + "<td>?</td>");
			// finish off this row
			out.println("</tr>");
		    }

		// table for this team is finished
		out.println("</table><br />");

		// if team had members, generate link to email
		// entire team
		if(t.number() > 0)
		    {
			out.print("<a href=\"mailto:");
			int email_i = 0;
			for(email_i = 0; email_i < t.number(); email_i++)
			    {
				out.print(t.email(email_i));
				if(email_i < t.number() - 1)
				    out.print(",");
			    }
			out.println("\">Email entire ");
			out.println(teaminfo.short_name(team_number)
				    +" team </a>");
		    }
		// new line
		out.println("<br />");
		// horizontal line in the web page
		out.println("<hr />");
	    }
	// finish up whole web page
	out.println("</center></body></html>");
    }		    

    // Generate a hidden input entry   
    private String gen_hidden(String name, String value)
    {
	return "<input type=\"hidden\" "
	    + "name=\"" + name + "\" "
	    + "value=\"" + value + "\">\n";
    }

    // Generate the options menu for each team member
    // allowing them to change name, email or be deleted
    // from the team
    private String gen_options(String course, 
			       int team_number,
			       int index_number)
    {
	return "<form action="
	    + "\"/servlets/teams.mod\" method=\"get\">"
	    + gen_hidden("course",course)
	    + gen_hidden("team",Integer.toString(team_number).trim())
	    + gen_hidden("index",Integer.toString(index_number).trim())
	    + "<select name=\"change\">"
	    + "<option value=\"z\">*</option>"
	    + "<option value=\"n\">Change name</option>"
	    + "<option value=\"e\">Change email</option>"
	    + "<option value=\"d\">Delete me from this team</option>"
	    + "</select>"
	    + "<input type=\"submit\" value=\"Do it!\">"
	    + "</form>";
    }


    // Standard header for all my web pages
    private String web_header(String title)
    {
	return "<!DOCTYPE HTML PUBLIC \""
	    + "-//W3C//DTD HTML 4.01 Transitional//EN\">"
	    + "<html>"
	    + "<head>"
	    + "<title>"
	    + title
	    + "</title>" +
	    "<LINK rel=\"stylesheet\" TYPE=\"text/css\" " +
	    "HREF=\"/course/course.css\">" +
	    "<link rev=\"made\" href=\"mailto:jsmith@drexel.edu\">"
	    + "</head><body>";
    }
}


Justin R. Smith
Last modified: Tue Mar 6 10:59:32 EST 2001