32、servlet -重定向/下载/缓存/中文乱码

32、servlet --重定向/下载/缓存/中文乱码
重定向1、sendRedirect
rep.sendRedirect(path+"/pages/login.jsp?info=username or password is worng .");
重定向2、Location  一定要设置302  302是指请求重定向
rep.setStatus(302);
rep.setHeader("Location", basePath+"pages/login.jsp?info=username or password is worng .");
重定向3、Refresh
rep.setHeader("Refresh", "2,pages/login.jsp?info=username or password is worng .");


使用sendRedirect()传递参数
1、static变量,纯servlet时可用
2、...jsp?name=name&pwd=111122   缺点:只能穿字符串,而不能传对象
3、使用session
    传字符串:
//存入seesion
 req.getSession().setAttribute("name", name);
//重定向1、sendRedirect
rep.sendRedirect(path+"/pages/login.jsp?info=username or password is worng .");

  获取seesion
  <%=request.getSession().getAttribute("name") %>
传递对象:
  req.getSession().setAttribute("obj", ct);
  <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
   ${obj.name }
在servlet中获取:
   Constant ct = (Constant)request.getSession().getAtttibute("obj");



web容器下载文件的原理:
1、将图片图取到内存中
2、将文件发送给浏览器
response.setContentType("text/html;charset=utf-8");
		//提示浏览器有文件下载,自动弹框,默认是打印在浏览器页面上
		response.setHeader("Content-Disposition", "attachment;filename=1.jpg");
		//获取文件的真实路径
		String realPath = this.getServletContext().getRealPath("/images/1.jpg");
		//System.out.println(realPath);
		//将文件存入内存,创建输入流
		FileInputStream fi = new FileInputStream(realPath);
		byte buff [] = new byte[2048];
		//实际每次读取了多少字节
		int len = 0;
		OutputStream os = response.getOutputStream();
		while((len=fi.read(buff))>0)
		{
			//发送给浏览器
			os.write(buff,0,len);
		}
		os.close();
		fi.close();
	}



缓存:
浏览器缓存(Browser Caching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览。
浏览器默认会缓存所用页面,但对于及时交互性较强的网站如银行、证券系统是不合适的;
1、禁用缓存
response.setDateHeader("Expires",-1);  [ie]
response.setHeader("Cache-control","no-cache"); [firefox]
response.setHeader("Pragme","no-cache"); [other browser]

2、设置缓存时间
response.setDateHeader("Expires",System.currentTimeMillis()+3600);


web容器对每个请求都会 创建一个request对象和一个response对象;作为service()方法的参数;
response不能同时使用getWriter()和getOutputStream();
原因:
1、web容器拆解response为http协议识别的信息
2、web容器检测response所带的对象、属性、流等,查看liu是否关闭,没关闭就容器来关闭流;
3、web关闭了writer流,而还存在output流,提示流已经被关闭错误。


request的中文乱码处理:
response的中文乱码处理:
发生中文的3中情况
1、表单
2、超链接?name=民族(本质是get方式提交)
解决方法:
doPost()
request.setCharacterEncoding("utf-8");
doGet()
String name = req.getParameter("name");
try {
String newname = new String(name.getBytes("iso-8859-1"),"utf-8");
3、response.sendRedirect("...?name=名字");
  而浏览器没有正常显示/login.jsp?info=   后面的汉字不见了。。。
  要进行转码:?name=%E9%9A%8F%E8%BA%AB%E9%82%AE
  rep.sendRedirect(path+"/pages/login.jsp?info="+new String("随身".getBytes("utf-8"),"iso-8859-1"));
  String info = (String)request.getParameter("info");
  String newinfo = new String(info.getBytes("iso-8859-1"),"utf-8");

session只要接收的不是乱码,就不会出现乱码。

文件下载时中文乱码
response.setHeader("Content-Disposition", "attachment;filename=名字.jpg");
解决方法:
String name = new String("名字.jpg".getBytes("utf-8"),"iso-8859-1");
response.setHeader("Content-Disposition", "attachment;filename="+name);

常用编码:gbk,gb2312,iso-8859-1,utf-8