重定向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