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