当使用struts2的struts2-json-plugin输出接送数据时,如果配置enableGZIP为true,发现竟然有中文乱码问题。查看源代码,果然有一小小问题,所以干脆动手自己修改吧。
1.首先在struts.xml中加入下面的代码:
<!-- 修正struts2-json-plugin-2.1.8.1中enableGZIP为true时中文乱码问题 -->
<package name="json-guofeng" extends="json-default">
<result-types>
<result-type name="json" class="com.guofeng.ux.jsonplugin.GfJSONResult"/>
</result-types>
</package>
2.GfJSONResult:
public class GfJSONResult extends JSONResult{
/**
* @author $Author: GuoFeng $
* @date $Date:Sep 28, 2010 3:39:33 PM $
* 修正struts2-json-plugin-2.1.8.1中enableGZIP为true时中文乱码问题
*/
private static final long serialVersionUID = -997525907667125535L;
private int statusCode;
private int errorCode;
private boolean prefix;
private String contentType;
@Override
protected void writeToResponse(HttpServletResponse response, String json,
boolean gzip) throws IOException {
GfJSONUtil.writeJSONToResponse(new SerializationParams(response, getEncoding(), isWrapWithComments(),
json, false, gzip, isNoCache(), statusCode, errorCode, prefix, contentType, getWrapPrefix(),
getWrapSuffix()));
}
public void setStatusCode(int statusCode) {
this.statusCode = statusCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
public void setPrefix(boolean prefix) {
this.prefix = prefix;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
}
3.GfJSONUtil代码:
public class GfJSONUtil {
private static final Logger LOG = LoggerFactory.getLogger(MyJSONUtil.class);
public static void writeJSONToResponse(
SerializationParams serializationParams) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
if (StringUtils.isNotBlank(serializationParams.getSerializedJSON()))
stringBuilder.append(serializationParams.getSerializedJSON());
if (StringUtils.isNotBlank(serializationParams.getWrapPrefix()))
stringBuilder.insert(0, serializationParams.getWrapPrefix());
else if (serializationParams.isWrapWithComments()) {
stringBuilder.insert(0, "/* ");
stringBuilder.append(" */");
} else if (serializationParams.isPrefix())
stringBuilder.insert(0, "{}&& ");
if (StringUtils.isNotBlank(serializationParams.getWrapSuffix()))
stringBuilder.append(serializationParams.getWrapSuffix());
String json = stringBuilder.toString();
if (LOG.isDebugEnabled()) {
LOG.debug("[JSON]" + json);
}
HttpServletResponse response = serializationParams.getResponse();
// status or error code
if (serializationParams.getStatusCode() > 0)
response.setStatus(serializationParams.getStatusCode());
else if (serializationParams.getErrorCode() > 0)
response.sendError(serializationParams.getErrorCode());
// content type
if (serializationParams.isSmd())
response.setContentType("application/json-rpc;charset="
+ serializationParams.getEncoding());
else
response.setContentType(serializationParams.getContentType()
+ ";charset=" + serializationParams.getEncoding());
if (serializationParams.isNoCache()) {
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Expires", "0");
response.setHeader("Pragma", "No-cache");
}
if (serializationParams.isGzip()) {
response.addHeader("Content-Encoding", "gzip");
GZIPOutputStream out = null;
InputStream in = null;
try {
out = new GZIPOutputStream(response.getOutputStream());
/**
* @author $Author: GuoFeng $ 修正编码问题
* @date $Date:Sep 28, 2010 3:40:17 PM $
*/
in = new ByteArrayInputStream(json.getBytes(serializationParams
.getEncoding()));
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
} finally {
if (in != null)
in.close();
if (out != null) {
out.finish();
out.close();
}
}
} else {
response.setContentLength(json.getBytes(serializationParams
.getEncoding()).length);
PrintWriter out = response.getWriter();
out.print(json);
}
}
}
其实只需要修改一句代码即可:
in = new ByteArrayInputStream(json.getBytes(serializationParams
.getEncoding()));
在源码中只写了json.getBytes(),也就是取到的本地的编码,即GBK,所以无法与整个项目的UTF-8相匹配。
当然,之后要写的所有struts的配置文件,用到json的包都要继承"json-guofeng"了。这样当我们再使用"enableGZIP"=true这个配置时不会再有中文乱码问题。在firebug中查看了一下,大概能压缩json数据40%吧,当然比较大的数据没有尝试……
看到有些文章指出使用GZIP压缩会对服务器性能消耗较大,建议无带宽限制的内网项目中不要使用。
具体内容请看:http://www.iteye.com/topic/171207
分享到:
相关推荐
标签:apache、struts2、plugin、struts、json、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,...
struts2-json-plugin,Struts JSON插件
`struts2-json-plugin-2.1.8.1.jar` 则是Struts 2框架的一个插件,主要用于增强Struts 2对JSON的支持。Struts 2是一款非常流行的MVC(Model-View-Controller)框架,用于构建企业级的Java Web应用程序。这个插件允许...
struts2-spring-plugin-2.3.15.2.jar ; struts2-json-plugin-2.3.16.3.jarstruts2-spring-plugin-2.3.15.2.jar ; struts2-json-plugin-2.3.16.3.jar
3. **JSON插件配置**:在`struts-plugin.xml`配置文件中,会注册JSON插件,声明结果类型和其他相关设置,如启用GZIP压缩、排除某些字段等。 4. **拦截器**:Struts2的拦截器机制允许在Action调用前后执行特定逻辑。...
在实际开发中,为了使用这个插件,你需要将`struts2-json-plugin-2.3.8.jar`文件放入项目的类路径(classpath)下,然后在Struts2的配置文件(通常为struts.xml)中启用JSON插件。在Action类中,定义返回JSON数据的...
struts2自带的json转换 倒入jar文件 struts.xml中 <package ......extends="json-default" <result type="json"/>
struts2-json-plugin-2.2.3.1能用的包
struts2-json-plugin-2.3.15.1 -Lee修复bug版.jarstruts2-json-plugin-2.3.15.1 -Lee修复bug版.jarstruts2-json-plugin-2.3.15.1 -Lee修复bug版.jarstruts2-json-plugin-2.3.15.1 -Lee修复bug版.jar
ajax结合Struts2要用到的jar包
struts2 2.3.16.3 版本配置json所需要的jar文件。有时候版本不一致也会配置失败。
这个压缩包包含了两个关键的组件:json-lib-2.1.jar和struts2-json-plugin-2.1.8.1.jar,它们是Struts2支持JSON(JavaScript Object Notation)序列化和反序列化的关键。 1. **json-lib-2.1.jar**: JSON是一种轻...
struts2-json-plugin-2.3.24.jar
Struts2 JSON Plugin是Apache Struts框架的一个扩展插件,主要功能是支持Struts2应用程序与JSON(JavaScript Object Notation)格式的数据进行交互。JSON是一种轻量级的数据交换格式,广泛用于Web服务和AJAX...
struts2-struts1-plugin-2.1.6.jar
Struts2 JSON Plugin是Apache Struts框架的一个扩展插件,主要功能是为Struts2提供JSON(JavaScript Object Notation)支持。JSON是一种轻量级的数据交换格式,它使得客户端(通常为JavaScript)与服务器端之间进行...
struts2-json-plugin-2.3.28.1.
总的来说,这三个文件的组合是为了解决Struts2框架中与JSON处理相关的版本不匹配问题,通过导入它们,开发者可以确保Struts2的JSON插件正常工作,同时利用JUnit插件进行更有效的测试,而`json-lib-2.1.jar`则为JSON...