经过网上搜索和自己的经验,JSP/Servlet页面的中文显示为乱码的问题可以细分为5类:

1. JSP页面显示乱码。

2. Servlet接收Form/Request传递的参数时显示为乱码

3. JSP接收Form/Request传递的参数时显示为乱码

4. 用时页面显示乱码

5. 数据库存取的时候产生乱码。

解决方式:

1. JSP页面显示乱码的解决方式:

第一种方式为在页面的开头加上:

注:有时候如果不再页面开头加上这句,则页面中无法保存中文字符,并提示:中文字符在不能被iso-8859-1字符集mapped,这是由于默认情况下,JSP是用iso-8859-1来编码的,可以在Window->Preferences->General->Content Type选项下,在右边的窗口选择Text->Jsp,然后在下面的Default Encoding由默认的iso-8859-1改为GBK,然后点击update即可解决。

然而这种方式会带来一些问题:由于这一句在其他文件include该文件的时候不能被继承,所以include它的文件也需要在文件开头加上这句话,此时如果用的是pageEncoding="gbk"则会出现问题。类似于org.apache.jasper.JasperException: /top.jsp(1,1) Page directive: illegal to have multiple occurrences of contentType with different values (old: text/html;charset=GBK, new: text/html;charset=gbk).

类似地,如果两个文件一个用的是gbk,一个用的是gb2312也会出现问题。

另一种更好的解决方式为:

在项目的web.xml中添加以下片段:

Special property group for JSP Configuration JSP example.

JSPConfiguration

*.jsp

true

GBK

false

Special property group for JSP Configuration JSP example.

JSPConfiguration

*.html

true

GBK

false

2. Servlet接收Form/Request传递的参数时显示为乱码的解决方式:

第一种解决方式为在用到request方法的前面加上这条语句:

request.setCharacterEncoding("GBK");

同样地,这也会由于页面设置中GbK或gB2312大小写不同或者采用不同的汉语字符集而发生错误。

另一种更好的解决方式为:添加一个名为SetCharacterEncodingFilter的filter。

filter的源文件为(参见apach安装目录下\webapps\jsp-examples\WEB-INF\classes\filters中的SetCharacterEncodingFilter.java文件):

package com.filters;import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.UnavailableException;

public class SetCharacterEncodingFilter implements Filter {

protected String encoding = null;

protected FilterConfig filterConfig = null;

protected boolean ignore = true;

public void destroy() {

this.encoding = null;

this.filterConfig = null;

}

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain)

throws IOException, ServletException {

// Conditionally select and set the character encoding to be used

if (ignore || (request.getCharacterEncoding() == null)) {

String encoding = selectEncoding(request);

if (encoding != null)

request.setCharacterEncoding(encoding);

}

// Pass control on to the next filter

chain.doFilter(request, response);

}

public void init(FilterConfig filterConfig) throws ServletException {

this.filterConfig = filterConfig;

this.encoding = filterConfig.getInitParameter("encoding");

String value = filterConfig.getInitParameter("ignore");

if (value == null)

this.ignore = true;

else if (value.equalsIgnoreCase("true"))

this.ignore = true;

else if (value.equalsIgnoreCase("yes"))

this.ignore = true;

else

this.ignore = false;

}

protected String selectEncoding(ServletRequest request) {

return (this.encoding);

}

}

同时在web.xml中添加一下片段:

SetCharacterEncoding

com.filters.SetCharacterEncodingFilter

encoding

GBK

SetCharacterEncoding

/*

3. JSP接收Form/Request传递的参数时显示为乱码

当我们按照第二种乱码的解决方式修改了web.xml并添加了filter之后,有时候并不一定就对乱码问题高枕无忧了,有时候我们会奇怪的发现Sevlet接收Form/Request传递的参数可以正常显示了,但是jsp页面接受Form/Request传递的参数却仍然显示为乱码。这是为什么呢?

对于我遇到的情况而言,我发现是由于我在用Form发送信息的页面采用了这样的html:

姓名

选出你喜欢吃的水果:

苹果

西瓜

桃子

葡萄

也就是说没有指定form的method属性。而问题就发生在此,Form的默认mothod属性为get.

而get是通过在发送请求的url后面加?然后加参数和值来传递数据的的,编码格式为ASCII.这就要求我们在传递的数据中有非ASCII字符或是超过了100个字符,那么你必须使用method="post",否则就会出现乱码。

所以解决方式为:第二种乱码的解决方式+在发送页面的Form中指定method为post.

4. 用时页面显示乱码的解决方式

此时实际上乱码的原因和产生其他几种乱码的原因不同,它的原因在于我们用eclipse编辑要forward的html或者jsp文件时,采用的编码是可以产生中文乱码的编码而不是GBK或者GB2312.所以解决方式就是把eclipse编辑器的编码方式改为GBK或者GB2312.

具体操作方式见:上文红色字体部分。

5. 数据库存取的时候产生乱码的解决方式(由于尚未遇到此问题,不知道说的是什么,故此部分完全采用枫之阁的文字。如有侵权,请及时联系我删除之,谢谢。)

当然,在写数据库时,也要保正数据库的编码与其它一致:

我们可以在系统盘windows目录下的my.ini文件,在文件中插入一行default-character-set=GBK,但上面说了这么多,大家也应该明白些了吧,改动太多的默认设置不是我的风格,因此上,这一行还是不要加的好。

但不管怎么样,我们还是要创建一个基于中文编码的数据库,当然,用客户端登录的时候,某些客户用自动把字体编码转换成中文编码。在这里,我想说一下在DOS下创建中文编码数据库的方法:

在进入数据库的时候,用mysql --default-character-set=gbk -u root -p 这句话进入mysql,然后创建数据库,如:create database admin;这样创建起来的数据库就是基于中文编码的了。

用连接数据库的时候,读出的数据也可能是乱码,解决这个问题的方法非常简单,只要在你建立数据库连接的时候把URL设置成下面这个样子就可以了:URL= jdbc:mysql://localhost:3306/my_database?useUnicode=true&characterEncoding=GBK

好了,说了这么多,总结一句话结束吧,把各种地方的编码统一起来,那么,所在的乱码问题就都解决了!

posted on 2009-04-16 10:22 MichaelLee 阅读(2295) 评论(1)  编辑  收藏

html输入表单jsp返回数据中文乱码,JSP/Servlet页面中文显示为乱码的解决方式相关推荐

  1. excel数据表单_Excel中的工作表数据输入表单

    excel数据表单 With a bit of programming, you can make it easy for users to enter data in an Excel workbo ...

  2. excel数据表单_新的改进的Excel数据输入表单

    excel数据表单 Many moons ago, Dave Peterson created a sample Excel worksheet data entry form and kindly ...

  3. 电子表单设计,表单打印,表单填写,数据发布,VC++,VB,源代码组件库

    电子表单设计,表单打印,表单填写,数据发布,VC++,VB,源代码组件库 -- 为您提供即刻可以拿来使用的源码级电子表单解决方案! E-Form++可视化组件库企业版本电子表单解决方案在E-Form+ ...

  4. form表单只提交数据而不进行页面跳转的解决方案

    转载 将数据提交到saveReport(form的action指向)页面,但是页面又不进行跳转,即保持当前页面不变呢?利用jquery的ajaxSubmit函数以及form的onsubmit函数完成 ...

  5. 表单提交对数据进行加密详解(RSA加密)

    一.使用背景 以前在做项目的时候就觉得表单直接明文提交非常不安全.有心之人只要稍加操作就能轻易获取用户的信息,这是非常可怕的事情,但又苦于不知道该如何加密,如何提高安全性. 后来慢慢接触到RSA,才知 ...

  6. 微信h5页面提交表单后返回键重复提交的问题

    微信h5页面提交表单后返回键重复提交的问题 问题描述:h5表单提交保存成功之后,手机返回后原来的页面还能提交表单. 示例: mui.post('savexxxx',data,function(res) ...

  7. web常用通用组件+Axure后台管理系统框架模板+大屏数据可视化元件库+智慧社区管理系统大屏+图表组件+表单组合+智慧数据看板+通用大屏图表原件库+电脑端常用组件

    作品介绍:web常用通用组件+Axure后台管理系统框架模板+大屏数据可视化元件库+智慧社区管理系统大屏+图表组件+表单组合+智慧数据看板+通用大屏图表原件库+电脑端常用组件 Axure原型演示及下载 ...

  8. vue表单验证(用户名、密码、身份证号、中文姓名、手机号、邮箱)

    vue表单验证(用户名.密码.身份证号.中文姓名.手机号.邮箱) new Vue({el: '#register',data: function() {// 验证邮箱let checkEmail = ...

  9. form表单提交FormData数据

    代码见https://gitee.com/bladeandmaster/freemarkerDemo 1.第一种直接使用form表单的submit提交 2.第二种采用ajax提交,需要设置conten ...

最新文章

  1. 解释一下SQLSERVER事务日志记录
  2. IOS sqlite数据库增删改查
  3. 论文阅读笔记:You Only Look Once: Unified, Real-Time Object Detection
  4. [css] 用css实现倒影的效果
  5. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 角色权限的配置页面改进优化...
  6. [码海拾贝 之JS] JS 之数组排序
  7. 基于matlab的直流调速仿真系统代码,基于Matlab的双闭环直流调速系统仿真研究毕业设计论文...
  8. linux 笔记本 显卡驱动,archlinux 笔记本安装nvidia显卡驱动与intel显卡驱动
  9. 7723java异形_7723-14-0
  10. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.25日(2019省赛A组第3题)
  11. c++编程简易计算器、JavaScript游戏
  12. 蘑菇街防重复请求处理的实践与总结
  13. 软件测试工程师面试如何描述自动化测试是怎么实现的?
  14. ROS 多机器人导航salm中的问题
  15. 亚马逊云科技北京区域第二个EC2可用区帮助客户构建高可用架构
  16. 实用解析dmp文件内容
  17. Windows10下VirtualBox虚拟机的备份与迁移
  18. 计算机通信原理知识点,《计算机通信原理与技术》.pdf
  19. dash linux命令,Linux shell语言——dash和bash
  20. python调用打印机参考例子_Python调用打印机参考例子

热门文章

  1. 【正则表达式】正则表达式及python的re模块学习
  2. 单选按钮、复选框、下拉框的回显
  3. 【Java】 # 使用java调用MySQL的函数、存储过程
  4. MyEclipse 里面怎么查看当前方法在哪儿被调用
  5. 苹果电脑php开发工具,Mac系统下给力的PHP开发工具
  6. Android studio 百度地图开发(5)查询周边服务(加油站)
  7. 如何引爆手淘首页流量,手淘首页流量获取玩法
  8. Flutter Container 设置最大最小宽高
  9. mysql树形结构 无限分类_使用 authenticationDatabase 参数连接 aliyun 上的 MongoDB - SegmentFault 思否...
  10. vue项目中导入视频