3.1 HttpServletResponse类

调用service()您的 servlet 方法后,Web 容器将根据HttpServletResponse. 所以如果你想以某种方式影响对客户端的响应,那么你应该修改这个对象。

服务器响应由三部分组成:

  • 状态行(例如:200 OK)
  • 标头
  • 响应体

而类方法HttpServletResponse也分为3组?几乎:

方法 描述
1个 void setStatus(int sc) 设置响应状态代码。
2个 void sendError(int sc) 使用指定代码向客户端发送错误。
3个 void sendError(int sc, String msg) 向客户端发送带有指定代码的错误和消息。
4个 void addHeader(String name, String value) 将标头添加到响应标头列表。
5个 void setHeader(String name, String value) 更改响应标头列表中的标头。
6个 boolean containsHeader(String name) 检查标题是否已经存在。
7 void addCookie(Cookie cookie) 将 Cookie 添加到响应中。
8个 void sendRedirect(String location) 将客户端重定向到不同的 URL。
9 String encodeRedirectURL(String url) 对指定的 URL 进行编码以在 sendRedirect 方法中使用。
10 String encodeURL(String url) 对指定的 URL 进行编码,包括会话 ID。
十一 void setContentType(String type) 设置结果的 MimeType。
12 void setContentLength(int len) 设置响应主体的长度。
13 void setCharacterEncoding(String charset) 设置响应编码集。
14 void setBufferSize(int size) 设置响应主体的缓冲区大小。
15 boolean isCommitted() 检查缓冲区是否已写入响应。
16 void flushBuffer() 将缓冲区的内容写入响应。
17 void reset() 重置存储在缓冲区、标头和响应代码中的所有数据。
18 void resetBuffer() 清除响应缓冲区。

这里的方法非常简单。但我会在下面给你一些重点。

缓冲区。您的 servlet 的响应被写入缓冲区,而不是立即发送给用户。因此,在某个阶段(例如,如果发生错误),您可以重置(擦除)写入缓冲区的所有内容。您甚至可以调用 reset() 方法,不仅可以清除缓冲区的内容,还可以清除带有响应代码的标头。

3.2 重定向()

第二个要点是重定向。如果您的 servlet 决定将客户端重定向到另一个 URL,那么您需要以某种方式将此 URL 发送到客户端。这可以使用sendRedirect.

但是有一个重要的细微差别。URI 可以包含比响应正文中允许的字符范围更广的字符。因此,在调用该方法之前,必须先将 URL 编码为有效的字符集sendRedirect()。为此有一个特殊的方法encodeRedirectURL(String url)。用它。

重定向示例:


public class RedirectServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String newUrl = "http://google.com?q=Learn to google!";
        String redirectUrl = response.encodeRedirectURL(newUrl);
        response.sendRedirect(redirectUrl);
    }
}

3.3 getWriter()方法

现在我们将学习如何将文本编写为响应正文。为此,该类有一个返回对象的HttpServletResponse特殊方法。如果有人忘记了,这是名称为 的字段类型。getWriter()PrintStreamSystem.out

为了将一些文本写为 servlet 响应,您需要:

  • 通过调用 获取 PrintStream 对象response.getWriter()
  • 将您认为必要的任何内容写入 PrintStream 对象(所有数据都将写入缓冲区)。
  • close()通过调用PrintStream 上的方法将缓冲区发送给用户。

让我们编写一个 servlet,将两个数字相加a并将b结果返回给用户:



public class CalculatorServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
         // Getting the parameter “a” and “b” from request
        String a = request.getParameter("a");
        String b = request.getParameter("b");
 
        try {
            // Convert strings to numbers and calculate sum
            int sum = Integer.parseInt(a) + Integer.parseInt(b);
 
            // Print HTML as a response for browser
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
 
            out.println("<html>");
            out.println("<head> <title> CalculatorServlet </title> </head>");
            out.println("<body>");
            out.println("<h1> Sum == " + sum + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}