最近刚搞完一个项目(使用了两个不同版本的struts),其中使用了 Struts2的新版 struts2-core-2.1.6.jar xwork-2.1.2.jar
在使用的时候出现了乱码问题,以下是我的解决办法:
我首先说一下为什么会产生乱码吧,当然这主要与我们公司的特殊应用环境有关:
公司使用的是oracle 数据库,并且其字符集: iso-8859-1 ,在处理java代码时,对所有的含中文 配置文件其编码都是iso-8859-1 ,
java 代码编译时 -encoding "ISO8859-1" 。这样在使用struts2 时 就出现了乱码,主要是 <s:property 标签,经过对struts2源码的分析该标签输出时默认对输出内容做了htmlEncode 操作。
解决该问题:
1 将默认的执行 htmlEncode 操作,改为对输出内容不进行htmlEncode操作:
struts2-core-2.0.6 中 :
package org.apache.struts2.components ;
将 Property.java 中的
private boolean escape = true;
改为:
private boolean escape = false;
其次,将prepare 方法改为:
private String prepare(String value) {
if (escape) {
return TextUtils.htmlEncode(value,false);
} else {
return value;
}
}
struts2-core-2.1.6 中:
package org.apache.struts2.components
将 Property.java 中的
private boolean escape = true;
改为:
private boolean escape = false;
其次,将prepare 方法改为:
private String prepare(String value) {
String result = value;
if (escape) {
result = TextUtils.htmlEncode(result,false);
}
if (escapeJavaScript) {
result = TextUtils.escapeJavaScript(result);
}
return result;
}
再其次:
package org.apache.struts2.views.jsp;
将 PropertyTag.java 中的
private boolean escape = true;
改为:
private boolean escape = false;
这样就OK了~!
进一步说明: 对于需要使用 htmlEncode 的时候,那么就使用 <s:property 标签的 escape="true" (防止用户在输入内容时页面出现js注入错误)
但是以上的修改方法还是有一个问题:我们来看看xwork-2.1.2 中的
package com.opensymphony.xwork2.util;
TextUtils.java
public final static String htmlEncode(String s) {
return htmlEncode(s, true);
}
/**
* Escape html entity characters and high characters (eg "curvy" Word quotes).
* Note this method can also be used to encode XML.
* @param s the String to escape.
* @param encodeSpecialChars if true high characters will be encode other wise not.
* @return the escaped string
*/
public final static String htmlEncode(String s, boolean encodeSpecialChars) {
s = noNull(s);
StringBuilder str = new StringBuilder();
for (int j = 0; j < s.length(); j++) {
char c = s.charAt(j);
// encode standard ASCII characters into HTML entities where needed
if (c < '\200') {
switch (c) {
case '"':
str.append(""");
break;
case '&':
str.append("&");
break;
case '<':
str.append("<");
break;
case '>':
str.append(">");
break;
default:
str.append(c);
}
}
// encode 'ugly' characters (ie Word "curvy" quotes etc)
else if (encodeSpecialChars && (c < '\377')) {
String hexChars = "0123456789ABCDEF";
int a = c % 16;
int b = (c - a) / 16;
String hex = "" + hexChars.charAt(b) + hexChars.charAt(a);
str.append("&#x" + hex + ";");
}
//add other characters back in - to handle charactersets
//other than ascii
else {
str.append(c);
}
}
return str.toString();
}
也就是说,我们即使 使用 <s:property 标签的 escape="true" 任然会有一定问题。这里我们首先复习一下:
ASCII 的表示内容如下:
0 – 31 控制符号
32 空格
33-47 常用符号
48-57 数字
58-64 符号
65-90 大写字母
91-96 符号
97-127 小写字母
ISO8859 如下:
编号 0 – 127 与 ASCII 保持兼容
编号128 – 159 共32个编码保留给扩充定义的 32 个扩充控制码
160 为空格
161 -255 的 95 个数字用于新增加的字符代码
编码的布局与 ASCII 的设计思想如出一辙,由于在一张码表中只能增加 95 种字符的代码,所以 ISO8859 实际上不是一张码表,而是一系列标准,包括 14 个字符码表。
例如,西欧的常用字符就包含在 ISO8859-1字符表中。在 ISO8859-7种则包含了 ASCII 和现代希腊语字符。
现在我想大家一定已经都很明白了,为什么修改后的代码:
else if (encodeSpecialChars && (c < '\377')) {
String hexChars = "0123456789ABCDEF";
int a = c % 16;
int b = (c - a) / 16;
String hex = "" + hexChars.charAt(b) + hexChars.charAt(a);
str.append("&#x" + hex + ";");
}
才能将中文显示正确。
但是同时也是有隐患的,所以也就让我有了别的想法:
干脆先进行转码好了
struts2-core-2.0.6 中 :
package org.apache.struts2.components ;
将 Property.java 中的
private String prepare(String value) {
if (escape) {
return TextUtils.htmlEncode(new String(value.getBytes("iso-8859-1"),"gbk"));
} else {
return value;
}
}
注:进行该修改 可不对
package org.apache.struts2.components
Property.java 中的
private boolean escape = true;
进行修改,让其默认进行 htmlEncode
struts2-core-2.1.6 中:
package org.apache.struts2.components
将 Property.java 中的
private String prepare(String value) {
String result = value;
if (escape) {
result = TextUtils.htmlEncode(new String(result.getBytes("iso-8859-1"),"gbk"));
}
if (escapeJavaScript) {
result = TextUtils.escapeJavaScript(result);
}
return result;
}
注:进行该修改 可不对:
package org.apache.struts2.components
Property.java 中的
private boolean escape = true;
和
package org.apache.struts2.views.jsp;
PropertyTag.java 中的
private boolean escape = true;
进行修改,让其默认进行 htmlEncode 操作,便可以显示正确的中文。
其他相关包说明:
xwork-2.0.1.jar
struts2-core-2.0.6.jar
struts2-spring-plugin-2.0.6.jar
struts2-tiles-plugin-2.0.6.jar
xwork-2.1.2.jar
struts2-core-2.1.6.jar
struts2-spring-plugin-2.1.6.jar
struts2-tiles-plugin-2.1.6.jar
分享到:
相关推荐
这段代码中,首先将文件名转换成ISO-8859-1编码,然后再转换为UTF-8编码。这样做的目的是为了让文件名中的中文字符能够在不同的环境中正常显示。 #### 2. 根据浏览器类型处理 不同的浏览器对于文件名的处理方式...
本文详细介绍了在Struts2应用中处理中文乱码问题的三种常见场景及其解决方案。通过上述方法的应用,可以有效避免中文乱码问题的发生,提升用户体验。需要注意的是,在实际应用中还需要根据具体情况灵活调整字符编码...
具体做法是在Action类中,对从请求中获取的参数先按照ISO-8859-1编码读取,再转换为目标编码,例如: ```java String sqlvalue = request.getParameter("sqlvalue"); sqlvalue = new String(sqlvalue.getBytes("ISO...
- 该方案中,后端解码时需要首先按照`ISO-8859-1`编码格式获取字节,然后再转换为`UTF-8`格式。 - 这种方式与方案一的区别在于编码步骤的不同,但最终目的都是确保中文字符能正确传输。 #### 方案三:全面解决...
对于使用Struts2标签创建的表单,无论GET还是POST,JSP页面都应使用UTF-8编码,并且不应使用getBytes("ISO8859-1")转换,同时无需使用中文过滤器。 接下来,我们探讨Servlet中的中文乱码处理。在GET请求中,JSP页面...
byte[] temp = s.getBytes("ISO-8859-1"); String result = new String(temp, "UTF-8"); } catch (UnsupportedEncodingException e) { // 处理异常 } ``` 通过上述步骤,可以有效地解决Struts2框架中的中文...
在Web应用中,数据的传输通常涉及多种编码方式,如HTTP请求的默认编码通常是ISO-8859-1,而Java内部使用的是UTF-8。当这些编码不匹配时,中文字符就会被错误地解码,从而出现乱码。解决Struts2中文乱码问题通常涉及...
- Struts 1.2 框架默认使用 ISO-8859-1 编码来解析请求参数,这与大部分中文网页使用的 GBK 或 UTF-8 编码不一致。 3. **配置不当:** - struts-config.xml 文件中没有正确配置编码转换相关的过滤器或处理器。 -...
String fileName = new String(file.getName().getBytes("ISO-8859-1"), "UTF-8"); ``` 通过以上步骤,一般可以解决Struts 2.5.2框架下的中文乱码问题。但请注意,每个项目可能有不同的配置和需求,因此在实际...
- **请求编码**:Struts2默认使用ISO-8859-1编码,如果上传文件名包含中文,需在Action中手动将文件名转换为UTF-8,例如使用`new String(file.getName().getBytes("ISO-8859-1"), "UTF-8")`。 - **文件存储**:...
value = new String(value.getBytes("ISO-8859-1"), "UTF-8"); // 其他业务逻辑... } } ``` 通过以上步骤,大部分情况下可以解决Struts框架下的中文乱码问题。然而,具体问题可能需要具体分析,有时还需要检查...
1. **前端页面与服务器端处理不一致**:例如,前端页面使用的是UTF-8编码,而服务器端默认使用ISO-8859-1编码。 2. **数据库编码与应用编码不一致**:例如,应用使用UTF-8编码,而数据库使用GBK编码。 3. **表单提交...
- **修改JSP文件的编码格式**:将JSP文件中的`<%@ page language="java" import="java.util." pageEncoding="ISO-8859-1" %>`改为`<%@ page language="java" import="java.util." pageEncoding="UTF-8" %>`。...
`RequestProcessor`是Struts框架中的核心组件,它负责处理ActionServlet接收到的所有请求,并将请求分解为多个任务。通过自定义`RequestProcessor`,我们可以在请求处理的早期阶段就解决编码问题,使得所有后续操作...
当网页编码设置为非UTF-8,如ISO-8859-1时,如果页面中包含中文字符,Eclipse会警告无法正确保存,因为这种编码不支持中文。此时,你需要将页面的编码更改为UTF-8。在Eclipse中,可以通过右键点击项目 -> ...
本篇文章将详细探讨如何在Struts中处理文件上传并解决乱码问题。 首先,我们需要了解Struts文件上传的基本原理。在Struts中,文件上传是通过`Commons FileUpload`库来实现的,它是Apache Commons项目的一部分,专门...
解决Struts2上传时候使用UTF-8的冲突问题... * 对于请求流,使用的ISO-8859-1编码方式进行,如果发现请求内容中出现名称乱码,请使用new String(str.getBytes("ISO-8859-1"),"GBK")进行编码转换。 包里面已经含有源代码
byte[] bytes = str.getBytes("ISO-8859-1"); return new String(bytes, "UTF-8"); } catch (Exception e) { return str; } } } ``` 然后,你可以这样使用这个方法: ```java String chaosChinese; // 假设 ...
这将将请求参数的字符编码从 iso-8859-1 转换为 UTF-8,从而解决中文乱码问题。 解决中文乱码问题的关键是确保字符编码的一致性。无论是在 JSP 文件、Servlet、Struts 2 还是在表单处理中,我们都需要设置正确的...