javaweb编写分页mysql

1.封装PageBean

import java.util.List;

/**
 * 分页的JavaBean
 * @author Administrator
 */
public class PageBean<T> {

    // 当前页
    private int pageCode;

    // 总页数
    // private int totalPage;

    // 总记录数
    private int totalCount;
    // 每页显示的记录条数
    private int pageSize;
    // 每页显示的数据
    private List<T> beanList;

    public int getPageCode() {
        return pageCode;
    }
    public void setPageCode(int pageCode) {
        this.pageCode = pageCode;
    }

    /**
     * 调用getTotalPage() 获取到总页数
     * JavaBean的属性规定:totalPage是JavaBean是属性 ${pageBean.totalPage}
     * @return
     */
    public int getTotalPage() {
        // 计算
        int totalPage = totalCount / pageSize;
        // 说明整除
        if(totalCount % pageSize == 0){
            return totalPage;
        }else{
            return totalPage + 1;
        }
    }

    /*public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }*/

    public int getTotalCount() {
        return totalCount;
    }
    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public List<T> getBeanList() {
        return beanList;
    }
    public void setBeanList(List<T> beanList) {
        this.beanList = beanList;
    }
}

2.Servlet

/**
     * 获取当前页
     *如果用户没有传,默认是第一页,如果传了,就是几
     * @param request
     * @return
     */
    public int getPageCode(HttpServletRequest request){
        String pc = request.getParameter("pc");
        // 判断
        if(pc == null || pc.trim().isEmpty()){
            return 1;
        }
        return Integer.parseInt(pc);
    }
/**
     * 分页查询
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 处理当前页
         * 处理每页显示的记录条数
         */
        // 当前页
        int pageCode = getPageCode(request);
        // 处理每页显示的记录条数
        int pageSize = 4;
        try {
            // 调用业务层,分页查询
            PageBean<Product> page = new ProductService().findByPage(pageCode,pageSize);
            // 存入
            request.setAttribute("page", page);
            // 转发
            request.getRequestDispatcher("/jsp/pages.jsp").forward(request, response);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

3.service

/**
     * 分页查询
     * @param pageCode
     * @param pageSize
     * @return
     * @throws SQLException
     */
    public PageBean<Product> findByPage(int pageCode, int pageSize) throws SQLException {
        return new ProductDao().findByPage(pageCode,pageSize);
    }

4.dao


/**
     * 分页查询
     *
     * @param pageCode
     * @param pageSize
     * @return
     * @throws SQLException
     */
    public PageBean<Product> findByPage(int pageCode, int pageSize) throws SQLException {
        PageBean<Product> page = new PageBean<>();
        // 属性是空的
        page.setPageCode(pageCode);
        page.setPageSize(pageSize);

        QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
        // ScalarHandler 处理聚合函数
        long count = (long) qr.query("select count(*) from product", new ScalarHandler());
        // 设置总记录条数
        page.setTotalCount((int) count);

        // limit a,b a = (当前页-1) * b
        List<Product> beanList = qr.query("select * from product limit ?,?", new BeanListHandler<Product>(Product.class),
                (pageCode - 1) * pageSize, pageSize);

        // 每页显示的数据
        page.setBeanList(beanList);

        return page;
    }

5.utils

public class JdbcUtils {

    // 成员变量,创建了C3P0的连接池(连接池中已经存在连接了...)
    private static final ComboPooledDataSource DATASOURCE = new ComboPooledDataSource();

    /**
     * 返回的是C3P0的连接池
     * @return
     */
    public static DataSource getDataSource(){
        return DATASOURCE;
    }

    /**
     * 获取连接,返回连接
     * @return
     */
    public static Connection getConnection(){
        Connection conn = null;
        try {
            // 从连接池中来获取连接,conn 是增强过的连接
            conn = DATASOURCE.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 释放资源
     * @param stmt
     * @param conn
     */
    public static void release(Statement stmt,Connection conn){
        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null){
            try {
                // 已经变成了归还了...
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 释放资源
     * @param stmt
     * @param conn
     */
    public static void release(ResultSet rs,Statement stmt,Connection conn){
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null){
            try {
                // 把close()给修改了,原来是销毁连接,现在让方法变成归还连接。
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

6.jsp页面

<table border="1" width="100%">
    <tr>
        <th>序号</th>
        <th>图片</th>
        <th>名称</th>
        <th>市场价格</th>
        <th>商城价格</th>
        <th>商品日期</th>
    </tr>

    <c:forEach var="p" items="${ page.beanList }" varStatus="vs">
        <tr align="center">
            <td>${ vs.count }</td>
            <td>
                <img src="${ pageContext.request.contextPath }/${p.pimage}" width="100px" height="100px">
            </td>
            <td>${ p.pname }</td>
            <td>${ p.market_price }</td>
            <td>${ p.shop_price }</td>
            <td>${ p.pdate }</td>
        </tr>
    </c:forEach>

    分页条
    <tr>
        <th colspan="6">
            第${ page.pageCode }页/共${ page.totalPage }页
            <a href="${ pageContext.request.contextPath }/findByPage?pc=1">首页</a>
            <c:if test="${ page.pageCode > 1 }">
                <a href="${ pageContext.request.contextPath }/findByPage?pc=${page.pageCode - 1}">上一页</a>
            </c:if>

                begin和end值是变化的,设置begin和end的值
                逻辑:
                    * 如果总页数<=10页,让begin=1 end=总页数
                    * 如果总页数 > 10页,begin=当前页-5 ,end = 当前页 + 4
                        * 头溢出:如果begin<1,出现了头溢出了,让begin=1 end=10
                        * 尾溢出:如果end > 总页数,让begin=总页数-9 end=总页数

            <c:choose>
                <c:when test="${ page.totalPage <= 10 }">
                    <c:set var="begin" value="1"/>
                    <c:set var="end" value="${ page.totalPage }"/>
                </c:when>
                <c:otherwise>
                    <c:set var="begin" value="${ page.pageCode - 5 }"/>
                    <c:set var="end" value="${ page.pageCode + 4 }"/>
                头溢出的问题
                    <c:if test="${ begin < 1 }">
                        <c:set var="begin" value="1"/>
                        <c:set var="end" value="10"/>
                    </c:if>

                    <c:if test="${ end > page.totalPage }">
                        <c:set var="begin" value="${ page.totalPage - 9 }"/>
                        <c:set var="end" value="${ page.totalPage }"/>
                    </c:if>
                </c:otherwise>
            </c:choose>

            <c:forEach var="i" begin="${ begin }" end="${ end }">
                <a href="${ pageContext.request.contextPath }/findByPage?pc=${i}">[${ i }]</a>
            </c:forEach>

            <c:if test="${ page.pageCode < page.totalPage }">
                <a href="${ pageContext.request.contextPath }/findByPage?pc=${page.pageCode + 1}">下一页</a>
            </c:if>
            <a href="${ pageContext.request.contextPath }/findByPage?pc=${page.totalPage}">尾页</a>
        </th>
    </tr>
</table>

原文地址:http://blog.51cto.com/13579086/2074334

时间: 2024-11-10 14:08:36

javaweb编写分页mysql的相关文章

pl/sql之编写分页过程

--开发一个包 --建立一个包,在该包中,我定义类型test_cursor,是个游标. 如下: Sql代码 create or replace package testpackage as TYPE test_cursor is ref cursor; end testpackage; --开始编写分页过程 create or replace procedure fenye (table_name in varchar2, page_size in number,        --每页显示的记

javaweb 实现分页

分页原理 什么是分页技术 分页,是一种将所有数据分段展示给用户的技术.用户每次看到的不是全部数据,而是其中的一部分,如果在其中没有找到自习自己想要的内容,用户可以通过制定页码或是翻页的方式转换可见内容,直到找到自己想要的内容为止.其实这和我们阅读书籍很类似 分页的意义 分页确实有效,但它一定会加大系统的复杂度,但可否不分页呢?如果数据量少的话当然可以.但是对于企业信息系统来说数据量不会限制在一个小范围内.如果不顾一切的Select * from某个表,再将返回的数据一古脑的扔给客户,即使客户能够

sqlserver分页;mysql分页;orcale分页 的sql 查询语句

1 一,sqlserver分页: 2 SELECT TOP (每页显示的数据条数) *FROM 表名 WHERE (ID NOT IN (SELECT TOP ((当前页码 -1)*每页显示的数据条数 -1) ID FROM 表名 AS 表名1_1 ORDER BY ID)) ORDER BY ID; 3 二:mysql分页 4 select * from 表名 where id limit((当前页码 -1)*每页显示的数据条数,当前页码 * 每页显示的数据条数); 5 三:orcale分页

WinForm下编写分页控件,实现DataGridView的分页效果

 前几天做C/S项目的时候用到了分页查询,所以就想去网上找一些封装好的分页控件,类似BS项目中的那种.但是找了好几个都不是特别的好,没有自己想要的.而且WinForm 里面的DataGridView也不像WebForm里面的GridView那样有自带的分页功能.没办法还是自己动手封装一个吧,以后复用也方便. 从网上找了几个demo做了一下,实现挺简单的. 用到的方法就是编写一个用户控件,下面说明如何实现: 一,先画界面 新建一个用户控件,然后拖拽几个标签,文本框和按钮,排列好.如下图所示:

JSP分页(MySql+c3p0+dbutils)

为什么要对数据进行分页?当数据较多时,页面就会变的很庞大,不仅会影响到用户的使用,而且还有加重服务器的负担.下面简单的实现了数据的分页. 第一步:导入相应的jar包 需要导入c3p0,dbutils,mysql驱动等jar包. 第二步:创建数据库和表, 配置c3p0, 创建工具类,User类 创建数据库,并准备测试数据(可以自行生成) create database contacts; use contacts; create table users( id varchar(32), usern

Javaweb 实现分页功能

package cn.zr.testpage.entity; public class User { private String name; private int age; private String hobby; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public

Mybatis的分页[MySql数据库]

在Mybatis的应用中,Mybatis只提供了内存分页,并分页时需要把表单数据全部加载到内存中,实际Mybatis更希望开发者根据实际需要进行物理分页,当数据库为MySql数据库是,只要在SQL中实现分页即可: select * from user where id=#{id} limit #{offset},#{limit} offset表示页码,limit表示每页记录数

linux下集成脚启动本编写——Rabbitmq mysql redis apache

集成启动服务脚本设计 ... 12 总体思路需求 根据计算机系统启动顺序,启动项的优先级设定 1):rabbitMQ    2):mysql     3):redis      4):tomcat 2:对磁盘空间检测结果是否达到一定容量,达到后,就不启动相应程序(如:mysql) if 执行启动脚本过程中,依照启动项依赖强度,决定后续依赖是否启动(例:mysql不能启动,后续tomcat启动脚本就不执行) if 集成脚本命名 ramr (rabbit apache mysql   redis)

MVC 简单的AJAX异步分页+MYSQL

留资料,以后学习用 1.后台 public ActionResult textPage() { return View(); } [HttpPost] public ActionResult textPage(FormCollection collection) { //实例化对象 BLL.pc_dialog bll_pcdialog = new BLL.pc_dialog(); Model.pc_dialog model_pcdialog = new Model.pc_dialog(); //