web中翻页功能的实现

来源:互联网 发布:sybase数据库win7 编辑:程序博客网 时间:2024/05/01 13:07

 

  我是一名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实现的分页功能,其功能和效率不知道怎么样?在大型的系统中性能是如何的。