从请求与响应入手,这是经过tomcat的两个必经之路;
页面:
当页面设定了编码集(utf8)
请求A. 是post(传递的数据放在请求体中):
B.是get(此时服务端设置utf8编码集不起作用,因为数据是经过请求行,而之前是经过请求体。)
服务器(web容器):
默认设置ISO-8859-1字符
服务端小程序(servlet)
此时工作空间为UT8
A.request.setCharacterEncoding("utf8");此时不会以ISO-8859-1生成字符,而是生成UTF8.所以不乱码。
B.new String(request.getParmt("...").getBytes("ISO-8859-1"), "UTF8");此时生成UTF8字符
响应 1.response.setCharacterEncoding("UTF-8");只是设置web容器的字符集为utf8
2.response.setHeader(content-type,text/html;charset=utf8)不光告诉tomcat,还告诉浏览器字符集为utf8(缩写代码为:response.setContentType(“text-html;charset =utf8”)
响应下载:
a.除了读写文件之外.还是设置强制下载文件类型.
response.setHeader("Content-Disposition","attachement;filename ="+name)
b.这时将new String(getBytes("gbk"), "ISO-8859-1")此时name可以传入a.了
c.拓展:设置浏览器解析文件类型:
response.setHeader("Content-Type",this.getServletContent.getMimeType("web-content下的某个文件夹”+name)(但这一步浏览器自动做)
最后注意编程时:不得响应字符流与字节流同时使用。会报web容器已经用过getWriter()
浏览器:
1.此时浏览器默认的如果是gbk字符那么就会产生乱码,因为底层字节是utf8的。
a.默认编码集为gbk的会出现下载中文的文件名,不显示文件名。
注意:浏览器有缓存资源的功能。业务场景:点击更改验证码.此时请求servlet路径不变。图片不发生改变.解决方案是:使用请求行加参数。?time=new Date().getTime().