web中翻页功能的实现

 

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值