最近开发用EXT+SSH,开发的不亦乐乎,突然遇到一个问题------分页,经过一天的尝试最后解决问题,网上有很多的文章写这个的,但是我感觉写的人肯定知道了怎么去做,但是看的人是一面的雾水.希望我写的对大家有所帮助.
我实现的是对Grid的分页,使用到的有GridPanel ,Pagingbar,JSonStore.使用的的是struts2.0+hibernate.
首先、说一下JSonStore;
cityStore=new Ext.data.Store({//配置分组数据集
autoLoad :{params:{start:0,limit:2}},
reader: new Ext.data.JsonReader({
totalProperty:'results',
root : "cities",
fields : [
{name: 'cityId'},
{name: 'cityName'},
{name:'longitude'},
{name:'latitude'},
{name:'cityDescription'}]
}),
其中重要的有三个变量:start limit totalProperty,在autoLoad:中的start ,limit 是用来设置开始加载store时候使用,相当于第一次显示的记录,limit 要与pagingBar 中的pasgeSize 数值一样、再一个是totalProerty是记录的总数,是所有记录的数量,不是json返回的记录数量,这就决定了,我们在生成json数据的时候,返回的results,是所有的记录的数量,而不是一页包含的记录数,因为pagingbar的分页数量是根据jsonStrore中totalProperty和pagingbar中的pageSize计算主来的。
其次、说一下pagingbar
var pagingBar=new Ext.PagingToolbar(
{
//params:{start:0,limit:2},
store:cityStore,
pageSize:2,
displayInfo:false,
displayMsg:'第{0}条到{1}条,一共{2}条',
emptyMsg:'没有记录'
});
里面重要的数据有pageSize,params{start ,limit},store,pageSize是一页显示的记录数,params{start,limit}是pagingbar默认的参数,可以自己定义,这两个参数是用在action中的接收参数,action根据stat limit来获得要返回的json中的记录内容,并把内容传递给jsonStore,store就不说了,就是自己定义的那个cityStore.
再次、说一说action,action是关键的,它要接受start limit两个参数,根据这两个参数从数据库中获得记录集合,同时要获得所有记录的总数,并且把记录的总数要作为数据传递给store,results在这个里子中是这样的。长久没有解决这个问题,原因就是没有想到这一点,最后才发现,很多文章,在这一点,没有介绍清楚,我想是大家都知道,都没有点明,这让我饶了一个大弯,通过不段的测试和假设才发现原因,不过还要感谢你们帮助我找到问题的原因。
最后、简单说一下hibernate,在数据库操作类,定义一个根据开始位置和增加量的方法。
public List getCitys(final int begin, final int end) {
// TODO Auto-generated method stub
final String hql="from City";
final int cityCount=this.getCityCount();//获得所有的记录数量
List list=(List)this.getHibernateTemplate().execute(new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException, SQLException {
// TODO Auto-generated method stub
Query query=session.createQuery(hql);
int first,last;
List listTemp;
if(begin<cityCount)
{
if(begin>0)
{
first=begin;
}
else
{
first=0;
}
if(end<cityCount-begin)
{
last=end;
}
else
{
last=cityCount-begin;
}
query.setFirstResult(first);
query.setMaxResults(last);
listTemp=query.list();
}
else
{
listTemp=null;
}
return listTemp;
}
});
return list;
}