forward到html乱码,response.sendRedirect乱码问题终极解决方案(示例代码)

本文详细探讨了Java EE开发中遇到的乱码问题,包括普通JSP页面、Servlet处理表单和超链接中的中文乱码。解决方法主要是确保编码格式的一致性,例如将pageEncoding设为UTF-8,并在必要时调整文件编码。对于servlet通过response.sendRedirect()传递参数导致的乱码,需要关注Tomcat服务器的URIEncoding配置。通过理解编码原理和正确设置,可以有效避免乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读到这篇文章的同学想必是在response.sendRedirect乱码问题上出现了迷惑,只好问度娘了。但是如果度娘能把我们的迷惑完全解释清楚,也就不存在这篇文章了。既然本文就像标题那样吹下了大牛,闲话少叙看看笔者是如何把这个牛一步步的吹下去的。

在JAVAEE开发时经常会遇到中文乱码问题,对于老程序员来说也是一件比较头疼的问题。我们通常是遇到问题时上网搜一搜,有时候运气好问题也就解决了,可是很少去从本质上去关注问题为什么会产生?到底是怎么解决的?

首先来看第一个问题,为什么会产生乱码?乱码是指中文乱码,也就是中文字符显示出现了问题,而英文字符很少出现乱码问题。中文字符是以中文编码格式在计算机中进行存储的。常见的中文编码格式有GB2312,BIG5,GBK,而我们在开发时通常采用UTF-8码,UTF-8码几乎包含了全世界各种语言的编码,基本上解决了国际化的问题。

要解决乱码问题,牢记一句话:你的字符是以什么编码方式存储的就要以什么格式读取。

一、普通jsp页面的乱码问题

1.打开myeclipse新建一个web工程。

2.打开index.jsp文件,在第一行就能看到此页面的编码格式。

e2970b090ff7708d61a5907c0ca425ee.png

我们在body里写一句中文吧。

ae5aca5c5e41fca901db898a0fad6061.png

保存文件,问题来了。

235d14423a0a7d85aa42e053e19ecc54.png

这段提示大概的意思是你要保存的页面中有中文,建议你把ISO-8859-1换成正确的编码方式。只能选择Save as UTF-8了,不然你就保存不了的。

发布一下,在浏览器中果然看到了乱码。

386d11a2e5807f5e3d1cb5ae1debe8d5.png

小白到这一步就疑惑了,我明明用UTF-8保存了啊,为什么还是出现乱码了。问题在这里

4908db76a408fb04eff97ed4198335d5.png

你虽然用UTF-8格式保存了文件,但是浏览器不认啊。因为浏览是按照pageEncoding="ISO-8859-1" 来读取页面内容进行显示的,你既然告诉它让它用ISO-8859-1的编码格式来显示,那么它就乖乖的听你的了。怎么才能正常显示出来呢?只要重新告诉浏览器采用正确的编码格式就可以了。

3.在浏览器页面右键选择编码格式为UTF-8。

95675be8abb4e317d13f7657ca5cf5e7.png

可是每次都要在浏览器中选择转换是不是太麻烦了?

4.将中的"ISO-8859-1"改成"utf-8"就可以了。这样每次打开页面时就能正常显示中文了。

到这里如果不深究下去,也就基本能解决jsp页面乱码的问题了。可是有爱较真的朋友就会问了,你前文不是说中文主要采用GBK/GB2312进行编码的吗,那么我把pageEncoding="ISO-8859-1"改成pageEncoding="GBK"或”GB2312”不就行了吗?说干就干,果断修改。问题出现了,怎么又出现乱码了?

5.修改为

修改为

本来以为能正常看到中文了,可是乱码再次出现了。

问题就出在你虽然改了pageEncoding="gb2312"以及content="text/html; charset=gb2312",但是文件保存格式却没有改,需要把文件的保存格式也要改成gb2312才行。

6.解决办法

用EditPlus打开index.jsp文件,然后转码成GB2312,同时要在

标签中加上保存就可以了。

98c855f5fe3bfe8496c458c88141f4cc.png

这么折腾一番以后,熟悉的中文是不是又出现了?

二、servlet处理表单时乱码问题

1.接收post提交的数据

5ec67b93bf2a253ba563806ed32d3642.png

dc0e81d9cd6514a6b293699ddbdda85c.png

只要图中3 处的编码一致基本就能解决问题了,建议全部使用utf-8码。

2.接收get提交的数据

设置同1.

三、servlet处理超链接中的中文问题

270fb8e48330ea588ad73d4b7e6f2d68.png

四、servlet1通过response.sendRedirect();传值给servlet2

流程如下

13634f35c0fe9d8e1e3b66a11a2f2c48.png

提交表单中包含中文时,servlet2就会显示乱码了。

网上很多人的解决方案是,在servlet1中,先给username指定编码格式

username = new String(username.getBytes("ISO-8859-1"),"utf-8");

而后,在servlet2中,通过

String username = request.getParameter("username");取到servlet1传过来的值后再次给username指定编码格式。

username = new String(username.getBytes("ISO-8859-1"),"utf-8");

这种方式如果运气好的话可以解决问题,如果运气不好,还是乱码。问题出在哪里?

原来,除了在两个servlet中强制指定了编码格式,在tomcat/conf/server.xml中还得进行配置。

找到

connectionTimeout="20000"

redirectPort="8443" />

添加

URIEncoding=" ISO-8859-1"属性,如果不添加则默认为URIEncoding=" utf-8"。

因此username = new String(username.getBytes("ISO-8859-1"),"utf-8");

也就无法生效了。

解决方案:

1.修改tomcat/conf/server.xml文件

connectionTimeout="20000"

redirectPort="8443" URIEncoding=" ISO-8859-1"/>

然后使用

username = new String(username.getBytes("ISO-8859-1"),"utf-8");

强制为中文字符指定编码格式。

2.使用

request.getRequestDispatcher("/Servlet2").forward(request, response);

代替

response.sendRedirect("/encoding/Servlet2?username=" + username);

题目:基于MySQL的注册登录系统(需要提交作业结果) 需求描述: 设计一个包含三个JSP页面的登录系统: index.jsp:首页,显示登录用户名、退出链接或者是去登录超链接 login.jsp:用户输入用户名和密码的表单页面 register.jsp:用户输入用户名和密码的表单页面 process.jsp:处理注册登录请求并转发结果的页面 logout.jsp:退出页面 功能要求: 在index.jsp中实现: 通过读取session判断是否已登录 已登录,则显示登录用户名、退出链接 未登录,则显示去登录超链接 在login.jsp中实现: 创建一个含有用户名输入框、密码输入框、登录按钮的表单 表单提交到process.jsp 如果接收到errorMsg参数,将errorMsg内容显示在网页中 在register.jsp中实现: 创建一个含有用户名输入框、密码输入框、注册按钮的表单 表单提交到process.jsp 如果接收到errorMsg参数,将errorMsg内容显示在网页中 在process.jsp中实现: 通过request对象获取用户名和密码 通过action参数用来区分是登录操作还是注册操作,如果是登录就是到数据库进行用户信息验证,如果是注册就将注册信息存储到数据库中。 若登录验证失败: 使用<jsp:forward>动作转发回login.jsp,并附加错误参数errorMsg 若登录验证成功: 使用session记录登录的用户名 使用response.sendRedirect跳转到index.jsp 若注册验证失败: 使用<jsp:forward>动作转发回register.jsp,并附加错误参数errorMsg 若注册失败: 页面中显示注册成功信息 页面中显示跳转到登录页面的链接 在logou.jsp中实现: 清除登录的用户名session数据 使用response.sendRedirect跳转到index.jsp
最新发布
06-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值