我是一名Java初学者,这段时间需要在自己的小程序中添加翻页功能,折腾了几天,终于搞定。所以在这儿想把它记录下来,作为自己的一个小小的总结。
这个分页是:仅仅用jsp和servlet实现的。没有使用任何架构~~
我使用的数据库是MySQL,而MySQL中的分页的sql语句是:
select [*] from [table_name] order by [id] limit a,b。
[*]是指的你需要查找的字段,[table_name]是你的表名。而 limit a,b 的意思就是:从a 为开始索引,查找b个数据。 例如:limit 0,3 即为 从索引0个开始,查找三个数据。
下面的例子就是一个简单的JSP界面的分页功能。
<%@ page contentType="text/html; charset=GB2312"%> <%@page import="java.sql.ResultSet"%> <%@ include file="common.jsp" %> //这儿是引用了一个javaBean。 <html> <head> <title>翻页功能的实现</title> </head> <% final int e=5; //一页中显示的数量 int totlePages=0; //页面总数 int currentPage=1; //当前页面数 int totleCounts; //数据库中的数据总量 int firstIndex=0; //当前页面的开始索引 ResultSet rs=null; String tempStr=request.getParameter("currentPage"); if(tempStr!=null&&!tempStr.equals("")){ currentPage=Integer.parseInt(tempStr); } totleCounts=bookDB.getNumberOfBooks(); //获得数据库中总的数量 totlePages=(totleCounts%e==0)?(totleCounts/e):(totleCounts/e+1); //得到总的页面数目 if(totlePages==0){ totlePages=1; } if(currentPage>totlePages){ currentPage=totlePages; }else if(currentPage<1){ currentPage=1; } firstIndex=(currentPage-1)*e; //这儿就是当前索引的定义。 rs=bookDB.getBooksAllEntity(firstIndex,e); //这儿我自己写的一个小的方法,可以进行查询limit的查询,在下面说明了它 while(rs.next()){ String bookID=rs.getString(1); String bookTitle=rs.getString(2); String bookAuthor=rs.getString(3); String bookPrice=rs.getString(4); String bookPublishYear=rs.getString(5); String bookDescription=rs.getString(6); String bookSaleAmount=rs.getString(7); String bookISBN=rs.getString(8); %> <body> <br> <table> <tr><%=bookID %></tr> <tr><%=bookTitle %></tr> <tr><%=bookAuthor %></tr> <tr><%=bookPrice %></tr> <tr><%=bookPublishYear %></tr> <tr><%=bookDescription %></tr> <tr><%=bookSaleAmount %></tr> <tr><%=bookISBN %></tr> </table> <% } %> 页码: <% for(int i=1;i<=totlePages;i++){ if(i==currentPage){ %> <%=i%> <% }else{ %> <a href="turnPage.jsp?currentPage=<%=i%>"><%=i%></a> //实现了点击跳转的作用 <% } } %> 总的记录数目:<%=totleCounts%> 总的totlePages<%=totlePages%> </body> </html>
这儿就是getBooksAllEntity()方法的定义
public ResultSet getBooksAllEntity(int p,int e){ Connection conn=null; Statement stat=null; ResultSet rs=null; String sql="select * from books order by bookID limit "+p+","+e; try{ conn=getConnection(); stat=conn.createStatement(); rs=stat.executeQuery(sql); }catch(Exception m){ m.printStackTrace(); } return rs; }
翻页的实现基本上的就是这样了。比较简单。还有在Oracle数据库中使用的SQL语句是不同的。
/**************************************************************/
上面的是针对MySQL数据库进行的。后来在慢慢的学习中渐渐的感到,1是你不可能什么架构都不使用,而仅仅是使用jsp和servlet的。 第二点就是:现在应用架构进行翻页功能的实现,能够更加方便和通用。
记录时间:2011年7月14日17:21:19
用的架构是struts2, spring 2.5 和hibernate 3.2
在这儿使用的hibernate本身提供的翻页方法。
第一步: 首先先写一个分页类
import java.util.List; public class Pager { private int totalRows;//记录总数 private int pageSize = 10;//设置一页显示的记录数 private int currentPage;//当前页码 private int totalPages;//总页数 private int startRow;//当前页码开始记录数 private List elements;//记录列表 public Pager() { } //构造pager对象 /** * 初始化Pager,在构造器中初始化变量 */ public Pager(int _totalRows) { totalRows = _totalRows; totalPages=totalRows/pageSize; int mod=totalRows%pageSize; if(mod>0){ totalPages++; //这个就是 totalPages = totalPages +1; } // currentPage = 1; startRow = 0; } //首页 public void first() { currentPage = 1; startRow = 0; } //上一页 public void previous() { if (currentPage == 1) { return; } currentPage--; startRow = (currentPage - 1) * pageSize; } //下一页 public void next() { if (currentPage < totalPages) { currentPage++; } startRow = (currentPage - 1) * pageSize; } //尾页 public void last() { currentPage = totalPages; startRow = (currentPage - 1) * pageSize; } //刷新pager对象 public void refresh(int _currentPage) { currentPage = _currentPage; if (currentPage > totalPages) { last(); } } public int getStartRow() { return startRow; } public int getTotalPages() { return totalPages; } public int getCurrentPage() { return currentPage; } public int getPageSize() { return pageSize; } public void setTotalRows(int totalRows) { this.totalRows = totalRows; } public void setStartRow(int startRow) { this.startRow = startRow; } public void setTotalPages(int totalPages) { this.totalPages = totalPages; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalRows() { return totalRows; } public List getList() { return elements; } public void setList(List elements) { this.elements=elements; } }
第二步:
声明一个IDAO(public interface IBaseDao)
并且写一个Pager方法接口。
import java.util.List;
import org.hibernate.Session;
import com.kemp.util.page.Pager;
public interface IBaseDao {
// 根据给定的持久化对象,添加记录
public void save(Object object);
// 根据给定的持久化对象,删除记录
public void delete(Object object);
// 根据给定的持久化对象,更新记录
public void update(Object object);
// 执行HQL查询,返回查询的结果
public List find(String where);
// 通过主键ID返回一个数据对象
public void saveOrUpdate(Object object);
// 根据给定的对象,保存或更新对象
public Object findById(Class cla,Integer id);
// 获得Hibernate中的一个session
public Session openSession();
// 获取分页对象
public Pager getPager(String hsql,String currentPage,String pagerMethod);
}
第三步:写一个DAO的实现类
public Pager getPager(String hsql, String currentPage, String pagerMethod) {
// 定义pager对象,用于传到页面 int totalRows = 0; List items = new ArrayList(); Pager pager = null; Session session = this.openSession(); Query query = session.createQuery(hsql); totalRows = (query.list()).size(); //取得总计录数 pager = new Pager(totalRows); // 如果当前页号为空,表示为首次查询该页 // 如果不为空,则刷新pager对象,输入当前页号等信息 if (currentPage != null) { pager.refresh(Integer.parseInt(currentPage)); } // 获取当前执行的方法,首页,前一页,后一页,尾页。 if (pagerMethod != null) { if (pagerMethod.equals("first")) { pager.first(); } else if (pagerMethod.equals("previous")) { pager.previous(); } else if (pagerMethod.equals("next")) { pager.next(); } else if (pagerMethod.equals("last")) { pager.last(); } } //从当前页记录数开始 query.setFirstResult(pager.getStartRow()); //取出pageSize个记录 query.setMaxResults(pager.getPageSize()); items = query.list(); pager.setList(items); return pager; }
第三步:在具体的service中编写对于特定业务的方法。
第四步:在Action中引用相对应service的方法。通过界面和Action的之间值的传递,完成翻页功能的实现
在Action中继承了一个AbstractAction
其代码如下:
import com.kemp.util.page.Pager; import com.opensymphony.xwork2.ActionSupport; public abstract class AbstractAction extends ActionSupport { protected String where = ""; //分页需要属性 protected Pager pager; protected String currentPage; protected String pagerMethod; public Pager getPager() { return pager; } public void setPager(Pager pager) { this.pager = pager; } public String getPagerMethod() { return pagerMethod; } public void setPagerMethod(String pagerMethod) { this.pagerMethod = pagerMethod; } public String getWhere() { return where; } public void setWhere(String where) { this.where = where; } public String getCurrentPage() { return currentPage; } public void setCurrentPage(String currentPage) { this.currentPage = currentPage; } }
【注意】:有一点有点疑问,通过hibernate实现的分页功能,其功能和效率不知道怎么样?在大型的系统中性能是如何的。