Servlet - 服务器 HTTP 响应


正如前一章所讨论的,当 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 编程中非常频繁地使用它们 -

先生。 标题和描述
1

允许

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

2

缓存控制

该标头指定可以安全地缓存响应文档的环境。它可以具有publicprivateno-cache等值。 Public 表示文档可缓存, Private 表示文档适用于单个用户,只能存储在私有(非共享)缓存中, nocache 表示文档不应被缓存。

3

联系

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

4

内容处置

通过此标头,您可以请求浏览器要求用户将响应保存到磁盘上给定名称的文件中。

5

内容编码

该标头指定了传输期间页面的编码方式。

6

内容语言

该标题表示编写文档所用的语言。例如 en、en-us、ru 等

7

内容长度

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

8

内容类型

该标头给出了响应文档的 MIME(多用途 Internet 邮件扩展)类型。

9

过期

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

10

上一次更改

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

11

地点

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

12

刷新

此标头指定浏览器应多长时间请求更新页面。您可以指定刷新页面的时间(以秒为单位)。

13

之后重试

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

14

设置Cookie

该标头指定与该页面关联的 cookie。

设置 HTTP 响应标头的方法

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

先生。 方法及说明
1

字符串encodeRedirectURL(字符串url)

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

2

字符串编码URL(字符串url)

通过在其中包含会话 ID 来对指定的 URL 进行编码,或者,如果不需要编码,则返回原样的 URL。

3

布尔包含标题(字符串名称)

返回一个布尔值,指示指定的响应标头是否已设置。

4

布尔值 isCommited()

返回一个布尔值,指示响应是否已提交。

5

无效addCookie(Cookie cookie)

将指定的 cookie 添加到响应中。

6

void addDateHeader(字符串名称,长日期)

添加具有给定名称和日期值的响应标头。

7

void addHeader(字符串名称,字符串值)

添加具有给定名称和值的响应标头。

8

void addIntHeader(字符串名称, int 值)

添加具有给定名称和整数值的响应标头。

9

无效的flushBuffer()

强制将缓冲区中的任何内容写入客户端。

10

无效重置()

清除缓冲区中存在的所有数据以及状态代码和标头。

11

无效重置缓冲区()

清除响应中底层缓冲区的内容,而不清除标头或状态代码。

12

无效发送错误(int sc)

使用指定的状态代码向客户端发送错误响应并清除缓冲区。

13

无效sendError(int sc,字符串消息)

使用指定的状态向客户端发送错误响应。

14

无效sendRedirect(字符串位置)

使用指定的重定向位置 URL 向客户端发送临时重定向响应。

15

无效setBufferSize(int大小)

设置响应正文的首选缓冲区大小。

16

无效setCharacterEncoding(字符串字符集)

设置发送到客户端的响应的字符编码(MIME 字符集),例如,设置为 UTF-8。

17 号

无效设置内容长度(int len)

设置响应中内容正文的长度 在 HTTP servlet 中,此方法设置 HTTP Content-Length 标头。

18

void setContentType(字符串类型)

如果响应尚未提交,则设置发送到客户端的响应的内容类型。

19

void setDateHeader(字符串名称,长日期)

设置具有给定名称和日期值的响应标头。

20

void setHeader(字符串名称,字符串值)

设置具有给定名称和值的响应标头。

21

void setIntHeader(字符串名称, int 值)

设置具有给定名称和整数值的响应标头

22

void setLocale(区域设置 loc)

如果响应尚未提交,则设置响应的区域设置。

23

无效 setStatus(int sc)

设置此响应的状态代码

HTTP 标头响应示例

您已经在前面的示例中看到了 setContentType() 方法的工作原理,下面的示例也将使用相同的方法,此外我们将使用setIntHeader()方法来设置刷新标头。

// 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