MyHtml.html代碼文件:
Index.jsp代碼文件
調試部署後在瀏覽器中瀏覽亂碼:
我們在打開tomcat下由jsp編譯成對應的Java源碼文件,此時發現這裏面對應從HTML文件中導入部分的編譯成的Java源碼也是亂碼的。這可以猜想,出現亂碼的問題應該出現在把jsp文件轉換成Java類的過程中。
設置編碼的代碼有兩個:pageEncoding和contentType,他們有,以下區別:
1、(第一次訪問時)web容器將jsp編程成Java文件,這個階段編譯器會根據pageEncoding設置的編碼來讀取jsp文件,翻譯成utf-8的Java類文件。,如果pageEncoding設置錯誤或者未設置,編譯出來的Java文件就會出現亂碼。
2、由javac將Java類的源碼編譯成.class字節碼文件,javac將用utf-8編碼讀取Java源碼,編譯成二進制文件。
3、web容器載入class字節碼文件,將內容輸出到客戶端,這一過程內容的編碼爲contentType設置的編碼。
可以分析出,出現亂碼的問題是HTML文件並沒指定pageEncoding的編碼。
有兩種解決方法:
方法1、在每個將要被指令引入的HTML文件前聲明文件的pageEncoding的編碼。即在<html>標籤前添加<%@ page pageEncoding=”utf-8”%>。儘管HTML無法識別該指令,但是通過include指令引入jsp之後就能起作用了。如下:
方法二:在web.xml裏統一配置pageEncoding的編碼,在web-app標籤裏添加如下配置:
<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)