;2. 设置
pageEncoding=”UTF-8″属性;3. 检查Tomcat的server.xml中Connector配置
URIEncoding=”UTF-8″`;4. 使用过滤器统一处理请求响应编码;5. 确保IDE文件编码为UTF-8。在Java Web开发中,JSP页面乱码是常见问题,主要由字符编码不一致引起,以下是系统化的解决方案,覆盖从页面到数据库的全链路处理:
核心原因分析
- 页面自身编码:JSP文件保存的物理编码(如UTF-8、GBK)与声明不一致。
- HTTP传输编码:
- 请求编码(浏览器→服务器):
request.getParameter()
乱码 - 响应编码(服务器→浏览器):
response
输出乱码
- 请求编码(浏览器→服务器):
- 数据库编码:数据库连接、表字段编码不统一。
- 容器默认编码:Tomcat等服务器默认使用ISO-8859-1。
全面解决方案
统一物理文件编码
- 步骤:
- 用IDE(如Eclipse/IntelliJ)将JSP文件另存为 UTF-8 格式。
- 在JSP头部强制声明编码:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
- 在
<head>
标签内添加:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
请求编码处理(GET/POST)
- POST请求:在获取参数前设置
request
编码request.setCharacterEncoding("UTF-8"); // 需在第一次调用request前执行
- GET请求(Tomcat为例):
- 修改
server.xml
,在Connector标签添加:URIEncoding="UTF-8" useBodyEncodingForURI="true"
- 修改
响应编码处理
- 在Servlet或JSP中设置响应类型:
response.setContentType("text/html;charset=UTF-8"); response.setCharacterEncoding("UTF-8");
数据库编码配置
- MySQL连接示例:
jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8
- 确保数据库、表、字段均为UTF-8:
ALTER DATABASE db CHARACTER SET utf8mb4; ALTER TABLE table CONVERT TO CHARACTER SET utf8mb4;
过滤器统一处理(推荐)
创建全局编码过滤器:
public class EncodingFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); chain.doFilter(req, resp); } }
在web.xml
中配置:
<filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.example.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
特殊场景处理
- URL传参乱码:手动转码
String param = new String(request.getParameter("key").getBytes("ISO-8859-1"), "UTF-8");
- JSON响应乱码:Spring中配置
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
验证流程
- 浏览器检查:按F12→Network→查看Response Headers中的
Content-Type
。 - 数据库验证:执行
SHOW VARIABLES LIKE 'character_set%'
确认编码。 - 文件编码:用Notepad++打开JSP文件,右下角检查编码格式。
总结关键点
- 三处强制声明:JSP头部、
<meta>
标签、响应Content-Type
。 - 两处配置:Tomcat的
server.xml
、数据库连接字符串。 - 一处全局设置:使用编码过滤器一劳永逸。
引用说明:本文解决方案参考Oracle官方文档《Java Servlet Specification》第3.10章字符编码处理,并结合W3C推荐的Web编码标准及MySQL 8.0字符集配置指南,测试环境基于Tomcat 9.0和JDK 11。
通过以上步骤,可彻底解决99%的JSP乱码问题,若仍存在异常,需检查中间件(如Nginx)或第三方库的编码配置。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/38195.html