从网络的早期阶段开始,人们就希望他们的网络服务器不仅能够显示静态文档,通用网关接口(CGI) 扩展了服务器的能力,但其代价是增加了额外的处理进程。FastCGI则把外部CGI 处理进程同网络服务器更紧密地集成在一起,另外,对于专有的,诸如NSAPI 和ISAPI 这样的服务器API,它们直接把外部进程以服务器插件的形式集成到服务器中。现在有了Java servlets,它们的功能强大,可以快速替代你现有的CGI程序。 什么是servlets? 就象applet扩充了网络浏览器的能力一样,servlets这个Java部件,扩充了网络服务器的能力。对于任何种类的服务器端的处理,Servlets可以作为server-side includes使用或者作为CGI程序(在JavaSoft的Java Web server中可以作为插件)执行。 Servlets可以移植,不象CGI和专有的API模块,你可以利用Java的“编写一次,到处运行”的机制,在你的企业中配置网络应用程序。Servlets的运行也很稳固,在 servlet 中你创建了一个数据库连接,下一次你访问servlet时连接仍然存在,这同CGI 程序不一样。Servlets也具有扩展性,所以你可以使用面向对象的程序设计方法,来减少开发时间。Servlets可以运行在任何支持servlet的网络服务器上。目前,servlet SDK除了支持JavaSoft的Java Web server,还支持Netscape, Apache 和IIS,以及大量第三方的网络服务器。 JSDK导游 为了创建servlets,你需要Java servlet SDK (JSDK),它可以从JavaSoft网站下载。JSDK包含诸如javax.servlet,javax.servlet.http等包,其中包含有你自己创建servlets时所需要的类和接口。对于sun.servlet 包来说,其中包含了网络服务器用来运行servlets所需要的类。 (对Servlet的支持通常是通过服务器插件的形式)。一旦你有了JSDK,你只要创建GenericServlet类的子类,并且重载若干方法。GenericServlet 定义了你应该重载的三种主要方法: init(), service()和destroy()。 init() :初始化你的servlet,诸如打开数据库连接。 destroy():在applet运行结束后,清除servlet 自身。 service():每次调用servlet时,就调用service()方法。有两个对象 ServletRequest和ServletResponse需要传送给servlet,用于处理客户请求。 为了帮助处理基于Web 的事务,JSDK 在 javax.servlet.http包中有个HttpServlet类。HttpServlet是从GenericServlet中派生出来的,它提供了service()的一个实现,该实现用于自动处理GET, HEAD和POST的请求。 HttpServlet类中的方法有doGet()和doPost()。一个典型的CGI servlet只需要实现doGet()和doPost()方法。 doGet()和doPost()的参数为HttpServletRequest和HttpServletResponse。 HttpServletRequest是个接口,该接口提供了从客户的请求获取信息的一些方法。例如, getParameter()方法返回在客户请求中的要害字/值对(或者从请求串中取得,或者从POSTed数据中取得)。 HttpServletResponse提供了输出流,使得servlet把Html格式的输出返回给客户。 基本Servlet代码 代替你的CGI 下面为一段可以取代CGI程序的基本的servlet代码。Servlet完成如下的简单事情:列出由HTML表单搜集的要害字/值对(key/value)。 BasicCGIServlet处理POST,也用同样处理GET。所以doPost()和doGet()都调用doService()。doService()可以在子类中重载,以实现更多特定的功能。 import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class BasicCGIServlet extends HttpServlet { public BasicCGIServlet () { super(); } public void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doService(req, resp); } public void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doService(req, resp); } protected synchronized void doService (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // get an output stream to write to