zoukankan      html  css  js  c++  java
  • 分页技术的实现

    关于分页的逻辑如图所示


     实现步骤如下

    1、相关环境准备

    a)         引入jar文件及引入配置文件

                                           i.              数据库驱动包

                                         ii.              C3P0连接池jar文件 及 配置文件

                                          iii.              DbUtis组件:    QueryRunner qr = new QueryRuner(dataSouce);

    b)        公用类: C3P0Utils.java

    package gqx.shoppingcar.util;
    
    import javax.activation.DataSource;
    
    import org.apache.commons.dbutils.QueryRunner;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class C3P0Util {
    	//1、初始化C3P0连接池
    	private static ComboPooledDataSource dataSource;
    	static{
    		dataSource=new ComboPooledDataSource();
    	}
    	
    	public static QueryRunner getQueryRunner(){
    		//创建queryRunner对象
    		//创建QueryRunner对象的时候,如果传入了数据源对象
    		//那么在使用QueryRunner对象的的时候,就不需要传入连接对象了
    		//会自动从数据源中获取连接(所以不用我们自己来手动关闭连接)
    		return new QueryRunner(dataSource);
    	}
    	
    	
    }
    

      对应的的配置文件

    <c3p0-config>
      <default-config>
        <property name="jdbcUrl">jdbc:sqlserver://localhost:1433;DataBaseName=Test</property> 
        <property name="driverClass">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
        <property name="user">sa</property>
        <property name="password">123456</property>
        <property name="maxIdleTime">3000</property>
        <property name="maxPoolSize">6</property>
        <property name="initialPoolSize">3</property>
      </default-config>
    
    
      <named-config name="mysqlConfig">
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_demo
    		</property>
    		<property name="driverClass">com.mysql.jdbc.Driver</property>
    		<property name="user">root</property>
    		<property name="password">root</property>
    		<property name="initialPoolSize">3</property>
    		<property name="maxPoolSize">6</property>
    		<property name="maxIdleTime">1000</property>
       </named-config>
    </c3p0-config>
    

    2、先设计:PageBean.java

    package gqx.shoppingcar.entity;
    
    import java.util.List;
    
    public class PageBean<T> {
    	private int  currentPage=1;	//当前页,默认显示第一页
    	private int pageCount=4;		//每页显示的行数
    	private int totalCount;			//总记录数
    	private int totalPage;				//总页数=总记录数
    	private List<T> pageDataList;		//分页查到的数据
    	
    	//返回总页数
    	public int getTotalPage() {
    		if (totalCount%pageCount==0) {
    			totalPage=totalCount/pageCount;
    		}else {
    			totalPage=totalCount/pageCount+1;
    		}
    		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 getPageCount() {
    		return pageCount;
    	}
    	public void setPageCount(int pageCount) {
    		this.pageCount = pageCount;
    	}
    	public int getTotalCount() {
    		return totalCount;
    	}
    	public void setTotalCount(int totalCount) {
    		this.totalCount = totalCount;
    	}
    	public List<T> getPageDataList() {
    		return pageDataList;
    	}
    	public void setPageDataList(List<T> pageDataList) {
    		this.pageDataList = pageDataList;
    	}
    
    	@Override
    	public String toString() {
    		return "PageBean [currentPage=" + currentPage + ", pageCount="
    				+ pageCount + ", totalCount=" + totalCount + ", totalPage="
    				+ totalPage + ", pageDataList=" + pageDataList + "]";
    	}
    	
    
    
    }
    

    显示产品的javaBean

    package gqx.shoppingcar.entity;
    
    public class Product {
    	private int ID;
    	private String name;
    	private float price;
    	private int number;
    	private String message;
    	public int getID() {
    		return ID;
    	}
    	public void setID(int iD) {
    		ID = iD;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public float getPrice() {
    		return price;
    	}
    	public void setPrice(float price) {
    		this.price = price;
    	}
    	public int getNumber() {
    		return number;
    	}
    	public void setNumber(int number) {
    		this.number = number;
    	}
    	public String getMessage() {
    		return message;
    	}
    	public void setMessage(String message) {
    		this.message = message;
    	}
    	public Product(int iD, String name, float price, int number, String message) {
    		super();
    		ID = iD;
    		this.name = name;
    		this.price = price;
    		this.number = number;
    		this.message = message;
    	}
    	public Product() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    	@Override
    	public String toString() {
    		return "Product [ID=" + ID + ", name=" + name + ", price=" + price
    				+ ", number=" + number + ", message=" + message + "]";
    	}
    	
    }
    

    3、Dao接口设计/实现:

    接口:

    package gqx.shoppingcar.dao;
    
    import gqx.shoppingcar.entity.PageBean;
    import gqx.shoppingcar.entity.Product;
    
    public interface PageDao {
    	
    	/***页数处理***/
    	//分页查询数据
    	public void getAllPage(PageBean<Product> pbBean);
    	//查询总记录数
    	public int getTotalCount();
    }
    

    实现

    package gqx.shoppingcar.dao.impl;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    import org.apache.commons.dbutils.handlers.ScalarHandler;
    
    import gqx.shoppingcar.dao.PageDao;
    import gqx.shoppingcar.entity.PageBean;
    import gqx.shoppingcar.entity.Product;
    import gqx.shoppingcar.util.C3P0Util;
    import gqx.shoppingcar.util.JDBCUtil;
    
    public class PageOperate implements PageDao {
    
    	@Override
    	public void getAllPage(PageBean pbBean) {
    		//1、获取当前页数
    		int currentPage=pbBean.getCurrentPage();
    		
    			//查询返回的行数
    		int count=pbBean.getPageCount();
    
    		
    		//2、查询总记录数,设计到pb对象中
    		int totalCount=this.getTotalCount();
    		pbBean.setTotalCount(totalCount);
    	
    		//3、分页查询数据;当查询到的数据放到pb对象中
    		String sql="SELECT TOP "+count+"  *  FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber, * FROM product ) A WHERE RowNumber > "+count+"*("+currentPage+"-1)";
    		//得到QueryRunner对象
    		QueryRunner qr=C3P0Util.getQueryRunner();
    		//根据当前页面,查询当前数据
    		try {
    			List<Product> pageData=qr.query(sql, new BeanListHandler<Product>(Product.class));
    			//设置到pageBean中
    			pbBean.setPageDataList(pageData);
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		/*Connection connection=JDBCUtil.getConnection();
    		PreparedStatement statement=null;
    		ResultSet result=null;
    		List<Product> list=new ArrayList<Product>();
    		try {
    			statement=connection.prepareStatement(sql);
    		
    			result=statement.executeQuery();
    			while(result.next()){
    				Product product =new Product();
    				product.setID(result.getInt("ID"));
    				product.setName(result.getString("name"));
    				product.setPrice(result.getFloat("price"));
    				product.setNumber(result.getInt("number"));
    				product.setMessage(result.getString("message"));
    				list.add(product);	
    			}
    			pbBean.setPageDataList(list);
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}*/
    	}
    
    	@Override
    	public int getTotalCount() {
    		String sql="select count(*) from product";
    		try {
    			QueryRunner qr=C3P0Util.getQueryRunner();
    			int count=qr.query(sql, new ScalarHandler<Integer>());
    			return count;
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			throw new RuntimeException();
    		}
    	
    	}
    
    }
    

    4、Service/servlet的完成

    接口及对应的实现

    //分页查询数据(接口中的抽象方法)
    		public void getAll(PageBean<Product> pBean);
    		public int getTotalCount();
    
    
    /*****分页处理(接口的实现)****/
    	PageOperate pageOperate=new PageOperate();
    	@Override
    	public void getAll(PageBean<Product> pBean) {
    		// TODO Auto-generated method stub
    		try {
    			pageOperate.getAllPage(pBean);
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	@Override
    	public int getTotalCount() {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    

    对应的servlet

    package gqx.shoppingcar.servlet;
    
    import gqx.shoppingcar.entity.PageBean;
    import gqx.shoppingcar.entity.Product;
    import gqx.shoppingcar.service.ProductService;
    import gqx.shoppingcar.service.impl.SerOperate;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.List;
    
    import javax.enterprise.context.spi.Context;
    import javax.jms.Session;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class IndexServlet extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		
    		HttpSession session=request.getSession();
    		//判断是否是注册进来的
    		Object object=request.getAttribute("status");
    		if (object!=null) {
    			request.getRequestDispatcher("success.jsp").forward(request, response);
    			return;
    		}
    		ProductService operate=new SerOperate();
    		String name=request.getParameter("username");
    		if (name!=null) {
    			name=new String(name.getBytes("iso-8859-1"),"utf-8");
    			String password=request.getParameter("password");
    			
    			int result=operate.test(name, password);
    			
    			if (result>0) {
    				
    				List<Product> list=operate.allPro(result);
    				session.setAttribute("userproducts", list);
    				session.setAttribute("name", name);
    				session.setAttribute("id", result);
    			}
    		}
    		
    		String currPage = request.getParameter("currentPage");
    		System.out.println(currPage+"kkk");
    		if (currPage == null || "".equals(currPage.trim())){
    			currPage = "1";  	// 第一次访问,设置当前页为1;
    		}
    		int currentPage = Integer.parseInt(currPage);
    		//2. 创建PageBean对象,设置当前页参数; 传入service方法参数
    		PageBean<Product> pageBean = new PageBean<Product>();
    		System.out.println(currentPage);
    		System.out.println(pageBean.getTotalPage()+"pageBean.getTotalPage()");
    		if(currentPage<1){
    		pageBean.setCurrentPage(pageBean.getTotalPage());
    		}else {
    			pageBean.setCurrentPage(currentPage);
    		}
    		
    		operate.getAll(pageBean);
    
    	
    		List<Product> list=pageBean.getPageDataList();
    		
    		session.setAttribute("pageBean", pageBean);
    		response.sendRedirect(request.getContextPath()+"/index.jsp");
    	}
    		
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doGet(request, response);
    	}
    
    }
    

    5、jsp页面

    <%@page import="java.text.SimpleDateFormat"%>
    <%@page import="gqx.shoppingcar.entity.Product,gqx.shoppingcar.entity.PageBean"%>
    <%@ page language="java" import="java.util.*,gqx.shoppingcar.service.impl.SerOperate" pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <% 
    	SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String time =format.format(new Date());
        pageContext.setAttribute("time", time);
     %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <%	SerOperate operate=new SerOperate();
    	List<Product> list=operate.Shop(); 
    	pageContext.setAttribute("allproducts", list);
    %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        <meta charset="utf-8">
    	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    	<title>欢迎来到网上商城</title>
      </head>
      <style>
      	td{
      		text-align: center;
      	}
      </style>
      <body>
        <center><h2>网上商城</h2>
        <p>今天是:${time}</p>
        <h4>欢迎您的到来
        	<c:choose>
        	<c:when test="${!empty sessionScope.name}">:${sessionScope.name },要不去
        	<strong><a href="${pageContext.request.contextPath }/UserServlet?id=${sessionScope.id}">我的购物车</a></strong>瞧一瞧
        	    <a href="${pageContext.request.contextPath }/login.html">退出</a>
        	</c:when>
        	<c:otherwise>:亲,您还未登入,请先去<a href="${pageContext.request.contextPath }/login.html">登入</a></c:otherwise>
        	</c:choose>
        	</h4>
        
        <hr>
    	<table border="1">
    		<caption>商品列表</caption>
    		<thead>
    			<tr>
    				<th>商品编号</th>
    				<th>商品名称</th>
    				<th>商品价格</th>
    				<th>商品数量</th>
    				<th style="500px">商品信息</th>
    				<th>操作</th>
    			</tr>
    		</thead>
    		<c:if test="${empty sessionScope.pageBean}">
    				<%	
    					PageBean<Product> pageBean = new PageBean<Product>();
    					pageBean.setCurrentPage(1);
    					operate.getAll(pageBean);
    					out.print(pageBean.getTotalPage());
    					session.setAttribute("pageBean",pageBean);
    					 %>	
    		</c:if>
    		
    		<tbody>
    		  <c:choose>
      			<c:when test="${not empty sessionScope.pageBean.pageDataList}">
    				<c:forEach items="${sessionScope.pageBean.pageDataList}" var="product" varStatus="varStar">
    				<tr>
    			
    					<td>${product.ID }</td>
    					<td>${product.name }</td>
    					<td>${product.price }</td>
    					<td>${product.number }</td>
    					<td style="500px">${product.message }</td>
    					<td>
    						<c:if test="${!empty sessionScope.name}">
    							<a href="${pageContext.request.contextPath }/BuyServlet?pid=${product.ID }" onclick="tell()">购买</a>
    						</c:if>
    						<c:if test="${empty sessionScope.name}">
    							<a href="javascript:remind()">购买</a>
    						</c:if>
    					</td>
    				</tr>
    				<tr>	
      			   </tr>
    		 	</c:forEach>
    		 </c:when>
    		 <c:otherwise>
      				<tr>
      					<td colspan="3">对不起,没有你要找的数据</td>
      				</tr>
      			</c:otherwise>
      		</c:choose>
      		<tr>
      		<td colspan="6" align="center">
    				
      				当前${sessionScope.pageBean.currentPage }/${sessionScope.pageBean.totalPage }页       
      				
      				<a href="${pageContext.request.contextPath }/IndexServlet?currentPage=1">首页</a>
      				<a href="${pageContext.request.contextPath }/IndexServlet?currentPage=<c:choose><c:when test="${sessionScope.pageBean.currentPage==1}">${sessionScope.pageBean.totalPage}</c:when><c:otherwise>${sessionScope.pageBean.currentPage-1}</c:otherwise></c:choose>">上一页 </a>
      				<a href="${pageContext.request.contextPath }/IndexServlet?currentPage=<c:choose><c:when test="${sessionScope.pageBean.currentPage==sessionScope.pageBean.totalPage}">1</c:when><c:otherwise>${sessionScope.pageBean.currentPage+1}</c:otherwise></c:choose>">下一页 </a>
      				<a href="${pageContext.request.contextPath }/IndexServlet?currentPage=${sessionScope.pageBean.totalPage}">末页</a>
      			</td>
      		</tr>
    		</tbody>
    		
    	</table>
    	</center>
    	<script type="text/javascript">
    			function remind(){
    				alert("亲,你还没有登入");
    			}
    			function tell(){
    				alert("哈哈,已成功加入了购物车啦。")
    			}
    	</script>
      </body>
    </html>
    

      

      

    实现的效果如图

  • 相关阅读:
    【Linux】Linux服务器(centos7)安装配置 redis
    【java】使用 starter 的方式在 SpringBoot 中整合 Shiro
    【Docker】使用 Docker 基于centos7 构建 java 环境容器
    c#经典三层框架中的SqlHelper帮助类
    SOD框架的Model、连接数据库及增删改查
    用bat文件更改ip地址
    postgresql 创建并使用uuid作为唯一主键
    postgresql 查询字符串中是否包含某字符的几种写法
    pycharm激活码
    c# DataTable第二行改为各列标题字段
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/6088802.html
Copyright © 2011-2022 走看看