JSP服务器响应

JSP服务器响应

在本章中,我们将讨论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 此响应头指定服务器支持的请求方法(GETPOST等)。
2 Cache-Control 此响应头指定响应文档可以安全地缓存的情况。它的值可以是publicprivateno-cache等等。public则表示文档是可缓存的,private则表示文档是针对单个用户,只能存储在私有(非共享)缓存中,而no-cache则表示文档不应该被缓存。
3 Connection 此响应头指示浏览器是否使用持久HTTP连接。close值指示浏览器不使用持久HTTP连接,而keep-alive表示使用持久连接。
4 Content-Disposition 此响应头允许请求浏览器要求用户将响应保存到给定名称的文件中。
5 Content-Encoding 此响应头指定在传输期间页面被编码的方式。
6 Content-Language 此响应头表示文档写入的语言。例如,enen-usru
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-8GB2312
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秒钟显示当前系统时间,如下所示 -