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必须是一次取全部数据记录。