以下总结这段时间以来遇到的中文问题汇集:
注:以下“后台”字眼,相当于在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源代码中回出现类似:雨滴 这种“汉字内码”,比如jsf的代码如下:
<f:view>
<h:outputText value="#{testBean.testValue}"></h:outputText>
<br>
哈哈
</f:view>
<br>呵呵
浏览器显示如下:
雨滴雨滴2
哈哈
呵呵
而查看html源代码如下:
雨滴雨滴2
<br>
哈哈
<br>呵呵
我们发现用jsf标签出来的有内码,而不是jsf标签的就没事。(网页服务器编码等都是UTF-8统一的)。
那么有什么办法呢?
第一个方法,写一个自定义的Converter,在jsf中有这种功能,但是我测试了写了一个converter,但是效果令我失望,因为我发现jsf的内在逻辑把汉字变成内码的地方在converter以后,我在converter中添加什么东西,在html源代码中还是内码。于是放弃
第二种方法是在写个Servlet的Filter过滤器,放到web.xml中,但是由于汉字内码雨需要去掉前后坠,然后把这几个数字变成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作为Java EE的一部分,常常用于企业级应用开发,但处理中文字符时可能会遇到编码不兼容、乱码等问题...
2. 当用户在表单中输入数据后,JSF会调用相应的转换器将输入值转换为服务器端可处理的数据类型。 3. 自定义转换器可以通过实现`javax.faces.convert.Converter`接口或使用`@FacesConverter`注解来创建。 4. `...
通过上述内容可以看出,JSF提供了多种方式进行用户输入验证,包括手动验证、隐式自动验证、显式自动验证以及自定义验证方法。合理利用这些工具可以帮助开发者构建安全可靠的Web应用程序。同时,结合具体的业务场景...
《JSF中文教程》可能是这方面的资源,它可能涵盖了JSF的基础知识、进阶主题和实际案例,旨在帮助开发者快速上手并熟练运用JSF开发Web应用。 通过深入学习JSF,开发者不仅可以提高Web应用的开发效率,还能利用Java ...
在**JSF中文教程**中,通常会涵盖以下关键知识点: 1. **JSF架构**:JSF由多个组件构成,包括视图、控制器、模型和事件处理。视图由UI组件组成,如按钮、输入框等;控制器负责处理用户的交互;模型则包含业务数据和...
5. **国际化支持**:JSF支持多语言,这在“JSF中文使用教程”中可能包含如何设置和使用中文资源的内容。 **学习JSF的关键概念**: 1. **Facelet**:Facelets是JSF的默认视图技术,用于创建和组织用户界面组件。 2. ...
理解这些阶段对于优化性能和解决潜在问题至关重要。 **8. JSF与MVC模式** JSF遵循MVC设计模式,其中视图由Facelets文件表示,模型由Managed Beans实现,控制器则是JSF框架自身。这种结构使得代码组织清晰,易于维护...
**JSF(JavaServer Faces)** 是一个Java平台上的用户界面框架,用于构建和呈现Web应用程序。...通过深入学习和实践JSF中文教程以及参数传递方式,开发者可以更好地利用其功能,构建出符合现代Web标准的应用程序。
标签“jsf”直接指向JSF技术,意味着文档内容可能涉及JSF的使用、教程、最佳实践或者是解决JSF开发中遇到的问题。由于提供的文件内容主要是邮件头信息和HTML格式的元数据,它们并不直接包含JSF的具体知识点。但是,...
在JavaScript Server Faces (JSF)框架中,获取...同时,`JSF中文教程.chm`这样的资源可以帮助你深入理解JSF框架的更多细节,包括组件使用、生命周期、验证和转换等。通过不断实践和查阅资料,你可以成为JSF开发的专家。
总的来说,JSF中文帮助文档涵盖了JSF框架的所有关键概念和技术,包括API详解、生命周期、组件使用、数据绑定、验证、导航等,对于希望在Java Web开发中使用JSF的开发者来说,是极具价值的学习资源。通过阅读和实践,...
本资源提供了一份详细的JSF入门中文PDF教程,旨在帮助初学者快速理解并掌握JSF的核心概念和基本用法。 JSF的核心理念在于简化Java Web开发,通过组件化的方式将界面、业务逻辑和数据模型进行解耦。在JSF中,UI组件...
jsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSFjsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSF
而"JSF API"则是官方提供的详细接口文档,是开发者查找API用法、解决技术问题的关键工具。 "struts2.0中文帮助手册"和"struts2.0中文教程"聚焦于Struts2框架。Struts2是基于MVC(Model-View-Controller)设计模式的...
深入讨论JSF中Tree2组件使用方法。
JSF 1.2提供了一套丰富的预定义UI组件,如按钮、输入字段、表格等。这些组件可以通过XML(Faces配置文件)或者在JSP页面上直接声明。例如,`<h:inputText>`用于创建文本输入字段,`<h:commandButton>`用于创建提交...
5. **调用应用程序(Invoke Application)**:在这个阶段,JSF会调用应用程序中的方法来处理事件。例如,如果用户点击了一个按钮,JSF会执行对应的动作方法,该方法通常在管理Bean中定义。 6. **呈现响应(Render ...