HttpServletResponse response(中文乱码、文件下载、定时刷新、控制缓存、重定向、注意事项)

能够在html中用<meta http-equiv="" content="">来模拟响应头信息,好比html

<meta http-equiv="refresh" content="3;url='/Home/Index'" /> 三秒后,跳转到Home/Index页面
java


一、向浏览器输出中文乱码浏览器


A、乱码缘由: 加密方式 和 解密方式 不一样形成。缓存

B、浏览器默认解密,通常是gb2313,若是加密方式也是gb2313则不会乱码,可是存在兼容性问题,通常建议手动指定。tomcat

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 方式一

		// 输出UTF-8的数据,有出现乱码问题,通知浏览器以UTF-8码表打开回送的数据
		// response.setHeader("content-type", "text/html;charset=UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		String data = "你好";
		OutputStream out = response.getOutputStream();
		out.write(data.getBytes("UTF-8"));

		
		
		// 方式二

		// 更改response的码表,通知服务器用UTF-8码表去取response中的数据,而后写给客户机
		response.setCharacterEncoding("UTF-8");
		// 通知浏览器以UTF-8码表打开回送的数据
		// 调用了这句话,内部会执行response.setCharacterEncoding("UTF-8"); 所以能够省略此句。
		// response.setHeader("content-type", "text/html;charset=UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter writer = response.getWriter();
		writer.write(data);
	}




二、response实现文件下载服务器


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 1.获取须要下载的文件
		String path = this.getServletContext().getRealPath(
				"/download/一直很安静.mp3");
		String filename = path.substring(path.lastIndexOf("\\") + 1);
		// System.out.println(filename);
		// 2.通知浏览器如下载方式打开
		// 若是文件名中包含中文,则文件名要进行URL编码,URLEncoding.encode;若是不进行编码则文件名显示错误而且不可下载。
		response.setHeader("content-disposition", "attachment;filename="
				+ URLEncoder.encode(filename, "UTF-8"));
		// 3.向浏览器写出数据
		FileInputStream in = null;
		try {
			OutputStream out = response.getOutputStream();
			in = new FileInputStream(path);
			byte buffer[] = new byte[1024];
			int len = 0;
			while ((len = in.read(buffer)) > 0) {
				out.write(buffer, 0, len);
			}
		} finally {
			if (in != null) {
				in.close(); // 关闭流
			}
		}
	}



三、refresh控制定时刷新jsp


A、利用Response设置响应头refresh能够实现页面的定时刷新功能。ui

B、response.setHeader("Refresh",  "3");//3秒刷新一次当前页this

C、response.setHeader("Refresh",  "3;url='/news/index.jsp'");//三秒后跳转到另一个页面。编码

D、也可设置<meta http-equiv="refresh" content="3;url='/Home/Index'" /> 实现相同效果



四、 控制缓存


A、利用response设置expires响应头为0或-1浏览器就不会缓存当前资源。(一样功能的头还有Cache-Control:no-cache、Pragma: no-cache)

B、设置缓存文件

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {	
		
		// System.currentTimeMillis() 当前时间毫秒 ; 1000l 加l表明是long类型,相乘的结果也是long类型。
		response.setDateHeader("Expires", System.currentTimeMillis() + 1000l
				* 3600 * 24 * 30);

		InputStream in = new FileInputStream(this.getServletContext()
				.getRealPath("1.jpg"));
		OutputStream out = response.getOutputStream();

		byte[] bs = new byte[1024];
		int i = 0;
		while ((i = in.read(bs)) != -1) {
			out.write(bs, 0, i);
		}
		in.close();
	}


五、response实现请求重定向


A、response.sendRedirec("....");//是 发送两次请求

B、利用 HttpContext 转发实现重定向 是一次请求

		/* 要利用ServletContext对象实现转发 */
		this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);



六、getOutputStream和getWriter方法冲突的问题


A、getOutputStreamgetWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另外一方法。  

B、lSerlvetservice方法结束后,Servlet引擎将检查getWritergetOutputStream方法返回的输出流对象是否已经调用过close方法,若是没有,Servlet引擎tomcat将调用close方法关闭该输出流对象。

相关文章
相关标签/搜索