`
liqita
  • 浏览: 291390 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Tomcat+MySql+Struts的中文问题 [过滤器]

阅读更多
开发Web应用程序时,无论是用什么样的框架技术来开发,一碰从数据库存取涉及到中文的数据,就要面对中文乱码或者是各种编码方式不匹配的异常,今天晚上终于搞定了Tomcat+MySql+Struts的中文问题,用到了很简单的方法,很快就能搞定。

    在做以下工作之前,所有的HTML/JSP的charset都设为charset=gb2312。

    第一个要解决的是表单提交乱码问题。在使用Struts提供的ActionForm过程中,无论表单采用的是Struts标签还是Html标签,都可以用ActionForm的Get/Set来获取和设置表单的元素值(它们的作用效果与request.getParameter()方法一样),但提取出来的数据不经过处理的话就是乱码,主要的原因是1.Tomcat的J2EE实现对表单提交即Post方法提交时,处理参数采用默认的ISO8859_1来处理2.Tomcat对Get方法提交的请求在query-string处理时采用了和Post方法不一样的处理方式。所以如果要正确地显示和获取中文数据采用的解决方案:(1)对于Post方法提交的表单通过编写一个过滤器(filer)的方法解决,过滤器在用户提交的数据被处理之前被调用,可以通过这个Java代码改变参数的编码方式(目标编码方式可以通过Web.xml文件里面的参数指定)。过滤器的代码如下:

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;


/**
* <p>Example filter that sets the character encoding to be used in parsing the
* incoming request, either unconditionally or only if the client did not
* specify a character encoding.  Configuration of this filter is based on
* the following initialization parameters:</p>
* <ul>
* <li><strong>encoding</strong> - The character encoding to be configured
*     for this request, either conditionally or unconditionally based on
*     the <code>ignore</code> initialization parameter.  This parameter
*     is required, so there is no default.</li>
* <li><strong>ignore</strong> - If set to "true", any character encoding
*     specified by the client is ignored, and the value returned by the
*     <code>selectEncoding()</code> method is set.  If set to "false,
*     <code>selectEncoding()</code> is called <strong>only</strong> if the
*     client has not already specified an encoding.  By default, this
*     parameter is set to "true".</li>
* </ul>
*
* <p>Although this filter can be used unchanged, it is also easy to
* subclass it and make the <code>selectEncoding()</code> method more
* intelligent about what encoding to choose, based on characteristics of
* the incoming request (such as the values of the <code>Accept-Language</code>
* and <code>User-Agent</code> headers, or a value stashed in the current
* user’s session.</p>
*
* @author Craig McClanahan
* @version $Revision: 1.2 $ $Date: 2004/03/18 16:40:33 $
*/

public class SetCharacterEncodingFilter implements Filter {


    // ----------------------------------------------------- Instance Variables


    /**
     * The default character encoding to set for requests that pass through
     * this filter.
     */
    protected String encoding = null;


    /**
     * The filter configuration object we are associated with.  If this value
     * is null, this filter instance is not currently configured.
     */
    protected FilterConfig filterConfig = null;


    /**
     * Should a character encoding specified by the client be ignored?
     */
    protected boolean ignore = true;


    // --------------------------------------------------------- Public Methods


    /**
     * Take this filter out of service.
     */
    public void destroy() {

        this.encoding = null;
        this.filterConfig = null;

    }


    /**
     * Select and set (if specified) the character encoding to be used to
     * interpret request parameters for this request.
     *
     * @param request The servlet request we are processing
     * @param result The servlet response we are creating
     * @param chain The filter chain we are processing
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet error occurs
     */
    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);

    }


    /**
     * Place this filter into service.
     *
     * @param filterConfig The filter configuration object
     */
    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 Methods


    /**
     * Select an appropriate character encoding to be used, based on the
     * characteristics of the current request and/or filter initialization
     * parameters.  If no character encoding should be set, return
     * <code>null</code>.
     * <p>
     * The default implementation unconditionally returns the value configured
     * by the <strong>encoding</strong> initialization parameter for this
     * filter.
     *
     * @param request The servlet request we are processing
     */
    protected String selectEncoding(ServletRequest request) {

        return (this.encoding);

    }

}

编绎后把class文件放在classes目录下,并在Web应用的web.xml文件中添加如下代码:

<filter>
  <filter-name>Set Character Encoding</filter-name>
  <filter-class>com.neusoft.equipment.controller.SetCharacterEncodingFilter</filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>gbk</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>Set Character Encoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>只要是gb2312,gbk,utf8等支持多字节编码的字符集都可以储存汉字,当然,gb2312中的汉字数量远少于gbk,而gb2312,gbk等都可在utf8下编码,这里指定目标编码方式是gbk,重新启动Tomcat后就可以了。
(2)对Get方法提交的表单,由于参数是紧跟在用户的URL请求后面,Tomcat对其的处理方法与Post方法不一样。所以上面设置的过滤器对Get方法没有作用,它需要在其他地方设置。找到Tomca的server.xml配置文件,找到对80(或者是8080等别的,这个是自己修改后的)的Connector组件的设置部分,给这个Connector组件添加一个属性:URIEncoding="GBK"。修改后的Connector组件是这样的:

<!-- Define a non-SSL HTTP/1.1 Connector on port 80-->
    <Connector port="80" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true"  URIEncoding="GBK"/>这样修改后,重启Tomcat就可以正确处理GET方法提交的表单数据了。

    第二个要解决的是数据库存取数据出现的乱码等情况。对于不同的数据库往往支持不同的编码,造成了应用时比较混乱,不同的数据库的解决方法往往是不同的,针对MySql,网上也有各种各样的解决方案,但个人觉得那些太繁了,现在有一个极其简单的解决办法:修改MySql的配置文件,打开MySql安装后的根目录,找到my.init文件,把[mysqld]区的如下语句:default-character-set=latin1修改为:default-character-set=gbk,然后在[client]区增加:default-character-set=gbk,修改后记得做一件事情,到Widows控制面板的管理工具下的服务程序,把Mysql服务停止了重新启动,这样就根本解决了MySql的数据库乱码问题,很简单~~~~
分享到:
评论

相关推荐

    解决Tomcat+MySql+Struts的中文问题

    在开发基于Java的Web应用程序时,常常会遇到中文字符编码的问题,尤其是在Tomcat服务器、MySQL数据库和Struts框架的组合中。这个问题主要涉及到字符集的兼容性和一致性,因为每个环节都可能有自己的默认编码方式,...

    Struts+Hibernate+MyEclipse+Tomcat+MySQL的乱码之解决篇

    在本篇文章中,我们将深入探讨如何解决Struts + Hibernate + MyEclipse + Tomcat + MySQL环境中出现的乱码问题。该问题通常出现在处理中文字符时,由于编码设置不当导致中文显示为乱码或无法正常读取。为了确保系统...

    Struts+Hibernate+MyEclipse+Tomcat+MySQL的乱码之解决

    在开发Java Web应用程序时,经常会遇到编码问题,尤其是在使用Struts、Hibernate、MyEclipse、Tomcat和MySQL等技术栈时。这个问题主要涉及到各种组件之间的编码一致性,以及数据的正确转换。本文将针对这些技术的...

    java8+tomcat8+struts2.5+spring4.3+hibernate5.2框架搭建详细过程

    - 配置Struts2的过滤器。 - 示例配置: ```xml &lt;filter-name&gt;struts2 &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter &lt;filter-name&gt;struts2 &lt;url-pattern&gt;/* ...

    struts2+jsp+mysql 编写用户注册程序

    2. **配置web.xml**:配置Struts2的过滤器`FilterDispatcher`,这是Struts2框架工作所必需的基础配置之一。 3. **部署MySQL JDBC驱动**:将MySQL的JDBC驱动程序添加到Tomcat的lib目录下,以便能够通过Java程序连接...

    zebraCMS(斑马内容管理系统)1.0安装包

    windows(linux)+eclipse+mysql+mysql query browser +tomcat +zebraCMS+dreamvear+photoshop windows(linux)+netbeans+mysql+mysql query browser +tomcat +zebraCMS+dreamvear+photoshop 快速开发平台构建: ...

    zebraCMS(斑马内容管理系统)源码

    windows(linux)+eclipse+mysql+mysql query browser +tomcat +zebraCMS+dreamvear+photoshop windows(linux)+netbeans+mysql+mysql query browser +tomcat +zebraCMS+dreamvear+photoshop 快速开发平台构建: ...

    SSH实现mysql+tomcat+myeclipse 简单登录及论坛功能

    首先,Struts2是MVC(模型-视图-控制器)架构的一个框架,它负责处理用户请求,提供视图展示,并与业务逻辑层进行交互。Struts2的核心是Action,它是处理请求的实体,可以通过配置struts.xml文件定义Action的映射和...

    jsp+servlet+mysql实现的在线鲜花商城源码

    此外,项目的配置文件如web.xml对于部署和运行也至关重要,它定义了Servlet的映射、过滤器、监听器等配置信息。 总之,这个在线鲜花商城项目提供了学习和实践Java Web开发的实战案例,涵盖了从数据库设计、后端开发...

    Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作1

    在本教程中,我们将深入探讨如何使用Java、MyEclipse和Tomcat来实现Servlet和DAO(数据访问对象)模式下的数据库操作,特别是针对增删改查(CRUD)功能。首先,我们需要理解整个项目的结构。 项目结构遵循DAO设计...

    jbpm4.4+tomcat+s2sh

    这会在项目中生成struts.xml配置文件和相应的web.xml配置,用于过滤器的设置,确保Struts2能正常工作。 **Hibernate配置** 接下来,需要配置Hibernate,创建数据访问对象(DAO)和持久化对象(PO),并编写对应的...

    Spring2.5.3+Hibernate3.2+Struts2.0.11整合

    例如,配置`Struts2`过滤器(`FilterDispatcher`)和字符编码过滤器(`CharacterEncodingFilter`)。 4. **编写实体类**: 对应数据库中的表,创建Java实体类并使用Hibernate注解或XML配置文件进行映射。 5. **...

    jpetstore4.0 (spring+struts+ibatis)

    这个项目是针对JDK7及更高版本,以及Tomcat6及以上版本进行优化的,并且使用MySQL作为其后台数据库。接下来,我们将深入探讨这三个关键组件及其在jpetstore4.0中的作用。 **Spring框架** Spring是Java企业级应用...

    strucs+mysql实现留言板

    同时,还需要在web.xml中配置过滤器以启用Struts。部署时,将整个项目打包成WAR文件,然后上传到服务器的Web容器(如Tomcat)中进行运行。 **安全与优化** 为了保证系统的安全性,需要对用户输入进行验证和过滤,...

    Java的struts2+MySQL+jsp实现登录、注册以及文件上传demo的jar包文件

    Struts2是一个强大的MVC(模型-视图-控制器)框架,它在Java Web开发中广泛应用,用于构建可维护性高、结构清晰的Web应用程序。MySQL是世界上最流行的开源关系型数据库管理系统,它以其高效、稳定和易用性而受到...

    java学生成绩管理系统源码数据库 MySQL源码类型 WebForm

    JAVA学生成绩管理系统源码 开发语言:JAVA, 框架:SSH+Mysql+jsp (struts2 + spring + hibernate) ...5. 中文乱码使用自定义过滤器 6. 分页使用的是pager-taglib框架 7. 后台登陆使用的是frameset框架

    网上购物系统(jsp+struts)

    - web.xml:Web应用的部署描述符,配置了Servlet和过滤器。 - 数据库脚本(.sql):用于创建和初始化数据库表。 - 图片和其他静态资源:用于网页设计。 - 其他配置文件(如log4j.properties,hibernate.cfg.xml等)...

    struts2.3+hibernate4.1+spring3.2+EasyUI1.36整合实现的java后台管理系统

    3. **整合框架**:配置Struts2的核心过滤器、Action类、结果类型以及拦截器;配置Spring的Bean定义和依赖注入;配置Hibernate的数据源、SessionFactory和实体类。 4. **数据库设计**:创建对应的数据库表,定义实体...

    学生信息后台管理系统 (S2SH)(含MySQL数据库)

    6. `web.xml`: 应用的部署描述符,配置了过滤器、监听器等。 这个项目对于初学者来说,可以帮助理解SSH框架的整合和使用,以及如何构建一个完整的管理信息系统。同时,通过实际操作MySQL数据库,可以提升对数据库...

    struts MySQL数据库开发的留言板

    Struts和MySQL数据库结合开发留言板系统是Web应用开发中的一个常见场景。Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它可以帮助开发者构建结构清晰、可维护性强的Web应用程序。而MySQL则...

Global site tag (gtag.js) - Google Analytics