action类代码 public class CategoryAction extends ActionSupport {
    private List<Category> subcates;
    //。省略get/set方法
    public String getsubcates(){
subcates=categoryManger.getSubCates(pid);
return SUCCESS; //注意此处
    }
 }
action的配置:     <package name="json"  extends="json-default" >
        <action name="getsubcatesaction" class="categoryAction" method="getsubcates">
         <result name="success" type="json">
         <param name="includeProperties">
         subcates\[\d+\]\.id,subcates\[\d+\]\.name
         </param>
         </result>
        </action>
    </package>
jsp页面中 js代码:
function addsubcotes(pid){ 
alert(pid);
ajaxUtil("getsubcatesaction.action?pid="+pid,false,true,null,true,
function(data){
alert(data); 
var jsonObject = eval('(' + data + ')');
var select = document.getElementById("subcate");
select.options.length=0;//清空select
alert(jsonObject.subcates);
for(var i = 0;i<jsonObject.subcates.length;i++){
var category = list.subcates[i];
slect.add(new Option(category.name,category.id));
}
}
);
}
问题:正确的情况下应该是在js中获得List<Category>,结果返回的居然是 “success"字符串,也就是action 的result的name。
不知道怎么个情况,平常这样写都没问题,今天怎么就错了呢?请大神解救。

解决方案 »

  1.   

    <param name="includeProperties">
                        subcates\[\d+\]\.id,subcates\[\d+\]\.name
    </param><param name="root">这是我一般的用法
      

  2.   

    传过去了,后台执行正常,List数据subcates也正常存在,但就是返回时像我前面说的一样,在页面中获得的是 “success”字符串,而不是一个list对象。
      

  3.   

    debug  断点调试一下 如果后台没问题  是不是前端 接收对象有问题  firebug  调试 获取前端对象是什么
      

  4.   

    firebug也没问题,如果我在后台返回的变量类型为String就可以正常的返回,如果是list,则只会返回 “success”,也就是视图的name
      

  5.   

    我觉得你在前台返回的success,应该是Getsubcatesaction尖中的方法getsubcates返回的字符串(return SUCCESS),你通过ajax调用getsubcates方法,返回到前台的应该是经过json处理的字符串吧,比如你返回的是list,应该把list转为json字符串,再return出来,由前台ajax捕获,再做eval解析,再输出来。
      

  6.   


    getsubcates 返回的结果类型为List<Category>,怎么会是String类型的字符串。Struts2 + ajax + json 的原理和流程我想应该是这样,你通过前台的ajax发送一个请求到后台,也就是Action中,后台进行业务逻辑处理,处理完成后,进入action的配置中发现所配置的 result类型为json类型的,并且指定了要返回的参数。json插件处理action中指定的值,如果值为普通类型,则转为普通的字符串,如果是对象类型和素组集合等,则转换为json格式的字符串。然后将这个json格式字符串传给前台,前台ajax通过回调函数获得responseText,然后对该responseText进行 eval()方法,转为json对象。
    我前后检查了一遍,就是查不出原因。在另外一个项目中,我也是这么用的,没有任何问题,结果在这个项目中就有问题了,很是奇怪。我换了一种方法,就是用JSONArray,这个功能实现是解决了。但是上面遇到的问题还没解决,如果那个高手知道了,请指教。