Web开发中页面出现乱码的解决(Java Web学习笔记:需在编译时用 -encoding utf-8)

news/2025/3/14 1:12:12/

目录

  • 1 引言
  • 2 乱码表现、原因分析及解决
    • 2.1 乱码表现
    • 2.2 原因分析
    • 2.3 解决
  • 3 总结

1 引言

Web开发的页面出现了乱码,一直不愿写出来,因为网上的解决方案太多了。但本文的所说的页面乱码问题,则是与网上的大多数解决方案不一样,使用通常的方法解决不了。这些通常的解决方法包括:

  1. 在出现乱码的jsp页面源文件的头部写:<% request.setCharacterEncoding("utf-8"); %>
  2. 在出现乱码的jsp页面源文件中的<head>标签中写入:
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />

于是,本博文的写作动力就有了。

2 乱码表现、原因分析及解决

2.1 乱码表现

本项目是基于Struts 2构建的,struts.xml中涉及到乱码的action为getBooks,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><package name="teststruts" extends="struts-default" namespace="/"><action name="login" class="com.rob.teststruts.action.LoginAction"><result name="error">/error.jsp</result><result name="success">/welcome.jsp</result></action><action name="getBooks" class="com.rob.teststruts.action.GetBooksAction"><result name="login">/loginForm.jsp</result><result name="success">/showBook.jsp</result></action></package>
</struts>

展示页面showBook.jsp的内容如下:

<%@ page language="java" pageEncoding="UTF-8" errorPage="" %>
<%@ page import="java.util.*, com.opensymphony.xwork2.util.*" %>
<!DOCTYPE html>
<html><head><title>作者李刚的图书</title></head><body><table border="1" width="360"><caption>作者李刚的图书</caption><%// 获取封装输出信息的ValueStack对象ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");String[] books = (String[])vs.findValue("books");for (String book: books) {%><tr><td>书名:</td><td><%=book%></td></tr><%}%></table></body>
</html>

项目部署、启动Tomcat后,出现如下乱码:
乱码表现

2.2 原因分析

利用引言中介绍的两种方法无法解决该问题,乱码仍然出现。忽然想到,BookService.java源文件本身是UTF-8编码,在Windows cmd下编译时没指定编码方式,会默认GBK编码,但对该文件的编译缺没报错。若一个UTF-8编码的java源文件中的注释中包含汉字,则编译时会提示如下:
在这里插入图片描述
所以,对源文件BookService.java来说,其中只有字符串中有汉字,没提示报错。最大的原因在于该文件编译时没指定utf-8编码。BookService.java的内容如下:

package com.rob.teststruts.service;public class BookService {private String[] books = new String[] {"疯狂Java讲义","疯狂Android讲义","轻量级Java EE 企业应用实战","疯狂Ajax讲义","疯狂XML讲义",};// business logic methodpublic String[] getLeeBooks(){return books;}
}

2.3 解决

对源文件BookService.java按如下方式编译,指定编码方式:

javac -encoding utf-8 -d classes src\com\rob\teststruts\service\BookService.java

用生成的BookService.class文件替换部署环境中的旧的BookService.class,重启Tomcat,访问网址,成功解决乱码,如下图:
在这里插入图片描述

3 总结

这是个共性问题,只要是基于Java Web开发的项目,只要utf-8编码的源文件编译时没指定utf-8编码方式,都会遇到这个乱码问题。该问题用通常的乱码解决方法行不通。这里愿意与大家交流,有问题请大家私信。

大家注意,只要源文件是utf-8编码格式的,最好在编译时也指定utf-8编码方式。

本文例子选自书籍《Struts 2.x 权威指南》1第29页。书中代码未包含import部分、package部分,对编译过程也没提到,大家在阅读时要注意自行补上。实际上,有一定基础的人,都可以毫无困难地复现书中例子。在此,感谢作者提供的例子,虽然该例子没考虑到编码问题,这不是作者的问题。


  1. 李刚. Struts 2.x 权威指南. 第3版. 北京: 电子工业出版社, 2012.10: 29. ↩︎


http://www.ppmy.cn/news/1562895.html

相关文章

《框架程序设计》复习题解析-2

目录 简答题 1.在MyBatis框架中&#xff0c;当查询结果列名和实体类中的属性名不一致时如何配置实现自定义映射关系&#xff0c;请详细说明。 2.请描述在SQL映射文件中&#xff0c;如何自定义合适的实体类与查询结果完成映射&#xff1f; 3.Spring整合MyBatis时&#xff0c;…

【WRF运行报错】总结WRF运行时报错及解决方案(持续更新)

目录 ./real.exe错误1:ERROR while reading namelist physics./wrf.exe错误1:FATAL CALLED FROM FILE: <stdin> LINE: 2419 Warning: too many input landuse types参考./real.exe 错误1:ERROR while reading namelist physics 执行./real.exe时,报错如下: taski…

计算机网络 —— 网络编程(TCP)

计算机网络 —— 网络编程&#xff08;TCP&#xff09; TCP和UDP的区别TCP (Transmission Control Protocol)UDP (User Datagram Protocol) 前期准备listen &#xff08;服务端&#xff09;函数原型返回值使用示例注意事项 accpect &#xff08;服务端&#xff09;函数原型返回…

【黑灰产】假钱包推广套路

假钱包推广产业链研究 市面上钱包的主要推广方式&#xff1a; 1&#xff0c;竞价&#xff08;搜索引擎&#xff09;&#xff0c;误导客户为真正官方钱包从而完成下载使用 优点&#xff1a;精准&#xff0c;客户大 缺点&#xff1a;竞价户容易挂&#xff0c;投资大 2&#xff0…

反向代理模块m

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

Spring Boot性能提升的核武器,速度提升500%!

虚拟线程是 Java 21 引入的一个新特性&#xff0c;用于简化并发编程。它与传统的操作系统线程相比&#xff0c;具有显著的优势&#xff1a; 轻量级&#xff1a;虚拟线程由 JVM 管理&#xff0c;而非操作系统&#xff0c;因此它们的内存占用和创建成本远低于传统线程。理论上&am…

探索 Cloudflare Workers:高效边缘计算的新选择

随着现代应用对低延迟、高可扩展性的需求日益增长&#xff0c;边缘计算成为了热门话题。而在边缘计算中&#xff0c;Cloudflare Workers 作为一种轻量级、功能强大的计算平台&#xff0c;脱颖而出。本文将深入探讨 Cloudflare Workers 的技术特性、核心优势&#xff0c;以及如何…

C++—9、如何在Microsoft Visual Studio中调试C++

本文通过实例操作来介绍 Visual Studio 调试器的功能。调试器在运行过程中可提供许多方法让你查看代码的情况。 你可以逐步浏览代码、查看变量中存储的值、设置对变量的监视以查看值何时改变、检查代码的执行路径、查看代码分支是否正在运行等等。本实例主要是设置断点及查看内…