response对象表示服务器端对客户端的回应,response本身是HttpServletResponse的对象,HttpServletResponse对象本身也是ServletResponse对象的子接口,这点与reqeust是一样的。通过下面来验证response是HttpServletResponse的实例:
<% if ( response instanceof HttpServletResponse) { out.println("是HttpServletResponse的实例"); } else { out.println("不是HttpServletResponse的实例"); } %>
response中也有很多用法,最长用的有设置头信息、跳转、Cookie,其主要方法有:
// 设置头信息的名字和内容 public void setHeader(java.lang.String name, java.lang.String value); // 跳转,由一个页面跳往另外一个页面 public void sendRedirect(java.lang.String location) throws java.io.IOException; // 向客户端加入cookie public void addCookie(Cookie cookie); // 设置内容的返回类型 public void setContentType(java.lang.String type);
头信息是随着内容一起提交到服务器端,或者从服务器端随内容一起发到客户端,在jsp中可以使用request对象的方法获取头信息。如:
// 取出全部头信息内容 public java.util.Enumeration getHeaderNames(); // 取得每一个头信息内容 public java.lang.String getHeader( java.lang.String name);
通过上面的方法获取的头信息属于http自己提交过的,但是用户也可以手工进行头信息的设置,回应给客户端,但是头信息的内容还是比较多的,用得较多的就是定时刷新:
// 每隔两秒自动刷新页面一次 response.setHeader("refresh","2");
经常看见网站上页面过了几秒后就会跳转到其他页面的现象,这种跳转成为服务器端的跳转,页面的地址会发生变化
// 三秒后自动刷新并跳转到新的页面上去 response.setHeader("refresh","3;URL=../emp.jsp");
在HTTP里面也可以实现这样的跳转,也是在头部信息完成的:
<head> <title>复杂表单的提交</title> <meta http-equiv="refresh" CONTENT="2; URL=../emp.jsp"> </head>
以上都是服务器端的跳转。如:response.setHeader("refresh","5;URL=demo.jsp")。在客户端的跳转中我们使用response.sendRedirect()就可以完成。如下:
response.sendRedirect("demo01.jsp");
此种跳转依然可以使用重写地址的方式向跳转页传递参数,如下:
response.sendRedirect("demo01.jsp?ref=helloword");
接收也面依然使用request.getParameter()方法接收
服务器端的跳转
<jsp:forward page="" />
无条件跳转,只要语句执行到此处就会跳转,而且可以传递ruquest参数
客户端的跳转
response.setHeader("") reseponse.sendRedirect("")
所有页面执行完成之后在进行跳转,不能传递request范围的参数
cookie是服务器端保存在客户端的一组数据,安全性较差,在JSP中,cookie属于单独的一个类,定义在javax.servlet.http.*
Cookie类的定义
public class Cookie extends java.lang.Ojbect implemnets java.lang.Cloneable
Cookie类的主要方法
// Cookie的构造方法,实例化Cookie对象,传入名称和内容 public Cookie (String name,String value) // 取得Cookie的名字 public java.lang.String getName() // 修改内容 public void setValue(java.lang.String newValue) // Cookie的最大保存时间 pubilc void setMaxAge(int expiry)
【实例】设置定时刷新的头信息--response_demo_01.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head><title>www.jxau.edu.cn</title></head> <body> <%! // 定义全局变量 int count = 0; %> <% // 设置两秒刷新一次 response.setHeader("refresh", "2"); %> <h1>已经访问了<%=count++%>次!</h1> </body> </html>
【实例】定时跳转(属于客户端跳转):3秒后跳转到其它网页response_demo_02.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head> <title>www.hxstrive.com</title> </head> <body> <h1>3秒后跳转到response_demo_01.jsp页面,如果没有跳转请按 <a href="response_demo_01.jsp">这里</a>!</h1> <% // 3秒后跳转到response_demo01.jsp response.setHeader("refresh", "3;URL=response_demo_01.jsp"); %> </body> </html>
提示HTML中的跳转指令:
<META HTTP-EQUIV="refresh" CONTENT="3" "3;URL=response_demo_01.jsp">
比较:
动态页请求:要经过Web Container进行代码的拼凑操作
静态页请求:直接读取文件系统
使用HTML进行定时跳转的情况:页面中没有JSP代码
【实例】<jsp:forward>服务器跳转response_demo_041.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head> <title>服务器跳转</title> </head> <body> <% System.out.println("============forward跳转前============"); %> <jsp:forward page="response_demo_01.jsp"/> <% System.out.println("============forward跳转后============"); %> </body> </html>
执行结果:
============forward跳转前============
...........每隔两秒输出一句..........
============forward跳转前============
【实例】response.sendRedirect()服务器跳转response_demo_042.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head> <title>服务器跳转</title> </head> <body> <% System.out.println("============forward跳转前============");%> <% response.sendRedirect("response_demo_01.jsp");%> <% System.out.println("============forward跳转后============");%> </body> </html>
执行结果:
============forward跳转前============
============forward跳转后============
提示:
在代码开发中,尤其是JDBC操作中,一定要在<jsp:forward>语句之前关闭数据库连接,否则再也无法关闭该数据库连接。而如果数据库连接始终没有关闭,达到一定程度是将出现“数据库连接已经达到最大的异常”,此时只有重启服务器了