学习jsp(3)
HttpServletRequest和HttpServletResponse:
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h1>Servlet NewServlet at " + request.getContextPath() + "</h1>");
out.println("<h1>请求方式:"+request.getMethod()+"<h1>");
out.println("<h1>资源名部分:"+request.getRequestURI()+"<h1>");
out.println("<h1>参数部分:"+request.getQueryString()+"<h1>");
out.println("<h1>协议名和版本:"+request.getProtocol()+"<h1>");
out.println("<h1>Web程序的路径:"+request.getContextPath()+"<h1>");
out.println("<h1>额外路径信息:"+request.getPathInfo()+"<h1>");
out.println("<h1>Servlet映射的路径:"+request.getServletPath()+"<h1>");
我把用户发送请求方式不同引起的中文问题划分了四种类型:
1、表单的get提交
2、表单的post提交
3、页面链接传递中文参数(参考get提交)
4、地址栏中参数直接输入中文提交(不讨论,违背寻常规则,而且这种方式很难控制)
1.get提交
对于这种,影响的有tomcat的URIEncoding。
浏览器会根据自己的页面的编码格式作为起始编码格式(右击菜单编码有显示的),把字符使用浏览器的编码格式编码成byte字节进行传输。到了tomcat这里,tomcat会使用URIEncoding进行重新编码(解码),如果tomcat没有配置的话就会使用iso-8859-1对byte进行重新编码(解码)成字符。如果浏览器得编码格式为UTF-8,且tomcat没有配置重新编码(解码)格式的话,就可以使用下面的方式拿到正确的字符了new
String(request.getParameter("text").getBytes("iso-8859-1"),"utf-8")
上的意思就是说,把刚才的字符,用iso-8859-1进行编码成byte,还原回去,再使用uft-8对byte进行重新编码(解码)成字符。(这个方法就是刚才从浏览器到tomcat过来的逆向过程)
2.post提交
对于这种情况,response.setCharacterEncoding有影响,当没有对response.setCharacterEncoding设置的时候值为null,则默认采用iso-8859-1来进行重新编码(解码)。
浏览器根据自己页面的编码格式作为起始编码格式,把字符进行编码成byte进行传输,到了tomcat,tomcat不进行干涉其中的重新编码(解码)格式。如果response.getCharacterEncoding为null,那么默认采用iso-8859-1进行重新编码(解码)成字符,如果设置了,就按照设置的编码格式进行重新编码(解码)字符。
jsp:pageEncoding="GB18030"
jsp页面的编码格式,即jsp会被解析成servlet时,采用的编码格式。如果不配置,默认采用iso-8859-1,当jsp文件保存编码类型和pageEncoding不一致时就会出现jsp内部解析乱码。Eclipse现在默认pageEncoding就是文件的编码格式,修改pageEncoding就会修改文件的编码格式。该参数还有一个功能,就是在JSP中不指定contentType参数,也不使用response.setCharacterEncoding方法时指定对服务器响应进行重新编码(解码)的编码,从而pageEncoding会影响浏览器的编码格式。
jsp:contentType="text/html;charset=UTF-8"
的作用是指定对服务器响应进行重新编码(解码)的编码。设定浏览器的编码格式。也就是说浏览器提交数据就会使用这个编码格式。相当于response.setCharacterEncoding来改变编码,但是改变的只是jsp请求的response编码格式。不能改变里面所有其他的ajax请求的编码格式。在没有设定的情况下默认采用ISO-8859-1格式。
meta中
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
当前面pageEncoding和contentType都没有设置的情况下,被解析成的html页面就会采用这种编码方式。来把byte解析成浏览器显示的信息。
jsp页面中
pageEncoding--->contentType--->meta 默认缺省。pageEncoding写了后面的都可以不用写,默认继承。
jsp页面中的设定编码优先级response.setCharacterEncoding--->contentType--->pageEncoding
层层覆盖。
request.setCharacterEncoding("UTF-8")的作用是设置对客户端请求进行重新编码(解码)的编码。
该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。对post方法有效。
使用response.setCharacterEncoding方法时,用该参数指定对服务器响应进行重新编码(解码)的编码。
tomcat:默认URIEncoding为iso-8859-1,可以设置。设置之后,会影响get方法和页面链接传递中文的参数字符编码。
关于UTF-8和GBK转化之间的问题
当UTF-8转化成GBK,再从GBK转化成UTF-8的时候,偶数汉字可以在UTF-8,GBK两者中互相转换,而奇数个汉字则不能。
关于BIG5
关于其他的转码问题,如果使用的是简体中文的字符,即使编码和解码都是使用BIG5,部分字符仍然无法解析,是乱码。
关于ISO-8859-1
ISO-8859-1是不支持中文的,所以就算中文字符使用ISO-8859-1进行编码,最后再用ISO-8859-1进行重新编码(解码)的话,拿到的字符也不能显示中文。即换言之,ISO-8859-1不能作为把字符变成byte的编码格式使用。
ajax
xmlHttp.responseText的请求的默认编码是UTF-8 。当然可以重新设置,通过在Request Headers中设置Content-Type:application/x-www-form-urlencoded;
charset=utf-8。为什么ajax和之前的不同呢?因为ajax不是使用默认的浏览器跳转提交方式,而是使用httprequest提交方式,默认跳转方式会读取浏览器的编码格式,而httprequest不会,所以ajax就会设置自己的默认的编码格式进行提交,即UTF-8.而使用ajax的post方法提交,无需再设定request的重新编码(解码)格式,因为request不再是默认的null,已经修改为UTF-8,所以不用转换直接拿出即可。而对于get方法的话,需要参考tomcat的URIEncoding重新编码(解码)。
二、返回信息
而response如果没有显式设置的话,不管request的编码是什么,response的编码就是ISO-8859-1。
对于response返回的信息如:response.getWriter().println就可以看到这个编码设置的作用了。而对于使用request.setAttribute等传递数据的话,这个编码格式设置了也没用。
当使用response.getWriter().println打印到浏览器时,在没有设置response的时候默认为null,而在服务器端则默认使用iso-8859-1进行编码成byte,等到了浏览器,发现response的信息header中没有相关编码设置,就会去取window系统的编码格式,中文系统默认为GBK/GB2312。所以,打印出来的页面的浏览器编码格式为GB2312。而如果设置了response的编码格式,那么就算到了浏览器,浏览器解析也会按照设置的编码格式重新编码(解码)。
当使用response.getWriter().println打印到本地文件时,即使设置了response,在发出时,采用的是设置的编码格式编码成byte,等到了客户端,客户端会用系统的编码格式重新编码(解码)文件,对于windows默认就是GB2312/GBK,所以最好再response发出时就设置编码的格式为GBK。
至于为什么打印到浏览器,头文件的信息就写入编码格式,而打印到本地文件,头文件中就没有写入编码格式的问题,还没有得到证实。猜测:后端传送到浏览器时,浏览器使用包含重新编码(解码)格式的。而传送文件时,没有使用重新编码(解码)格式的,使用的是操作系统的编码格式存储文件。
如果设置了response.setCharacterEncoding。那么就会按照这个编码格式传送到前端,浏览器并用这种方式重新编码(解码)。也就是说在传送的页面的文本信息head中的content-type已经设置成了response.setCharacterEncoding定义的编码格式,来用作重新编码(解码)。
ajax
ajax使用的是response.responseText来进行获取信息,也就是说,也是需要使用到response的编码格式的。ajax不会再对该编码格式进行任何修改。只是接受而已。
学习jsp(3)的更多相关文章
- javaweb学习--jsp
阅读电子书<Java Web从入门到精通>密码:461c,学习JavaWeb基础知识.由于本人已有html基础,所以直接略过前面部分,进入jsp学习 jsp页面添加库引用,引入项目文件 引 ...
- 学习 JSP:第二步 创建一个JSP Web Project
接上文 学习 JSP:第一步Eclipse+Tomcat+jre(配置环境) [创建新工程](Dynamic Web Project) 1.选择 "File-->New-->Dy ...
- 学习JSP篇:jsp简单介绍
这几天开始学习JSP和Servlet,写些博客,记录自己的学习过程,算是自己从业开始的一个见证. 一.什么是JSP JSP的全称是Java Service Page,一种动态的网页开发技术,区别于静态 ...
- JavaWeb学习----JSP内置对象详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- JavaWeb学习----JSP脚本元素、指令元素、动作元素
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- JavaWeb学习----JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 新手学习JSP+Servlet笔记一
作为一个新手,初次接触jsp,servlet,习惯了后台的开发,前台的知识一窍不通,利用闲暇时间,给自己补补,从MyEclipse开始. 安装好MyEclipse之后,没有安装程序的可以下载 http ...
- jsp学习--JSP运行原理,九大隐式对象和JSP常用标签
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- 学习jsp(2)
@Webservlet 具体见:http://www.cnblogs.com/luxh/archive/2012/06/06/2537458.html. 我折腾半天才发现,在web.xml里注册了,删 ...
随机推荐
- textView截取字符串-医生工作台1期
textfield截取字符串 ios7 会崩溃 解: 之前的写法是这样的 正确的写法: 先判断markedTextRange是否为nil, markedTextRange这个属性是啥意思呢 表 ...
- ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
https://en.wikipedia.org/wiki/Base64 The Base64 index table: Value Char Value Char Value Char ...
- Vaadin
Vaadin 这个是用Java 做的 一个人就可以完成 你去网上搜一下 教程 https://vaadin.com/home 官网 http://baike.baidu.com/link?url ...
- 弄清const与指针、引用之间的关系
const和 define在常量定义上的差别 在C++中,我们可以使用const 或者 宏define来定义常量.但是C++鼓励使用const定义常量,而不是宏define.原因有很多. 1.defi ...
- Windows下一个比较完美的线程池实现(使用线程池实现的Http上传下载实现)
http://blog.csdn.net/fishjam/article/details/8632049 http://download.csdn.net/user/fishjam
- Delphi调用约定
Register Calling Convention Ojbect Pascal的默认调用约定为register,寄存器调用约定会将前三个参数依次放入eax,edx,ecx,返回值是eax(根据类型 ...
- Ubuntu 12.04+DarwinStreamingSrvr6.0.3 架设流媒体服务器
1.安装Ubuntu 12.04操作系统,网上很多教程.. 2.打开终端,下载darwin源代码DarwinStreamingSrvr6.0.3-Source.tar,补丁patch dss-6.0. ...
- hdu1045 Fire Net
在一张地图上建立碉堡(X),要求每行没列不能放两个,除非中间有强挡着.求最多能放多少个碉堡 #include<iostream> #include<cstdio> #inclu ...
- leap motion
体感控制器: 识别:手,手指和工具,获取位置,手势,动作 范围:倒金字塔,塔尖在设备中心,2.5cm~0.6米 坐标系统:采用右手笛卡尔积坐标系,返回的数值:毫米 摆放:绿灯朝向自己,z轴距离屏幕越来 ...
- Selenium2学习-013-WebUI自动化实战实例-011-WebElement.getText()值为空问题探索及解决
今天有个朋友在群里问 WebElement.getText() 值为空,当你发现取到的值为空的时候,会不会郁闷呢?明明看到的值不为空,脚本看着也没有问题啊,为何取到的值为空呢!!!万千纠结啊,若是长时 ...