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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值