|
表单是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中配置使其运行,我们得到的结果如下:

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