Servlets - 服务器响应( Server 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)。
以下是从Web服务器端返回浏览器的最有用的HTTP 1.1响应标头的摘要,您将在Web编程中经常使用它们 -
Sr.No. | 标题和说明 |
---|---|
1 | Allow 此标头指定服务器支持的请求方法(GET,POST等)。 |
2 | Cache-Control 此标头指定可以安全地缓存响应文档的环境。 它可以具有public , private或no-cache等值。公共意味着文档是可缓存的,私有意味着文档是针对单个用户的,并且只能存储在私有(非共享)缓存中,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(多用途Internet邮件扩展)类型。 |
9 | Expires 此标头指定内容应被视为过期的时间,因此不再被缓存。 |
10 | Last-Modified 此标头指示文档上次更改的时间。 然后,客户端可以缓存文档,并在以后的请求中通过If-Modified-Since请求标头提供日期。 |
11 | Location 此标头应包含在状态代码为300s的所有响应中。 这会通知浏览器文档地址。 浏览器会自动重新连接到此位置并检索新文档。 |
12 | Refresh 此标头指定浏览器应该多久要求更新的页面。 您可以指定刷新页面的时间(以秒为单位)。 |
13 | Retry-After 此标头可与503(服务不可用)响应结合使用,以告知客户端可以多快重复其请求。 |
14 | Set-Cookie 此标头指定与页面关联的cookie。 |
设置HTTP响应标头的方法
有以下方法可用于在servlet程序中设置HTTP响应头。 这些方法可用于HttpServletResponse对象。
Sr.No. | 方法和描述 |
---|---|
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标头响应示例
您已经看到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并等待查看结果 -
<h1 align="center">Auto Refresh Header Setting</h1>
<p>Current Time is: 9:44:50 PM</p>