JSP - 服务器响应

当一个 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 编程时,你会频繁使用它们:

标题 描述
Allow 这个标题指定了服务器支持的请求方法(GET、POST 等等)。
Cache-Control 这个标题指定了响应文档可以安全地被缓存的情况。它可以有 public,privatenon-chche 的值。Public 意味着文件是缓存的,private 意味着文档用于单个用户,且只能存储在私有(非共享)缓存中,non-chche 意味着永远不会被缓存。
Connection 该标题表明浏览器是否使用持久的HTTP连接。值为 close 表明浏览器不使用持续的 HTTP 连接, keep-alive 表明使用持久连接。
Content-Disposition 该标题让你请求浏览器要求用户将响应保存到给定名称的磁盘文件中。
Content-Encoding 这个标题指定了在传输过程中页面被编码的方式。
Content-Language 这个标题表明了编写文档的语言。例如,英语,美语,俄语等。
Content-Length 这个标题表明了响应中的字节数。这些信息只有在浏览器使用持久(keep-alive)的HTTP连接时才需要。
Content-Type 这个标题给出响应文档的 MIME(多用途 Internet 邮件扩展)类型。
Expires 这个标题指定了内容应该被认为是过时的时间,因此不再被缓存。
Last-Modified 这个标题表示最后一次修改文档的时间。客户端可以缓存文件并由后面的请求的 if - modified - since 请求标题提供一个日期。
Location 这个标题应该包含在所有带有 300 s 状态码的响应中。该标题通知浏览器文档的地址。浏览器自动重新连接到这个位置并且检索新文档。
Refresh 这个标题指定浏览器应该多久访问更新页面。你可以在页面刷新后,指定时间为几秒。
Retry-After 这个标题可以与 503(服务不可用)响应结合使用,告诉客户端多久以后它可以重复请求。
Set-Cookie 这个标题制定了与页面相关联的一个 cookie。

HttpServletResponse 对象

该响应对象是 javax.servlet.http.HttpServletResponse 的一个实例。正如服务器创建请求对象,它也创建了一个对象来表示客户端的响应。

响应对象还定义了接口,处理创建新的 HTTP 标题。通过这个对象 JSP 程序员可以添加新的 cookies 或日期 stamps,HTTP 状态码等。

以下方法可以用来在你的 servlet 程序中设置 HTTP 响应标题。有了代表服务器响应的 HttpServletResponse 对象,这些方法都是可用的。

S.N. 方法 & 描述
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 内容-长度标题。
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 标题响应实例

接下来的例子中将使用 setIntHeader() 方法设置 Refresh 标题来模拟数字时钟:


<%@ page import="java.io.*,java.util.*" %>
<html>
<head>
<title>Auto Refresh Header Example</title>
</head>
<body>
<center>
<h2>Auto Refresh Header Example</h2>
<%
   // Set refresh, autoload time as 5 seconds
   response.setIntHeader("Refresh", 5);
   // 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;
   out.println("Current Time is: " + CT + "\\n");
%>
</center>
</body>
</html>

现在把上面的代码添加到 main.jsp 并试图访问它。这将在每5秒后显示当前系统时间如下所示。运行 JSP,等着看结果:


  Auto Refresh Header Example---------------------------
Current Time is: 9:44:50 PM

想要变得更加舒适你可以以相同的方式试试上面几个方法。