在你需要导出显示大量列表时,在一页中都显示出来,是不美观页不实用的。在这种时候,就需要设置一个分页来显示你的内容,如百度的分页:
分页分为:前段分页和后端分页
后端分页:
首先我们应该确定,我们要分页,都需要从哪得到哪些数据:
Page类
在Servlet中得到:
int pageNumber //当前页码 , 该数据在Servlet中获取
int pageSize //每页显示的条数 , 在Servlet中指定
后期计算得到:
int index // 分页开始的索引 , 通过计算获得
int totalPage // 总页数 , 需要通过计算获得
从数据库中导出:
int totalRecord // 总记录 , 通过查询数据库获得
List data; // 分页的数据 , 通过数据库查询
分页查询时,DAO、Service的分工
Service:
pageNumber
pageSize
DAO:
int totalRecord
List data
下面是Page类,在这里声明了上面我们需要的6个数据中的4个,index、totalPage 2个需要计算得到的,我们就不在这里面声明了。这个page类可以拿过去直接使用的:
public class Page{private intpageNumber;private intpageSize;private inttotalRecord;private Listdata;privateString path;public Page(int pageNo, int pageSize, inttotalRecord) {super();this.pageNumber =pageNo;this.pageSize =pageSize;this.totalRecord =totalRecord;
}public intgetPageNumber() {if(pageNumber < 1){return 1;
}if(pageNumber >getTotalPage()){returngetTotalPage();
}returnpageNumber;
}public void setPageNumber(intpageNumber) {this.pageNumber =pageNumber;
}public intgetPageSize() {returnpageSize;
}public void setPageSize(intpageSize) {this.pageSize =pageSize;
}public intgetTotalPage() {if(getTotalRecord()%getPageSize()==0){return getTotalRecord()/getPageSize();
}else{return getTotalRecord()/getPageSize()+1;
}
}public intgetTotalRecord() {returntotalRecord;
}public void setTotalRecord(inttotalRecord) {this.totalRecord =totalRecord;
}public intgetIndex() {return (getPageNumber() - 1) *getPageSize();
}public ListgetData() {returndata;
}public void setData(Listdata) {this.data =data;
}publicString getPath() {returnpath;
}public voidsetPath(String path) {this.path =path;
}
}
Servlet关键代码
protected void getStuList(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
String url=WebUtils.getPath(request);
Page page=stuService.findAll(pageNo, pageSize);
page.setPath(url);
request.setAttribute("page",page );
request.getRequestDispatcher("/studentList.jsp").forward(request, response);
}
Dao关键代码:从数据库中导出 totalRecord 、List data;
public static intgetTotalRecord() {
PreparedStatement ps=null;
ResultSet rs= null;
Connection conn=Utils.getConnection();
String sql= " SELECT COUNT(*) AS total FROM student";int total=0;try{
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();if(rs.next()){
total= rs.getInt("total");
}
}catch(SQLException e) {//e.printStackTrace();
}finally{
Utils.close(conn, ps, rs);
}returntotal;
}public List getLimitStuList(int index, intpageSize) {
PreparedStatement ps=null;
ResultSet rs= null;
Connection conn=Utils.getConnection();
String sql= " SELECT * FROM student limit ? , ?";
List list= new ArrayList();try{
ps=conn.prepareStatement(sql);
ps.setInt(1, index);
ps.setInt(2, pageSize);
rs=ps.executeQuery();while(rs.next()){int id = rs.getInt("id");
String name= rs.getString("name");
String school= rs.getString("school");double score = rs.getDouble("score");
list.add(newStudent(id,name,school,score));
}
}catch(SQLException e) {//e.printStackTrace();
}finally{
Utils.close(conn, ps, rs);
}returnlist;
}
这就是后端的一些关键代码,下面我们看下前段分页。
前段分页:这是一个JSP代码
百度是页里最多只显示10个页码
咱们设计为页面中最多显示5页码
这个问题就转变成了需要动态的设置forEach中begin和end的值
根据不同的情况去设置begin和end的值
第一种情况,总页数小于等于5
begin=1 end=总页数
第二种情况,当前页 小于等于 3
begin=1 end=5
第三种情况,当前页 大于3
lbegin=当前页-2 end=当前页+2
首页
上一页
page.totalPage }">
【${num}】
${num }
下一页
末页共${page.totalPage }页,${page.totalRecord }条记录到,去第页
$("#btn_id").click(function(){varvalue=$("#pn_input").val();
window.location="${page.path}&pageNo="+value;
});