extjs grid调用action,无法显示数据 ,我用System.out.println(str);调试有数据,但是grid无法获得数据,应该如何改?下面的是action的代码
public class ShowUserAction extends Action { @Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
response.setContentType("text/json;charset=utf-8");
Session session = null;
Transaction tx = null;
String str=null;
try {
session = HibernateClass.getSession();
tx = session.beginTransaction();
List<Systemusers> list = new ArrayList();

List group = session.createQuery("from Systemusers")
.list();

for(Iterator iter = group.iterator();iter.hasNext();)
{
Systemusers sg = (Systemusers)iter.next();
sg.getUserid();
sg.getUsername();
sg.getEasuserid();
sg.getStatus();
list.add(sg);
//System.out.println(sg);
} JSONArray jsonarray = JSONArray.fromObject(list);
str = jsonarray.toString();
tx.commit();
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
tx.rollback(); } finally {
HibernateClass.closeSession(session);
}

response.getWriter().write(str);
return null;
}}
下面是extjs部分代码:
var sm = new Ext.grid.CheckboxSelectionModel();
var cm = new Ext.grid.ColumnModel([
new Ext.grid.RowNumberer(),// 自动行号
sm,// 添加的地方
{
header : '编号',
dataIndex : 'userid'
}, {
header : '姓名',
dataIndex : 'username' }, {
header : 'EAS编号',
dataIndex : 'easuserid' }, {
header : '状态',
dataIndex : 'status' }]);
cm.defaultSortable = true;
var ds = new Ext.data.Store({
proxy : new Ext.data.HttpProxy({
url : '../showuser.do',
method : 'post'
}),
reader : new Ext.data.JsonReader({
totalProperty : 'totalProperty',
root : 'root'
}, [{
name : 'userid',
mapping : 'userid'
}, {
name : 'username',
mapping : 'username'
}, {
name : 'easuserid',
mapping : 'easuserid'
}, {
name : 'status',
mapping : 'status'
}])
});
ds.load();
var bbar = new Ext.PagingToolbar({
pageSize : 10,
store : ds,
displayInfo : true,
displayMsg : '显示第{0}条到{1}条,一共{2}条',
emptyMsg : '没有记录'
});
var grid = new Ext.grid.GridPanel({
el : 'grid',
ds : ds,
cm : cm,
sm : sm,// 加入一列checkbox
loader : "../showuser.do",
title : '人员资料维护',
height : 200,
autoScroll : false,
bbar : bbar
});
// 响应事件
grid.on('beforeload', function() {
grid.loader.dataUrl = "../showuser.do";
});grid.render();

解决方案 »

  1.   


    response.getWriter().write(str);
    将你的str在控制台打印下,然后放到js中eval下看看格式对不对
    不过我想应该是不对
      

  2.   

    这个是你的前后台数据交互没有正常接收:  
    new Ext.data.JsonReader({
            totalProperty : 'totalProperty',    //grid中分页记录总数接收参数的地方,后台命名一定要是totalProperty
            root : 'root'                       //grid中接收显示数据的地方,后台命名一定要是root
          }
    很明显,你后台就传了一个list,JSP接收不到。另:后台向前台传store时,store中必须有success,只是在store中默认了而已。
      

  3.   

    谢谢你的回复,有点了解了,但是totalProperty 和 root : 'root' 我如果直接以{}来取代可否?我现在只有传了list,其他不知道如何写了?能指导下吗
      

  4.   

    2种方法都是可以实现的:1.可以修改后台传到前台的参数,建议先看一下后台打印的str然后将totalProperty拼接上去,思路如下:
    String json = "{\"totalProperty\":"+list.size()+",\"success\":true,"+str+"}";//可能会有问题
    2.把前台的接收参数名改掉,后台只传了一个list,那么前台接收:
    new Ext.data.JsonReader({
                       root : 'list'
                      }, 
    当然这样处理之后分页显示就不准确了,分页总记录数是固定的,每页显示的总数也失去意义,grid永远只有1页,更糟糕的可能会不显示,没有接收到success = true,这个我没试过,我都是用Struts插件直接转JSON的,里面都带了success的,最好采取第一种思路去调试。
      

  5.   

    Struts插件直接转JSON?我也是用的myeclipse,当然也引用了struts+hibernate,可是我不知道如何转呢不过还是谢谢你,我先试下两种办法
      

  6.   


    只要格式对了,用response.getWriter().write(str);
    输出json字符串即可,在前台store的render会自动解析的
      

  7.   

    {"totalProperty":1720,"success":true,[{"easuserid":"D2CMAAENEADgAHNifwAAARO33n8=","status":"0","userid":"251","username":"xxx0104"},{"easuserid":"HqemXQENEADgAQh3fwAAARO33n8=","status":"0","userid":"252","username":"xxx02"},{"easuserid":"HqemXQENEADgAQKofwAAARO33n8=","status":"0","userid":"253","username":"xxxx0200}]}
    因资料太多,所以就弄了其中3条
      

  8.   

    修改了两个地方:
    1、Action页面
    JSONArray jsonarray = JSONArray.fromObject(list);
    str = jsonarray.toString();
    json = "{\"totalProperty\":"+list.size()+",\"success\":true,\"root\":"+str+"}";
    System.out.println(json);
    tx.commit();

    } catch (Exception e) {
    e.printStackTrace();
    tx.rollback(); } finally {
    HibernateClass.closeSession(session);
    }

    response.getWriter().write(json);
    2、JS页面
    reader : new Ext.data.JsonReader({
    totalProperty : 'totalProperty',
    root : 'root'
    }, [{不过这样还是没有数据传入我的grid,现在显示的数据格式如下:
    {"totalProperty":1720,"success":true,"root":[{"easuserid":"D2CMAAENEADgAHNifwAAARO33n8=","status":"0","userid":"251","username":"XXXX0104"}]}  
    哪里还有问题?求救了
      

  9.   

    我看过你的Extjs部分的代码了,没什么问题,数据格式是正确的,你说的没有数据传入grid,症状是不是grid显示了,但里面显示“没有记录”,特别是注意grid的header显示了没。如果是这样,再从Store的接收看看。
      

  10.   

    OK,解决了!尤其wanghao的大力帮忙,呵呵,经过查了很多资料,任何结合各位的意见,已经出来结果了。我估计就是grid少了个region : 'center',现在我把代码重新修改了,放入,供其他人参考:var sm = new Ext.grid.CheckboxSelectionModel();
    var cm = new Ext.grid.ColumnModel([
    new Ext.grid.RowNumberer(),// 自动行号
    sm,// 添加的地方
    {
    header : '编号',
    dataIndex : 'userid'
    }, {
    header : '姓名',
    dataIndex : 'username' }, {
    header : 'EAS编号',
    dataIndex : 'easuserid' }, {
    header : '状态',
    dataIndex : 'status' }]);
    cm.defaultSortable = true;
    var ds = new Ext.data.Store({
    proxy : new Ext.data.HttpProxy({
    url : '../showuser.do',
    method : 'post'
    }),
    reader : new Ext.data.JsonReader({
    totalProperty :"totalProperty",
    root : "root"
    }, [{
    name : 'userid',
    mapping : 'userid'
    }, {
    name : 'username',
    mapping : 'username'
    }, {
    name : 'easuserid',
    mapping : 'easuserid'
    }, {
    name : 'status',
    mapping : 'status'
    }])
    });
    ds.load();
    var bbar = new Ext.PagingToolbar({
    pageSize : 10,
    store : ds,
    displayInfo : true,
    displayMsg : '显示第{0}条到{1}条,一共{2}条',
    emptyMsg : '没有记录'
    });var grid = new Ext.grid.GridPanel({
    el : 'grid',
    ds : ds,
    cm : cm,
    region : 'center',
    sm : sm,// 加入一列checkbox
    frame : true,
    // loader : "../showuser.do",
    title : '人员资料维护',
    height : 200,
    autoScroll : false,
    viewConfig : {
    forceFit : true
    },
    autoExpandColumn : "status",
    tbar : [{
    text : '增加',
    tooltip : 'Add a new row',
    iconCls : 'add'
    }, '-', {
    text : '删除',
    tooltip : 'Remove the selected item',
    iconCls : 'remove'
    }, '-', {
    text : '帮助',
    tooltip : 'help me',
    iconCls : 'option'
    }],
    bbar : bbar
    });grid.render();Action代码:
    public class ShowUserAction extends Action { @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {
    response.setContentType("text/json;charset=utf-8");
    Session session = null;
    Transaction tx = null;
    String str=null;
    String json=null;
    try {
    session = HibernateClass.getSession();
    tx = session.beginTransaction();
    List<Systemusers> list = new ArrayList();

    List group = session.createQuery("from Systemusers")
    .list();

    for(Iterator iter = group.iterator();iter.hasNext();)
    {
    Systemusers sg = (Systemusers)iter.next();
    sg.getUserid();
    sg.getUsername();
    sg.getEasuserid();
    sg.getStatus();
    list.add(sg);
    // System.out.println(sg);
    } JSONArray jsonarray = JSONArray.fromObject(list);
    str = jsonarray.toString();
    json = "{\"totalProperty\":"+list.size()+",\"success\":true,\"root\":"+str+"}";
    System.out.println(json);
    tx.commit();

    } catch (Exception e) {
    e.printStackTrace();
    tx.rollback(); } finally {
    HibernateClass.closeSession(session);
    }

    response.getWriter().write(json);
    return null;
    }}
      

  11.   

    store在load的时候放入2个参数:
    store.load({
    params : {
    start : 0,
    limit : grid.bbar.pageSize
    }
    });
    然后后台Action里接收start limit 2个参数,做分页时,将Query接口中加入.setFirstResult(start).setMaxResult(limit)就行了,grid控件已经将分页其他的工作全部做好了
      

  12.   

    看我改的,还是一页显示呢
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {
    response.setContentType("text/json;charset=utf-8");
     int start =  Integer.parseInt(request.getParameter("start"));
     int limit =  Integer.parseInt(request.getParameter("limit"));
    //          request.setAttribute("start", start);
    //          request.setAttribute("limit", limit);
    Session session = null;
    Transaction tx = null;
    String str=null;
    String json=null;
    try {
    session = HibernateClass.getSession();
    tx = session.beginTransaction();
    List<Systemusers> list = new ArrayList();
    String hql="from Systemusers";
    List group = session.createQuery(hql).setFirstResult(start).setMaxResults(limit).list();    
    for(Iterator iter = group.iterator();iter.hasNext();)

    前台没改什么,指教下
      

  13.   

    用store.load({
    params : {
    start : 0,
    limit : grid.bbar.pageSize
    }
    });把store.load();换掉。这是前台要做的。
    后台 json = "{\"totalProperty\":"+list.size()+",\"success\":true,\"root\":"+str+"}";
    把list.size()换成要查询的记录总数,别做假分页。。最后记住:你的页面显示设置的是10条记录,如果你的记录不超过10,那肯定就是1页显示完,如果超过10,那你看看后台的list里是不是10条记录,以及totalProperty的值是否是实际记录的总数。
      

  14.   

    ds.load({params : {start : 0,limit : 10}});
    这个我老早改好了,可是你说的list.size()换成要查询的记录总数,我是不是还要定义一个变量来存储总数?
      

  15.   

    而且,list.size()实际获取到的数据时正确的啊,不需要改的吧?我总数比较多,有1700多条。另外json在返回给前台的时候,是通过group来封装到list中的吧?按理已经到前台的话,就能实现分页了咯
      

  16.   

    分页查询在数据层会有2条查询语句:
    select count(*) from table ;
    select index1,index2... form table ;
    这里你可以这样写:
     session = HibernateClass.getSession();
     List<Systemusers> group = session.createQuery("from Systemusers").setFirstResult(start).setMaxResults(limit).list();
     int total = session.createQuery("select count(*) from Systemusers").uniqueResult().toString().intValue();
     JSONArray jsonarray = JSONArray.fromObject(group);
     String json = "{\"totalProperty\":"+total+",\"success\":true,\"root\":"+jsonarray.toString()+"}";
    其中我改的部分包括:1.去掉事务,查询不要事务
                        2.对查询出来的list不用在重新遍历一次。
    当然,以上都是我在这编辑框里敲的,可能会有语法错误,你查查,另外一般来说,分页都是在HibernateSupport这类里实现,其他的Dao接口的实现里调用下就行了,没必要每个Action都写这个查询。
      

  17.   

    你把以上改了看看grid分页的效果,你就应该能知道分页是怎么一回事了吧
      

  18.   

    用firebug先看下,是数据没到前台,还是ext解析的时候出错
      

  19.   

    这个语句无法直接使用,运行后会出现systemusers is not mapped [select count(*) from systemusers]错误,《《分页都是在HibernateSupport这类里实现,其他的Dao接口的实现里调用下就行了,没必要每个Action都写这个查询。》》 HibernateSupport是系统类吧,实现分页是不是还要重写类?我目前写的东西既没有弄反向工程,也没有DAO接口。只有最简单的功能~~~ 如果要实现分类,是不是还要做反向工程才行?然后在DAO类中加入如下代码?
    /**
    * 返回当前数据库中记录的总数.
    *
    * @return int 记录总数
    */
    public int recordCount() {
    int allCount = -1;
    String tableName = "table_name";// 要处理的表格名
    String sql = "SELECT COUNT(*) FROM " + tableName;
    ResultSet rs = null;
    Statement stmt = null;
    try {
    // TODO: open connection
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sql);
    if (rs.next()) {
    allCount = rs.getInt(1);
    }
    } catch (Exception exception) {
    System.out
    .println("Occur a error in " + getClass()
    + ".recordCount() : " + exception.getMessage());
    } finally {
    closeJDBCResource(stmt);
    closeJDBCResource(rs);
    closeJDBCResource(conn);
    }
    return allCount;
    }
      

  20.   

    select count(*) from Systemusers
    这是个HQL语句,不能用表名的,要放对象上去。就跟String hql="from Systemusers";里面的一样。
    你用String tableName = "table_name";// 要处理的表格名
    String sql = "SELECT COUNT(*) FROM " + tableName;肯定报错
      

  21.   

    哦,上面的看错。
    你直接把 int total = Integer.parseInt(session.createQuery("select count(*) from Systemusers").uniqueResult().toString());  放到原来的程序里面去,先别加public int recordCount() 类,应该是没错的,我都这样写的
      

  22.   

    可以了,果然是因为我的Systemusers写成了systemusers,找不到了这个HQL对象了,呵呵,谢谢啦~~~
      

  23.   

    我也遇到了同样的问题,我也照着上面的一步步检查了,root 能打印出来,可Grid怎么还是不出来数据呢?
      

  24.   

    有没有extjs grid在asp.net中的应用代码?