response对象、request对象详解

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。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值