JSP通過include標籤引入html出現亂碼問題
今天使用jsp的include標籤引入html檔案時發現出現了亂碼問題,通過百度後解決了,寫個小水文記錄下
jsp檔案
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登入</title> </head> <body> <!-- <%@include file="title.html"%> --> 登入成功 老王 123456 </body> </html>
html檔案
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>導航欄</title> <style> *{ margin: 0px; } #title1{ width: 100%; height: 50px; background-color:coral; } .li1{ text-decoration: none; display: inline; margin-left: 70px; margin-right: 70px; font-weight: bold; } #ul1{ height: 50px; padding-top: 16px; text-align: center; } #search{ height: 25px; position: absolute; left: 20px; top: 10px; } </style> </head> <body> <div id="title1"> <ul id="ul1"> <li class="li1">開始</li> <li class="li1">選項</li> <li class="li1">編輯</li> <li class="li1">工具</li> <li class="li1">退出</li> <input type="text" id="search"> </ul> <div> </div> </div> </body> </html>
兩個檔案都用了UTF-8編碼,並且單獨顯示的時候都沒有問題,但是當通過JSP的include標籤把html頁面引入後顯示時出現了亂碼
JSP沒有亂碼,引入的html發生了亂碼
首先看看jsp翻譯的java檔案
紅線圈住的部分是引入的html檔案,可以發現在翻譯為java檔案時就發生了亂碼,但是綠線圈住的jsp檔案則沒有發生亂碼.兩個檔案都已經設定了UTF-8編碼,怎麼只有一個亂碼呢?
那jsp翻譯到java時我在兩個頁面設定的兩個編碼方式都是怎麼被識別和處理的呢
在jsp我指定了contentType為text/html;charset=utf-8.表示jsp翻譯後servlet給客戶端傳送html程式碼時告訴客戶端檔案的格式為utf-8編碼的html檔案.
ps:在jsp還有一個pageEncoding屬性,這兩個屬性的區別如下:
pageEncoding是jsp檔案本身的編碼,是指定web容器將jsp編譯成java檔案時採用什麼編碼讀取jsp檔案。
contentType的charset設定的編碼是指伺服器傳送給客戶端時的內容編碼。
在html中我指定了charset=utf8,作用是告訴客戶端展示這個html檔案時用utf-8編碼.
這其中是不是少了什麼呢?
少了html指定從jsp翻譯為java檔案時規定的編碼,在jsp中有pageEncoding這個屬性指定(我的編譯器預設設定為utf-8),但是html就缺少了這個配置,所以包含了html的jsp檔案在翻譯為java檔案時就不知道該怎麼處理這段html程式碼了,但是jsp檔案原本的程式碼卻可以正常翻譯,這才導致了最後的結果是jsp正常,html部分發生異常.
解決
在html檔案的html標籤標籤下加入這行程式碼
<%@page pageEncoding="UTF-8"%>
html本身並不能識別這個指令,所以它並不影響html檔案的使用,並且當這個html被引入jsp檔案後被翻譯為java檔案時這段程式碼能夠讓html檔案以utf-8編碼方式被翻譯,就不會出現之前的錯誤了.
還有一種方法就是在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>