大可制作:QQ群:31564239(asp|jsp|php|mysql)

JSP/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>