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]