java试练之路--分页实现

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>
                &nbsp;|&nbsp;<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整合开发分页显示,感兴趣的同学可以看一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值