表单是HTML中使用最广泛的传递信息的手段。搞清楚Servlet与表单的交互,就在客户端与服务器之间架起了一座桥梁。Servlet使用HttpServlet类中的方法与表单进行交互。在HttpServlet类中有几个未完全实现的方法,你可以自己定义方法的内容,但是必须正确使用方法名称以使HTTP Server把客户请求正确的映射到相应的函数上。

  doHeader 用于处理HEADER请求
  doGet 用于处理GET请求,也可以自动的支持HEADER请求
  doPost 用于处理POST请求
  doPut 用于处理PUT请求
  doDelete 用于处理DELETE请求
  HttpServlet的Service方法,当它接收到一个OPTIONS请求时,它会自动调用doOptions方法,当接收到一个TRACE请求时调用doTrace。DoOptions默认执行方式是自动决定什么样的HTTP被选择并返回哪个信息。

  在使用这些方法时必须带两个参数。第一个包含来自客户端的数据HttpServletRequest。第二个参数包含客户端的相应HttpServletResponse。在我们的第一个例子中使用的是doGet方法,因为通过地址访问的话,对应的方式是GET。

  一个HttpServletRequest对象提供请求HTTP头部数据,也允许获取客户端的数据。怎样获取这些数据取决于HTTP请求方法。

  不管何种HTTP方式,都可以用getParameterValues方法返回特定名称的参数值。

  对于HTTP GET请求的方式,getQueryString方法将会返回一个可以用来解剖分析的参数值。

  对于用HTTP POST,PUT和DELETE请求的方式,HttpServletRequest有两种方法可以选择:如果是文本数据,你能通过getReader的方法得到BufferedReader获取数据;如果是二进制数据,可以通过getInputStream方法得到ServletInputStream获取数据。

  为了相应客户端,一个HttpServletResponse对象提供返回数据给用户的两个方法:一种是用getWriter方法得到一个PrintWriter,用于返回文本数据;另一种方法是用getOutputStream方法得到ServletOutputStream,用于返回二进制数据。在使用Writer或OutputStream之前应先设置头部(HttpServletResponse中有相应的方法),然后用Writer或OutputStream将相应的主体部分发给用户。完成后要关闭Writer或OutputStream以便让服务器知道相应已经结束。

  下面我们举一个使用HttpServletRequest和HttpServletResponse得到并打印客户端信息的例子:

  //RequestInfo.java
  import java.io.*;
  import javax.servlet.*;
  import javax.servlet.http.*;

  public class RequestInfo extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws IOException, ServletException
               //处理GET请求的方法
    { 
      response.setContentType("text/html");
      //先设置Header,在这里只设置ContentType一项
      PrintWriter out = response.getWriter();
      //得到文本输出Writer

      //下面打印相关的HTML
      out.println("<html>");
      out.println("<head>");
      out.println("<title>Request Information Example</title>");
      out.println("</head>");
      out.println("<body>");
      out.println("<h3>Request Information Example</h3>");

      out.println("Request URI: " + request.getRequestURI()+"<br>");
      //打印请求的路径
      out.println("Protocol: " + request.getProtocol()+"<br>");
      //打印协议名称
      out.println("PathInfo: " + request.getPathInfo()+"<br>");
      //打印额外的路径信息
      out.println("Remote Address: " + request.getRemoteAddr());
      //打印客户机的地址,如果没有打印IP地址
      out.println("</body>");
      out.println("</html>");
      out.close(); //关闭Writer
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
     //如果是POST请求类型,同样调用GET类型的响应函数
     doGet(request, response);
    }
  }

  用我们在前面介绍的方法在Resin中配置使其运行,我们得到的结果如下:



  这样的一个例子很好的说明了所谓的动态网页和静态网页的区别,就上面这个例子而言,每个客户看到的内容是不一样的,而静态网页则对每一个客户而言都是一成不变的。