在本章中,我们将讨论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”
)组成。
以下是从Web服务器返回浏览器的最有用的HTTP 1.1响应头的摘要。 这些头文件经常用于Web编程 -
编号 | 响应头 | 描述 |
---|---|---|
1 | Allow |
此响应头指定服务器支持的请求方法(GET ,POST 等)。 |
2 | Cache-Control |
此响应头指定响应文档可以安全地缓存的情况。它的值可以是public ,private 或no-cache 等等。public 则表示文档是可缓存的,private 则表示文档是针对单个用户,只能存储在私有(非共享)缓存中,而no-cache 则表示文档不应该被缓存。 |
3 | Connection |
此响应头指示浏览器是否使用持久HTTP连接。close 值指示浏览器不使用持久HTTP连接,而keep-alive 表示使用持久连接。 |
4 | Content-Disposition |
此响应头允许请求浏览器要求用户将响应保存到给定名称的文件中。 |
5 | Content-Encoding |
此响应头指定在传输期间页面被编码的方式。 |
6 | Content-Language |
此响应头表示文档写入的语言。例如,en ,en-us ,ru 等 |
7 | Content-Length |
此响应头指示响应中的字节数。仅当浏览器使用持久(保持活动)HTTP连接时,才需要此信息。 |
8 | Content-Type |
此响应头给出响应文档的MIME (多用途Internet邮件扩展)类型。 |
9 | Expires |
此响应头指定内容应被视为过期的时间,因此不再被缓存。 |
10 | Last-Modified |
此响应头指示文档何时上次更改。客户端可以缓存文档,并在稍后的请求中通过If-Modified-Since 请求头提供日期。 |
11 | Location |
此响应头应该在300s 内包含在状态代码的所有响应中。它通知浏览器文档地址。 浏览器自动重新连接到此位置并检索新文档。 |
12 | Refresh |
此响应头指定浏览器应该要求更新页面的时间。可以指定时间,之后它将指定秒数刷新页面。 |
13 | Retry-After |
此响应头可以与503 (服务不可用)响应一起使用,以便告诉客户端可以多久重复其请求。 |
14 | Set-Cookie |
此响应头指定与该页面相关联的cookie 。 |
HttpServletResponse对象
response
对象是javax.servlet.http.HttpServletResponse
对象的一个实例。就像服务器创建请求对象一样,它还创建一个对象来表示对客户端的响应。
response
对象还定义了处理创建新HTTP头的接口。通过此对象,JSP程序员可以添加新的Cookie或日期戳,HTTP状态代码等。
可以使用以下方法在servlet程序中设置HTTP响应头。这些方法可用于HttpServletResponse
对象。此对象表示服务器响应。
编号 | 方法 | 描述 |
---|---|---|
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 ,GB2312 。 |
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头响应示例
打开Eclipse创建一个动态Web项目:ServerResponse,其项目结构如下所示 -
以下示例将使用setIntHeader()
方法设置Refresh
头来模拟数字时钟,请参考以下代码实现。
文件:index.jsp -
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "java.io.*,java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>服务器响应示例</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<h2>自动刷新HTTP标头示例</h2>
<%
// Set refresh, autoload time as 5 seconds
response.setIntHeader("Refresh", 3);
// 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");
%>
</div>
</body>
</html>
在上面代码编写完成后,部署这个Web项目,打开浏览器访问URL: http://localhost:8080/ServerResponse/ , 每3
秒钟显示当前系统时间,如下所示 -