java实现后台 分页查询日志列表

本文介绍了一种基于Java和JSP实现的日志记录分页查询功能,通过手动输入页码和行数,展示特定页码的数据,每页显示指定行数的日志记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大致为手动输入页码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
		}
		
	}
}

当然了,还有其他的办法,大家可以去试一试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值