response对象和request对象有是什么?
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
简单来说,想要提取客户端的内容,需要使用request对象(发出请求);想要对客户端做出响应,需要使用response对象(发出响应)。接下来主要讲一下这两个对象。
response对象(响应对象)
HttpServletResponse对象对应服务器的响应,这个对象中封装了向客户端发送数据,发送响应头,发送响应状态码的方法
下面是 HttpServletResponse的方法的来处(ServletResponse就是最上层的接口了):
案例1:重定向
class LocationDemo{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//规定状态码
response.setStatus(302);
//设置响应头
response.setHeader("location", "/ServletDemo2/response/response.html");
}
)
重定向的执行过程并不是直接去访问response.html,而是先访问LocationDemo然后跳转response.html页面。可以在调试中看到状态码(status)
而后又有更简单的方法sendRedirect()完成定向。
/* //规定状态吗
response.setStatus(302);
//设置重定向地址
response.setHeader("location", "/ServletDemo2/response/login.html");*/
//直接重定向
response.sendRedirect("/ServletDemo2/response/login.html");
案例2:简单下载
设置头信息Content-Disposition
/**
* 实现下载最重要的就是头信息的设置
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取文件磁盘路径
String path = getServletContext().getRealPath("/img/2.jfif");
//获取文件名
String filename = null;
//找到最后一个\的位置
int index = path.lastIndexOf("\\");
if (index != -1) {
filename = path.substring(index+1);
}
//假如文件名包含中文,浏览器下载出现中文乱码
String agent = request.getHeader("User-Agent");
//判断是否ie浏览器
if (agent.contains("MISE")) {
//设置成ie能读取的编码格式
filename = URLEncoder.encode(filename,"UTF-8");
}else {
//假如是FireFox,Chrome。。。
}
if (filename != null) {
//设置头信息(最重要的步骤)
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//读取到流中
InputStream in = new FileInputStream(path);
//通过response读取到客户端
OutputStream os = response.getOutputStream();
//io读取
byte[] b = new byte[2014];
int len = 0;
while((len = in.read(b))!=-1) {
os.write(b, 0, len);
}
in.close();
}
}
案例3:禁用缓存
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
*
* 开发人员在项目开发阶段,一般都会禁用浏览器缓存,这样做的原因是为了每次
* 访问都能够获得实时数据。当一个项目上线后,就不会再继续禁用浏览器缓存。
*
* 禁用缓存多用于网银网站,因为要保证获得的都是实时数据
*
* Cache-Control : no-cache
Expires: -1 值是日期类型(setDateHeader())
Pragma : no-cache
*/
//设置头禁用关闭浏览器缓存
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", -1);
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = sdf.format(date);
response.getWriter().write(str);
}
request对象(请求对象)
案例1:获取客户机信息
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String IP = request.getRemoteAddr();
String method = request.getMethod();
String path = request.getContextPath();
System.out.println("访问用户IP:"+IP);
System.out.println("访问方式:"+method);
System.out.println("访问虚拟路径:"+path);
//获取请求头记住来源(防盗链)
String referer = request.getHeader("referer");
//判断浏览器(多用于下载,可以和response下载配合使用,当然response中也要设置头信息撒)
String agent = request.getHeader("user-agent");
//当然还有控制缓存的请求头if-modified-since
//然后接下来就可以做操作
}
案例2:利用请求域传递对象(request域对象)——这也是转发和重定向的区别
在此之前需要明白一个对象:request。该对象只作用于一次请求范围。HTTP协议中已经提到了,每次连接只处理一次请求,所以request对象只在这一次连接中起作用。
而我们之前提到的ServletContext对象是对于整个WEB工程而言,一直存在的。
class RequestDemo3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request域设置内容
request.setAttribute("name", "张三");
/**
* 重定向工作(客户端的绝对路径)
* 至于为什么要用response和绝对路径
* 重定向分为两部分,一部分是用户发送请求,然后服务器response返回找到客户端项目。
*/
response.sendRedirect("/ServletDemo2/RequestDemo4");
/**
* 转发(服务端的绝对路径)
*/
//request.getRequestDispatcher("/RequestDemo4").forward(request, response);
}
}
————————————————————————————————————————————————————————————————————————————————————————————————————
class RequestDemo4 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("你好呀!"+(String)request.getAttribute("name"));
}
}
这种request对象设置域内容,但是重定向后输出结果是null
但若是将上面doGet方法的中使用转发(request.getRequestDispatcher),注释掉重定向,结果为
观察调试和地址栏的情况,明显可以看到,重定向是有页面跳转的,先去页面1拿到状态码然后跳转页面2。转发是直接将页面内容1改为页面2。