对于web应用来说分页显示数据是是最基本的功能,作为经常开发web应用的程序员来说这个功能也小菜一碟,但是对于初学者来说却是是个常见的问题,以前自学web开发的时候对这个问题也是各种google,整了半天才实现。
现在手中的项目正好也需要一个分页的功能,这个项目用了spring mvc数据库用到了mongodb,自己就写了一个分页的标签供整个项目来使用,今天周六加完班闲着没事就把分页的实现写出来以便大家参考,不当之处欢迎批评指正。
1)分页:
一般都是把一次查询分几次查询来显示。用户每次点击页数(或者上一页下一页)的时候实际上一次查询请求。查询设定数据的条数返回并显示。
2) mongodb分页用到的工具
在查询的时候需要用到Query来保存用户的查询条件,该类有两个方法是实现分页功能的核心一个是skip(int),一个是limit(int)方法,其中limit用来限制每次查询的条数,也是每显示的条数。而skip是跳过当前页之前的所有页面的数据条数开始查询
3)分页关键点(所需的数据):
i) 每页显示的条数pageSize
ii) 当前的页数currentPage,而前面的skip方法传入的参数就是根据currentPage和pageSize来决定的,skip = (currentPage-1)*pageSize
4)分页的具体实现
通过上面的分析,分页简单来说就是用户点击分页的时候提交一个关键数据(currentPage)到后台,后台根据currentPage来进行分页查询;至于上面的pageSize,
在后台设置一个变量来控制即可。
下面是项目中的用来查询的基类:MongodbBaseDao<T>的部分代码
-
-
protectedstaticfinalintPAGE_SIZE=8;
-
-
-
-
publicPagination<T>getPage(intcurrentPage,Queryquery){
-
-
longtotalCount=this.mongoTemplate.count(query,this.getEntityClass());
-
-
inttotalPage=(int)(totalCount/PAGE_SIZE);
-
-
intskip=(currentPage-1)*PAGE_SIZE;
-
-
Pagination<T>page=newPagination<T>(currentPage,totalPage,(int)totalCount);
-
query.skip(skip);
-
query.limit(PAGE_SIZE);
-
-
List<T>datas=this.find(query);
-
-
page.build(datas);
-
-
returnpage;
-
}
上面的代码中Pagination类保存了分页所需的必要的数据,比如当前页currentPage,总页数totalPage,总条数totalCount,当然还有数据集合List 用来保存页面所需的数据。另外getEntityClass()是T所对应的class对象(由子类来具体实现)。例如项目中有一个子类VideoMongodbDao
-
@Service
-
publicclassVideoMongodbDaoextendsMongodbBaseDao<Video>{
-
-
@Override
-
protectedClass<Video>getEntityClass(){
-
returnVideo.class;
-
}
-
}
分页数据封装类Pagination<T>,里面提供了分页的数据
-
publicclassPagination<T>{
-
-
-
privateIntegerpageSize=8;
-
-
-
privateIntegercurrentPage=1;
-
-
-
privateIntegertotalPage=1;
-
-
-
privateIntegertotalNumber=0;
-
-
-
privateListitems;
-
-
publicIntegergetPageSize(){
-
-
returnpageSize;
-
}
Pagination类还有一个重要的build方法,根据该类封装的数据来设定分了多少页,具体实现方法如下
-
-
-
-
-
-
-
-
-
publicvoidbuild(Listitems){
-
this.setItems(items);
-
intcount=this.getTotalNumber();
-
intdivisor=count/this.getPageSize();
-
intremainder=count%this.getPageSize();
-
this.setTotalPage(remainder==0?divisor==0?1:divisor:divisor+1);
-
}
所以在对应的controller对应的方法中查询的时候,可以这么处理
-
Queryquery=newQuery();
-
-
CriteriachannleIdCri=Criteria.where("channelId").is(channel_id);
-
query.addCriteria(channleIdCri);
-
-
StringcurrentPageStr=request.getParameter("currentPage");
-
intcurrentPage=0;
-
if(currentPageStr!=null){
-
currentPage=Integer.valueOf(currentPageStr);
-
}
-
-
Pagination<Video>videos=dao.getPage(currentPage,query);
-
m.addAttribute("videos",videos);
-
下面需要生成分页当行条,在这里用到了spring的标签来处理,对应的是标签类PaginationTag,该类封装了页面表单form对应的id,分页显示所需的数据,以及分页显示可点击的页面的长度。该类如下
-
publicclassPaginationTagextendsTagSupport{
-
-
privateStringform;
-
-
-
privateStringpageInfo;
-
-
-
privateintsize;
-
-
publicPaginationTag(){
-
this.form="form";
-
this.size=5;
-
}
生成的分页导航条的代码如下
-
@Override
-
publicintdoStartTag()throwsJspException{
-
inthalf=size/2;
-
intpoint=size/2+size%2;
-
intstart=1;
-
intloop=size;
-
Paginationquery=(Pagination)this.pageContext.getRequest().getAttribute(pageInfo);
-
intpageSize=query.getPageSize();
-
intcurrentPage=query.getCurrentPage();
-
inttotalPage=query.getTotalPage();
-
longtotalNumber=query.getTotalNumber();
-
if(totalPage<=size){
-
start=1;
-
loop=totalPage;
-
}else{
-
if(currentPage>point&¤tPage<totalPage-half+1){
-
start=1+(currentPage-point);
-
}elseif(currentPage>totalPage-half){
-
start=totalPage-size+1;
-
}
-
}
-
-
if(currentPage<=0){
-
currentPage=1;
-
}
-
StringBuildersb=newStringBuilder();
-
sb.append("<divclass=\"box-ttl\"><divclass=\"g4\">共<spanclass=\"text-info\">");
-
sb.append(totalNumber).append("</span>条数据");
-
sb.append("/共<spanclass=\"text-info\">");
-
if(totalNumber!=0){
-
sb.append(totalPage).append("</span>页!</div><divclass=\"boxcollapsedg6flt-r\"><ulclass=\"nav-menu\">");
-
}else{
-
sb.append(0).append("</span>页!</div><divclass=\"boxcollapsedg6flt-r\"><ulclass=\"nav-menu\">");
-
}
-
-
if(currentPage==1){
-
sb.append("<liclass=\"disabled\"><ahref=\"#\">上一页</a></li>");
-
}else{
-
sb.append("<li><ahref=\"javascript:dopage("+(currentPage-1)+",'"+form+"');\">上一页</a></li>");
-
}
-
-
for(inti=start;i<start+loop;i++){
-
-
if(currentPage==i){
-
sb.append("<liclass=\"active\"><ahref=\"#\">"+i+"</a></li>");
-
}else{
-
-
sb.append("<li><ahref=\"javascript:dopage("+i+",'"+form+"');\">"+i+"</a></li>");
-
}
-
}
-
-
if(currentPage==totalPage){
-
sb.append("<liclass=\"disabled\"><ahref=\"#\">下一页</a></li>");
-
}else{
-
sb.append("<li><ahref=\"javascript:dopage("+(currentPage+1)+",'"+form+"');\">下一页</a></li>");
-
}
-
-
sb.append("</ul></div></div>");
-
-
sb.append("<inputtype=\"hidden\"id=\"currentPage\"name=\"currentPage\"value=\""+currentPage+"\"/>");
-
-
try{
-
pageContext.getOut().write(sb.toString());
-
}catch(IOExceptione){
-
thrownewJspException(e.toString(),e);
-
}
-
returnsuper.doStartTag();
-
}
有上面的标签可以发现,每次点击页面页数的时候是用过js的dopage方法来实现的,该js方法根据form.submit()来提交信息查询信息(特别是currentPage数据)
js的代码如下
-
functiondopage(currentPage,formid){
-
$("#currentPage").val(currentPage);
-
$("#"+formid).submit();
-
}
在jsp页面中只需要添加上述标签即可(标签类Pagination以及转换成tld文件了—)
-
<div>
-
<tv:paginationpageInfo="videos"form="video-form"size="5"></tv:pagination>
-
</div>
-
分享到:
相关推荐
主要为大家详细介绍了Springmvc应用Mongodb分页实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
SpringMVC和MongoDB整合Demo+文档
springMVC整合MongoDb整个工程,包括所用到的jar包
Spring+SpirngMVC+MongoDB应用源码。运行环境:IDEA,tomcat8.0,MongoDB4.0.6
通过IDEA搭建maven工程整合Spring+SpringMVC+MongoDB,通过bootstrap编写的jsp页面,主要功能有用户注册,用户登录,添加用户,删除用户,更新用户,多条件搜索,停用用户,启用用户等功能。
1、mongodb常规操作 2、测试数据多线程生产 3、单元测试查询效率
spring,SpringMVC,整合MongoDB的例子,基于spring-data-mongo1.X,spring4.X
基于springmvc实现分页查询基于springmvc实现分页查询
springMVC集成mongoDB的demo
SpringMVC和MongoDB整合
springMVC+MongoDB实现基本的登录注册以及增删改查 用到idea,MongoDB4.0.5版本,java8,tomcat9,spring4.0.0jar,spring-data-mongodb1.5.5jar(最开始用spring5.0jar和spring-data-mongodb2.0的jar,怎么都无法...
springmvc+mongodb+maven 项目搭建配置,项目能运行,测试过了
springmvc mongodb jquery 实现用户操作
1、利用SpringMVC+Spring+MongoDb搭建的Rest api工程 2、利用localhost:8080/demo/user/register可以测试(会在本地MongoDB中形成user数据) 3、利用maven进行管理 4、IDE:IDEA
包含了spring+springmvc+mongodb + mybaits+ oracle所必须的基本全部jar包,经本人亲自测试,从源码中复制出来的,欢迎下载
springmvc-mongodb-maven结合,spring4 mongodb3,在写的时候,遇到最多的问题就是spring版本与mongodb版本不兼容,整个demo出来给大家参考吧
1、这个项目是 springMVC+mongoDB,用的 mongoTemplate 做和数据库的链接, 日志用的log4j 2、项目中集成了 完整的单元测试,和基本的添加和查询,具体的api可以查看mongoTemplate 的api 3、经过单元测试添加和查询...
集成了 angular springmvc mongodb,做的单页面应用
SpringMVC+mongodb+freemarker+apiToken开源内容管理系统.zip