package com.ly.action;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;import org.apache.struts2.ServletActionContext;import net.sf.json.JSONArray;import com.ly.beans.ExtUser;
import com.ly.commons.ListRange;
import com.opensymphony.xwork2.ActionSupport;public class ExtJsonTest extends ActionSupport {
 private int mid;
 private String message;
     private int result;
     
     public int getMid() {
return mid;
}
public void setMid(int mid) {
this.mid = mid;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
private List<ExtUser> dataArr;
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
public List<ExtUser> getDataArr() {
return dataArr;
}
public void setDataArr(List<ExtUser> dataArr) {
this.dataArr = dataArr;
}
public String toExtJsonData(){
ListRange<ExtUser> userlist = new ListRange<ExtUser>();
ExtUser eu1 = new ExtUser(1,"ly","程序员","男");
ExtUser eu2 = new ExtUser(2,"PYX","公务员","女");
this.dataArr = new ArrayList<ExtUser>();
this.dataArr.add(eu1);
this.dataArr.add(eu2);
userlist.setList(dataArr);
userlist.setTotalSize(dataArr.size());
userlist.setMessage(message);
userlist.setSuccess(true);
String json = JSONArray.fromObject(userlist).toString();
System.out.println(mid+"==================");
System.out.println(message+"==================");
System.out.println(json);
try {
ServletActionContext.getResponse().setContentType("text/javascript;charset=UTF-8");
PrintWriter out = ServletActionContext.getResponse().getWriter();
out.print(json);
} catch (IOException e) {
e.printStackTrace();
}
return SUCCESS;
}

}
=================================================================================================
前台
    var myRecord = new Ext.data.Record.create(
        [
                                            {name:'name'},
                                            {name:'job',mapping:'ocupation'},
                                            {name:'sex',mapping:'gender'}                  ]
                                                );
     var myDataStore = new Ext.data.Store(
                                          {
                                        proxy:new Ext.data.HttpProxy({url : "jsontoext.action"}),
             reader:new Ext.data.JsonReader({
                                                      totalProperty:"totalSize",                                                                  root:"list"
                     },
                     myRecord       )
         }
               );
        myDataStore.load();
        Ext.Msg.alert("总记录:"+myDataStore.getCount());
这里显示的记录数为0;
还有后台可以打印出:[{"message":"","list":[{"id":1,"ocupation":"程序员","name":"罗毅","gender":"男"},{"id":2,"ocupation":"公务员","name":"PYX","gender":"女"}],"totalSize":2,"success":true}]
这条json数据。但是不知道传到前台去没有

解决方案 »

  1.   

    1 浏览器直接访问jsontoext.action,看看输出的是什么。
    2 不需要最外层的[]. 直接用对象 {....}
    3 定义的record是 name job sex三个字段,而 list里的对象是 id, ocupation, name, gender四个。字段名称不对应。
      

  2.   

    我现在改了前台是这样的
           var myRecord = new Ext.data.Record.create(
            [   
                     {name:'myid', type:'int'},
                                                {name:'name'},
                                                {name:'job',mapping:'ocupation'},
                                                {name:'sex',mapping:'gender'}       
            ]
                                                    );
            var myDataStore = new Ext.data.Store(
             {
               proxy:new Ext.data.HttpProxy({url : "jsontoext.action"}),
               reader:new Ext.data.JsonReader(
                         {
                                                          totalProperty:"totalSize",                    
                           root:"list",
                           id:'myid',
                           successProperty:'success'
                         },
                                     myRecord      
           )
             }
              );
            myDataStore.load();
            //Ext.Msg.alert("总记录:"+myDataStore.getCount());    
    前台总是显示0.这是为什么。(从后台的json数据在火狐firedub中已经有显示,但是通过ext显示不出来,估计是解析是出问题了。但是我自己看前台代码貌似没问题呀)后台的json数据 是这样的:
    [{"message":"yeye","list":[{"ocupation":"程序员","myid":1,"name":"ly","gender":"男"},{"ocupation":"公务员","myid":2,"name":"PYX","gender":"女"},{"ocupation":"工人","myid":3,"name":"tom","gender":"男"}],"totalSize":3,"success":true}]
      

  3.   

    我现在也遇到了类似的问题,请问LZ你可以正常调用action吗?我连action都无法调用,可以struts2和action类的代码贴出来看看吗