`
yydy1983
  • 浏览: 47735 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Tomcat下中文的彻底解决

阅读更多
Tomcat下中文的彻底解决
发布时间: 2006年11月9日 07:57:05

作者:ponky

这些天开发一个项目,服务器是tomcat,操作系统是xp,采用的是MVC架构,模式是采用Facade模式,总是出现乱码,自己也解决了好多 天,同事也帮忙解决,也参考了网上众多网友的文章和意见,总算是搞定。但是好记性不如烂笔杆,所以特意记下,以防止自己遗忘,同时也给那些遇到同样问题的 人提供一个好的参考途径:
(一) JSP页面上是中文,但是看的是后是乱码:
解决的办法就是在JSP页面的编码的地方<%@ page language="java" contentType="text/html;charset=GBK" %>,因为Jsp转成Java文件时的编码问题,默认的话有的服务器是ISO-8859-1,如果一个JSP中直接输入了中文,Jsp把它当作 ISO8859-1来处理是肯定有问题的,这一点,我们可以通过查看Jasper所生成的Java中间文件来确认
(二) 当用Request对象获取客户提交的汉字代码的时候,会出现乱码:
解决的办法是:要配置一个filter,也就是一个Servelet的过滤器,代码如下:
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;

/**
* Example filter that sets the character encoding to be used in parsing the
* incoming request
*/
public class SetCharacterEncodingFilter implements Filter {

/**
* Take this filter out of service.
*/
public void destroy() {
}
/**
* Select and set (if specified) the character encoding to be used to
* interpret request parameters for this request.
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)throws IOException, ServletException {

request.setCharacterEncoding("GBK");

// 传递控制到下一个过滤器
chain.doFilter(request, response);
}

public void init(FilterConfig filterConfig) throws ServletException {
}
}
配置web.xml
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>SetCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果你的还是出现这种情况的话你就往下看看是不是你出现了第四中情况,你的Form提交的数据是不是用get提交的,一般来说用post提交的话是没有问题的,如果是的话,你就看看第四中解决的办法。
还有就是对含有汉字字符的信息进行处理,处理的代码是:
package dbJavaBean;

public class CodingConvert
{
public CodingConvert()
{
//
}
public String toGb(String uniStr){
String gbStr = "";
if(uniStr == null){
uniStr = "";
}
try{
byte[] tempByte = uniStr.getBytes("ISO8859_1");
gbStr = new String(tempByte,"GB2312");
}
catch(Exception ex){
}
return gbStr;
}

public String toUni(String gbStr){
String uniStr = "";
if(gbStr == null){
gbStr = "";
}
try{
byte[] tempByte = gbStr.getBytes("GB2312");
uniStr = new String(tempByte,"ISO8859_1");
}catch(Exception ex){
}
return uniStr;
}
}
你也可以在直接的转换,首先你将获取的字符串用ISO-8859-1进行编码,然后将这个编码存放到一个字节数组中,然后将这个数组转化成字符串对象就可以了,例如:
String str=request.getParameter(“girl”);
Byte B[]=str.getBytes(“ISO-8859-1”);
Str=new String(B);
通过上述转换的话,提交的任何信息都能正确的显示。
(三) 在Formget请求在服务端用request. getParameter(“name”)时返回的是乱码;按tomcat的做法设置Filter也没有用或者用 request.setCharacterEncoding("GBK");也不管用问题是出在处理参数传递的方法上:如果在servlet中用 doGet(HttpServletRequest request, HttpServletResponse response)方法进行处理的话前面即使是写了:
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
也是不起作用的,返回的中文还是乱码!!!如果把这个函数改成doPost(HttpServletRequest request, HttpServletResponse response)一切就OK了。
同样,在用两个JSP页面处理表单输入之所以能显示中文是因为用的是post方法传递的,改成get方法依旧不行。
由此可见在servlet中用doGet()方法或是在JSP中用get方法进行处理要注意。这毕竟涉及到要通过浏览器传递参数信息,很有可能引起常用字符集的冲突或是不匹配。
解决的办法是:
1) 打开tomcat的server.xml文件,找到区块,加入如下一行:
URIEncoding=”GBK”
完整的应如下:
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>

2)重启tomcat,一切OK。
需要加入的原因大家可以去研究 $TOMCAT_HOME/webapps/tomcat-docs/config/http.html下的这个文件就可以知道原因了。需要注意的是:这 个地方如果你要是用UTF-8的时候在传递的过程中在Tomcat中也是要出现乱码的情况,如果不行的话就换别的字符集。

(四) JSP页面上有中文,按钮上面也有中文,但是通过服务器查看页面的时候出现乱码:
解决的办法是:首先在JSP文件中不应该直接包含本地化的消息文本,而是应该通过<bean:message>标签从Resource Bundle中获得文本。应该把你的中文文本放到Application.properties文件中,这个文件放在WEB-INF/classes/* 下,例如我在页面里有姓名,年龄两个label,我首先就是要建一个Application.properties,里面的内容应该是name=”姓名” age=”年龄”,然后我把这个文件放到WEB-INF/classes/properties/下,接下来根据 Application.properties文件,对他进行编码转化,创建一个中文资源文件,假定名字是 Application_cn.properties。在JDK中提供了native2ascii命令,他能够实现字符编码的转换。在DOS环境中找到你 放置Application.properties的这个文件的目录,在DOS环境中执行一下命令,将生成按GBK编码的中文资源文件 Application_cn.properties:native2ascii ?Cencoding gbk Application.properties Application_cn.properties执行以上命令以后将生成如下内容的Application_cn.properties文件: name=\u59d3\u540d age=\u5e74\u9f84,在Struts-config.xml中配置:<message-resources parameter="properties.Application_cn"/>。到这一步,基本上完成了一大半,接着你就要在JSP页面上写 <%@ page language="java" contentType="text/html;charset=GBK" %>,到名字的那个label是要写<bean:message key=”name”>,这样的化在页面上出现的时候就会出现中文的姓名,年龄这个也是一样,按钮上汉字的处理也是同样的。
(五) 写入到数据库是乱码:
解决的方法:要配置一个filter,也就是一个Servelet的过滤器,代码如同第二种时候一样。
如果你是通过JDBC直接链接数据库的时候,配置的代码如下:jdbc:mysql://localhost:3306/workshopdb? useUnicode=true&characterEncoding=GBK,这样保证到数据库中的代码是不是乱码。
如果你是通过数据源链接的化你不能按照这样的写法了,首先你就要写在配置文件中,在tomcat 5.0.19中配置数据源的地方是在C:\Tomcat 5.0\conf\Catalina\localhost这个下面,我建立的工程是workshop,放置的目录是webapp下面, workshop.xml的配置文件如下:
<!-- insert this Context element into server.xml -->

<Context path="/workshop" docBase="workshop" debug="0"
reloadable="true" >

<Resource name="jdbc/WorkshopDB"
auth="Container"
type="javax.sql.DataSource" />

<ResourceParams name="jdbc/WorkshopDB">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>


<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>

<parameter>
<name>username</name>
<value>root</value>
</parameter>
<parameter>
<name>password</name>
<value></value>
</parameter>

<!-- Class name for mm.mysql JDBC driver -->
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value><![CDATA[jdbc:mysql://localhost:3306/workshopdb
?useUnicode=true&characterEncoding=GBK]]></value>
</parameter>
</ResourceParams>

</Context>
粗体的地方要特别的注意,和JDBC直接链接的时候是有区别的,如果你是配置正确的化,当你输入中文的时候到数据库中就是中文了,有一点要注意的是你在显 示数据的页面也是要用<%@ page language="java" contentType="text/html;charset=GBK" %>这行代码的。需要注意的是有的前台的人员在写代码的是后用Dreamver写的,写了一个Form的时候把他改成了一个jsp,这样有一个地方 要注意了,那就是在Dreamver中Action的提交方式是request的,你需要把他该过来,因为在jsp的提交的过程中紧紧就是POST和 GET两种方式,但是这两种方式提交的代码在编码方面还是有很大不同的,这个在后面的地方进行说明。3

以上就是我在开发系统中解决中文的问题,不知道能不能解决大家的问题,时间匆忙,没有及时完善,文笔也不是很好,有些地方估计是词不达意。大家可以给我意见,希望能共同进步。

 
分享到:
评论

相关推荐

    彻底解决Tomcat的页面提交时的中文问题

    彻底解决Tomcat的页面提交时的中文问题

    tomcat服务器如何配置字符集为utf-8彻底解决中文乱码的问题详解

    本篇文章将详细讲解如何在Tomcat服务器上配置字符集为UTF-8,以彻底解决中文乱码问题。 首先,我们要理解什么是字符集。字符集是一种规定,它定义了字符(如汉字、字母、数字等)与二进制数字之间的映射关系。这是...

    tomcat日志乱码处理方法总结

    2. **使用不同字符集测试**:为了确保乱码问题得到彻底解决,可以尝试输入包含各种字符的数据,比如中文、英文、特殊符号等,进一步验证日志输出的正确性。 #### 五、其他注意事项 - **兼容性考虑**:在修改编码时...

    Tomcat乱码问题

    本文将深入探讨Tomcat乱码问题的原因,并提供一系列有效的解决方案,帮助你彻底摆脱乱码的困扰。 #### 一、理解乱码根源 乱码的根本原因在于字符编码的不匹配。在Web开发中,数据可能在多个环节被编码和解码,包括...

    彻底解决jsp中用SmartUpload上传附件中文乱码问题实用.pdf

    以下是对彻底解决该问题的详细解析: 首先,理解问题的根本原因:中文文件名在传输过程中没有正确地进行编码和解码。由于文件名包含非ASCII字符(如中文字符),在不同系统之间传输时,如果编码格式不一致,就可能...

    彻底解决fckeditor(jsp版)上传中文图片乱码问题

    彻底解决fckeditor(jsp版)上传中文图片乱码问题,我这里用的编码是utf-8的,这里用的fckeditor 是2.6的,fckeditor.java包是2.3的,经过我修改ConnectorServlet.java和SimpleUploaderServlet.java两个文件,重新生成...

    BBS-CS_3_Tomcat4.rar

    V3.0版本在内核上较以前版本有了很大的改进,并且彻底解决了中文问题! BBS-CS V3.0环境配置说明: BBS-CS V3.0需要Servlet.jar和mm.mysql-2.0.4-bin.jar两个jar文件包,Servlet.jar是Servlet引擎,mm.mysql-2.0.4...

    使用过滤器解决中文乱码问题

    为了彻底解决这个问题,可以通过实现一个自定义的过滤器来处理请求。 ##### 实现过滤器 下面是一个简单的示例代码,展示了如何创建一个名为`CharacterEncodingFilter`的过滤器类,用于设置请求的字符编码: ```...

    超强过滤器彻底解决JSP-SERVLET中文参数GET-POST传递的问题(转)

    总结,"超强过滤器"是解决JSP-Servlet之间中文参数GET-POST传递问题的有效手段,通过统一设定请求的字符编码,确保在整个Web应用中中文数据能够正确无误地传输和处理。对于大型项目,这样的全局解决方案可以大大提升...

    jsp页面乱码最简单的解决办法

    接下来,我们将详细介绍如何配置此属性以及其他相关措施来彻底解决JSP页面的乱码问题。 ##### 1. 修改`server.xml`文件 打开Tomcat服务器的配置文件`server.xml`,找到`&lt;Connector&gt;`元素,在其内部添加属性`...

    jsp fckeditor 上传中文图片乱码问题的解决方法.docx

    通过以上步骤,可以彻底解决FCKeditor(jsp版)在上传中文图片时可能出现的乱码问题。确保每个环节都按照正确的编码设置,这样无论是文件名还是文件内容,都能正确地处理中文字符,避免乱码的出现。

    Ajax 博客网站系统

    1)MVC结构本实例在实现上严格遵循MVC结构。 2)本实例系统在开发时采用Eclipse+MyEclipse结合Tomcat部署,本章完整的讲述了工程的部署过程。...5)本系统介绍了一种彻底解决中文乱码问题的方法-UTF-8配置。

    JSP中乱码解决办法

    更彻底的解决方案是修改Tomcat服务器的配置文件`server.xml`,在Connector元素中添加`URIEncoding`属性,指定编码格式为GBK或UTF-8。这样,所有通过GET请求发送的参数都会被正确解析,避免了乱码问题。 ```xml ...

    【Web开发】彻底解决开发中请求(get/post)、应答以及控制台中文乱码问题

    总结起来,解决Java Web开发中的中文乱码问题,关键在于明确请求和响应的编码流程,并根据实际情况调整字符编码设置。对于响应,需要设置`HttpServletResponse`的字符编码和响应头。对于请求,尤其是GET请求,需关注...

    Struts2乱码终极解决办法

    本文将详细介绍如何彻底解决Struts2中的乱码问题,并提供实际可行的解决方案。 #### 二、乱码产生的原因 在Struts2框架中,中文乱码主要由以下几个方面的原因造成: 1. **请求编码问题**:客户端发送请求时未指定...

    JS中页面与页面之间超链接跳转中文乱码问题的解决办法

    在JavaScript中进行页面与页面之间的超链接跳转时,如果链接中包含中文字符,很可能会遇到中文乱码的问题。这种现象通常发生在URL传递过程中,服务器...通过系统地检查和配置,可以彻底解决页面跳转中的中文乱码问题。

    Java Web开发(JSP、Servlet)乱码终极解决方案.txt

    本篇将详细解析如何在Java Web项目中彻底解决乱码问题,确保数据在各个环节都能正确地显示和处理。 ### 一、项目配置 #### 1. 开发工具编码设置 - **Eclipse**: 在Eclipse中,通过`Preferences -&gt; General -&gt; ...

    JSP struts2 url传参中文乱码解决办法

    因此,为了彻底解决URL中中文乱码的问题,需要对Web服务器的配置文件进行调整,对于使用Apache Tomcat服务器的情况,需要修改\conf\server.xml文件,在HTTP连接器()标签中添加URIEncoding="UTF-8"属性,这样服务器...

Global site tag (gtag.js) - Google Analytics