最近项目中运用了s2sh架构开发项目,部分页面运用了jquery的ajax方式查询数据,返回格式为json,结果经常出现堆溢出的问题!
报的错误是:
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:572)
at java.lang.StringBuilder.append(StringBuilder.java:203)
at com.googlecode.jsonplugin.JSONWriter.add(JSONWriter.java:500)
at com.googlecode.jsonplugin.JSONWriter.string(JSONWriter.java:458)
at com.googlecode.jsonplugin.JSONWriter.process(JSONWriter.java:141)
郁闷了好几天,后来发现是action类里面由于注入了service接口的get方法导致。
public UserSerivce getUserService(){
return this.userService;
}
最后将其去除,程序正常。
原来当你的项目使用json格式返回的时候你的action类里面所有的的属性具有get方法都会被自动以json格式返回给页面。所以我们以后的项目应该在使用ajax的时候最好单独的写一个Ajax的类。单独写一个针对ajax的struts配置文件。例如:struts-ajax.xml文件内容
<struts>
<package name="ajax" namespace="/ajax" extends="json-default">
<action name="query" class="AjaxAction" method="query">
<result type="json"/>
</action>
</package>
</struts>
页面写法如下:
$.ajax({
url:"ajax/query.action",
type:"GET",
datatype:"json",
data:'userId='+document.getElementById("uid").value,
success:function(value){
var json = eval( "("+value+")" );
var num = eval(json.map.num);
if(num!="0")
{
jQuery('#pNum').text(num);
}
},
error:function(json){
//alert("error");
}
});