在jsp中使用<%@include file="in.html" %>导入html页面时,若是html页面里有中文,就会产生乱码。检查jsp文件和html文件的编码,编码一致,都是统一使用的utf-8,检查生成的Servlet类文件,发现里面直接就乱码了。html
jsp页面内容:java
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>测试JSP的include指令</title> </head> <body> <%@include file="in.html" %><br/> <%@include file="in1.jsp"%><br/> <%@include file="in2.html" %> </body> </html>
in.html文件内容:web
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> 我是in.html文件的内容 </body> </html>
生成的Servlet内容:apache
out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n"); out.write("<title></title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.write("ææ¯in.htmlæä»¶çå 容\r\n"); out.write("</body>\r\n"); out.write("</html>\r\n");
经过上面生成的Servlet内容能够看出,在将jsp文件编译成java类这一过程就出现了乱码,问题确定是编码一致的,而设置编码的有两个:pageEncoding和contentType,这两个属性的区别以下:tomcat
pageEncoding是jsp文件自己的编码,是指定web容器将jsp编译成java文件时采用什么编码读取jsp文件。服务器
contentType的charset设置的编码是指服务器发送给客户端时的内容编码。app
而客户端访问一个jsp文件要通过以下三个阶段:jsp
一、(第一次访问时)web容器将jsp编译成java文件,这个阶段编译器会根据pageEncoding设置的编码读取jsp文件,翻译成统一的utf-8的Servlet类,若是pageEncoding设置错误或未设置,编译出来的java文件就会出现中文乱码。测试
二、由javac将java源码编译成class字节码,javac用utf-8编码读取java源码,编译成utf-8编码的二进制文件。ui
三、web容器载入class字节码文件,将内容输出结果到客户端,这一过程内容的编码为contentType设置的编码。
因而可知,是因为pageEncoding设置问题致使翻译jsp时乱码。有两种方式处理:
方法一:在每一个引入的html文件设置pageEncoding编码,即在html添加<%@page pageEncoding="UTF-8"%>,尽管html不能识别该指令,但经过include指令引入时该指令就能起做用了,以下:
<%@page pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> 我是in.html文件的内容 </body> </html>
方法二:在web.xml里统一配置pageEncoding的编码,在web-app标签里添加以下配置:
采用<%@ include file=""%>方式包含文件时,须要在被包含文件里指定其pageEncoding.
不然没法获取到对应的pageEncoding,则tomcat采用iso8850-1来读取被包含文件,被包含文件含有中文时就会出现乱码。但若是include的是一个html,txt等静态文件就比较麻烦。如今测试出一个方案就是在web.xml里添加:
<jsp-config> <jsp-property-group> <display-name>JSPConfiguration</display-name> <url-pattern>*.html</url-pattern> <page-encoding>UTF-8</page-encoding> </jsp-property-group> </jsp-config>
就能够了。指定以html结尾的文件都以utf-8编码去读取。
<jsp-config> <jsp-property-group> <description>html encoding</description> <display-name>JSPConfiguration</display-name> <url-pattern>*.html</url-pattern> <el-ignored>true</el-ignored> <page-encoding>UTF-8</page-encoding> <scripting-invalid>false</scripting-invalid> <include-prelude></include-prelude> <include-coda></include-coda> </jsp-property-group> </jsp-config>
方法一和方法二原理是同样的,都是经过设置pageEncoding编码来指定jsp将html文件include时使用的编码。方法一和方法二任选一种便可,若是同时使用须要注意两个地方设置的pageEncoding编码必须一致,不然将会报以下编码不一致的错误:
org.apache.jasper.JasperException: /in.html (line: 1, column: 2) Page-encoding specified in jsp-property-group (UTF-8) is different from that specified in page directive (GBK)