【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
=========《分页技术:》==============
前端代码:
<%@ 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接口
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的代理类
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);
}
}
业务层:L
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服务器端
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();
}
}
来源:oschina
链接:https://my.oschina.net/u/4244602/blog/3145160