日期:2014-05-16  浏览次数:20385 次

JSP乱码和out内置对象
一、深入out对象
1、getOutputStream
返回ServletOutputStream类型的out对象,属于字节输出流
2、getWriter
返回PrintWriter类型的对象,属于字符输出流
切记:同一个servlet程序向客户端输出内容时,只能选其一使用,不可同时都用。
两种头字段
Content-Length:n   向客户端输出前知道内容的大小
Transfer-Encoding:chunked   以下两种情况会出现:
A、输出的内容刚好装满缓冲区
B、手工执行过刷新(flush)操作
3. 案例
案例1:实现动态文件下载
Response.setContentType("application/x-msdownload");
Response.addHeader("Content-Disposition", "attachment;filename=xx.ext");
使用两种类型的out对象都可以实现文本类型的文件下载;
但其它二进制文件只能使用ServletOutputStream类型的out对象来输出文件内容。

案例2:输出图片
Response.setContentType("image/jpeg"); //显示图片
要实现图片下载,头字段的设置还是
Response.setContentType("application/x-msdownload");
Response.addHeader("Content-Disposition”, “attachment;filename=xx.jpg");

4、JSP内置的out对象
属于JspWriter类型的对象
(1)弄清缓冲区的概念,它对out对象输出内容顺序的影响(和printwriter比较)
Printwriter先输出,out对象后输出
(2)弄清回车换行对jsp执行的影响


下面是servlet里面的代码,不会出错
PrintWriter out = response.getWriter();
out.print("wrong!");
request.getRequestDispatcher("input.html").forward(request,response);
原因在于defaultservlet内部输出的时候会先判断是否调用过response.getWriter(),
如果已经调用过,就直接用PrintWriter来输出

二、中文输出问题
设置页面发送的编码要在定义的输出流前面
1、Servlet的中文输出问题:
response.setLocale(new java.util.Locale("zh", "CN")); //在tomcat5下无效
response.setCharacterEncoding("gb2312");//设置PrintWriter的编码
response.setContentType("text/html;charset=utf-8");//可增加Content-Type头字段

2、HTML静态页面中文输出问题:

注意:charset=GB18030最好和文件的编码一致

3、下载文本文件输出中文问题:
response.setContentType("application/x-msdownload;charset=gb2312");
//方法一
response.addHeader("Content-Disposition",attachment;filename=x.txt");
//response.setCharacterEncoding("gb2312");
//方法二
PrintWriter out = response.getWriter();
out.print("中国人民");

4、传参时的中文问题:
(1) get方式提交
String name = request.getParameter("name");
name = new String(name.getBytes("iso8859-1"), "gb2312");
//对get和post方式都有效,并且get方式必须用此方法
配置server.xml文件的Connector元素

添加两个属性
useBodyEncodingForURI="true",可以按照post方式处理
或者URIEncoding="gb2312",可以直接request.getParameter("name")而不会有问题
但不建议大家使用,因为移植到另一个服务器这些参数可能并不提供了.

(2)post方式提交
request.setCharacterEncoding("gb2312");
//只对实体内容有效,也就是只对post方式提交有效
String name = request.getParameter("name");

5、jsp文件的中文输出问题:

注意这个参数很有作用,
1) 可以设置文件的编码
2) 可以设置输出内容的Content-Type
3) 修改以后文件的存储编码也跟着改变[/size][/size]