Servlets 简明教程

Servlets - Server HTTP Response

如前一章所述,当 Web 服务器响应 HTTP 请求时,响应通常由状态行、一些响应头、一个空行和文档组成。一个典型的响应如下所示:

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
   (Blank Line)
<!doctype ...>
<html>
   <head>...</head>
   <body>
      ...
   </body>
</html>

状态行由 HTTP 版本(示例中为 HTTP/1.1)、状态代码(示例中为 200)和对应于状态代码的非常短的消息(示例中为 OK)组成。

以下是对最常用的 HTTP 1.1 响应头部的总结,这些响应头部从 Web 服务器端返回到浏览器,并且在 Web 编程中会非常频繁地使用:

Sr.No.

Header & Description

1

Allow 此标头指定服务器支持的请求方法(GET、POST 等)。

2

Cache-Control 此标头指定可以安全缓存响应文档的情况。它可以具有值 publicprivateno-cache 等。Public 表示文档可缓存,Private 表示文档仅针对单个用户,只能存储在私有(不共享)缓存中,而 nocache 表示文档不应缓存。

3

Connection 此标头指示浏览器是否使用 HTTP 连接中的持久性。值 close 指示浏览器不使用持久性 HTTP 连接,而 keepalive 表示使用持久性连接。

4

Content-Disposition 此标头允许您请求浏览器要求用户将响应保存到具有给定名称的文件的磁盘中。

5

Content-Encoding 此标头指定在传输过程中对页面进行编码的方式。

6

Content-Language 此标头表示文档所用语言。例如 en、en-us、ru 等

7

Content-Length 此标头指示响应中的字节数。仅当浏览器使用持久性(保持活动)HTTP 连接时才需要此信息。

8

Content-Type 此标头给出响应文档的 MIME(多用途互联网邮件扩展)类型。

9

Expires 此标头指定应将内容视为过时并因此不再缓存的时间。

10

Last-Modified 此标头指示文档上次更改的时间。然后,客户端可以缓存文档并在以后的请求中通过 If-Modified-Since 请求标头提供日期。

11

Location 此标头应与所有状态代码位于 300s 中的响应一起包含。这会通知浏览器文档地址。浏览器自动重新连接到此位置并检索新文档。

12

Refresh 此标头指定浏览器应多久请求更新页面。您可以在页面刷新后的秒数中指定时间。

13

Retry-After 此标头可以与 503(服务不可用)响应结合使用,以告诉客户端它可以多久重复其请求。

14

Set-Cookie 此标头指定与页面关联的 Cookie。

Methods to Set HTTP Response Header

可以使用以下方法在 servlet 程序中设置 HTTP 响应标头。这些方法可与 HttpServletResponse 对象一起使用。

Sr.No.

Method & Description

1

String encodeRedirectURL(String url) 对指定的 URL 进行编码以在 sendRedirect 方法中使用,或者,如果不需要编码,则返回未更改的 URL。

2

String encodeURL(String url) 通过在其中包含会话 ID 对指定的 URL 进行编码,或者,如果不需要编码,则返回未更改的 URL。

3

boolean containsHeader(String name) 返回一个布尔值,指示是否已设置已命名的响应标头。

4

*boolean isCommitted() *返回一个布尔值,指示是否已提交响应。

5

void addCookie(Cookie cookie) 将指定的 cookie 添加至响应。

6

void addDateHeader(String name, long date) 添加带有给定名称和日期值的响应头。

7

void addHeader(String name, String value) 添加带有给定名称和值的响应头。

8

void addIntHeader(String name, int value) 添加带有给定名称和整数值的响应头。

9

*void flushBuffer() *强制缓冲区中的所有内容写入客户端。

10

void reset() 清除缓冲区中存在的任何数据,以及状态代码和标题。

11

void resetBuffer() 清除响应中底层缓冲区的内容,而不清除标题或状态代码。

12

void sendError(int sc) 使用指定的错误代码发送错误响应至客户端,并清除缓冲区。

13

void sendError(int sc, String msg) 使用指定状态发送错误响应至客户端。

14

void sendRedirect(String location) 使用指定的重定向位置 URL 向客户端发送临时重定向响应。

15

*void setBufferSize(int size) *设置响应正文的首选缓冲区大小。

16

void setCharacterEncoding(String charset) 设置发送至客户端的响应的字符编码(MIME 字符集),例如 UTF-8。

17

*void setContentLength(int len) *设置响应中内容正文的长度,在 HTTP servlet 中,此方法设置 HTTP Content-Length 标头。

18

*void setContentType(String type) *设置发送至客户端的响应的内容类型,前提是响应尚未提交。

19

*void setDateHeader(String name, long date) *设置带有给定名称和日期值的响应头。

20

*void setHeader(String name, String value) *设置带有给定名称和值的响应头。

21

*void setIntHeader(String name, int value) *设置带有给定名称和整数值的响应头

22

void setLocale(Locale loc) 设置响应的区域设置,前提是响应尚未提交。

23

*void setStatus(int sc) *设置此响应的状态代码

HTTP Header Response Example

您已经在前面的示例中看到 setContentType() 方法正在工作,并且后面的示例也会使用同样的方法,此外,我们会使用 setIntHeader() 方法来设置 Refresh 头。

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Extend HttpServlet class
public class Refresh extends HttpServlet {

   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      // Set refresh, autoload time as 5 seconds
      response.setIntHeader("Refresh", 5);

      // Set response content type
      response.setContentType("text/html");

      // Get current time
      Calendar calendar = new GregorianCalendar();
      String am_pm;
      int hour = calendar.get(Calendar.HOUR);
      int minute = calendar.get(Calendar.MINUTE);
      int second = calendar.get(Calendar.SECOND);

      if(calendar.get(Calendar.AM_PM) == 0)
         am_pm = "AM";
      else
         am_pm = "PM";

      String CT = hour+":"+ minute +":"+ second +" "+ am_pm;

      PrintWriter out = response.getWriter();
      String title = "Auto Refresh Header Setting";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";

      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n"+
         "<body bgcolor = \"#f0f0f0\">\n" +
         "<h1 align = \"center\">" + title + "</h1>\n" +
         "<p>Current Time is: " + CT + "</p>\n"
      );
   }

   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      doGet(request, response);
   }
}

现在,调用上面的 servlet 将每隔 5 秒显示当前系统时间,如下所示。只需运行 servlet 并等待查看结果 -

Auto Refresh Header Setting
Current Time is: 9:44:50 PM