java web 学习总结之 Servlet/JSP 编码问题
Servlet和JSP编码问题
字节流:
1.得到OutputStream 字节流
OutputStream os = response.getOutputStream();
用默认编码输出数据,就是本地编码GBK
os.write("李赛是一个正直的男人".getBytes());
在浏览器上输出正常。
用代码设置浏览器的编码
第一种搞法: 通过响应头
response.setHeader("Content-Type", "text/html;charset=UTF-8");
第二种搞法: 用meta标签模拟 (只针对IE浏览器有效果)
os.write("<meta http-equiv='Content-Type'
content='text/html;charset=UTF-8' >".getBytes());
第三种搞法:
response.setContentType("text/html;charset=UTF-8");
用指定的编码输出
os.write("李赛是一个正直的男人".getBytes("gbk"));
2.字符流
得到字符流
解决办法:设置服务器响应正文编码
response.setCharacterEncoding("gbk");更改服务器往浏览器输出的编码,iso-8859-1转gbk往外输出
如下一行代码有 两个功能:
告知浏览器用什么编码。
另外一个功能,告知服务器输出用什么编码
response.setContentType("text/html;charset=gbk");
代码的设置要先于printwriter的出现
PrintWriter pw = response.getWriter();
因为默认采用iso-8859-1输出,输出时肯定乱码
pw.write("崔召金是一个成功男士");
//设置response使用的码表,以控制response以什么码表向浏览器写出数据
response.setCharacterEncoding("UTF-8");
//指定浏览器以什么码表打开服务器发送的数据 以下的2种都可以
response.setHeader("content-type", "text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");
//把客户端提交的数据转码
request.setCharacterEncoding("UTF-8");
关于JSP页面中的pageEncoding和contentType两种属性的详细解析
简单的说,pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时的内容编码,例如:pageEncoding="GBK",这句话的意思是,告诉JVM这个jsp本身采用的"GBK"编码,在JSP编译成Servlet传给JVM的时候,就用“GBK”的编码方式将Jsp网页源文件翻译成统一的UTF-8形式的Java字节码,如果不加设定,则 JVM默认的用iso-8859这种编码方式。 contentType里的charset=gbk,指示的是此网页文件输出到浏览器的输出方式为gbk。在这个过程中,一个JSP的源文件需要经过三个阶段、两次编码,才能完成一次完整的输出。
以一个JSP文件通过Servlet容器假(设为Tomcat)输出到浏览器并显示的过程为例来说明三个阶段、两次编码的具体过程
第一阶段:第一次编码:从JSP到Servlet(.java文件),从pageEncoding———>UTF-8
在第一阶段中完成Jsp的第一次编码:第一次编码用到的指令是pageEncoding,根据pageEncoding=“XXX”的指示,找到编码的规则为“XXX”,服务器在将JSP文件编译成.java文件时会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding没有设定,则使用默认的iso-8859这种编码方式。设定错了出来的就是中文乱码。
第二阶段:从Servlet文件(.java)到Java字节码文件(.class),从UTF-8———>UTF-8
第一阶段是将jsp编译成.java文件,第二阶段主要是将(.java)的源文件翻译成JVM可识别的java byteCode,也就是Java字节码文件,是由JAVAC命令完成的,这些文件就是通常我们所说的(.class)文件。在这一阶段中,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。 JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。这一过程是由JVM的内在规范决定的,不受外界控件,这也是为什么,有时候看起来是乱码的程序能编译通过,但是去无法正常显示的原因。
第三阶段:第二次编码:从Tomcat服务器到浏览器,从UTF-8―――>contentType
这一阶段,主要是Tomcat显示的输出JSP网页的过程,这在一过程中用到的指令是contentType。 Tomcat(或其的application container)载入和执行由第二阶段生成出来JAVA二进制码,输出的结果,也就是在客户端可见到的结果,在这事输出过程中,由contentType属性中的charset来指示,将UTF8形式的二进制码以charset的编码形式来输出。如果没有人为设定,则默认的是ISO8859-1.的形式。
注意的问题:以上说的这个过程在大多数据情况是普遍适用的。但这也不是绝对的,还要看各自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"%>这样就服务器一定会是正确抓到“你好”了,这就是为什么有两个不同的指令设定,和两次不同的编码过程。
明白了这三个阶段和两次编码过程,那么在编程的时候,JSP网页中、数据库中、Web服务器中,关于一些字符的设定就会很清楚,要不然,会设来设去,字符跟着转来转去,最终没没转出过正确的来,记住一点,万变不离其踪,只要把最本质的东西搞明白,不管怎么变都不会有太大的问题。
近期笔者会把数据库与网页交互过程中出现的一些乱码问题、字符集问题、编码规则问题再整理下,在下一篇文章中与读者见面。
java web 学习总结之 Servlet/JSP 编码问题的更多相关文章
- java web学习总结(六) -------------------servlet开发(二)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- java web 学习六(servlet开发2)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- [原创]java WEB学习笔记14:JSP的9 个隐含对象 及 JSP 的基本语法
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- java web学习总结(五) -------------------servlet开发(一)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- java web学习总结(二十七) -------------------JSP标签介绍
一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...
- java web学习总结(十四) -------------------JSP原理
一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...
- java web 学习十六(JSP指令)
一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...
- java web 学习十四(JSP原理)
一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...
- java web 学习五(servlet开发1)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
随机推荐
- Java环境的搭建
一.JDK的下载 JDK又称Java SE,可以从Oracle公司的官网上https://www.oracle.com/index.html下载. 1.打开Oracle官网.将光标移到[Menu]-[ ...
- 如何写SysV服务管理脚本
本文目录: 1.1 SysV脚本的特性1.2 SysV脚本要具备的能力1.3 start函数分析1.4 stop函数分析1.5 reload函数分析1.6 status.restart.force-r ...
- 【★】KMP算法完整教程
KMP算法完整教程 全称: Knuth_Morris_Pratt Algorithm(KMP算法) 类型: ...
- About Cheating and Plagiarism
我先描述一下此次事件的具体经过.昨天3月15号的晚上十点,是第四次作业的deadline.在15号之前,只有五位同学提交了作业,而在临近deadline的这几个小时内密密麻麻地提交了二十多份作业.和第 ...
- 【集美大学1411_助教博客】团队作业7——Alpha冲刺之事后诸葛亮
写在前面的话 alpha阶段都顺利完成了,大家这次作业完成得都很认真.我觉得通过这些问题,大家既可以回顾自己的alpha阶段,又可以给beta阶段做一些指引.但看了所有组的博客,没有一个组在这些问题之 ...
- 【Beta阶段】第二次scrum meeting
Coding/OSChina 地址 1. 会议内容 学号 主要负责的方向 昨日任务 昨日任务完成进度 接下去要做 99 PM 会议总结,博客编写,代码整理 100% 准备下一次会议内容,并对已完成的代 ...
- 团队作业3-需求改进&原型设计
选题:实验室报修系统 实验室设备经常会发生这样或那样的故障,靠值班人员登记设备故障现象,维护人员查看故障记录,进行维修,然后登记维修过程与内容,以备日后复查,用这种方式进行设备运营管理,它仅仅起到一个 ...
- 201521123038 《Java程序设计》 第六周学习总结
201521123038 <Java程序设计> 第六周学习总结 1. 本周学习总结 2. 书面作业 1.clone方法 1.1 Object对象中的 clone 方法是被protected ...
- for /r命令实现全盘搜索指定文件
@echo off Rem :全盘搜索指定文件并输出到文本 set "fileName=Normal.dotm" set "outPutPath=C:\result.tx ...
- Jmeter之性能测试基础
1.概念:性能测试是通过自动化的测试工具模拟多种正常峰值及负载条件来对系统的各项性能指标进行测试.负载测试和压力测试都属于性能测试,两者可以结合进行.通过负载测试,确定在各种工作负载下系统的性能,目标 ...