`
hi_jfeng
  • 浏览: 5186 次
  • 来自: 深圳
社区版块
存档分类
最新评论

[转]JSF中文输入乱码问题解决方法

阅读更多


以下总结这段时间以来遇到的中文问题汇集:

注:以下“后台”字眼,相当于在servlet内,或者某一个类内,或者struts的action内。

1.一字符串在后台用system.out.println输出正常,保存在session里到JSP页面显示乱码

最初的乱码问题.

原因:似乎是默认的JSP页面采用8859-1编码,显示不了中文。

解决:在JSP页面上方加个<%@ page contentType="text/html;charset=utf-8"%>解决。当然,也可以用charaset="gbk","gb2312"之类的编码,不过建议还是用utf-8,详细原因去看看jdon板桥里人的那篇《中文乱码终极解决方法》。

*****************************************************************************

2.提交表单,在后台读取表单内容发现乱码

原因:request的默认编码问题,具体不甚清楚,没看过tomcat源代码。。。

解决:写个fileter,具体如下:

package operator;

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;

public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;

protected FilterConfig filterConfig = null;

public void init(FilterConfig filterConfig) throws ServletException {
  this.filterConfig = filterConfig;
  this.encoding = filterConfig.getInitParameter("encoding");
}

public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {

  request.setCharacterEncoding("UTF-8");
  chain.doFilter(request, response);
}

public void destroy() {

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

protected String selectEncoding(ServletRequest request) {
  return (this.encoding);
}
}

web.xml配置:

在servlet-mapping后加入以下内容:

<filter>
  <filter-name>Set Character Encoding</filter-name>
  <filter-class>operator.SetCharacterEncodingFilter</filter-class>
   <init-param>
   <param-name>encoding</param-name>
   <param-value>UTF-8</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>Set Character Encoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
***********************************************************************

3.下载时,“另保存为”默认名字显示乱码

原因:不清楚。。。

在tomcat安装目录的config/sever.xml内的

    <Connector
port="80"               maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />

加进最后的“URIEncoding="UTF8"

4.在后台用system.out.println()输出正常,保存到mysql数据库EMS显示乱码,读回数据也是乱码

原因:mysql默认采用的是latin1编码;

解决:创建表的时候要修改成utf-8。如果已存在表,用EMS的话,直接修改table-property里面的default charater set就可以了,其他管理工具不知道,没用过。

5.在后台用system.out.println()输出正常,保存到mysql数据库EMS显示乱码,读回数据时——居然正常了,直接往数据库里插入正常的中文,读出——居然乱码了;

原因:EMS管理工具的默认显示问题

解决:register数据库时,client default  charater set改utf-8

注:这该死的问题困扰了我好长一段时间,一直以为我程序有问题,检查了N久,发现居然是工具显示问题。。

6.COMMON-UPLOAD 上传中文名文件时,显示乱码

原因:common-upload组件默认采用系统的编码,而页面传过来的请求采用UTF-8编码。

我的系统是简体中文WINDOWS 2K3,系统编码是GBK,当页面请求过来时,UPLOAD就把UTF8编码的流直接按GBK编码了。。。如果用new String(oldStr.getBytes("gbk"),"utf8)可以发现,部分中文可以还原回去。

解决:网上的说法五花八门,甚至有归罪于这是UPLOAD的BUG,其实只要在

DiskFileUpload fu = new DiskFileUpload();

后加一句:

fu.setHeaderEncoding("utf8");

就解决了。。。

看来有时候还是直接读英文帮助手册来得正确。。。



问题描述:
在inputtext中输入中文,然后在输出,显示为乱码。

解决方法:
1、自定义转器
package util;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.convert.Converter;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;

public class StringConverter implements Converter {
public Object getAsObject(FacesContext context, UIComponent component,
   String newValues) throws ConverterException {
  String newstr = "";
  if (newValues == null) {
   newValues = "";
  }
  byte[] byte1 = null;
  try {
   byte1 = newValues.getBytes("ISO-8859-1");
   newstr = new String(byte1, "GB2312");
   UIInput input=(UIInput)component;//
   input.setSubmittedValue(newstr);
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }

  return newstr;

}

public String getAsString(FacesContext context, UIComponent component,
   Object Values) throws ConverterException {
  return (String) Values;
}
}

2、注册转换器
faces-config.xml片段
<converter>
  <converter-id>stringconverter</converter-id>
  <converter-class>util.StringConverter</converter-class>
</converter>

3、在页面使用转换器
<h:inputText id="account" value="#{util.account}" required="true" styleClass="input" >
<f:converter converterId="stringconverter"/>                                                                       <!--注:这里不是EL表达式-->
</h:inputText>





      JSF估计是天生就是这个毛病,凡是有jsf标签生成的html代码中有中文的(指从 backbean中提取出来的),在html源代码中回出现类似:&#38632;&#28404; 这种“汉字内码”,比如jsf的代码如下:
<f:view>
   <h:outputText value="#{testBean.testValue}"></h:outputText>
   <br>
   哈哈
</f:view>
<br>呵呵

浏览器显示如下:
雨滴雨滴2
哈哈
呵呵

而查看html源代码如下:

&#38632;&#28404;&#38632;&#28404;2
<br>
哈哈
<br>呵呵

我们发现用jsf标签出来的有内码,而不是jsf标签的就没事。(网页服务器编码等都是UTF-8统一的)。

那么有什么办法呢?

第一个方法,写一个自定义的Converter,在jsf中有这种功能,但是我测试了写了一个converter,但是效果令我失望,因为我发现jsf的内在逻辑把汉字变成内码的地方在converter以后,我在converter中添加什么东西,在html源代码中还是内码。于是放弃

第二种方法是在写个Servlet的Filter过滤器,放到web.xml中,但是由于汉字内码&#38632;需要去掉前后坠,然后把这几个数字变成char,在变成String。每个字都用这种方法变回来,这样本身效率回很低,而且一个html文档中用jsf显示的内容占有比率有多有少,如果没有标签的也是用这个过滤器一个字一个字取解析,那么效率就更不敢恭维了。虽然这种方法一定可行(因为过滤器可以到输出的最后一步),但是由于效率问题,我没有取试。

第三种方法是我自己研究出来的,通过FacesContext类来作,方法如下:
首先,写一个类
public class Converter {
public static void process(String str){
   FacesContext fc=FacesContext.getCurrentInstance();
   try {
    fc.getResponseWriter().write(str);
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
}
}
然后在每个backbean中需要getXXX方法中返回是String的方法中修改如下:
      把 return XXX   改为   return ""
      在return前面,也就是方法的最后一步,添加Converter.process(testValue),这个testValue是你要return的变量
ok,就这么简单^_^。。。

在网上找了一天没找到合理解决方法,用这个方法终于解决了。。
分享到:
评论

相关推荐

    JSF中文问题解决方法完整版

    这篇博文“JSF中文问题解决方法完整版”提供了关于如何处理JSF框架在处理中文字符时可能出现的问题的解决方案。JSF作为Java EE的一部分,常常用于企业级应用开发,但处理中文字符时可能会遇到编码不兼容、乱码等问题...

    JSF(转换器+验证器)

    2. 当用户在表单中输入数据后,JSF会调用相应的转换器将输入值转换为服务器端可处理的数据类型。 3. 自定义转换器可以通过实现`javax.faces.convert.Converter`接口或使用`@FacesConverter`注解来创建。 4. `...

    jsf用户输入验证

    通过上述内容可以看出,JSF提供了多种方式进行用户输入验证,包括手动验证、隐式自动验证、显式自动验证以及自定义验证方法。合理利用这些工具可以帮助开发者构建安全可靠的Web应用程序。同时,结合具体的业务场景...

    JSF中文教程jsf

    《JSF中文教程》可能是这方面的资源,它可能涵盖了JSF的基础知识、进阶主题和实际案例,旨在帮助开发者快速上手并熟练运用JSF开发Web应用。 通过深入学习JSF,开发者不仅可以提高Web应用的开发效率,还能利用Java ...

    JSF中文教程.zip

    在**JSF中文教程**中,通常会涵盖以下关键知识点: 1. **JSF架构**:JSF由多个组件构成,包括视图、控制器、模型和事件处理。视图由UI组件组成,如按钮、输入框等;控制器负责处理用户的交互;模型则包含业务数据和...

    jsf中文使用教程jsf中文使用教程

    5. **国际化支持**:JSF支持多语言,这在“JSF中文使用教程”中可能包含如何设置和使用中文资源的内容。 **学习JSF的关键概念**: 1. **Facelet**:Facelets是JSF的默认视图技术,用于创建和组织用户界面组件。 2. ...

    精通JSF中文教程精通JSF中文教程

    理解这些阶段对于优化性能和解决潜在问题至关重要。 **8. JSF与MVC模式** JSF遵循MVC设计模式,其中视图由Facelets文件表示,模型由Managed Beans实现,控制器则是JSF框架自身。这种结构使得代码组织清晰,易于维护...

    JSF中文教程+JSF参数传递方式

    **JSF(JavaServer Faces)** 是一个Java平台上的用户界面框架,用于构建和呈现Web应用程序。...通过深入学习和实践JSF中文教程以及参数传递方式,开发者可以更好地利用其功能,构建出符合现代Web标准的应用程序。

    JSF帮助文档

    标签“jsf”直接指向JSF技术,意味着文档内容可能涉及JSF的使用、教程、最佳实践或者是解决JSF开发中遇到的问题。由于提供的文件内容主要是邮件头信息和HTML格式的元数据,它们并不直接包含JSF的具体知识点。但是,...

    jsf获取表单的两种方法

    在JavaScript Server Faces (JSF)框架中,获取...同时,`JSF中文教程.chm`这样的资源可以帮助你深入理解JSF框架的更多细节,包括组件使用、生命周期、验证和转换等。通过不断实践和查阅资料,你可以成为JSF开发的专家。

    jsf 中文帮助文档

    总的来说,JSF中文帮助文档涵盖了JSF框架的所有关键概念和技术,包括API详解、生命周期、组件使用、数据绑定、验证、导航等,对于希望在Java Web开发中使用JSF的开发者来说,是极具价值的学习资源。通过阅读和实践,...

    JSF入门(中文pdf)

    本资源提供了一份详细的JSF入门中文PDF教程,旨在帮助初学者快速理解并掌握JSF的核心概念和基本用法。 JSF的核心理念在于简化Java Web开发,通过组件化的方式将界面、业务逻辑和数据模型进行解耦。在JSF中,UI组件...

    jsf实例jsf实例 JSF学习 JSF jar包 JSF

    jsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSFjsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSF

    教程与手册(Dhtml手册、 JSF中文教程)

    而"JSF API"则是官方提供的详细接口文档,是开发者查找API用法、解决技术问题的关键工具。 "struts2.0中文帮助手册"和"struts2.0中文教程"聚焦于Struts2框架。Struts2是基于MVC(Model-View-Controller)设计模式的...

    深入讨论JSF中Tree2组件使用方法

    深入讨论JSF中Tree2组件使用方法。

    core jsf 1.2 jsf 核心

    JSF 1.2提供了一套丰富的预定义UI组件,如按钮、输入字段、表格等。这些组件可以通过XML(Faces配置文件)或者在JSP页面上直接声明。例如,`&lt;h:inputText&gt;`用于创建文本输入字段,`&lt;h:commandButton&gt;`用于创建提交...

    JSF的工作方式 JSF架构 JSF模型 JSF事件类型

    5. **调用应用程序(Invoke Application)**:在这个阶段,JSF会调用应用程序中的方法来处理事件。例如,如果用户点击了一个按钮,JSF会执行对应的动作方法,该方法通常在管理Bean中定义。 6. **呈现响应(Render ...

Global site tag (gtag.js) - Google Analytics