=========《分页技术:》============== 前端代码: <%@ 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}行 总页数:${pp.pageCount}页 当前是第:${pp.pageNo}页 每页显示:${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> <a href="selected?pageNo=${pp.pageNo==pp.pageCount?pp.pageCount:pp.pageNo+1}">下一页</a> <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(); } }