对于新手来说实现分页有一定的难度,我开始页整了半天才弄清楚,这里对分页做了一个总结并分享出来,希望对有需要的朋友有所帮助。
一,分页思路
什么是分页?
分页,是一种将所有数据分段展示给用户的技术.用户每次看到的不是全部数据,而是其中的一部分,如果在其中没有找到自习自己想要的内容,用户可以通过制定页码或是翻页的方式转换可见内容,直到找到自己想要的内容为止.其实这和我们阅读书籍很类似.
为什么分页?
主要有以下几点
- 内容过多,不易将数据全部读取出来,
- 如果将数据全部读取出来会增加服务器负担,用户加载缓慢,体验下降
- 若用户不需要看后面的内容加载出来存在浪费
- 对用户找到自己想要的内容更加方便
怎样实现分页?
对数据库中的数据分页本质是对需要查询出来的记录进行拆分截取部分数据返回给用户,并获得该条件下的所有记录数tr,自定义每页记录数ps,计算得到总页数tp(计算公式:tp = tr / ps; tr%ps==0 ? tp:tp+1;),当记录数未满一页的记录数也算一页,所以有以上公式。
二、分页具体实现
- list.jsp页面分页操作简单说明示例代码演示如下:
<c:forEach items="${pb.beanList}" var="list">
<tr>
<td>${list.id}</td>
<td>${list.username}</td>
<td>${list.password}</td>
</tr>
</c:forEach>
2.页面分页列表
<div class="list-con">
<c:forEach items="${pb.beanList}" var="list">
<div class="list-con-model">
<%--第一显示栏--%>
<div class="m1">
<div class="m1-title">
<p>
<em class="list-con-reward">¥ ${list.price}</em>
<a class="list-con-title" title="${list.title}" href="needMarkets.ml?mt=needDetail&neid=${list.id}"
target="_blank">${list.title}</a>
</p>
</div>
<div class="m1-con">
<p class="list-con-ctn">${list.content}</p>
</div>
</div>
<%--第二显示栏--%>
<div class="m2">
<p>
<a class="blue" href="javascript:;" target="_blank">${list.joinNum}</a>
<span class="text">参与</span><span class="text"> | </span>
<span class="text">
<c:if test="${list.tradeModel=='bigao'}">
比稿
</c:if>
<c:if test="${list.tradeModel=='zhaobiao'}">
招标
</c:if>
</span>
</p>
<br/>
<p>
<c:if test="${list.tradeModel=='zhaobiao'}">
<span style="white-space: nowrap;color: #999;">仅剩<span class="blue">7</span>个投标机会</span>
</c:if>
</p>
</div>
<%--第三部分--%>
<div class="m3">
<p><span class="text">${list.closeDate} 后截止</span></p>
</div>
</div>
</c:forEach>
</div>
3.pageBean类
import java.util.List;
/**
* 分页模型类
*
* @author 10589
* @date 2016/6/3
* @time 14:01
*/
public class PageBean<T> {
private int pc;//当前页码 page code
private int tr;//总记录数 total record
private int ps;//每页记录数
private List<T> beanList;//当前页的记录
private String url;//用来保存条件!
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getPc() {
return pc;
}
public void setPc(int pc) {
this.pc = pc;
}
/**
* 记录总页数
* @return
*/
public int getTp() {
//通过总记录数和每页记录数来计算总页数
int tp = tr / ps;
return tr%ps==0 ? tp:tp+1;
}
public int getTr() {
return tr;
}
public void setTr(int tr) {
this.tr = tr;
}
public int getPs() {
return ps;
}
public void setPs(int ps) {
this.ps = ps;
}
public List<T> getBeanList() {
return beanList;
}
public void setBeanList(List<T> beanList) {
this.beanList = beanList;
}
}
4. controller层
/*分页操作*/
@RequestMapping(params = "mt=list")
public String list(HttpServletRequest request, HttpServletResponse response, HttpSession session, ModelMap map){
/**
* 需要修改 3 处地方
*/
/**
* 1. 获取页面传递的pc
* 2. 给定ps的值
* 3. 使用pc和ps调用service方法,得到PageBean,保存到request域
* 4. 转发到list.jsp
*/
/**
* 把条件截取出来,保存到pb.url中!
*/
String url = request.getQueryString();
/**
* url中有可能存在pc,这需要把pc截取下去,不要它!
*/
int index = url.lastIndexOf("&pc=");
if(index == -1) {
}else{
url = url.substring(0, index);
}
/**
* 1. 得到pc
* 如果pc参数不存在,说明pc=1
* 如果pc参数存在,需要转换成int类型即可
*/
String value = request.getParameter("pc");
int pc = 1;
if(!CommonsUtilsTool.isEmpty(value)){
pc = Integer.parseInt(value);
}
/**
* 2.给定ps值,每页10行记录
*/
/**=================需求修改的每页记录数,默认10记录========================*/
int ps = 10; /**1.修改*/
/**
* 3. 使用pc和ps调用service方法,得到PageBean,保存到request域
*/
/**=================需求修改对象参数======================================*/ /**2.修改*/
// 获取页面传递的查询条件
Users ob = CommonUtils.toBean(request.getParameterMap(),Users.class);
PageBean<Users> pb = userService.getPage(ob,pc,ps);
pb.setUrl(url);
/*存入到request域中*/
map.addAttribute("pb",pb);
/**
* 4. 转发到list.jsp
*/
return "/pc/main/list";
}
5…service层
public PageBean getPage(Users ob,int pc, int ps) {
/**
*
*需要修该 5 个地方
*/
/**需要修改的对象*/
String obName = "Users"; /**1.修改*/
/**
* 1. 给出基本的sql语句
*/
StringBuilder where = new StringBuilder("where 1=1");
/**
* 2. 创建List,用来保存参数
*/
List<Object> params = new ArrayList<Object>();
/**(
* 3. 判断c中每个字段是否存在,如果存在说明有这个条件,如果不存在就没有这个条件
*/
/**=========================有条件则加范围===============================*/ /**2.修改*/ //有条件则加,无条件不加
String username = ob.getUsername();
if(username != null && !CommonsUtilsTool.isEmpty(username.trim())) {
where.append(" and username like ?");
params.add("%" + username + "%");
}
/**=========================有条件则加范围===============================*/
/**
* 得到count的sql语句
*/
StringBuilder countSql = new StringBuilder("select count(*) from "+obName);
String hql = countSql.append(" ").append(where).toString();
/**
* 查询当前页的记录
* 头 + where + limit
*/
StringBuilder selectSql = new StringBuilder("from "+obName);
/**=========================修改对应对象===============================*/
PageBean<Users> pb = new PageBean<Users>(); /**3.修改*/
pb.setPc(pc);
pb.setPs(ps);
pb.setTr(userDao.getTotalCount(hql,params.toArray())); /**4.修改*/
pb.setBeanList(userDao.getPage(selectSql.append(" ").append(where).toString(),params.toArray(),(pc-1)*ps,ps)); /**5.修改*/
return pb;
}
6.dao层操作方法(hibernate版本,可更改)
public int getTotalCount(String hql,Object[] args) {
Query u = this.getSessionFactory().getCurrentSession().createQuery(hql);
if (args != null) {
for (int i = 0; i < args.length; i++) {
u.setParameter(i, args[i]);
}
}
return (int) ((Long)(u.uniqueResult())).longValue();
}
public List<T> getPage(int startIndex, int count) {
return this.getSessionFactory().getCurrentSession().createQuery(
"from " + this.getClz().getName() + " as c order by c.id asc").setFirstResult(startIndex).setMaxResults(count).list();
}
public List<T> getPage(String hql,Object[] args, int startIndex, int count) {
Query u = this.getSessionFactory().getCurrentSession().createQuery(hql);
if (args != null) {
for (int i = 0; i < args.length; i++) {
u.setParameter(i, args[i]);
}
}
List<T> list = u.setFirstResult(startIndex).setMaxResults(count).list();
return list;
}
打个小广告:博主自己开发的资源整合网站欢迎来访