![JSP应用与开发技术(第3版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/554/31794554/b_31794554.jpg)
4.3 response对象
response对象用于将服务器端数据发送到客户端以响应客户端的请求。response对象实现HttpServletResponse接口,可对客户的请求做出动态的响应,向客户端发送数据,如Cookie、HTTP文件头信息等,一般是HttpServlet.Response类或其子类的一个对象。
4.3.1 response对象常用方法
response对象的主要方法及说明如表4-3所示。
表4-3 response对象的主要方法及说明
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-T106_76116.jpg?sign=1739200621-WgpONhYhROrP3JedsB6AweN3bpmtvwxW-0-e65c69a6fc6877e49c4868697d7ad8a7)
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的代码如下:
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P107_76118.jpg?sign=1739200621-Bu2OzU1tMkqLrhy5mkE8e7qbQ5KFTass-0-0768c89d982f98908aeb18e96b9462e8)
在浏览器中输入http://localhost:8080/ch04/ response/setContentType.jsp,运行结果如图4-8所示。
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P107_8975.jpg?sign=1739200621-nr70eE9ecWMqmu4QzotiJ5SlvvWTiml1-0-7a90ffcaf3b747dcf8b27a6ce52bbe72)
图4-8 setContentType.jsp运行结果
分别单击word、excel按钮,则会采用不同的方式打开或保存setContentType.jsp文件,如图4-9所示。
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P107_8943.jpg?sign=1739200621-nkm0oZRzjMN7jJuE3cztNc2HlSApGgKq-0-dfcdbb9550cb00fde3d64dc1cfac3712)
图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的代码如下:
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P108_76126.jpg?sign=1739200621-obm13qVw5LsaWlgsaWpJ2FHzPkoMkA43-0-b9642bd59240fe3f237655f02396f213)
运行结果如图4-10所示,可以看到页面每一秒钟刷新一次,显示新的时间和随机数。
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P108_9079.jpg?sign=1739200621-ZpUd6JntP3UVkRbWGDBUTgl7nIIhuRhk-0-ed383dd5cf716492aba61a954283b7f2)
图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的代码如下:
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P109_76131.jpg?sign=1739200621-5ndiCBSrq0h3w3QNHSEcxgnNiAzGW7sF-0-6ff7265d0bb0d5677b9272bff7206dea)
redirect.jsp的代码如下:
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P109_9173.jpg?sign=1739200621-hcPQ4Z9eRKMGTjzlsqwH2rSTXgjQyPAz-0-b373941a12290f00b741d8224bb30808)
在浏览器中输入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所示文字。
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P109_9248.jpg?sign=1739200621-hgYTRnIor6o6kZaFK74doprpxg6fDIaF-0-050479b89acf55a1d400dd5eea16f8d5)
图4-11 页面重定向运行结果
4. 设定状态显示码的方法void setStatus(int n)
当服务器对请求进行响应时,发送的首行被称为状态行。
response的状态行包括3位数字的状态代码,下面是对5类状态代码的简单描述。
1**(1开头的3位数字):主要是实验性质的。
2**:用来表示请求成功。
3**:用来表示在请求满足之前应该采取进一步的行动。
4**:当浏览器做出无法满足的请求时,返回该状态码。
5**:用来表示服务器出现的问题。
一般情况下页面中不需要修改状态行,在服务器处理页面时一旦出现问题,服务器会自动响应,并发送响应的状态行代码。因此了解状态代码能够便于程序调试。通过状态代码提示能够快速查找出程序出现的问题。
状态码及其说明如表4-4所示。
表4-4 状态代码表
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-T110_76136.jpg?sign=1739200621-rVYS6bRnb7YR987NGvEDrqqbGbE0SAAK-0-3a6939ff56bc368293be0e5eb90d07db)
【例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的代码如下:
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P111_76139.jpg?sign=1739200621-dGzJWi75U5EttfBZqRnuGQUReUHaxSYl-0-f9365b8145bd292a2802eaa4d541343d)
status2.jsp的代码如下:
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P111_76140.jpg?sign=1739200621-ArJlj2y4KQ0ti8wMK9LFCXID4g7eYW2v-0-d590ab8bc078fb356cb262e6097fbb76)
status3.jsp的代码如下:
<%@ page contentType="text/html; charset=GB2312"%> <html> <body> <% response.setStatus(500); %> </body> </html>
程序执行结果如图4-12所示。
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P112_76144.jpg?sign=1739200621-ACH4ez7uYbCFbuIoU7esX72Ax8qb6BhQ-0-5f09d3a1db00295968cca8ad97b24f2d)
图4-12 程序执行过程
5. void addCookie(Cookie cookie)
添加一个Cookie对象,用来保存客户端的用户信息。可以通过request对象的getCookie()方法获得这个Cookie。Cookie可以保存用户的个性化信息,从而对下一次访问提供方便。
【例4-9】创建responseCookie.jsp页面,通过response对象对Cookie进行操作。
responseCookie.jsp的代码如下:
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P113_76148.jpg?sign=1739200621-RlnKVv96oCLunVgGGu6u6wDENzRHlYf1-0-575bf576808518b660c770471fd54cf9)
responseCookie.jsp在第一次执行时由于没有创建Cookie对象,所以显示如图4-13所示。
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P113_9827.jpg?sign=1739200621-KwEz8D7ZkgvoXrKlmDQmx6lK10EC5wpU-0-83d2a6dc1e6a75b4057c7c31eff112a2)
图4-13 responseCookie.jsp第一次执行时的效果
当刷新页面后,会显示所创建的Cookie对象的名cookietest和它的值,即上次访问的时间,每次刷新都会把当前时间和上次访问时间显示出来,如图4-14所示。关于Cookie的内容请参考第5章的详细介绍。
![](https://epubservercos.yuewen.com/B91E50/17214369404807006/epubprivate/OEBPS/Images/Figure-P113_9830.jpg?sign=1739200621-28Y1VDre5JIhb7QGkwWLxqQRRTwaLhmT-0-678f1e6dc0ba14a1310f59f86b68087d)
图4-14 responseCookie.jsp刷新之后的效果