JAVA--高级基础开发--分页技术

=========《分页技术:》==============
前端代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>分页技术</title>
    <script src="js/jquery-3.4.1.js"></script>
</head>
<body>
<h2 style="color: darkmagenta">分页技术的展现页面</h2>
   <table border="100%" width="100%">
       <h2 style="color: firebrick;" align="center">省份信息的展现</h2>
       <tr>
           <th>ID</th>
           <th>省份的代号</th>
           <th>省份</th>
       </tr>
       <c:forEach items="${pp.datas}" var="ss">
           <tr align="center">
               <td>
                   ${ss.id}
               </td>
               <td>
                   ${ss.provinceid}
               </td>
               <td>
                   ${ss.province}
               </td>
           </tr>
       </c:forEach>
   </table>
    总记录数:${pp.tatolCount}行&nbsp;&nbsp;&nbsp;&nbsp; 总页数:${pp.pageCount}页&nbsp;&nbsp;&nbsp;&nbsp;当前是第:${pp.pageNo}页&nbsp;&nbsp;&nbsp;&nbsp;每页显示:${pp. pageSize}条数据
        <select name="pageSize" id="pageSize">
            <option value="10">10</option>
            <option value="15">15</option>
            <option value="20">20</option>
            <option value="25">25</option>
         </select>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="selected?pageNo=${pp.pageNo==pp.pageCount?pp.pageCount:pp.pageNo+1}">下一页</a>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="selected?pageNo=${pp.pageNo==1?1:pp.pageNo-1}">上一页</a>

</body>
</html>
<script>
    $(function(){ //页面加载事件
       $("#pageSize").change(function(){
           var pages=$(this).val();
       })
    })
</script>

DAO接口html

public interface ProvincesDao {

    //获取表中的总记录数
    public int  SumConut();

    //每一页显示的记录数:pageNO:默认显示第一页;PageSize:每一页有多少条数据记录
    public PageModel<Provinces> findy(int pageNo, int   pageSize);

DAO接口的实现类前端

import com.Dao.ProvincesDao;
import com.model.PageModel;
import com.model.Provinces;
import org.apache.commons.dbutils.QueryRunner;

import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class ProvincesDaoImp implements ProvincesDao {
    private QueryRunner qr;
    private DataSource ds;

    public ProvincesDaoImp(DataSource ds){
        qr=new QueryRunner(ds);
    }
    //获取表中放入总记录数
    @Override
    public int SumConut(){
        String  sql="select  count(id)  from  provinces";
        int  count=0;
        try{
         Long lo=qr.query(sql,new ScalarHandler<Long>());
           if(lo!=null){
               count=lo.intValue();
           }

        }catch (SQLException  ce){
            ce.printStackTrace();
        }
        return count;
    }


    //分页查询,把数据保存到PageModel中
    @Override
    public PageModel<Provinces> findy(int pageNo, int  pageSize){
        //limit:从start开始,到end结束
        String  sql="select  *  from provinces limit ?,? ";
        Object[]prams={(pageNo-1)*pageSize, pageSize};
        //建立一个PageModel对象,
        PageModel<Provinces>model=new PageModel<>(pageSize,pageNo);
        try{
            List<Provinces>list=qr.query(sql,new BeanListHandler<Provinces>(Provinces.class),prams);
           //获取总的记录数
            int totalCount=SumConut();
            //设置分页的信息到PageModel中
            model.setTatolCount(totalCount);
            //设置每一页的数据
            model.setDatas(list);
        }catch (SQLException  ce){
            ce.printStackTrace();
        }
        return model;
    }
}

Dao的代理类java

package com.Dao.proxy;

import com.Dao.ProvincesDao;
import com.Dao.impl.ProvincesDaoImp;
import com.Utils.DatabaseConnection;
import com.model.PageModel;
import com.model.Provinces;

import javax.sql.DataSource;


public class ProvincesDaoProxy implements ProvincesDao {
    private ProvincesDao provincesDao;
    private DataSource ds;
    public ProvincesDaoProxy(){
        ds= DatabaseConnection.getDateSource();
        provincesDao=new ProvincesDaoImp(ds);
    }

    @Override
    public int SumConut(){
        return provincesDao.SumConut();
    }

    @Override
    public PageModel<Provinces> findy(int pageNo, int  pageSize) {
        return provincesDao.findy(pageNo, pageSize);
    }
}

业务层:Ljquery

import com.Dao.ProvincesDao;
import com.Factory.Daofactory;
import com.model.PageModel;
import com.model.Provinces;

import java.util.List;

public class ProvincesService {
    private ProvincesDao provincesDao= Daofactory.getInstance("UserProvinces",ProvincesDao.class);

    //定义查询的方法;
    public int SumCount(){
        return provincesDao.SumConut();
    }
    public PageModel<Provinces>findy(int pageNo,int  pageSize){
        return provincesDao.findy(pageNo, pageSize);
    }
}

Servlet服务器端sql

package com.Servlet;

import com.Servcice.ProvincesService;
import com.alibaba.fastjson.JSON;
import com.model.PageModel;
import com.model.Provinces;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

//查询页数
@WebServlet("/selected")
public class ProvincesServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

      //获取当前页数
        String page=req.getParameter("pageNo");
        int pageNo=1;
        if(page==null) { //若果当前页为空,我就让他显示第一页,
            pageNo=1;
        }else{
            pageNo=Integer.parseInt(page);
        }
        //建立业务层的对象
        ProvincesService  service=new ProvincesService();
        //表示从当前页开始,每一页显示10条数据。
        PageModel<Provinces>pageModel=service.findy(pageNo,10);

        //设置到请求域中
        req.setAttribute("pp",pageModel);
        //请求分派到展现的页面
        req.getRequestDispatcher("list.jsp").forward(req,resp);

    }
}
工具类
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * @PACKAGE_NAME: com.Model.utils
 * @ClASS_NAME: DaoFactory
 * @Description DAO工厂类
 * @Author: Model
 * @DATE: 2019/8/23 15:34
 * @Version : 1.0
 **/
public class Daofactory {

    private static Properties p;
    //map集合用来充当缓存,key要和dao.properties中的key一致
    //值,DAO接口的实例对象
    private static Map<String,Object> cache;

    //初始化
    static{
        p=new Properties();
        cache=new HashMap<>();
        //加载dao.properties属性文件
        InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("dao.properties");
        try {
            p.load(is);
        }catch (IOException ce){
            ce.printStackTrace();
        }
    }

    /**
     * 线程安全的泛型方法
     * @param daoName  就是dao.properties属性文件中key的名字
     * @param daoClass 就是key所对应值得父接口或者接口的实现类
     * @param <T>
     * @return
     */
    public synchronized static<T> T getInstance(String daoName,Class daoClass){

        //先从map集合中,根据KEY去查找,有没有对应的值
        T t=(T)cache.get(daoName);
        if(t==null){//说明map集合中不存在当前daoName锁对应的键值对
            //去属性文件中查找指定KEY是否存在,若是存在,则获取key所对应的值
            //值就是某个DAO接口的实现类的全限定名
            String className=p.getProperty(daoName);

            if(null!=className&&!"".equals(className)){//说明key-value存在
                try {
                    //把指定类的字节码文件加载JVM虚拟机中
                    Class clazz = Class.forName(className);
                    //经过反射机制调用类中无参数的构造方法建立clazz的对象
                    t=(T)daoClass.cast(clazz.getDeclaredConstructor().newInstance());
                    //把对象添加到map集合中
                    cache.put(daoName,t);
                }catch (Exception ce){
                    ce.printStackTrace();
                }
            }
        }
        return t;
    }

}
import com.alibaba.druid.pool.DruidDataSource;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

//专门负责数据库打开与关闭操做的类
public class DatabaseConnection {
    //建立阿里巴巴链接池对象
    private  static DruidDataSource ds;
    private  static Properties P;

    static {
        ds=new DruidDataSource();
        P=new Properties();
        //读取属性文件
        InputStream input=Thread.currentThread().getContextClassLoader().getResourceAsStream("druid.properties");
        //加载P对象
        try{
            P.load(input);
        }catch(IOException ce){
            ce.printStackTrace();
        }
        //根据键获取值
        ds.setDriverClassName(P.getProperty("driverClass"));
        ds.setUrl(P.getProperty("url"));
        ds.setUsername(P.getProperty("user"));
        ds.setPassword(P.getProperty("password"));
        //配链接池的参数
        ds.setInitialSize(Integer.parseInt(P.getProperty("initialSize")));
        ds.setMinIdle(Integer.parseInt(P.getProperty("minIdle")));
        ds.setMaxActive(Integer.parseInt(P.getProperty("maxActive")));
        ds.setMaxWait(Integer.parseInt(P.getProperty("maxWait")));
        ds.setTimeBetweenEvictionRunsMillis(Integer.parseInt(P.getProperty("timeBetweenEvictionRunsMillis")));
    }
    public  static DataSource getDateSource(){
        return ds;
    }
    //获取数据库链接对象
    public  static Connection getConnection()throws SQLException {
        return ds.getConnection();
    }


    //关闭数据库链接对象之insert  delete update的操做
    public static  void  close(Connection  con, Statement state)throws SQLException{
        con.close();;
        state.close();
    }
    //关闭数据库链接的对象之 select 查找查询的操做
    public static  void close(Connection  con, Statement  state, ResultSet set)throws SQLException{
        set.close();
        state.close();
        con.close();
    }
    //关闭获取数据库链接对象
    public  static  void  close(Connection  con)throws SQLException{
        con.close();
    }
    // 关闭执行Statement执行SQL 语句的对象
    public static  void close(Statement  state)throws SQLException{
        state.close();
    }
    //关闭结果集对象ResultSet对象
    public static  void close(ResultSet  set)throws SQLException{
        set.close();
    }
}
相关文章
相关标签/搜索