JSP应用与开发技术(第3版)
上QQ阅读APP看书,第一时间看更新

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刷新之后的效果