Beispiel: HTTP-Server auf HttpServlet-Basis

class Context

import javax.servlet.*;
import java.util.Hashtable;
import java.util.Enumeration;

public class Context implements ServletContext, ServletConfig
{
 protected Hashtable MIME;   // MIME-Types
 protected Hashtable Servlets;  // geladene Servlets nach Namen
 protected Hashtable ServletParam; // Init-Parameter der Servlets,
          // noch nicht benutzt
 protected String Docroot, Servletroot, Index;

 protected static String ServletAlias = "/servlet";
 
 public Context(Hashtable map, Hashtable mime,
  String docroot, String index)
 {
  MIME = mime;
  Servlets = new Hashtable();
  ServletParam = new Hashtable(); // bleibt leer
  Docroot = docroot;
  Servletroot = servletroot;
  Index = index;
  getServlet("DefaultServlet");
}
 
 public String GetServletName(String uri)
 { // sucht den Namen des Servlet zu einer URI
  if (uri.startsWith(ServletAlias))  // ein Servlet
  {
   String servlet = uri.substring(
    ServletAlias.length()+1, uri.length());
   if (servlet.indexOf("/",1) > 0) // mit PATH_INFO
    return servlet.substring(0,servlet.indexOf("/",1));
   else // ohne PATH_INFO
    return servlet;
  }
  else return "DefaultServlet";
}

 public Servlet GetServletForURI(String uri) throws ServletException
 { // gibt das Servlet fuer eine URI zurueck, nie null
  return getServlet(GetServletName(uri));
 }
 
 public Servlet getServlet(String name) throws ServletException
 { // gibt das Servlet mit dem Namen zurueck
  Servlet serv = (Servlet)Servlets.get(name);
  if (serv == null)
  { // wenn noetig Servlet laden und initialisieren
   Class c;
   try
   {
     c = Class.forName(name);   // die Klassen holen
     serv = (Servlet)c.newInstance();// eine Instanz erzeugen
     serv.init(this);    // Initialisieren
   }
   catch (Exception e)
   { // im Zweifel DefaultServlet
     serv = (Servlet)Servlets.get("DefaultServlet");
     if (serv == null)
       throw new ServletException(name);
   }
   Servlets.put(name, serv); // in den Hashtable einfuegen
  }
  return serv;
 }
 
 public Enumeration getServlets()
 { // wegen Interface ServletContext
  return Servlets.elements();
 }
 
 public void log(String msg)
 { // wegen Interface ServletContext
  System.out.println(msg);
 }

 public String getRealPath(String path)
 { // gibt den absoluten Pfad zu dem virtuellen path zurueck
   String real = Docroot + "/" + Index;
    if (path.indexOf("..") > -1 )
    { // Abwehren eines Angriffs mittels ".."
     log("Angriff: " + path);
    }
  else
  {
   if (path.startsWith(ServletAlias))  // ein Servlet
   {
    return Servletroot + "/" + GetServletName(path);
   }
   else // kein Servlet
   {
    if (path.endsWith("/")) // evt. Indexfile anhaengen
     real = Docroot + path + Index;
    else
     real = Docroot + path;
   }
  }
  return real;
 }

 public String getMimeType(String file)
 { // erraet den MIME-Type anhand der Dateinamen-Endung
  if (file.lastIndexOf(".") < 0) return "text/plain";
  else
  {
   String mime = (String)MIME.get(
    file.substring(file.lastIndexOf(".")+1, file.length()));
   if (mime != null)
    return mime;
   else return "text/plain";
  }
}
 
 public String getServerInfo()
 { // wegen Interface ServletContext
  return "ServletHttp/1.1";
 }
 
 public Object getAttribute(String name)
  { return null; } // wegen Interface ServletConfig

 public ServletContext getServletContext()
 { return this; } // wegen Interface ServletConfig
 
 public String getInitParameter(String name)
 { // wegen Interface ServletConfig
  return (String) ServletParam.get(name);
 }
 
 public Enumeration getInitParameterNames()
 { // wegen Interface ServletConfig
  return ServletParam.keys();
 }

 public String GetPathInfo(String path)
 { // gibt bei Servlets den Wert fuer
   // PATH_INFO zurueck
    if (path.startsWith(ServletAlias))
  {
   int i = ServletAlias.length()+2;
   if (path.indexOf("/",i) > 0)
   {
    return path.substring(path.indexOf("/",i),
     path.length());
   }
   else
    return "";
  }
  return getRealPath(path);
 }

 public String GetServletPath(String path)
 { // gibt bei Servlets den Wert fuer
   // PATH_INFO zurueck
    if (path.startsWith(ServletAlias))
  {
   int i = ServletAlias.length()+2;
   if (path.indexOf("/",i) > 0)
    return path.substring(0, path.indexOf("/",i));
   else
    return path;
  }
  return path;
 }
 

}