java试练之路–分页实现
此次实现的是java分页,采用的是SpringMVC架构,完成一个显示特定用户的分页查询,伙伴们如果弄明白了也可以改造。话不多说,直接上代码:
1、第一步,最重要的写一个分页的实体类PageBean;(代码都有注释,结合代码看,这里就不赘述了)
package com.example.bean;
import java.util.List;
public class PageBean {
private List list; //要返回的某一页的记录列表
private int allRow; //总记录数
private int totalPage; //总页数
private int currentPage; //当前页
private int pageSize; //每页记录数
private boolean isFirstPage; //是否为第一页
private boolean isLastPage; //是否为最后一页
private boolean hasPreviousPage; //是否有前一页
private boolean hasNextPage; //是否有下一页
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getAllRow() {
return allRow;
}
public void setAllRow(int allRow) {
this.allRow = allRow;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
/**
* 初始化分页信息
*/
public void init() {
this.isFirstPage = isFirstPage();
this.isLastPage = isLastPage();
this.hasPreviousPage = isHasPreviousPage();
this.hasNextPage = isHasNextPage();
}
/**
* 以下判断页的信息,只需getter方法(is方法)即可
*/
public boolean isFirstPage() {
return currentPage == 1; //如果当前页是第1页
}
public boolean isLastPage() {
return currentPage == totalPage; //如果当前页是最后一页
}
public boolean isHasPreviousPage() {
return currentPage != 1; //只要当前页不是第1页
}
public boolean isHasNextPage() {
return currentPage != totalPage; //只要当前页不是最后1页
}
/**
* 计算总页数,静态方法,供外部直接通过类名调用
* @param pageSize 每页记录数
* @param allRow 总记录数
* @return 总页数
*/
public static int counTotalPage(final int pageSize, final int allRow) {
int totalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize+1;
return totalPage;
}
/**
* 计算当前页开始记录
* @param pageSize 每页记录数
* @param currentPage 当前第几页
* @return 当前页开始记录号
*/
public static int countOffset(final int pageSize, final int currentPage){
int curpage = (currentPage == 0 ? 1 : currentPage);
final int offset = pageSize * (curpage - 1);
return offset;
}
/**
* 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替
* @param page 传入的参数(可能为空,即0,则返回1)
* @return 当前页
*/
public static int countCurrentPage(int page) {
final int curPage = (page == 0 ? 1:page);
return curPage;
}
}
2、其次需要一个实体类User,这个肯定就不用多说了,但是因为该demo是基于Hibernate的,需要注意一下。
package com.example.model;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/***
* 用户表
* @author victory
*/
@Table(name = "t_user")
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Integer id;
/** 用户名 **/
String username;
/** 密码 **/
String password;
/** 手机号码 **/
String telPhone;
/** 创建时间 **/
Date createDate;
/** 用户状态 **/
Integer isDelete;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTelPhone() {
return telPhone;
}
public void setTelPhone(String telPhone) {
this.telPhone = telPhone;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Integer getIsDelete() {
return isDelete;
}
public void setIsDelete(Integer isDelete) {
this.isDelete = isDelete;
}
public User(){
}
public User(Integer id, String username, String password,String cardId,
String telPhone, Date createDate, Integer isDelete) {
super();
this.id = id;
this.username = username;
this.password = password;
this.telPhone = telPhone;
this.createDate = createDate;
this.isDelete = isDelete;
}
}
3、第三步,写基本的dao层接口BaseDao(第一个是不带指定条件的,可以自己试着写一下)
package com.example.dao;
import java.util.List;
public interface BaseDao {
/***
* 分页查询 return list
* hql 查询的条件
* offset 开始记录
* length 一次查询几条记录
*/
public List findPage(String hql, int offset, int length);
/***
* 分页查询 带占位符参数
*
* @param hql
* @param page
* @param length
* @param args
* @return
*/
public List findPage(String hql, int offset, int length, Object[] args);
}
4、现在写个接口的实现类BaseDaoImpl()
package com.example.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public class BaseDaoImpl implements BaseDao {
/**
* 分页查询
* @param hql 查询的条件
* @param offset 开始记录
* @param size 一次查询几条记录
* @return
*/
public List findPage(final String hql, final int offset, final int length) {
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setMaxResults(length);
query.setFirstResult(offset);
List<Object> list = query.list();
return list;
}
/**
* 分页查询
* @param hql 查询的条件
* @param offset 开始记录
* @param length 一次查询几条记录
* @return args 占位符参数
*/
public List findPage(final String hql,final int offset,final int length,final Object[] args) {
Query query = sessionFactory.getCurrentSession().createQuery(hql);
for (int i = 0; i < args.length; i++) {
query.setParameter(i, args[i]);
}
query.setMaxResults(length);
query.setFirstResult(offset);
List<Object> list = query.list();
return list;
}
}
5、现在写业务层的一个类,就不写接口了,直接写个实现类 AccountService
package org.ysw.service;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.bean.PageBean;
import com.example.dao.BaseDao;
import com.example.model.User;
/****
* 用户Service
*
* @author victory
*
*/
@Service
public class AccountService {
/**
* 用户审核通过 - 分页查询
* @param curPage 当前第几页
* @param pageSize 每页大小
* @return 封闭了分页信息(包括记录集list)的Bean
* page 传入的参数
*/
public PageBean SearchUser1(int pageSize, int curPage, int isDelete) {
// 查询语句
final String hqlStr = "FROM User WHERE isDelete = ?";
// 总记录数 dao.findAllByHQL(hqlStr, new Object[] {isDelete}) -> 获取的是条件集合
int allRow = dao.findAllByHQL(hqlStr, new Object[] {isDelete}).size();
// 总页数
int totalPage = PageBean.counTotalPage(pageSize, allRow);
// 当前页开始记录
final int offset = PageBean.countOffset(pageSize, curPage);
// 每页记录数 (每页有多少条记录)
final int length = pageSize;
final int currentPage = PageBean.countCurrentPage(curPage);
// "一页"的记录
List<User> list = dao.findPage(hqlStr, offset, length, new Object[] { isDelete});
// 将分页信息保存到PageBean当中
PageBean pageBean = new PageBean();
pageBean.setPageSize(pageSize);
pageBean.setCurrentPage(currentPage);
pageBean.setAllRow(allRow);
pageBean.setTotalPage(totalPage);
pageBean.setList(list);
pageBean.init();
return pageBean;
}
// 公共的数据库访问接口
// 这里省略BaseDao dao的编写
@Autowired
private BaseDao dao;
}
6、现在做逻辑控制层-AccountsController类
package com.example.controller;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.example.bean.PageBean;
import com.example.model.User;
import com.example.service.AccountService;
@Controller
public class AccountsController {
@RequestMapping(value = "getUser1", method = RequestMethod.GET)
public String getUserForPage1(HttpServletRequest request) {
System.out.println("AccountsController ---> getUserForPage1");
//分页的pageBean,参数pageSize表示每页显示记录数,curPage为当前页
System.out.println("curPage --->" + request.getParameter("curPage"));
int curPage = Integer.parseInt(request.getParameter("curPage"));
System.out.println("curPage --->" + page);
this.pageBean = accountService.SearchUser1(2, curPage, 1);
HttpSession session = request.getSession();
session.setAttribute("pageBean", pageBean);
return "userForPage1";
}
// 公司
@Autowired
private AccountService accountService;
}
7、最后做数据的回显userForPage1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="com.exampel.bean.*"%>
<%@ page import="java.util.*"%>
<jsp:useBean id="pageBean" scope="session" class="com.example.bean.PageBean" />
<!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">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="description" content="">
<meta name="author" content="ThemeBucket">
<link rel="shortcut icon" href="#" type="image/png">
<title>待审核</title>
<link href="css/style.css" rel="stylesheet">
<link href="css/style-responsive.css" rel="stylesheet">
<link rel="stylesheet" href="css/sence.css">
<script type="text/javascript">
function Jumping() {
document.PageForm.submit();
return;
}
function gotoPage(curPage) {
document.PageForm.curPage.value = curPage;
document.PageForm.submit();
return;
}
</script>
<style type="text/css">
.autocut {
width: 120px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
-icab-text-overflow: ellipsis;
-khtml-text-overflow: ellipsis;
-moz-text-overflow: ellipsis;
-webkit-text-overflow: ellipsis;
}
</style>
</head>
<body class="sticky-header">
<h1>用户管理menu</h1><br/>
<table width="680" border="1">
<tr>
<th width="110">用户编号</th>
<th width="200">用户名称</th>
<th width="110">用户密码</th>
<th width="110">可用状态</th>
<th width="110">注册时间</th>
<th width="110">操作</th>
</tr>
<c:forEach items="${sessionScope.pageBean.list }" var="user">
<tr>
<td>${user.id }</td>
<td>${user.username }</td>
<td>${user.password }</td>
<td>${user.isDelete }</td>
<td>${user.createDate }</td>
<td width="800" align="center"><a href="searchUserById?id=${user.id }">更新</a>
| <a href="listP1">listP1</a>
</td>
</tr>
</c:forEach>
</table>
<%
if (pageBean.getTotalPage() != 0) {
%>
每页<%=pageBean.getPageSize()%>行 共<%=pageBean.getAllRow()%>行 第<%=pageBean.getCurrentPage()%>页
共<%=pageBean.getTotalPage()%>页<BR>
<%
if (pageBean.getCurrentPage() == 1) {
out.print(" 首页 上一页");
} else {
%>
<a href="getUser1?curPage=1">首页</a>
<a href="getUser1?curPage=${pageBean.currentPage-1}">上一页 </a>
<%
}
%>
<%
if (pageBean.getCurrentPage() == pageBean.getTotalPage()) {
out.print("下一页 尾页");
} else {
%>
<a href="getUser1?curPage=${pageBean.currentPage+1}">下一页 </a>
<a href="getUser1?curPage=${pageBean.totalPage}">末页</a>
<%
}
%>
<form name="PageForm" action="getUser1" method="get">
转到第<SELECT name="curPage" onchange="Jumping()">
<%
for (int i = 1; i <= pageBean.getTotalPage(); i++) {
if (i == pageBean.getCurrentPage()) {
%>
<OPTION selected value="<%=i%>"><%=i%>
</OPTION>
<%
} else {
%>
<OPTION value="<%=i%>"><%=i%>
</OPTION>
<%
}
}
%>
</SELECT> 页
<%
}
%>
</form>
</body>
</html>
到这里基本就结束了。基本的分页实现也可以实现,需要的发邮箱就可以了。
参考链接
Hibernate+Spring+Struts2整合开发分页显示,感兴趣的同学可以看一下。