关于使用SSH框架分页的实现以及容易出错的地方

本文探讨了在SSH框架下实现分页功能的两种方法,针对已搭建好的框架进行讨论。首先展示了分页效果,接着详细列出showlist.jsp、Action层、Service层和DAO层的代码实现,分享在编写过程中可能遇到的问题与解决策略。
摘要由CSDN通过智能技术生成

  洗完澡后,闲来无事来聊一聊分页功能的实现,这里我将向大家展示两种方案.

1.第一种方案:先看效果图,我这里说的分页功能是指SSH框架搭建完全没有问题的情况下做的,由于是第一次写博客,还是不够太熟练,我直接贴代码出来吧,先是我的showlist.jsp显示,然后是action层,service层,dao层的代码

这个jsp页面中的allpages变量是我在action中定义了的

	
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

	<a href="addInput.jsp">新增</a>
	<hr>
	<table border="1">
	<tr>
	<th>编号</th><th>书名</th><th>价格</th><th>数量</th><th>作者</th><th>删除</th><th>修改</th>
	</tr>
	<c:forEach items="${bookList }" var="list">
	<tr>
	<td>${list.id }</td>
	<td>${list.name }</td>
	<td>${list.price }</td>
	<td>${list.bookCount }</td>
	<td>${list.author }</td> 
	<td><a href="book_delete.action?bid=${list.id }">删除</a></td>
	<td><a href="book_load.action?bid=${list.id }">修改</a></td>
	</tr>
	</c:forEach>
	
</table>	
<c:forEach begin="1" end="${allPages }" step="1" var="p">
	  <a href="book_list.action?pageCurrent=${p }">${p }</a>
	</c:forEach>

</body>
</html>



action层

//当前页
	private int pageCurrent;
	//总页数
	private int allPages;
	//总记录数
	private int allCount;
//有些是给set方法,有些是给get方法,这里我就全部给加上set,get方法
//显示图书列表
	public String list(){
		bookList = bookService.list(pageCurrent);
		return "list";
	}
然后跳到service层

实现action中bookService.list(pageCurrent)的方法

public ArrayList<Book> list(int pageCurrent) {
		
		return bookDao.list(pageCurrent);
	}
再到dao层

public ArrayList<Book> list(int pageCurrent) {
		Session session = sessionFactory.getCurrentSession();
		String hql = "from Book";
		ArrayList<Book> arrayList = (ArrayList<Book>) session.createQuery(hql)
		.setFirstResult((pageCurrent-1)*pageSize)
		.setMaxResults(pageSize).list();
		return arrayList;
	}
//再写一个计算总记录数的方法
public int countPage() {
		Session session = sessionFactory.getCurrentSession();
		String hql = "select count(*) from Book";
       allCount = ((Long)session.createQuery(hql).uniqueResult()).intValue();
       allPages = allCount%pageSize==0?allCount/pageSize:(allCount/pageSize)+1;
		return allPages;
	}
pagesize变量是我定义的一个常量,给其值为5,每页显示5条数据.

这是第一种方法.

接下来第二种方式就是因为,我这只是联系代码,只用到了一个action,等到真正用在项目中时还是得改进,接下来让我先在eclipse中把第二种实现我再来述说,那我先来说说思路吧,我们以后可能需要用到n多个action我们总不能可能在每个action对应的service层dao层写同样的代码吧,这样显示代码会过于冗长,所以我们想到可以把分页的数据(像当前页数page,总页数totalPage,每页显示数pagesize,总记录数allrec,封装到一个pageBean中,值得一提的小技巧是,我们可以把显示的每一条书的数据也可以封装到pageBean里面去)

终于弄完了,还是按照老规则,以此上传showlist.jsp,action层 service层dao层的代码,这些代码都是根据我上述所说的基础上改的,有心的读者可以参照阅读

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

	<a href="addInput.jsp">新增</a>
	<hr>
	<table border="1">
	<tr>
	<th>编号</th><th>书名</th><th>价格</th><th>数量</th><th>作者</th><th>删除</th><th>修改</th>
	</tr>
	<%-- <c:forEach items="${bookList }" var="list"> --%>
	<s:iterator var="b" value="pb.list">
	<tr>
	<td><s:property value="#b.id"/></td>
	<td> <s:property value="#b.name"/> </td>
	<td><s:property value="#b.price"/></td>
	<td><s:property value="#b.bookCount"/></td>
	<td><s:property value="#b.author"/></td> 
	<td><a href="book_delete.action?bid=<s:property value="#b.id"/>">删除</a></td>
	<td><a href="book_load.action?bid=<s:property value="#b.id"/>">修改</a></td>
	</tr>
	</s:iterator>
	<%-- </c:forEach> --%>
	
</table>	
<%-- <c:forEach begin="1" end="${allPages }" step="1" var="p">
	  <a href="book_list.action?pageCurrent=${p }">${p }</a>
	</c:forEach> --%>
<span>第<s:property value="pb.page"/>/<s:property value="pb.totalPage"/>页 </span>
<s:iterator begin="1" end="pb.totalPage" step="1" var="i">
<a href="book_list?page=<s:property value="#i"/>"> <s:property value="#i"/></a>
</s:iterator>
<s:if test="pb.page != 1">
<a href="book_list?page=<s:property value="1"/>"> 首页</a>
<a href="book_list?page=<s:property value="pb.page-1"/>"> 上一页</a>
</s:if>
<s:if test="pb.page != pb.totalPage">
<a href="book_list?page=<s:property value="pb.page+1"/>"> 下一页</a>
<a href="book_list?page=<s:property value="pb.totalPage"/>"> 尾页</a>
</s:if>
</body>
</html>

这个页面加了点小功能,希望大家能参照我的运行结果的截图看得懂

action层

private int page = 1;//接受页面传过来的page
	public int getPage() {
		return page;
	}
	//显示图书列表第二种方法
	public String list(){
		PageBean<Book> pb =  bookService.list(page);
		System.out.println("------"+pb.toString());
		ActionContext.getContext().getValueStack().set("pb", pb);
		return "list";
	}
差点忘了我另外写了一个util包,里面一个pageBean类

package com.jh.util;

import java.util.List;

public class PageBean<T> {
  private int page;
  private int totalPage;
  private int pagesize;
  private int allrec;
  private List<T> list;
public int getPage() {
	return page;
}
public void setPage(int page) {
	this.page = page;
}
public int getTotalPage() {
	return totalPage;
}
public void setTotalPage(int totalPage) {
	this.totalPage = totalPage;
}
public int getPagesize() {
	return pagesize;
}
public void setPagesize(int pagesize) {
	this.pagesize = pagesize;
}
public int getAllrec() {
	return allrec;
}
public void setAllrec(int allrec) {
	this.allrec = allrec;
}
public List<T> getList() {
	return list;
}
public void setList(List<T> list) {
	this.list = list;
}
@Override
public String toString() {
	return "PageBean [page=" + page + ", totalPage=" + totalPage + ", pagesize=" + pagesize + ", allrec=" + allrec
			+ ", list=" + list + "]";
}
  
}
把所有和分页相关的数据全部存放到pageBean中,方便多个action调用,通过service层和dao层得到pageBean对象,然后把这个对象存进值栈中,页面用ognl表达式取出

service层

	@Override
	public PageBean<Book> list(int page) {
		int pagesize = 5;
		//设置当前页数
		PageBean<Book> pb = new PageBean<>();
		pb.setPage(page);
		//设置书的总记录数
		int allrec = 0;
		allrec = bookDao.getCount();
		pb.setAllrec(allrec);
		//设置总页数
		int totalPage = 0;
         if(totalPage % allrec ==0){
        	 totalPage = allrec/pagesize;
         }else{
        	 totalPage = (allrec/pagesize)+1;
         }
         pb.setTotalPage(totalPage);
		//设置每页显示记录数
		pb.setPagesize(pagesize);
		//设置每条数据的集合(书名,价格,数量..)
		int begin = (page - 1)*pagesize;
       List<Book> list =   bookDao.listBypage(begin,pagesize);		
		pb.setList(list);
		return pb;
	}
这里需要在dao中写另外两个方法getCount()和listBypage(),相比读者都发现了

dao层

	@Override
	public int getCount() {
     String hql = "select count(*) from Book";
     Session session = sessionFactory.getCurrentSession();
    int allrec = ((Number) session.createQuery(hql).uniqueResult()).intValue();
		return allrec;
	}

	@Override
	public List<Book> listBypage(int begin, int pagesize) {
		String hql = "from Book";
		Session session = sessionFactory.getCurrentSession();
		List<Book> list = session.createQuery(hql)
		.setFirstResult(begin)
		.setMaxResults(pagesize)
		.list();
		return list;
	}
那么大功告成了,经过测试完全可行,运行结果见上传图片.第一次写,不足的地方还请大家多多担待,有问题或者是错误欢迎大家提出.
ps:第一张截图是第一种方式实现,其他的是第二种方式实现的,有人注意到第一页时没有首页和上一页,最后一页没有下一页和尾页,而且页码也在跟着变,虽然很简单,还望原谅我的自娱自乐! 


最后说说我编程过程中遇到的问题:最容易出错的地方就是给pageBean封装数据是时,那个地方千万仔细.











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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值