- Servlet 教程
- Servlet - 首页
- Servlet - 概述
- Servlet - 环境设置
- Servlet - 生命周期
- Servlet - 示例
- Servlet - 表单数据
- Servlet - 客户端请求
- Servlet - 服务器响应
- Servlet - HTTP 状态码
- Servlet - 编写过滤器
- Servlet - 异常
- Servlet - 处理 Cookie
- Servlet - 会话跟踪
- Servlet - 数据库访问
- Servlet - 文件上传
- Servlet - 处理日期
- Servlet - 页面重定向
- Servlet - 访问计数器
- Servlet - 自动刷新
- Servlet - 发送电子邮件
- Servlet - 打包
- Servlet - 调试
- Servlet - 国际化
- Servlet - 注解
- Servlet 有用资源
- Servlet - 常见问题解答
- Servlet - 快速指南
- Servlet - 有用资源
- Servlet - 讨论
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)组成。
以下是 Web 服务器端返回到浏览器最常用的 HTTP 1.1 响应头摘要,您在 Web 编程中会经常用到它们:
序号 | 头信息及描述 |
---|---|
1 | Allow 此标头指定服务器支持的请求方法(GET、POST 等)。 |
2 | Cache-Control 此标头指定可以在哪些情况下安全地缓存响应文档。它可以具有public、private或no-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 此标头指示响应中的字节数。只有当浏览器使用持久(keep-alive)HTTP 连接时才需要此信息。 |
8 | Content-Type 此标头给出响应文档的 MIME(多用途互联网邮件扩展)类型。 |
9 | Expires 此标头指定内容应在何时被视为过期,因此不再被缓存。 |
10 | Last-Modified 此标头指示文档上次修改的时间。然后,客户端可以缓存文档并在以后的请求中通过If-Modified-Since请求头提供日期。 |
11 | Location 此标头应包含在所有状态代码为 300 多的响应中。这会通知浏览器文档地址。浏览器会自动重新连接到此位置并检索新文档。 |
12 | Refresh 此标头指定浏览器应在多久后请求更新页面。您可以指定页面刷新后的秒数。 |
13 | Retry-After 此标头可以与 503(服务不可用)响应一起使用,以告诉客户端它可以多久后重复其请求。 |
14 | Set-Cookie 此标头指定与页面关联的 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。 |
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 并等待查看结果:
Auto Refresh Header Setting
Current Time is: 9:44:50 PM