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

此标头指定服务器支持的请求方法(GET、POST 等)。

2

Cache-Control

此标头指定可以安全缓存响应文档的情况。它可以具有值public、privateno-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

此标头指示响应中的字节数。只有当浏览器使用持久性 (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。

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。

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 头响应示例

以下示例将使用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

您可以尝试以类似的方式使用其他方法。

广告