Beispiel: HTTP-Server auf HttpServlet-Basis

class Response

import java.net.Socket;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import sun.servlet.http.HttpDate;

public class Response implements HttpServletResponse
{
 protected Socket Connect;  // Socket der Verbindung
 protected Context Env;
 protected OutStream Stream;  // ServletOutputStream
 protected int StatusCode = 500; // Status-Code, default "Server Error"
 protected String StatusMsg = "";// Status-Code
 protected int Length = 0;  // Content-Length
 protected String Type = "text/plain"; // Content-Type
 protected Hashtable Header;  // Header-Felder
 protected boolean HeaderSent = false; // Status und Header wurde gesendet
 
 public Response(Socket connect, Request req, Context env) throws IOException
 {
  Connect = connect;
  Env = env;
  Stream = new OutStream(Connect);
  Header = new Hashtable(2);
  if (req.getProtocol().startsWith("HTTP/0"))
   HeaderSent = true; // bei altem HTTP kein Header senden
 }
 
 public void setContentLength(int len)
 { Length = len; }

 public void setContentType(String type)
 { Type = type;  }
 
 public ServletOutputStream getOutputStream() throws IOException
 { // Stream zum Schreiben; Senden des Header
  SendHeader();
  return Stream;
 }
 
 public boolean containsHeader(String name)
 { return Header.containsKey(name.toLowerCase()); }
 
 public void setStatus(int sc, String sm)
 {
  StatusCode = sc;
  StatusMsg = sm;
 }
 
 public void setStatus(int sc)
 {
  StatusCode = sc;
  StatusMsg = "";
 }
 
 public void setHeader(String name, String value)
 {
  Header.put(name,value);
 }
 
 public void setIntHeader(String name, int value)
 {
  Header.put(name,Integer.toString(value));
 }
 
 public void setDateHeader(String name, long date)
 {
  Header.put(name, new HttpDate(date).toString());
 }
 
 public void sendError(int sc, String msg) throws IOException
 { // Senden einer Fehlermeldung
  setStatus(sc,msg);
  setContentLength(0); // damit das Header-Feld nicht gesendet wird
  setContentType("text/html");
  SendHeader();
  Stream.println("<HTML><HEAD><TITLE>Error: " + msg);
  Stream.println("</TITLE></HEAD><BODY>" + "<H1>Error: " + sc);
  Stream.println(" " + msg + "</H1>" + "</BODY></HTML>");
 }
 
 public void sendError(int sc) throws IOException
 {
  sendError(sc, "");
 }
 
 public void sendRedirect(String location) throws IOException
 { // Senden eines Redirect nach location
  if (StatusCode == 500)
   setStatus(300,"Multiple Choices");
  setContentLength(0); // damit das Header-Feld nicht gesendet wird
  setContentType("text/html");
  setHeader("location",location);
  SendHeader();
  Stream.println("<HTML><HEAD><TITLE>Redirect</TITLE></HEAD>");
  Stream.println("<BODY><H1>Redirect: </H1><a href=");
  Stream.println(location + "><H4>" + location + "</H4></a>");
  Stream.println("</BODY></HTML>");
 }

 public void SendHeader()
 { // HTTP-Header senden, wenn er noch nicht gesendet wurde
  if (HeaderSent) return;
  try
  {
   Stream.println("HTTP/1.0 " + StatusCode + " " + StatusMsg);
   if (Length > 0)
    Stream.println("Content-length: " + Length);
   Stream.println("Content-type: " + Type);
   Enumeration keys = Header.keys();
   String name;
   while (keys.hasMoreElements())
   { // weitere Header-Felder
    name = (String)keys.nextElement();
    Stream.println(name + ": " + Header.get(name));
   }
   Stream.println();
  }
  catch (IOException e)
  {
   Env.log("Response: " + e);
  }
  finally
  {
   HeaderSent = true;
  }
 }

}