大致为手动输入页码a与行数b,即可查看第a页的数据且数据共b行。
效果图:
废话不多说,代码如下:
这里我只供上主要代码:
jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>添加日志记录页面</title>
<style>
table {
margin-left: 35%;
border: 1px solid red;
}
table, td, th {
border: 1px solid pink;
}
.layui-form {
margin: 5% 0 0 35%;
}
</style>
<link rel="stylesheet" href="layui/css/layui.css">
</head>
<body>
<form action="recordList" method="get"
class="layui-form layui-form-pane">
<!-- 提示:如果你不想用form,你可以换成div等任何一个普通元素 -->
<h2>添加日志记录</h2>
<br />
<div class="layui-form-item pane">
<label class="layui-form-label">页码</label>
<div class="layui-input-inline">
<input type="text" name="pageCode" id="pageCode" autocomplete="off"
class="layui-input ">
</div>
</div>
<div class="layui-form-item pane">
<label class="layui-form-label">行数</label>
<div class="layui-input-inline">
<input type="text" name="pageSize" id="pageSize" autocomplete="off"
class="layui-input ">
</div>
</div>
<div class="layui-form-item ">
<div class="layui-input-inline">
<button class="layui-btn" id="btn" lay-submit lay-filter="*">确定</button>
</div>${count }
</div>
<span id="error" style="color: red;"></span>
${error }
${countError }
${sizeError }
</form>
<!-- 更多表单结构排版请移步文档左侧【页面元素-表单】一项阅览 -->
<!-- JSTL: jsp Standard<标准> Tag<标签> Lib<库> -->
<c:if test="${listStr!=null}">
<table cellpadding="0" cellspacing="0">
<tr>
<th>序号</th>
<th>日志生成时间</th>
<th>操作账号</th>
<th>对应的账号</th>
<th>交易类型</th>
<th>摘要</th>
<th>当前余额</th>
</tr>
<c:forEach items="${listStr}" var="u" varStatus="vs">
<tr>
<td>${vs.count}</td>
<td>${u.rtransdate}</td>
<td>${u.raidfro9om}</td>
<td>${u.raidto}</td>
<td>${u.rtranstype}</td>
<td>${u.rtranssummary}</td>
<td>${u.rabalance}</td>
</tr>
</c:forEach>
</table>
</c:if>
<script src="layui/layui.js"></script>
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<script>
</script>
</body>
</html>
DBUtil:
package cn.xxs.util;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import com.mysql.jdbc.Statement;
public class DBUtil {
/**
* 在成员位置定义5个存储数据库信息的变量
*/
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/bank";
//private static String url = "jdbc:mysql://localhost:3306/bank?useUnicode=true&characterEncoding=utf-8&useSSL=true";
private static String user = "root";
private static String password = "root";
/**
* 定义一个Connection类型的变量用来存储获取到的Connection实例化对象
*/
private static Connection conn;
/**
* 私有构造方法,防止用户创建对象,浪费内存空间
*/
private DBUtil() {
}
public static Connection getConnection() {
try {
if (conn == null || conn.isClosed()) {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/**
* 定义一个静态方法,用于释放资源
*/
public static void close(ResultSet rs, Statement stat, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
BaseDao:
package cn.xxs.dao;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import cn.xxs.util.DBUtil;
public class BaseDao<E> {
// E所对应的类型
private Class<E> cls; // CustomerService Card
public BaseDao() {
// 获取E所代表的类型(必须在子类中执行)
cls = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
public boolean isExistColumn(ResultSet rs, String columnName) {
try {
if (rs.findColumn(columnName) > 0) {
return true;
}
} catch (SQLException e) {
return false;
}
return false;
}
/**
* 查询一条数据时,返回一个实体类
*
* @param sql 查询的sql语句
* @param param sql语句中?所代表的数据
* @return
*/
public E queryOne(String sql, Object... param) { // Object... 0个~多个
E c = null;
Connection conn = null;
PreparedStatement state = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
// 3、任务Statement
state = conn.prepareStatement(sql);
// state.setObject(1,"皮特");
// state.setObject(2,"1234");
for (int i = 0; i < param.length; i++) {
state.setObject(i + 1, param[i]);
}
// 4、结果ResultSets
rs = state.executeQuery();
if (rs.next()) {
// 1、创建对象
c = cls.newInstance(); // new XX()
// 2、通过成员变量,来获取rs的数据
Field[] fs = cls.getDeclaredFields(); // 例如E代表Customer,cls->CustomerService
for (Field f : fs) {
f.setAccessible(true); // 让私有的、原本不可用的,变成可用
if (isExistColumn(rs, f.getName())) {
Object o = rs.getObject(f.getName());// 通过成员变量名,获得数据库的数据
f.set(c, o); // 给e的成员变量赋值
}
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
// 5、关闭
close(rs, state, conn);
}
return c;
}
/**
* 查询多条数据时,返回集合
*
* @param sql 查询的sql语句
* @param param sql语句中?所代表的数据
* @return
*/
public List<E> queryList(String sql, Object... param) { // Object... 0个~多个
List<E> list = new ArrayList<>();
Connection conn = null;
PreparedStatement state = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
// 3、任务Statement
state = conn.prepareStatement(sql);
// state.setObject(1,"皮特");
// state.setObject(2,"1234");
for (int i = 0; i < param.length; i++) {
state.setObject(i + 1, param[i]);
}
// 4、结果ResultSets
rs = state.executeQuery();
while (rs.next()) {
// 1、创建对象
E c = cls.newInstance(); // new XX()
// 2、通过成员变量,来获取rs的数据
Field[] fs = cls.getDeclaredFields(); // 例如E代表Customer,cls->CustomerService
for (Field f : fs) {
f.setAccessible(true); // 让私有的、原本不可用的,变成可用
if (isExistColumn(rs, f.getName())) {
Object o = rs.getObject(f.getName());// 通过成员变量名,获得数据库的数据
f.set(c, o); // 给e的成员变量赋值
}
}
// 放入集合中
list.add(c);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
close(rs, state, conn);
}
return list;
}
/**
* 修改数据库的操作(增、删、改)
*
* @param sql 修改的sql语句
* @param param sql语句中?所代表的数据
* @return 修改是否成功
*/
public boolean update(String sql, Object... param) { // Object... 0个~多个
int row = 0;
Connection conn = null;
PreparedStatement state = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
// 3、任务Statement
state = conn.prepareStatement(sql);
// state.setObject(1,"皮特");
// state.setObject(2,"1234");
for (int i = 0; i < param.length; i++) {
state.setObject(i + 1, param[i]);
}
// 4、结果ResultSets
row = state.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rs, state, conn);
}
return row > 0;
}
// 关闭三大变量
private void close(ResultSet rs, Statement state, Connection conn) {
try {
if (rs != null)
rs.close();
} catch (SQLException e) { // 避免空指针:1、if(rs!=null) 2、SQLException->Exception
e.printStackTrace();
}
try {
if (state != null)
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
实体类:
package cn.xxs.entity;
import java.math.BigDecimal;
import java.util.Date;
public class Record {
private Integer rid;
private Date rtransdate;//日志生成时间
private Integer Raidfro9om;//取款、存款、转账对应操作账号
private Integer raidto;//转账到对应的账号
private Integer rtranstype;//交易类型:转账3,存款1,取款2
private String rtranssummary;//摘要
private BigDecimal rabalance;//当前余额
public Record() {
super();
// TODO Auto-generated constructor stub
}
public Record(Integer rid, Date rtransdate, Integer raidfro9om, Integer raidto, Integer rtranstype,
String rtranssummary, BigDecimal rabalance) {
super();
this.rid = rid;
this.rtransdate = rtransdate;
Raidfro9om = raidfro9om;
this.raidto = raidto;
this.rtranstype = rtranstype;
this.rtranssummary = rtranssummary;
this.rabalance = rabalance;
}
public Integer getRid() {
return rid;
}
public void setRid(Integer rid) {
this.rid = rid;
}
public Date getRtransdate() {
return rtransdate;
}
public void setRtransdate(Date rtransdate) {
this.rtransdate = rtransdate;
}
public Integer getRaidfro9om() {
return Raidfro9om;
}
public void setRaidfro9om(Integer raidfro9om) {
Raidfro9om = raidfro9om;
}
public Integer getRaidto() {
return raidto;
}
public void setRaidto(Integer raidto) {
this.raidto = raidto;
}
public Integer getRtranstype() {
return rtranstype;
}
public void setRtranstype(Integer rtranstype) {
this.rtranstype = rtranstype;
}
public String getRtranssummary() {
return rtranssummary;
}
public void setRtranssummary(String rtranssummary) {
this.rtranssummary = rtranssummary;
}
public BigDecimal getRabalance() {
return rabalance;
}
public void setRabalance(BigDecimal rabalance) {
this.rabalance = rabalance;
}
@Override
public String toString() {
return "Record [rid=" + rid + ", rtransdate=" + rtransdate + ", Raidfro9om=" + Raidfro9om + ", raidto=" + raidto
+ ", rtranstype=" + rtranstype + ", rtranssummary=" + rtranssummary + ", rabalance=" + rabalance + "]";
}
}
dao层接口:
package cn.xxs.dao;
import java.util.List;
import cn.xxs.entity.Record;
public interface RecordDao {
/**
* 根据操作账号和被转账账号查询当前账号日志
*
* @param Raidfro9om
* @param raidto
* @return
*/
List<Record> select(Integer Raidfro9om, Integer raidto);
/**
* 添加日志信息
*
* @param r
*/
void add(Record r);
/**
* 日志列表
*
* @return
*/
List<Record> selectAll();
/**
* 分页查询
* @param pageCode
* @param pageSize
* @return
*/
List<Record> list(int pageCode,int pageSize);
}
dao层接口的实现:
package cn.xxs.dao.impl;
import java.util.List;
import cn.xxs.dao.BaseDao;
import cn.xxs.dao.RecordDao;
import cn.xxs.entity.Customer;
import cn.xxs.entity.Record;
public class RecordDaoImpl extends BaseDao<Record> implements RecordDao {
/**
* 添加日志信息
*
* @param r
*/
@Override
public void add(Record r) {
update("insert into tb_record values(null,?,?,?,?,?,?)", r.getRtransdate(), r.getRaidfro9om(), r.getRaidto(),
r.getRtranstype(), r.getRtranssummary(), r.getRabalance());
}
/**
* 根据操作账号和被转账账号查询当前账号日志
*
* @param Raidfro9om
* @param raidto
* @return
*/
@Override
public List<Record> select(Integer Raidfro9om, Integer raidto) {
List<Record> list = queryList("select * from tb_record where Raidfro9om=? or raidto=?", Raidfro9om, raidto);
return list;
}
/**
* 日志列表
*
* @return
*/
@Override
public List<Record> selectAll() {
// TODO Auto-generated method stub
return queryList("select * from tb_record");
}
/**
* 分页查询
*
* @param pageCode
* @param pageSize
* @return
*/
@Override
public List<Record> list(int pageCode, int pageSize) {
// TODO Auto-generated method stub
return queryList("select * from tb_record limit ?,?", pageCode, pageSize);
}
}
service层和dao层接口写法一样:
service层接口的实现:
package cn.xxs.service.impl;
import java.util.List;
import cn.xxs.dao.RecordDao;
import cn.xxs.dao.impl.RecordDaoImpl;
import cn.xxs.entity.Record;
import cn.xxs.service.RecordService;
public class RecordServiceImpl implements RecordService {
private RecordDao dao = new RecordDaoImpl();
/**
* 添加日志信息
*
* @param r
*/
@Override
public void add(Record r) {
// TODO Auto-generated method stub
dao.add(r);
}
/**
* 根据操作账号和被转账账号查询当前账号日志
*
* @param Raidfro9om
* @param raidto
* @return
*/
@Override
public List<Record> select(Integer Raidfro9om, Integer raidto) {
// TODO Auto-generated method stub
return dao.select(Raidfro9om, raidto);
}
/**
* 日志列表
*
* @return
*/
@Override
public List<Record> selectAll() {
// TODO Auto-generated method stub
return dao.selectAll();
}
/**
* 分页查询
*
* @param pageCode
* @param pageSize
* @return
*/
@Override
public List<Record> list(int pageCode, int pageSize) {
// TODO Auto-generated method stub
return dao.list(pageCode, pageSize);
}
}
servlet:
package cn.xxs.servlet;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.xxs.entity.Record;
import cn.xxs.service.RecordService;
import cn.xxs.service.impl.RecordServiceImpl;
public class RecordListServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取数据
String pageCode = req.getParameter("pageCode");
String pageSize = req.getParameter("pageSize");
// 为调方法做准备
RecordService s = new RecordServiceImpl();
try {
//判断
if(pageCode!= null && pageSize!= null && !pageCode.equals(" ") && !pageSize.equals(" ") && !pageCode.isEmpty() && !pageSize.isEmpty()) {
//转换数据类型
Integer code =Integer.parseInt(pageCode);
Integer size =Integer.parseInt(pageSize);
//设置最大行数9
if(size>9) {
req.setAttribute("sizeError", "行数不能大于9");
}
//页码公式
int count = (code-1)*size;
//所有数据长度
int length = s.selectAll().size();
//判断
if(count*size>length) {
req.setAttribute("countError", "此页无日志记录,请您重新输入");
}else {
//分页查询
List<Record> lists = s.list(count, size);
// 返回响应
req.setAttribute("listStr", lists);
}
}else {
//错误信息
req.setAttribute("error", "不好意思,您还没有输入页数或行数");
}
//转发
req.getRequestDispatcher("recordList.jsp").forward(req, resp);
//抛异常
} catch (IllegalStateException e) {
// TODO: handle exception
}
}
}
当然了,还有其他的办法,大家可以去试一试。