JSP服务器响应

时间:2023-03-10 02:26:58
JSP服务器响应

以下内容引用自http://wiki.jikexueyuan.com/project/jsp/server-response.html

当一个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)。

下面是最有用的HTTP 1.1响应标题的一个总结,它从Web服务器端回到浏览器,并且在Web编程时,会频繁使用它们:

标题 描述
Allow 这个标题指定了服务器支持的请求方法(GET、POST 等等)。
Cache-Control 这个标题指定了响应文档可以安全地被缓存的情况。它可以有public,private或non-chche的值。public意味着文件是缓存的,private意味着文档用于单个用户,且只能存储在私有(非共享)缓存中,non-chche意味着永远不会被缓存。
Connection 该标题表明浏览器是否使用持久的HTTP连接。值为close表明浏览器不使用持续的HTTP连接,keep-alive表明使用持久连接。
Content-Disposition 该标题让请求浏览器要求用户将响应保存到给定名称的磁盘文件中。
Content-Encoding 这个标题指定了在传输过程中页面被编码的方式。
Content-Language 这个标题表明了编写文档的语言。例如,英语,美语,俄语等。
Content-Length 这个标题表明了响应中的字节数。这些信息只有在浏览器使用持久(keep-alive)的HTTP连接时才需要。
Content-Type 这个标题给出响应文档的MIME(多用途 Internet 邮件扩展)类型。
Expires 这个标题指定了内容应该被认为是过时的时间,因此不再被缓存。
Last-Modified 这个标题表示最后一次修改文档的时间。客户端可以缓存文件并由后面的请求的if-modified-since请求标题提供一个日期。
Location 这个标题应该包含在所有带有300s状态码的响应中。该标题通知浏览器文档的地址。浏览器自动重新连接到这个位置并且检索新文档。
Refresh 这个标题指定浏览器应该多久访问更新页面。可以在页面刷新后,指定时间为几秒。
Retry-After 这个标题可以与503(服务不可用)响应结合使用,告诉客户端多久以后它可以重复请求。
Set-Cookie 这个标题制定了与页面相关联的一个Cookie。

一、HttpServletResponse对象

该响应对象是javax.servlet.http.HttpServletResponse的一个实例。正如服务器创建请求对象,它也创建了一个对象来表示客户端的响应。

响应对象还定义了接口,处理创建新的HTTP标题。通过这个对象JSP程序员可以添加新的Cookies或日期stamps,HTTP状态码等。

以下方法可以用来在Servlet程序中设置HTTP响应标题。有了代表服务器响应的HttpServletResponse对象,这些方法都是可用的。

方法  描述

String encodeRedirectURL(String url)

将指定的URL编码用于sendRedirect方法,如果不需要编码,则返回的URL不变。

String encodeURL(String url)

编码由包括会话ID指定的URL,或者,如果不需要编码,返回的URL不变。

boolean containsHeader(String name)

返回一个布尔值表明指定的响应标题是否已经设置。

boolean isCommitted()

返回一个布尔值表明响应是否已经提交。

void addCookie(Cookie cookie)

将指定的Cookie添加到响应中。

void addDateHeader(String name, long date)

添加一个带有给定名称和日期值的响应标题。

void addHeader(String name, String value)

添加一个带有给定名称和值的响应标题。

void addIntHeader(String name, int value)

添加一个带有给定名称和整数值的响应标题。

void flushBuffer()

将缓冲区的内容强行写入到客户端。

void reset()

清除缓冲区中的全部数据,以及状态码和标题。

void resetBuffer()

清除响应中没有清除头或状态码的潜在的缓冲区的内容。

void sendError(int sc)

使用指定的状态代码给客户端发送一个错误响应,并清除缓冲区。

void sendError(int sc, String msg)

使用指定的状态给客户端发送一个错误响应。

void sendRedirect(String location)

使用指定的重定向位置URL给客户端发送一个临时的重定向响应。

void setBufferSize(int size)

为响应主体设置首选缓冲区大小。

void setCharacterEncoding(String charset)

设置将被发送到客户端的响应的字符编码(MIME字符集)例如UTF-8。

void setContentLength(int len)

设置HTTP Servlet中的响应的主体内容的长度,这种方法设置了HTTP内容-长度标题。

void setContentType(String type)

如果响应尚未提交,设置要被发送到客户端的响应的内容类型。

void setDateHeader(String name, long date)

用给定的名称和日期值设置一个响应标题。

void setHeader(String name, String value)

用给定的名称和值设置一个响应标题。

void setIntHeader(String name, int value)

用给定的名称和整数值设置一个响应标题。

void setLocale(Locale loc)

如果反应尚未提交,设置响应的语言环境。

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

测试工程:https://github.com/easonjim/5_java_example/tree/master/jspbasics/test5