实验部分+网上摘抄

如果一下有您认为错误的,请指出来,谢谢.

http://www.360doc.com/content/060731/11/10506_169583.html

//  如果页面是GBK,容器是utf-8,好像不能转码

//  容器是gbk,页面是utf-8时,由于uft-8字符集比gbk宽,因此部分乱码 



这两个问题还需要验证



**************************************************

tomcat5.0下service.xml配置:

  <Connector
port="8080"               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000"
               disableUploadTimeout="true"  URIEncoding="gbk" <!--此处设置容器的编码格式,但是只针对get方法有效--> useBodyEncodingForURI="false" <!--此处设置为true则使用容器默认的ISO编码格式,即使前面设置了URIEncoding -->
/>



**************************************************







protected void doGet (

      HttpServletRequest request,  HttpServletResponse response )throws ServletException, IOException

{
  //使用get方法提交,url编码默认 iso-8859-1,因为是通过url浏览器编码后的,也即web容器
//  request.setCharacterEncoding("GBK");//这个对get方法不起作用
  System.out.println("hello2="+new String(request.getParameter("user").getBytes("iso-8859-1"),"utf-8"));//容器默认的是ISO,如果对容器不设置,则后面的需要根据页面是什么编码,来转换成相对应的
  System.out.println("hello2="+request.getParameter("user"));
  System.out.println("hello2="+new String(request.getParameter("user").getBytes("gbk"),"gbk"));
  //如果页面,容器,都是utf-8,或页面,容器都是GBK,那么在java端就不用转码



//  容器是gbk,页面是utf-8时,由于uft-8字符集比gbk宽,因此部分乱码   (自己理解,不一定正确,有待验证)
  //  System.out.println("hello2="+new String(request.getParameter("user").getBytes("gbk"),"utf-8"));//三个字最后一个乱码
 
//  如果页面是GBK,容器是utf-8,好像不能转码
//  new String(request.getParameter("user").getBytes("utf-8"或gbk),"gbk")//这样先获得容器的uft-8格式,在转化成页面的GBK也不行
  //这个问题有待继续验证
}
protected void doPost (

      HttpServletRequest request, HttpServletResponse response )throws ServletException, IOException
{
  //post方法,在容器中设置编码不起作用,都是用iso编码,除非在request中设置
  //post提交是封装在request中,post页面的编码格式是什么,在这一端就可以用什么格式来接收,和get不同,get方法需要经过容器的编码
//  request.setCharacterEncoding("GBK");//如果不设置,在getParameter返回的是iso编码格式的
  System.out.println("hello3="+new String(request.getParameter("user").getBytes("iso-8859-1"),"gbk"));
  System.out.println("hello3="+new String(request.getParameter("user").getBytes("GBK"),"GBK"));
  System.out.println("hello3="+new String(request.getParameter("user").getBytes("UTF-8"),"gbk"));
  System.out.println("hello2="+request.getParameter("user"));
}



个人理解:

get方法中:先是jsp页面把数据通过页面的编码格式转化到地址栏,然后发送给容器,容器在通过自己的编码格式,传给java端,也就是我们的程序,因此此时先需要用容器的编码格式获得字节,再转成页面的格式.

post方法: 数据通过页面的编码格式封装在request中,通过容器时转换成容器默认的,(自己目前不知道怎么改变容器默认的),传给java端.通过request.setCharacterEncoding()来改变成页面的.



但是对于get方法中中文浏览器总是以UTF-8发送,那如果页面设置成gbk,怎么让java不乱码?这个问题还未解决



server.xml
useBodyEncodingForURI="true"
这个参数扩展性更好,表示以页面的编码作为request默认编码.   ??????????????好像不对,带回公司验证



*******************************************

以下部分是我认为对上面能作出正确解释的:(摘自网上:源地址:http://www.iteye.com/topic/266705)





http://www.cnblogs.com/yencain/articles/1321386.html



http://www.iteye.com/topic/300656



http://www.iteye.com/topic/21680?page=1



-------------------------------------------------

关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时的内容编码 JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。 第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。 第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。 JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。 第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效 contentType的設定. pageEncoding 和contentType的预设都是 ISO8859-1. 而随便设定了其中一个, 另一个就跟着一样了(TOMCAT4.1.27是如此). 但这不是绝对的, 这要看各自JSPC的处理方式. 而pageEncoding不等于contentType, 更有利亚洲区的文字 CJKV系JSP网页的开发和展示, (例pageEncoding=GB2312 不等于 contentType=utf-8)。 jsp文件不像.java,.java在被编译器读入的时候默认采用的是操作系统所设定的locale所对应的编码,比如中国大陆就是GBK,台湾就是BIG5或者MS950。而一般我们不管是在记事本还是在ue中写代码,如果没有经过特别转码的话,写出来的都是本地编码格式的内容。所以编译器采用的方法刚好可以让虚拟机得到正确的资料。 但是jsp文件不是这样,它没有这个默认转码过程,但是指定了pageEncoding就可以实现正确转码了。 举个例子: <%@ page contentType="text/html;charset=utf-8" %> 大都会打印出乱码,因为输入的“你好”是gbk的,但是服务器是否正确抓到“你好”不得而知。 但是如果更改为 <%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%> 这样就服务器一定会是正确抓到“你好”了



======================

pageEncoding设置JSP源文件和响应正文中的字符集编码.
contentType设置JSP源文件的字符集编码和响应正文的MIME类型.

可见,pageEncoding和contentType都可以设置JSP源文件和响应正文中的字符集编码.但也有区别:

设置JSP源文件字符集时,优先级为   pageEncoding   >   contentType.都没有设置,默认ISO-8859-1.

设置响应输出的字符集时,优先级为   contentType   >   pageEncoding.都没有设置,默认ISO-8859-1;都设置了,以contentType为准.实际上,response.setContentType()就是根据contentType属性设置的.



========================

在JSP标准的语法中,如果pageEncoding属性存在,那么JSP页面的字符编码方式就由pageEncoding决定,否则就由contentType属性中的charset决定,如果charset也不存在,JSP页面的字符编码方式就采用默认的ISO-8859-1。


你可能感兴趣的:(jvm,tomcat,jsp,虚拟机,浏览器)