1、创建page类
@Repository
public class Page<T> {
public static final Integer PAGE_SIZE = 4;
private Integer pageNo;//当前页码
private Integer pageTotal;//总页码
private Integer showTotal = PAGE_SIZE;//当前页展示数量
private Integer pageTotalCount;//总记录数
private List<T> item;//当前页数据
private String url;
@Override
public String toString() {
return "Page{" +
"pageNo=" + pageNo +
", pageTotal=" + pageTotal +
", showTotal=" + showTotal +
", pageTotalCount=" + pageTotalCount +
", item=" + item +
", url='" + url + '\'' +
'}';
}
public static Integer getPageSize() {
return PAGE_SIZE;
}
public Integer getPageNo() {
return pageNo;
}
public void setPageNo(Integer pageNo) {
if (pageNo < 1){
pageNo = 1;
}
if (pageNo > pageTotal){
pageNo = pageTotal;
}
this.pageNo = pageNo;
}
public Integer getPageTotal() {
return pageTotal;
}
public void setPageTotal(Integer pageTotal) {
this.pageTotal = pageTotal;
}
public Integer getShowTotal() {
return showTotal;
}
public void setShowTotal(Integer showTotal) {
this.showTotal = showTotal;
}
public Integer getPageTotalCount() {
return pageTotalCount;
}
public void setPageTotalCount(Integer pageTotalCount) {
this.pageTotalCount = pageTotalCount;
}
public List<T> getItem() {
return item;
}
public void setItem(List<T> item) {
this.item = item;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Page() {
}
public Page(Integer pageNo, Integer pageTotal, Integer showTotal, Integer pageTotalCount, List<T> item, String url) {
this.pageNo = pageNo;
this.pageTotal = pageTotal;
this.showTotal = showTotal;
this.pageTotalCount = pageTotalCount;
this.item = item;
this.url = url;
}
}
2、dao层
public interface BookDao {
//查询商品项
List<Book> queryForPageItems(@Param(value = "begin") int begin, @Param(value = "pageSize") int pageSize);
Integer queryForPageTotalCountByPrice(@Param(value = "min")int min,@Param(value = "max")int max);//价格区间查询
List<Book> queryForPageItemsByPrice(@Param(value = "begin") int begin,@Param(value = "pageSize") int pageSize,
@Param(value = "min")int min, @Param(value = "max")int max);
}
3、service层
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
@Autowired
private Page<Book> page;
@Override
public Page<Book> page(int pageNo, int pageSize) {
page.setShowTotal(pageSize);// 设置每页显示的数量
Integer pageTotalCount = bookDao.queryForPageTotalCount();// 求总记录数
page.setPageTotalCount(pageTotalCount);// 设置总记录数
Integer pageTotal = pageTotalCount / pageSize;// 求总页码
if (pageTotalCount % pageSize > 0){
pageTotal += 1;
}
page.setPageTotal(pageTotal);//设置总页码
page.setPageNo(pageNo);//设置当前页码
// 求当前页数据的开始索引
Integer begin = (page.getPageNo() - 1) * pageSize;
// 求当前页数据
List<Book> items = bookDao.queryForPageItems(begin, pageSize);
page.setItem(items);//设置当前页数据
return page;
}
4、controller层
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping("/page.do")
public String page(@RequestParam(defaultValue = "1") Integer pageNo,
@RequestParam(defaultValue = "4") Integer pageSize,
Model model){
model.addAttribute("pageNo",pageNo);
Page<Book> page = bookService.page(pageNo,pageSize);
page.setUrl("book/page.do");
model.addAttribute("page",page);
return "forward:/pages/manager/book_manager.jsp";
}
}
5、jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 分页条的开始--%>
<div id="page_nav">
<%-- 首页大于一才显示 --%>
<c:if test="${page.pageNo>1}">
<a href="${page.url}?pageNo=1">首页</a>
<a href="${page.url}?pageNo=${page.pageNo-1}">上一页</a>
</c:if>
<%-- 页码输出开始--%>
<c:choose>
<%-- 情况1:如果总页码小于等于5的情况,页码范围是:1 —— 总页码--%>
<c:when test="${page.pageTotal <= 5}">
<c:forEach begin="1" end="${page.pageTotal}" var="i">
<c:if test="${i == page.pageNo}">
【${i}】
</c:if>
<c:if test="${i != page.pageNo}">
<a href="${page.url}?pageNo=${i}">${i}</a>
</c:if>
</c:forEach>
</c:when>
<%-- 情况2:如果总页码大于5的情况。--%>
<c:when test="${page.pageTotal > 5}">
<c:choose>
<%-- 小情况1:当前页码前面3个:1.2.3的情况,页码范围是:1-5 --%>
<c:when test="${page.pageNo <= 3}">
<c:forEach begin="1" end="5" var="i">
<c:if test="${i == requestScope.page.pageNo}">
【${i}】
</c:if>
<c:if test="${i != page.pageNo}">
<a href="${page.url}&pageNo=${i}">${i}</a>
</c:if>
</c:forEach>
</c:when>
<%-- 小情况2:当前页码后面3个:7.8.9的情况,页码范围是:总页码-4 - 总页码 --%>
<c:when test="${requestScope.page.pageNo >= requestScope.page.pageTotal-3}">
<c:forEach begin="${requestScope.page.pageTotal-4}" end="${requestScope.page.pageTotal}" var="i">
<c:if test="${i == requestScope.page.pageNo}">
【${i}】
</c:if>
<c:if test="${i != requestScope.page.pageNo}">
<a href="${page.url}?pageNo=${i}">${i}</a>
</c:if>
</c:forEach>
</c:when>
<%-- 小情况3:3..4.5.6页码范围是:当前页码-2 - 当前页码加2--%>
<c:otherwise>
<c:forEach begin="${requestScope.page.pageNo-2}" end="${requestScope.page.pageNo+2}" var="i">
<c:if test="${i == requestScope.page.pageNo}">
【${i}】
</c:if>
<c:if test="${i != requestScope.page.pageNo}">
<a href="${page.url}?pageNo=${i}">${i}</a>
</c:if>
</c:forEach>
</c:otherwise>
</c:choose>
</c:when>
</c:choose>
<%-- 页码输出结束--%>
<%-- 如果已经是最后一页,则不显示下一页,末页--%>
<c:if test="${page.pageNo < page.pageTotal}">
<a href="${page.url}?pageNo=${page.pageNo+1}">下一页</a>
<a href="${page.url}?pageNo=${page.pageTotal}">末页</a>
</c:if>
共${page.pageTotal}页,${page.pageTotalCount}条记录
到第<input value="${page.pageNo}" name="pn" id="pn_input"/>页
<input id="searchPageBtn" type="button" value="确定">
<script type="text/javascript">
$(function () {
//调到指定页码
$("#searchPageBtn").click(function () {
var pageNo = $("#pn_input").val();
var pageTotal = ${requestScope.page.pageTotal};
if (pageNo < 1 || pageNo > pageTotal){
alert("输入非法,请重新输入!");
}else {
location.href = "${pageScope.basePath}${page.url}?pageNo=" + pageNo;
}
//JavaScript语言中提供了一个Location地址栏对象
//它有一个属性叫href,它可以获取浏览器地址栏中的地址
//href属性可读,可写
});
});
</script>
</div>
<%-- 分页条的结束--%>