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();
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();
response.getWriter().write(str);
将你的str在控制台打印下,然后放到js中eval下看看格式对不对
不过我想应该是不对
new Ext.data.JsonReader({
totalProperty : 'totalProperty', //grid中分页记录总数接收参数的地方,后台命名一定要是totalProperty
root : 'root' //grid中接收显示数据的地方,后台命名一定要是root
}
很明显,你后台就传了一个list,JSP接收不到。另:后台向前台传store时,store中必须有success,只是在store中默认了而已。
String json = "{\"totalProperty\":"+list.size()+",\"success\":true,"+str+"}";//可能会有问题
2.把前台的接收参数名改掉,后台只传了一个list,那么前台接收:
new Ext.data.JsonReader({
root : 'list'
},
当然这样处理之后分页显示就不准确了,分页总记录数是固定的,每页显示的总数也失去意义,grid永远只有1页,更糟糕的可能会不显示,没有接收到success = true,这个我没试过,我都是用Struts插件直接转JSON的,里面都带了success的,最好采取第一种思路去调试。
只要格式对了,用response.getWriter().write(str);
输出json字符串即可,在前台store的render会自动解析的
因资料太多,所以就弄了其中3条
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"}]}
哪里还有问题?求救了
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;
}}
store.load({
params : {
start : 0,
limit : grid.bbar.pageSize
}
});
然后后台Action里接收start limit 2个参数,做分页时,将Query接口中加入.setFirstResult(start).setMaxResult(limit)就行了,grid控件已经将分页其他的工作全部做好了
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();)
前台没改什么,指教下
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的值是否是实际记录的总数。
这个我老早改好了,可是你说的list.size()换成要查询的记录总数,我是不是还要定义一个变量来存储总数?
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都写这个查询。
/**
* 返回当前数据库中记录的总数.
*
* @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;
}
这是个HQL语句,不能用表名的,要放对象上去。就跟String hql="from Systemusers";里面的一样。
你用String tableName = "table_name";// 要处理的表格名
String sql = "SELECT COUNT(*) FROM " + tableName;肯定报错
你直接把 int total = Integer.parseInt(session.createQuery("select count(*) from Systemusers").uniqueResult().toString()); 放到原来的程序里面去,先别加public int recordCount() 类,应该是没错的,我都这样写的