JSP/Servlet页面中文显示为乱码的解决方式

原创 2007年09月24日 17:39:00
经过网上搜索和自己的经验,JSP/Servlet页面的中文显示为乱码的问题可以细分为5类:
1. JSP页面显示乱码。
2. Servlet接收Form/Request传递的参数时显示为乱码
3. JSP接收Form/Request传递的参数时显示为乱码
4. 用<jsp:forward page="catalog2.html"></jsp:forward>时页面显示乱码
5. 数据库存取的时候产生乱码。
解决方式:
1. JSP页面显示乱码的解决方式:
第一种方式为在页面的开头加上:
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
<!--这里的 GBK可以由 gb2312代替,此处以GBK为例。下同 -->
注:有时候如果不再页面开头加上这句,则页面中无法保存中文字符,并提示:中文字符在不能被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中添加以下片段:
<!-- 下面的代码为解决页面乱码问题而加入 -->
<jsp-config>
            <jsp-property-group>
                <description>
                   Special property group for JSP Configuration JSP example.
                </description>
                <display-name>JSPConfiguration</display-name>
                <url-pattern>*.jsp</url-pattern>
                <el-ignored>true</el-ignored>
                <page-encoding>GBK</page-encoding>
                <scripting-invalid>false</scripting-invalid>
                <include-prelude></include-prelude>
                <include-coda></include-coda>
            </jsp-property-group>            
            <jsp-property-group>
                <description>
                   Special property group for JSP Configuration JSP example.
                </description>
                <display-name>JSPConfiguration</display-name>
                <url-pattern>*.html</url-pattern>
                <el-ignored>true</el-ignored>
                <page-encoding>GBK</page-encoding>
                <scripting-invalid>false</scripting-invalid>
                <include-prelude></include-prelude>
                <include-coda></include-coda>
</jsp-property-group>
</jsp-config>
<!--       添加的代码结束 -->
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中添加一下片段:
<!-- 为解决乱码问题而添加 -->  
          <filter>
             <filter-name>SetCharacterEncoding</filter-name>
             <filter-class>com.filters.SetCharacterEncodingFilter</filter-class>
             <init-param>
                 <param-name>encoding</param-name>
                 <param-value>GBK</param-value>
             </init-param>
          </filter>
         <filter-mapping>
             <filter-name>SetCharacterEncoding</filter-name>
             <url-pattern>/*</url-pattern>
         </filter-mapping>
<!-- 添加代码结束 -->  
3. JSP接收Form/Request传递的参数时显示为乱码
当我们按照第二种乱码的解决方式修改了web.xml并添加了filter之后,有时候并不一定就对乱码问题高枕无忧了,有时候我们会奇怪的发现Sevlet接收Form/Request传递的参数可以正常显示了,但是jsp页面接受Form/Request传递的参数却仍然显示为乱码。这是为什么呢?
对于我遇到的情况而言,我发现是由于我在用Form发送信息的页面采用了这样的html:
<form action="getParam.jsp" >
姓名<input type="text" name ="UserName"> <br>
选出你喜欢吃的水果:
<input type ="checkbox" name = "checkbox1" value = "苹果"> 苹果
<input type ="checkbox" name = "checkbox1" value = "西瓜"> 西瓜
<input type ="checkbox" name = "checkbox1" value = "桃子"> 桃子
<input type ="checkbox" name = "checkbox1" value = "葡萄"> 葡萄
<input type = "submit" value = "提交">
</form>
也就是说没有指定form的method属性。而问题就发生在此,Form的默认mothod属性为get.
而get是通过在发送请求的url后面加?然后加参数和值来传递数据的的,编码格式为ASCII.这就要求我们在传递的数据中有非ASCII字符或是超过了100个字符,那么你必须使用method="post",否则就会出现乱码。
所以解决方式为:第二种乱码的解决方式+在发送页面的Form中指定method为post.
4. 用<jsp:forward page="catalog2.html"></jsp:forward>时页面显示乱码的解决方式
此时实际上乱码的原因和产生其他几种乱码的原因不同,它的原因在于我们用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
好了,说了这么多,总结一句话结束吧,把各种地方的编码统一起来,那么,所在的乱码问题就都解决了!
文章参考:tomcat 乱码解决
                    HTML <form>标签
 

jsp、servlet中文乱码终极解决方法

jsp中文乱码终极解决方法 一 找出问题的根源    乱码可能出现的地方:1 jsp页面中                         2 jsp页面之间相互传参的参数        ...
  • csh624366188
  • csh624366188
  • 2011年08月03日 16:44
  • 33751

servlet页面中文乱码或是问号

response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); ////////把这句加上,且...
  • u010002184
  • u010002184
  • 2015年11月10日 18:13
  • 1795

过滤器解决Servlet中文乱码

一、问题描述:Servlet接收来自JSP页面的中文参数时,在Servlet文件中编写输出语句,控制台输出中文乱码。 过滤器解决方法:(这个问题我前面的文章已近解决,只不过你每次都要在Servlet...
  • lmengyunge
  • lmengyunge
  • 2014年08月15日 11:55
  • 2445

JSP/Servlet页面中文显示为乱码的解决方式

经过网上搜索和自己的经验,JSP/Servlet页面的中文显示为乱码的问题可以细分为5类:1. JSP页面显示乱码。2. Servlet接收Form/Request传递的参数时显示为乱码3. JSP接...
  • LegnaFlow
  • LegnaFlow
  • 2007年09月24日 17:39
  • 686

Servlet页面中文乱码问题

Servlet与页面之间的中文乱码问题1介绍很多时候,我们在写JavaEE的Servlet程序时,需要从前端页面获取数据,在控制台打印输出,或者在Servlet中设置名称,在其它页面显示或其他程序中输...
  • kevinr1990
  • kevinr1990
  • 2017年11月28日 15:13
  • 73

解决浏览器,servlet,jsp页面之间传值出现乱码的情况

解决浏览器,servlet,jsp页面之间传值出现乱码的情况每天进步一点点!做一个写代码的老司机!废话不多说,上代码:在servlet中设置/*****设置请求时的编码格式*****/ req.set...
  • u014804456
  • u014804456
  • 2016年09月22日 08:06
  • 1274

从servlet转发跳到Jsp页面中时出现的乱码问题

因为我用的IDE是eclipse,所以在生成servlet时,是自动生成的,在doGet方法内会自动添加上: response.getWriter().append("Served at: ").a...
  • x763795151
  • x763795151
  • 2016年09月08日 15:29
  • 2079

servlet中解决乱码

  • 2013年07月05日 14:53
  • 19KB
  • 下载

Servlet中文显示问号解决方法

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti...
  • u010002184
  • u010002184
  • 2016年05月23日 01:36
  • 2170

servlet跳转到JSP页面会出现乱码

问题描述:servlet跳转到JSP页面的时候会出现乱码。但是直接访问JSP页面不会出现乱码,乱码情况如图所示 servlet情况 我发现去掉servlet上面的那两句话,JSP乱码情况是...
  • ttf1993
  • ttf1993
  • 2015年01月11日 15:21
  • 3276
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JSP/Servlet页面中文显示为乱码的解决方式
举报原因:
原因补充:

(最多只允许输入30个字)