UPDATE:重新优化了一下代码,减少一次页面请求读取数据库的次数,由原来的一次请求6次读取,减少为一次请求3次读取:
UPDATE2: 修改UserPager.html模板,再次减少读取数据库一次,最后结果是一次请求读取数据库2次。
一个简单的、可用的分页widget,主要功能是通过点击“上一页”和“下一页”,从数据库中取得User Entity的分页数据。水平非常有限,错漏之处难免,请各位高手指点。
1、分页widget @Pager
UserPager.java
public class UserPager { private int page; private int maxPerPage; @Inject private UserFinder finder; public ArrayList<User> getNext(){ int start = page * maxPerPage; return finder.listUsers(start, maxPerPage); } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public boolean isNextExists(){ return !getNext().isEmpty(); } public boolean isPrevExists(){ if(page<2) return false; return true; } public void setMaxPerPage(int maxPerPage) { this.maxPerPage = maxPerPage; } public int getMaxPerPage(){ return maxPerPage; } }
2、 分页模板
UserPager.html
<!DOCTYPE HTML> <html> <head> <title>none</title> </head> <body> <p> @ShowIf(prevExists) <span><< <a href="/?page=${page-1}">上一页</a></span> <span> </span> @ShowIf(nextExists) <span><a href="/?page=${page+1}">下一页</a> >></span> </p> </body> </html>
3、sitebricks的配置,在protected void configureSitebricks()方法中增加一行:
embed(UserPager.class).as("Pager");
4、应用:
Home.java
public class Home extends Decorator { private ArrayList<User> pagedUsers; private int page; private int maxPerPage = 2;//设置每页最大显示结果数 public int getPage() { return page; } public void setPage(int page) { this.page = page; } @Inject private UserFinder finder; public Home() { } public ArrayList<User> getPagedUsers() { if(page<1) page = 1; int start = (page - 1) * maxPerPage; return finder.listUsers(start, maxPerPage); } @Override public String getPageTitle() { return "主页再次测试!"; } public int getMaxPerPage() { return maxPerPage; } public void setMaxPerPage(int maxPerPage) { this.maxPerPage = maxPerPage; } }
Home.html
<!DOCTYPE HTML> <html> <head> <title>bricks - Home page</title> <meta charset="UTF-8"/> </head> <body> <div> <ol> @Repeat(items=pagedUsers, var="user") <li>${user.name}</li> </ol> @Pager(page=page, maxPerPage=maxPerPage) <div/> </div> </body> </html>
5、还需要解决的问题:分页数据局限于User,widget @Pager不能用于其它数据分页。解决的思路:像tapestry的GridPager一样,设置pagedSource,但问题是pagedSource必须是一次取全部数据记录。