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>