(一)JSP的中文乱码问题
其根源在于:Web容器(Tomcat)默认的字符处理编码是iso-8859-1,对于需要在浏览器页面上显示中文的JSP程序,
器有些不是这样的,比如BEA Weblogic和IBM Websphere是从操作系统中取得默认的编码,然后按该编码来转码所有用户请求.Struts中
1. 发送请求时的中文问题
客户机向服务器发送请求时,根据所使用浏览器的不同可能会有不同的编码形式。不过通常情况下在请求到达Web容器前要将之转码,
转成某种固定的编码以方便Web应用的处理。这种问题有三种处理方法:
第一种(针对Tomcat 5 对POST请求有效,GET请求无效,因为Tomcat 5 对POST和GET请求时分别处理的)可以采用设置用户请求对象的编码形式,也就是以HttpServletRequest对象的编码的形式来进行用户请求的转码:
//将用户请求转码为GB2312、GB18030、GBK、UTF-8 等型,具体转为什么类型的编码以您的jsp文件的编码方式为准,java、jsp 、js 、css应保持一致的编码方式。这里以GBK为例。
request.setCharacterEncoding("GBK");
第二种(对GET请求有效),可以在Servlet中对用户输入的数据进行转码。Web容器接受到一个请求时,它会将它发往某个处理的Servlet。在Servlet中直接获取用户请求的数据,然后将之转码为需要的格式,例如把数据转换为GBK格式:
String username = request.getParameter("username");
username = new String(username.getBytes("iso-8859-1”), "GBK");
以上两种方法都是很常用的,但第一种是每个页面都要去修改,当JSP页面很多时比较麻烦,第二种就每个发送的数据都要转码,也很麻烦。
第三种,就是采用Filter过滤器方式,将用户的所有请求都通过过滤器进行转码,这种方法就克服了以上两种方法的缺点。代码如下:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain ) throws IOException, ServletException {
request.setCharacterEncoding("GBK");
//response.setContentType("text/html;charset=GBK");
chain.doFilter(request, response);
}
这里转码为GBK过滤器的主要代码,当然还要把这个类要在web.xml文件中部署。
2. 处理响应结果的中文问题
响应的结果包括Servlet、JSP和HTML三种情况,可以通过以下方式设置响应结果编码:
对于Servlet,可以在Servlet中为其设置响应代码类型,代码如下:
response.setContentType("text/html;charset=GBK"); 也可把这句加到上面的Filter中,如注释掉的部分。
有人说用 response.setCharacterEncoding("GBK"); 无效,必须用 response.setContentType("text/html;charset=GBK");
对于JSP,是比较方便的,只需要在JSP最前部分按如下方式声明:
<%@ page contentType="text/html;charset=GBK"%>
对于HTML,其和JSP文件基本类似,也是在页面最前部分按如下方式声明:
<head>
<META HTP-EQUIV="contentType" CONTENT="text/html;charset=GBK">
</head>
3. 国际化资源文件的中文问题
一个Struts应用程序中,可以配置多个资源包,无论是Action、ActionForm还是JSP都可以访问这些包中的资源。资源包就是由扩展名为.properties的文件组成的一组具有相同前缀的文件,如ApplicationResources_zh_CN.properties、ApplicationResources_zh.properties和ApplicationResources.properties。这些文件就构成一个Struts的资源包,它们都有一个统一的前缀ApplicationResources,凡是有相同前缀的资源文件就都属于一个包。
当用MyEclipse编写资源文件时,默认是不能保存中文的,因为默认保存编码的格式是ISO-8859-1,这就需要修改为gb2312或者gbk编码格式。Windons -->Preferences-->General -->Content Types-->Text-->Java Properties File,在最下方把其Default encoding改为"UTF-8”,然后"update”就可以保存中文了。但就这样保存的中文还是不能够在页面上使用的,因为Web容器默认是使用ISO-8859-1,也就会把中文用ISO-8859-1的格式发送给客户页面,显示的还是乱码,这就是JAVA国际化的问题。JAVA是支持unicode编码格式的,unicode是国际统一通用编码,所以不管什么格式的编码转化为unicode编码肯定不会显示乱码的。这个时候就是需要把资源文件的UTG-8编码格式转化为unicode编码格式,而SUN公司又提供了这样的一种工具。在JDK的安装目录bin下,有一个叫native2ascii可执行文件,这个是专门来进行资源文件转码的。打开cmd,进入JDK的bin目录下,把资源文件拷贝到该目录下,执行该命令。比如:
native2ascii –encoding GBK ApplicationResources.properties ApplicationResources_zh_CN.properties 就是把GBK编码格式ApplicationResources.properties转化为unicode编码格式ApplicationResources_zh_CN.properties,这样显示页面时就不会出现乱码了。
(二)Websphere 默认的字符处理编码要看 :
管理控制台--->服务器--->应用程序服务器--->server1--->java和进程管理--->进程定义--->java虚拟机--->通用jvm参数 的设置了,如为,-Dfile.encoding=GB2312 -Dclient.encoding.override=GBK 则是GBK。
我们可以通过如下判定:
用ieHTTPHEADERS 等工具查看POST请求中的请求参数,汉字是经过Encoding的(是按哪种字符集编码要看jsp文件的编码方式了),
由 % 间隔的十六进制数组成,如下 jsp文件的字符集是UTF-8,form 表单提交,用ieHTTPHEADERS 工具查得请求参数为:
struts.token.name=struts.token&struts.token=HPADE1CXRJ0PASL2V7RQFVXJLLFB1OUE&ptoId=244&
orgName=%E7%BB%84%E7%BB%87%E5%90%8D%E7%A7%B0&orgId=&oscId=&oscType=H1&ptoType=01&impDate=2009-06-16
&details=%E5%85%B7%E4%BD%93%E6%83%85%E5%86%B5
orgName=%E7%BB%84%E7%BB%87%E5%90%8D%E7%A7%B0 经UTF-8 编码的,其中文对应的是"组织名称" ,E7BB84 是"组"的十六进制表示,
E7BB87 是"织"的十六进制表示等。
form表提交后,在ACTION中查看 "组织名称" 变为乱码: "缁勭粐鍚嶇О"
通过以下代码分析:
String JinZhi16 = Integer.valueOf("E7",16).toString(); // 把E7 转为十进制,这里JinZhi16 = 231 ,BB 对应的十进制:187
System.out.println("JinZhi16 = "+JinZhi16);
// 这里的231、187,132等都是通过Integer.valueOf("E7",16).toString()分别把对应的E7、BB、84 等转过来的十进制数字。
byte[] bt = new byte[]{(byte)231,(byte)187,(byte)132,(byte)231,(byte)187,(byte)135,(byte)229,(byte)144,(byte)141,(byte)231,(byte)167,(byte)176};
System.out.println("GB18030 = "+new String(bt,"GB18030"));
System.out.println("GBK = "+new String(bt,"GBK"));
System.out.println("UTF-8 = "+new String(bt,"UTF-8"));
String aa = new String(bt,"GB18030");
System.out.println("GBK = "+new String(aa.getBytes("GBK"),"UTF-8"));
String encoding=System.getProperty("file.encoding");
System.out.println("Default System Encoding: " + encoding);
输出内容:
JinZhi16 = 231
GB18030 = 缁勭粐鍚嶇О
GBK = 缁勭粐鍚嶇О
UTF-8 = 组织名称
GBK = 组织名称
Default System Encoding: UTF-8
我们发现:form表单提交 orgName=%E7%BB%84%E7%BB%87%E5%90%8D%E7%A7%B0(即"组织名称") 到 ACTION ,是 "缁勭粐鍚嶇О"
这样的乱码,而 System.out.println("GB18030 = "+new String(bt,"GB18030")); 输出的也为"缁勭粐鍚嶇О" ,所以可假设其
编码字符集也为GB18030或GBK,用通过System.out.println("GBK = "+new String(aa.getBytes("GBK"),"UTF-8")); 得知确为GBK
或GB18030。GB18030是 GBK的超集,他支持3--4字节的编码,不过这两个标准都支持GB2312-80 。
查看WebSphere的 "通用jvm参数" 的设置了是 -Dfile.encoding=GB2312 -Dclient.encoding.override=GBK
所以最后把-Dfile.encoding=GB2312 -Dclient.encoding.override=GBK 改为
-Dfile.encoding=UTF-8 -Dclient.encoding.override=UTF-8 就可以解决乱码了(对get 和 post 有效)。
修改完上述参数要从起WebSphere的服务,远程登录到安装WebSphere的机器上,你的was发布的ip 就是WebSphere所在的机器, 其用户名和密码同登录到发布was 的WebSphere的控制台一样,因为本来就是同一台机器。登录到WebSphere控制台 ,服务器 ——>应用程序服务器找到对应的节点名称如 "cncaitKaifaNode03" ,在控制面板 - > 服务 -> 查看以IBM开头的有"cncaitKaifaNode03" 标识的WebSphere服务,重启。
用如下过滤器不管用。
public class ChartFilter implements Filter{
private String encoding = "UTF-8";
public void init(FilterConfig config) throws javax.servlet.ServletException {
String temp = config.getInitParameter("encoding");
encoding = (temp == null) ? encoding : temp;
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain ) throws java.io.IOException, javax.servlet.ServletException {
System.out.println("-----------过滤器-----------encoding = "+encoding);
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
response.setContentType("text/html; charset="+encoding);
chain.doFilter(request, response);
}
public void destroy() {
}
}
(三)共同问题:
Tomcat 5 和 webSphere6.1 对get请求,如果有奇数个汉字的参数,则紧接着&的下一参数会追加在这个汉字参数后。如:
String url = "/cnca/servlet/update.action?orgName=中国船级社质量认证公司&oscYM=2009-06" ,则取得orgName的值
为中国船级社质量认证公oscYM=2009-06,而oscYM 没有取到值。
解决的简单方法就是在 orgName=中国船级社质量认证公司之后 &oscYM=2009-06之前加一个全角空格。
---------------------------------------------------------------
程序从tomcat迁移至websphere的修改
1.普通应用部署在websphere上中文乱码问题
解决:管理控制台--->服务器--->应用程序服务器--->server1--->java和进程管理--->进程定义--->java虚拟机--->将通用jvm参数设置为:
根据你的jsp java文件的编码是什么而定,如果是UTF-8 则设置为 -Ddefault.client.encoding=UTF-8 -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.region=CN
2.修改hibernate.cfg.xml (针对我的项目cnca(自律))
<property name="connection.datasource">jdbc/cncaprod</property>
以下下是网上搜集的:
在部署文件中设定了jdbc引用名jdbc/sample,jndi名字为jdbc/sample
如果采用如下代码:
javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("java:comp/env/jdbc/sample");
conn = ds.getConnection();
运行就报错:05-7-1 10:02:24:178 CST] 00000031 SystemErr R Naming-Exception: Exception occurred while the JNDI NamingManager was processing a javax.naming.Reference object.
去掉"java:comp/env/”就好了。
解决:确认部署后在概要表空间下的config\cells\CN7642012HNode01Cell\applications目录下相应应用的web.xml文件下有正确的配置JNDI,如:
<b><resource-ref id="ResourceRef_1097466019938"></b>
<res-ref-name>jdbc/yjjndi</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
再查看同目录下的ibm-web-bnd.xmi文件中id是否和上面的id相同,如下(注意粗体部分):
<b><resRefBindings xmi:id="ResourceRefBinding_1097466019938" jndiName="jdbc/yjjndi" loginConfigurationName="DefaultPrincipalMapping">
<bindingResourceRef href="WEB-INF/web.xml#ResourceRef_1097466019938"/></b>
<properties xmi:id="Property_1165956970219" name="com.ibm.mapping.authDataAlias" value="CN7642012HNode01/yjj2c" description="description"/>
</resRefBindings>
3. 对get请求,去掉类似new String(username.getBytes("iso-8859-1”), "GBK"); 的代码段。
相关推荐
- **中文乱码问题**:在部署Java应用至WebSphere时,若出现中文乱码,可能是因为字符编码设置不正确。检查并调整JVM参数,确保编码一致。 - **补丁下载**:IBM官方支持网站提供各种补丁下载,网址为`...
3. **URL中文乱码**:Tomcat可能需要在`server.xml`中配置URL编码,而Websphere默认处理得更好。 了解并遵循这些规范和注意事项,可以帮助开发者在MyEclipse和Tomcat环境中更顺畅地进行开发,同时提高代码的可移植...
通过以上步骤,我们可以确保在不同的操作系统(如Win2000、Unix、Linux)和Web服务器(如Tomcat、WebSphere)环境下,使用SmartUpload上传和下载中文附件时,文件名都不会出现乱码问题。关键在于正确处理文件名的...
- 在JSP/Servlet环境中,处理汉字时经常遇到的问题就是字符集和编码之间的转换不当导致的乱码问题。 2. **乱码产生的原因**: - 不同的系统或组件可能使用不同的默认字符集,当数据在不同系统之间传输时,如果...
这些服务器各有特点,如Tomcat因其轻量级、易于管理和配置而广受欢迎,而WebLogic和WebSphere则更倾向于大型企业级应用,提供更全面的服务和支持。 Tomcat的配置是学习JavaEE的重要一环。通过修改`server.xml`,...
在Java Web开发中,特别是在使用JSP和Servlet时,经常会出现中文乱码的问题。以下是一些有效的解决方法: ##### 方法一:设置Content-Type 在JSP页面头部或Servlet中设置合适的`Content-Type`来指定字符集,例如...
最后一章是常见问题的解答,手册列举并解释了在安装和使用TRSWCM过程中可能会遇到的诸多问题,如缺少Java虚拟机、部署后出现乱码、需要重新部署Weblogic应用、JDBC驱动不匹配以及Unix系统中的文件打开限制等。...
假设在一个使用IBM WebSphere Application Server 3.5的环境中,开发者遇到了JSP/Servlet处理汉字时出现乱码的问题。此时,需要从以下几个方面入手排查: 1. **确认项目的统一编码**:检查所有源代码文件是否统一...
3. **Web服务与应用程序集成**:探讨了如何利用Web服务将DB2 Information Integrator与各种应用程序进行集成,包括WebSphere Application Server、Apache Jakarta Tomcat等。 4. **特定平台的集成指南**:针对不同...
- 常见的Web容器有Apache Tomcat、Jetty、IBM WebSphere、JBoss等。 3. Servlet的生命周期及方法: - 实例化:容器加载Servlet时创建Servlet实例。 - 初始化:调用`init()`方法,初始化Servlet。 - 提供服务:...
常见的应用服务器有Tomcat、Jetty、WebLogic、WebSphere等。 【数据连接池】 数据连接池预先创建一定数量的数据库连接,复用这些连接,提高性能,避免频繁创建和销毁连接的开销。 【分页实现】 基于缓存的分页将...
- 示例:Apache Tomcat、IBM WebSphere、Jetty、Resin、IIS等。 3. **Servlet生命周期**: - 实例化:容器创建Servlet实例。 - 初始化:调用`init()`方法,只执行一次。 - 提供服务:每次请求都会调用`service...
- **1.4.1 J2EE应用服务器**:J2EE应用服务器是运行J2EE应用程序的平台,常见的有Apache Tomcat、IBM WebSphere、Oracle WebLogic等。 - **1.4.2 J2EE开发环境搭建**:一般包括安装Java JDK、配置J2EE应用服务器以及...
- **1.4.1 J2EE应用服务器**:如Apache Tomcat、IBM WebSphere、Oracle WebLogic等,它们提供了一个运行J2EE应用所需的环境。 - **1.4.2 J2EE开发环境搭建**:主要包括安装JDK(Java Development Kit)、配置开发...