4.3 response对象
response对象用于将服务器端数据发送到客户端以响应客户端的请求。response对象实现HttpServletResponse接口,可对客户的请求做出动态的响应,向客户端发送数据,如Cookie、HTTP文件头信息等,一般是HttpServlet.Response类或其子类的一个对象。
4.3.1 response对象常用方法
response对象的主要方法及说明如表4-3所示。
表4-3 response对象的主要方法及说明
4.3.2 response对象应用实例
1. public void setContentType(String type)动态响应contenType属性
当一个用户访问一个JSP页面时,如果该页面用page指令设置页面的contentType属性是text/html,那么JSP引擎将按照这种属性值作出反映。如果要动态改变这个属性值来响应客户,需要使用response对象的setContentType(string s)方法来改变contentType的属性值。
设置输出数据的类型如下。
text/html:网页。
text/plain:纯文本。
application/x-mse xcel:Excel文件。
application/msword:Word文件。
【例4-5】创建setContentType.jsp页面,应用setContentType改变contentType的属性值。
setContentType.jsp的代码如下:
在浏览器中输入http://localhost:8080/ch04/ response/setContentType.jsp,运行结果如图4-8所示。
图4-8 setContentType.jsp运行结果
分别单击word、excel按钮,则会采用不同的方式打开或保存setContentType.jsp文件,如图4-9所示。
图4-9 用Word方式或Excel方式打开setContentType.jsp文件
如果想以其他类型显示文件,只需修改response.setContentType(String contentType);中的contentType参数的相应类型即可。
2. 设置刷新public void setHeader(Stringname, String value)
setHeader可以设置HTTP应答报文的首部字段和值;利用setHeader()方法可以设置页面的自动刷新。例如:
reponse.setHeader("Refresh","5"); //5秒种后自动刷新本页面 reponse.setHeader("Refresh", "5;URL=http://www.163.com");//5秒种后自动跳转到新页面
【例4-6】在refresh.jsp页面中控制页面的刷新频率,动态设置网页刷新。
refresh.jsp的代码如下:
运行结果如图4-10所示,可以看到页面每一秒钟刷新一次,显示新的时间和随机数。
图4-10 refresh.jsp运行结果
3. void sendRedirect(String redirectURL)将客户端重定向到指定的URL
在某些情况下,当响应客户时,需要将客户重新引导至另一个页面,可以使用response的sendRedirect(URL)方法实现客户的重定向。
sendRedirect和<jsp:forward>的区别如下:
response.sendredirect()会在客户端呈现跳转后的URL地址,这种跳转称为客户端跳转。使用response.sendredirect()方法将重定向的URL发送到客户端,浏览器再根据这个URL重新发起请求。所以用这个方法时,在浏览器地址栏上会看到新的请求资源的地址。并且这时的request和response都与第一次的不一样了,因为产生了新的request和response。
使用<jsp:forward>完全是在服务器上进行,浏览器地址栏中的地址保持不变,这种跳转称为服务器端跳转。所以使用这个方法时没有产生新的request和response,因为request没有变,在同一个请求内,可以用request来传递参数。
response.sendRedirect()方法想带参数的话,在地址中写成xxx.jsp?param1=aaa&...这种形式传递参数。<jsp:forward>能够使用<jsp:param/>标签向目标文件传送参数和值,目标文件必须是一个动态的文件,能够处理参数。
<jsp:forward>后面的语句不会被执行,也不会继续发送到客户端;response.sendRedirect()方法后面的语句会继续执行,除非语句前面有return。
<jsp:forward>是在服务器的内部进行转换,只发送给客户端最后转到的页面,速度会比较快;response.sendRedirect()方法需要服务器与客户端之间的往返,可以转到任何页面,包括网络有效域名,但速度比较慢。
【例4-7】页面重定向实例。在sendRedirect.jsp中输入用户名,然后重定向到redirect.jsp页面,显示输入的用户名。
sendRedirect.jsp的代码如下:
redirect.jsp的代码如下:
在浏览器中输入http://localhost:8080/ch04/response/sendRedirect.jsp,在表单中输入数据后单击login按钮,会发现地址栏中的地址变为http://localhost:8080/ch04/response/redirect.jsp?sendname =xxx,说明已经跳转到其他的URL。
如果把上例中的页面重定向语句response.sendRedirect("redirect.jsp?sendname=" + name);改为<jsp:forward page="redirect.jsp"/>不用传递参数name,在redirect.jsp中采用String sendname =request.getParameter("name");即可得到输入的用户名。注意,在这里参数名为name,和表单项的名字一致,说明request没有改变,在同一个请求内。但是如果采用response.sendRedirect()重定向必须传递参数,否则得到null值,因为产生了新的request对象。
另外,response.sendRedirect()方法后面的语句会继续执行,可以看到控制台上输出的文字,程序执行结果如图4-11所示。当然如果改为<jsp:forward page="redirect.jsp"/>,则控制台上不会显示,如图4-11所示文字。
图4-11 页面重定向运行结果
4. 设定状态显示码的方法void setStatus(int n)
当服务器对请求进行响应时,发送的首行被称为状态行。
response的状态行包括3位数字的状态代码,下面是对5类状态代码的简单描述。
1**(1开头的3位数字):主要是实验性质的。
2**:用来表示请求成功。
3**:用来表示在请求满足之前应该采取进一步的行动。
4**:当浏览器做出无法满足的请求时,返回该状态码。
5**:用来表示服务器出现的问题。
一般情况下页面中不需要修改状态行,在服务器处理页面时一旦出现问题,服务器会自动响应,并发送响应的状态行代码。因此了解状态代码能够便于程序调试。通过状态代码提示能够快速查找出程序出现的问题。
状态码及其说明如表4-4所示。
表4-4 状态代码表
【例4-8】设置响应的状态行示例。在setStatus.jsp中将几个超级链接链接到不同的页面,根据设置的状态码显示不同的页面状态。
setStatus.jsp的代码如下:
<%@ page contentType="text/html; charset=GB2312"%> <html> <body bgcolor=cyan> <font size=3> <p>单击下面的超级链接:<br> <a href="status1.jsp">状态行请求超时<br> <a href="status2.jsp">状态行请求成功<br> <a href="status3.jsp">状态表示服务器内部错误 </font> </body> </html>
status1.jsp的代码如下:
status2.jsp的代码如下:
status3.jsp的代码如下:
<%@ page contentType="text/html; charset=GB2312"%> <html> <body> <% response.setStatus(500); %> </body> </html>
程序执行结果如图4-12所示。
图4-12 程序执行过程
5. void addCookie(Cookie cookie)
添加一个Cookie对象,用来保存客户端的用户信息。可以通过request对象的getCookie()方法获得这个Cookie。Cookie可以保存用户的个性化信息,从而对下一次访问提供方便。
【例4-9】创建responseCookie.jsp页面,通过response对象对Cookie进行操作。
responseCookie.jsp的代码如下:
responseCookie.jsp在第一次执行时由于没有创建Cookie对象,所以显示如图4-13所示。
图4-13 responseCookie.jsp第一次执行时的效果
当刷新页面后,会显示所创建的Cookie对象的名cookietest和它的值,即上次访问的时间,每次刷新都会把当前时间和上次访问时间显示出来,如图4-14所示。关于Cookie的内容请参考第5章的详细介绍。
图4-14 responseCookie.jsp刷新之后的效果