5.3 response内置对象
与request对象相对应,response对象用于对客户端提交的请求做出动态响应,将JSP服务器处理后的信息传回到客户端。response对象的主要方法如表5.3所示。
表5.3 response对象中常用方法
response对象的用法不像request对象那样比较集中,其应用的方向相对分散,没有过多的共同点,显得比较杂乱。因此下面通过对response对象的几个典型应用的分析使读者对该对象有更清楚的认识。
5.3.1 response实现页面转向
使用response对象的sendRedirect(String location)方法可以实现页面的转向。在第4章中介绍过的<jsp:forward>动作指令也能够实现页面的转向,那么这两种转向有什么不同呢?它们的区别主要体现在两个方面。
❑ <jsp:forward>动作指令是JSP引擎中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址。sendRedirect(String location)方法则是完全的跳转,浏览器将会得到跳转后的地址,并重新发送请求链接。这样,从浏览器的地址栏中就可以看到跳转后的链接地址。
❑ <jsp:forward>动作指令中的page属性用来指定转向的地址,但该地址必须是一个相对路径,简单地说也就是,转向页面和转向到的页面必须位于一个Web应用中。而sendRedirect()方法中的location属性也是用来指定转向的地址,但该地址既可以是相对路径也可以是一个合法的URL,也就是说使用sendRedirect()方法可以转向到Internet中存在的任何网页中。
【实例5-5】使用response实现页面转向。
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <html> 03 <body> 04 include编译指令测试<br> 05 <% 06 response.sendRedirect("include.jsp"); //将页面转向到同一个应用程序中的 include.jsp页面 07 %> 08 </body> 09 </html>
【代码说明】该页面的第6行使用sendRedirect()方法将转向到include.jsp页面。
include.jsp页面的具体代码如下:
01 <%@ page contentType="text/html;charset=ISO-8859-1"%> 02 <%! String str="Here is include's context!"; //声明要显示的字符串对象%> 03 <% out.println(str+"<br>"); //将字符串显示到页面上%>
图5.8 使用sendRedirect()方法转向到的页面
【代码说明】该页面的第2行声明一个字符串对象,并在第3行使用out对象将字符串显示在页面上。
【运行结果】实例5-5 的JSP页面的执行结果如图5.8所示。
与第4章中的实例4-5的执行结果相比较可以看出,实例4-5运行结果中浏览器的地址栏中显示的是转向之前的页面路径,而本实例的运行结果中浏览器的地址栏中显示的则是转向之后的页面路径。
如果将实例5-5的代码修改如下:
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <html> 03 <body> 04 include编译指令测试<br> 05 <% 06 response.sendRedirect("http://www.sina.com"); //将页面转向到应用程序之外的页面 07 %> 08 </body> 09 </html>
图5.9 显示转向到的站外页面
该页面的第6行将使用sendRedirect()方法转向到如图5.9所示的新浪网站的首页面,这表明使用sendRedirect()方法可以转向到Internet中存在的任何网页中。
5.3.2 动态设置页面返回的MIME类型
在JSP中可以使用page编译指令来设置返回页面的MIME返回类型,但是在这里设置是在页面的编译阶段,也就是说一旦设置完成后,在页面的运行阶段是不能进行修改了。而使用response对象中的setContentType(String type)方法来动态设置页面的返回类型。
【实例5-6】动态设置页面的返回类型。在该实例中将在页面中包含一个文本文件,然后在运行时由用户选择页面的返回类型。
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY><Font size=5 > 04 <P>使用什么方式显示成绩? 05 <FORM action="show.jsp" method="post" name=form> 06 <INPUT TYPE="submit" value="word" name="submit1"> 07 <INPUT TYPE="submit" value="excel" name="submit2"> 08 </FORM> 09 </FONT> 10 </BODY> 11 </HTML>
【代码说明】在该页面的第6~7 行的<form>表单中声明了两个提交按钮,单击任何一个提交按钮都将请求show.jsp页面。
然后创建一个文本文件A.txt,在其中输入如下内容:
姓名 数学 英语 语文<br> 李明 85 77 92<br> 王超 95 88 75<br> 张丽 88 92 77<br> 杨梅 96 85 88<br>
在show.jsp页面中包含该文本文件,该页面将根据获取的提交按钮的value值来判断用户到底是单击了哪一个提交按钮。并根据用户单击的提交按钮来动态设置返回页面的类型,show.jsp页面的具体代码定义如下:
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY> 04 <% String str1=request.getParameter("submit1"); //获取submit1按钮的值 05 String str2=request.getParameter("submit2"); //获取submit2按钮的值 06 if(str1==null)//如果str1为null,则表示submit1按钮没有被单击,这时将str1设置为 空字符串 07 {str1=""; 08 } 09 if(str2==null) //如果str2为null,则表示submit2按钮没有被单击,这时将str2设置 为空字符串 10 {str2=""; 11 } 12 if(str1.startsWith("word")) //如果str1 字符串以“word”开头,则页面以word 文档形式返回 13 {response.setContentType("application/msword;charset=GB2312"); 14 15 } 16 if(str2.startsWith("excel")) //如果str2字符串以“excel”开头,则页面以excel 文档形式返回 17 {response.setContentType("application/x-msexcel;charset=GB2312"); 18 } 19 %> 20 <jsp:include page="A.txt"/> 21 </BODY> 22 </HTML>
【代码说明】该页面的第4~5行用来获取提交按钮的参数,第12~18行将根据提交按钮的参数来动态设置页面返回类型,第13行设置页面返回类型为Word形式,第17行设置页面返回类型为Excel形式。
说明
setContentType()方法中的MIME类型可以设置为application/x-msexcel、text/html、application/msword等。
【运行结果】实例5-6的JSP页面的执行结果如图5.10所示。当单击“word”提交按钮时,将以Word文档的形式返回如图5.11所示的页面。当单击“excel”提交按钮时,将以Excel文档的形式返回如图5.12所示的页面。
图5.10 用户选择显示方式的页面
图5.11 以Word文档的形式返回页面
图5.12 以Excel文档的形式返回页面
5.3.3 设置HTTP协议的传送文件头信息
request对象可以使用getHeaders(String name)方法来获取HTTP协议中的头信息,与之对应,使用response对象的setHeader(String name,String value)方法可以在返回页面的同时设置HTTP协议中的头信息,从而对返回给客户端的页面进行特殊设置。
例如,有时候当访问某个页面时,返回的页面却是之前的数据,执行浏览器上的刷新操作,才能看到更改数据后的结果。这个问题有时是因为浏览器会将之前浏览过的数据存放在浏览器的缓存中,所以当再次访问时,浏览器会直接从本地缓存中取出,因此会显示之前旧的数据。为了解决这一问题,可以在JSP页面的开头添加如下代码:
<% if (request.getProtocol().compareTo("HTTP/1.0")==0) //判断客户端是否使用的是HTTP 1.0版本 response.setHeader("Pragma", "no-cache"); //HTTP 1.0协议中设置禁用缓冲 区的格式 else if (request.getProtocol().compareTo("HTTP/1.1")==0) //判断客户端是否使用的是 HTTP 1.1版本 response.setHeader("Cache-Control", "no-cache"); //HTTP 1.1协议中设置禁用缓冲 区的格式 response.setDateHeader("Expires", 0); //设置缓存的过期时间为0秒 %>
上述代码中首先调用request对象的getProtocol()方法来获取当前使用的协议,如果为HTTP/1.0,就设定HTTP头信息内容为setHeader("Pragma", "no-cache");若为HTTP/1.1就设定HTTP头信息为setHeader("Cache-Control", "no-cache"),这是根据不同的HTTP协议版本来取消缓存。最后再调用response对象的setDateHeader("Expires", 0)方法来设置缓存的过期时间为0秒。这样浏览网页时,就不会将访问过的页面再存放到浏览器或是代理服务器的缓存中了。
下面再举一个设置HTTP协议头信息的常用案例。在制作动态网页时常常需要对一个网页进行定时刷新,以便更新要显示的内容,这就需要用到response对象的setHeader()方法。例如,需要让浏览器每隔1分钟就重新刷新此网页,则可以使用如下代码:
response.setHeader("Refresh" , "60")
如果想要过10秒后,调用浏览器转到http://www.sina.com的首页面时,则可以使用如下代码:
response.setHeader("Refresh","10; URL=http://www.sina.com" )
说明
在很多应用开发中经常在用户注册后自动跳转到用户之前访问的页面,所以该功能是日常开发中经常用到的功能。