HttpServletResponse response(中文乱码、文件下载、定时刷新、控制缓存、重定向、注意事项)
2015-04-23 15:00 -夜 阅读(1330) 评论(0) 编辑 收藏 举报可以在html中用<meta http-equiv="" content="">来模拟响应头信息,比如
<meta http-equiv="refresh" content="3;url='/Home/Index'" /> 三秒后,跳转到Home/Index页面
1、向浏览器输出中文乱码
A、乱码原因: 加密方式 和 解密方式 不同造成。
B、浏览器默认解密,一般是gb2313,如果加密方式也是gb2313则不会乱码,但是存在兼容性问题,一般建议手动指定。
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); }
2、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(); // 关闭流 } } }
3、refresh控制定时刷新
A、利用Response设置响应头refresh可以实现页面的定时刷新功能。
B、response.setHeader("Refresh", "3");//3秒刷新一次当前页
C、response.setHeader("Refresh", "3;url='/news/index.jsp'");//三秒后跳转到另外一个页面。
D、也可设置<meta http-equiv="refresh" content="3;url='/Home/Index'" /> 实现相同效果
4、 控制缓存
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(); }
5、response实现请求重定向
A、response.sendRedirec("....");//是 发送两次请求
B、利用 HttpContext 转发实现重定向 是一次请求
/* 要利用ServletContext对象实现转发 */ this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
6、getOutputStream和getWriter方法冲突的问题
A、getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
B、lSerlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎tomcat将调用close方法关闭该输出流对象。
版权声明:本文为博主原创文章,未经博主允许不得转载。