简单的来讲,pageEncoding是用来设置JSP源文件的编码方式,而contentType是用来设置响应内容的MIME类型、及响应内容的编码方式。
JSP运行过程:
首先由客户端浏览器发出请求,JSP容器接收请求后,JSP容器对JSP代码进行以下4个操作过程(如果不是首次访问且JSP文档没有更改过则直接执行第4步)
1、代码转换。JSP容器将JSP文件转换成Java Servlet文件(.java文件)。
2、编译。JSP容器编译Java Servlet文件,生成.class文件。
3、生成实例。JSP容器加载编译后的.class文件,并创建实例。
4、响应请求。JSP容器调用该实例的请求处理方法处理客户请求,并将响应信息回复给客户端。
第一阶段:将jsp编译成Servlet(.java)文件。用到的指令是pageEncoding,根据pageEncoding=“XXX”的指示,找到编码的规则为“XXX”,服务器在将JSP文件编译成.java文件时会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8编码的JAVA源码(即.java)。
第二阶段:从Servlet文件(.java)到Java字节码文件(.class),从UTF-8到UTF-8。JAVAC用UTF-8的encoding读取java源码,编译成UTF-8编码的二进制码(即.class)。这一过程是由JVM的内在规范决定的,不受外界控制。
第三阶段:从服务器到浏览器,这在一过程中用到的指令是contentType。服务器载入和执行由第二阶段生成出来JAVA二进制码,输出的结果,也就是在客户端可见到的结果,在这次输出过程中,由contentType属性中的charset来指定,将UTF8形式的二进制码以charset的编码形式来输出。如果没有人为设定,则默认的是ISO-8859-1的形式。
pageEncoding和contentType都可以设置JSP源文件(JSP页面本身的编码方式)和响应正文中的字符集编码。但也有区别:
设置JSP源文件字符集编码时,优先级为pageEncoding>contentType。如果都没有设置,默认ISO-8859-1。
设置响应输出的字符集编码时,优先级为contentType>pageEncoding。如果都没有设置,默认ISO-8859-1。
与contentType效果一样的设置方式还有:
html页面charset, response.setCharacterEncoding(), response.setContentType(), response.setHeader();其中response.setContentType(), response.setHeader(); 优先级最好,其次response.setCharacterEncoding();再者是<%@page contentType="text/html; chareset=utf-8"%>,最后是<meta http-equiv="content-type"content="text/html; charset=gb2312" />
web页面输入编码( 输入框输入的字体编码 ):
在设置页面编码<%@page contentType="text/html; chareset=gbk"%>的同时,也就指定了页面的输入编码;如果页面的显示编码被设置为UTF-8,那么用户所有的页面输入都会按照UTF-8编码;服务器端程序在读取表单输入之前要设定输入编码;表单被提交后,按照JSP容器对JSP文件的4个操作过程进行处理。但是页面需要告诉服务器当前页面的编码方式;request.setCharacterEncoding(),能修改Serverlet获取请求的编码,response.setCharacterEncoding(),能修改Serverlet返回结果的编码