ITEEDU

SP/Servlet: response

JSP的response隐含对象在转换为Servlet之后,对应于javax.servlet.http.HttpServletResponse型 态对象, HttpServletResponse对象是有关于对客户端请求之响应,您可以利用它来设定一些要响应的讯息,例如标题讯息、响应状态码等,必要的话, 您也可以由HttpServletResponse取得PrintWriter对象,由它来响应客户端,以获得PrintWriter的好处,而不是使用 JSP预设的out(JSPWriter)来应答客户端。

首先介绍几个 response(HttpServletResponse)设定标头(Header)的方法,要使用这些标头,您必须对HTTP协议先有些了解,这请自行查阅相关书籍,这边假设您已经了解标头的意义。

下面是如何设定"Refresh"标头,在指定的时间后刷新网页,或加载指定的网页:

headerDemo.jsp
<%! int reloadCount = 0; %> 
<% 
response.setHeader("Refresh", "3"); 
out.println("realod: " + reloadCount); 
reloadCount++; 
%> 
setHeader()方法是一个通用的标头设定方法,您可以用它来设定任何「名称/值」的标头,上面这个例子会每三秒钟自动加载网页,您可以由网页上不 断递增的数字看到重新加载的次数,如果标头设定的是一个整数值,则您也可以直接使用setIntHeader(),它是专门用来设定整数值标头的版本,

例 如:

response.setIntHeader("Refresh", 3); 
使用setHeader()的好处是,您可以像以下这么设定标头:

response.setHeader("Refresh", 
"3; URL=http://caterpillar.onlyfun.net/");

上面的设定会在加载网页,在3秒之后重新加载指定的网页;注意标头的设定必须在送出任何网页本体(Body)之前设定好,如果网页本体(例如HTML内容)已经送出,则设定标头的动作是无用的。

如果您想要浏览器不要快取网页,由于HTTP/1.0与HTTP1.1的设定方式不同,您可以使用先判定协议种类以设定不同的标头,例如:

headerDemo.jsp
<% 
// HTTP/1.0的话 
if(request.getProtocol().equals("HTTP/1.0")) { 
response.setHeader("Pragma", "no-cache"); 
} 
else if(request.getProtocol().equals("HTTP/1.1")) { 
response.setHeader("Cache-Control", "no-cache"); 
} 
response.setDateHeader("Expires", 0); 
%> 

setDateHeader()是setHeader()的Date设定版本,第二个参数是设定Date的Long数值,0表示GMT 1970/1/1 00:00。

setHeader()、setIntHeader()与setDateHeader()方法会直接覆盖标头设定,如果您要对同一个标头进行多值设定,可以使用add开头的方法,例如:

headerDemo.jsp
<%@page contentType="text/html;charset=Big5"%> 
<% 
response.setHeader("Refresh", "3"); 
response.addHeader("Refresh",
"URL=http://caterpillar.onlyfun.net/"); 
out.println("三秒后重新加载指定网页"); 
%> 
这个例子中先设定标头Refresh为3,然后加入URL信息,新的信息并不会覆盖之前的标头设定,其作用相当于:

&response.setHeader("Refresh", 
"3; URL=http://caterpillar.onlyfun.net/"); 

同样的,以add为开头来设定标头的方法也有Int与Date版本。

response(HttpServletResponse)的setStatus()方法是用来设定回应的状态码,例如404 Not Found,HttpServletResponse类中提供了一些助忆常数设定,例如SC_NOT_FOUND就是表示404状态码(您可以在 Servlet API文件中查询相关的助忆常数),使用setStatus()必须自行处理响应方式,如果是错误相关网页,您可以使用sendError()方法,这个方法会根据服务器的预设错误网页回报方式显示错误讯息,例如:

errorDemo.jsp
<%@page contentType="text/html;charset=Big5"%> 
<% 
response.sendError(response.SC_NOT_FOUND, "找不到档案");
%> 
对Tomcat来说,会显示以下的讯息:

HTTP Status 404 - 找不到档案

type Status

report

message 找不到档案

description

The requested resource (找不到档案) is not available.

.....

使用setStatus()必须自行处理响应方式,下面是一个例子,它可以让浏览器直接导向至指定的网页:

statusDemo.jsp
<% 
response.setStatus(response.SC_MOVED_TEMPORARILY); 
response.setHeader("Location", 
"http://caterpillar.onlyfun.net/"); 
%> 
事实上,上面的程序只要使用sendRedirect()方法就可以了,例如:

redirectDemo.jsp
<% 
response.sendRedirect("http://caterpillar.onlyfun.net/"); 
%> 
response是HttpServletResponse型态的对象,在Servlet的实作中,是从 HttpServletResponse对象取得PrintWriter对象,由它来写出响应至服务器的本体信息,在JSP中也可以取得 PrintWriter对象,例如您可以用PrintWriter来显示例外的堆栈追踪:

exceptionDemo.jsp
<%@page contentType="text/html;charset=Big5" 
isErrorPage="true"%> 
<html> 
<head><title>错误处理页面</title></head> 
<body> 
<H1>网页发生错误:</H1><%=exception%> 
<H2>显示例外堆栈追踪:</H2> 
<% 
exception.printStackTrace(response.getWriter()); 
%> 
</body> 
</html>