1. 程式人生 > >JSP通過include標籤引入html出現亂碼問題

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>