用servlet实现web的分页查询

首先,在util包里面我们先建立一个Page类,用于存放分页查到的列表以及每页行数以及最大页与当前页。

package com.hpe.muke.util;

import java.util.List;

public class Page {
	// 将分页查询的数据以及分页信息 一块返回到前台页面中
	
	private int count ;		// 一页显示的记录条数
	private int pageNum;	// 当前页码
	private int maxNum;		// 最大页码
	private List list;		// 查询到的数据
	
	
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public int getPageNum() {
		return pageNum;
	}
	public void setPageNum(int pageNum) {
		this.pageNum = pageNum;
	}
	public List getList() {
		return list;
	}
	public void setList(List list) {
		this.list = list;
	}
	public int getMaxNum() {
		return maxNum;
	}
	public void setMaxNum(int maxNum) {
		this.maxNum = maxNum;
	}
	
}

然后再DBUtil.java中,书写查询函数。目的是返回按条件查找到的某一页所用记录。比如第二页的三条记录。

	public Page query(String sql,Object[] params,Page page){
		//sql为传进来的查询所有语句,比如select * from user
		List all=query(sql,params);
		all.size();//总页数,也就是最大页数
		int maxNum=(all.size()+page.getCount()-1)/page.getCount();//获得最大页码数。
		page.setMaxNum(maxNum);
		sql+=" limit "+(page.getPageNum()-1)*page.getCount()+","+page.getCount()+" ";//与sql语句做链接形成完成limt语句
              //(page.getPageNum()-1)*page.getCount()是起始语句页,getPageNum是获取当前页码。limit返回第一页是0开始的
            //page.getCount()是步长,也就是每页记录数    。
List list=query(sql,params);page.setList(list);return page;}

useruser表中的记录数;

Countlimit 0,3 中的3,代表每页查询到记录数

Size是总的表总记录数

(在list 0,3maxNum=size/count:为当limit 0,3 时候,直接运算得到的页码结果

(size+count-1)/count:是经过调整以后得到的页码结果。

User (list 0,3maxNum=size/count (size+count-1)/count

1 1/3=0 (1+(3-1))/3=1

2 2/3=0 (2+(3-1))/3=1

3 3/3=1 (3+(3-1))/3=1

4 4/3=1 (4+(3-1))/3=2

5 5/3=1 (5+(3-1))/3=2

6 6/3=2 (6+(3-1))/3=2

7 7/3=2 (7+(3-1))/3=2

 

显然,(size+count-1)/count得到的结果是我们想过要的。

在Dao.java的search函数中:

public Page search(String key, String realname, int theid, Page page) {
		// TODO Auto-generated method stub
		//sql是做查询总记录语句
		String sql = "select * from message , user where message.userid = `user`.userid and msgtopic like ? ";
		ArrayList<Object> params = new ArrayList<>();
		
		params.add("%"+key+"%");
		
		/*
		 * 姓名过滤 和 主题过滤都使用=
		 * 1. 当姓名为空时, 不需要 and realname = ?
		 * 2. 主题ID <=0时, 不需要 and theid = ?
		 */
		
		if (realname != null && realname.length() > 0){
			sql += " and realname = ? ";
			
			params.add(realname);
		}
		
		if (theid>0){
			sql += " and theid = ? ";
			
			params.add(theid);
		}
		//这里db.query函数将sql查询所有语句,以及需要用到的参数,还是存储查询结果的实体类函数一并存储
		return db.query(sql, params.toArray(),page);
	}

在servlet.java中调用

Page page=new Page();
		page.setCount(1);//设置步长,也就是一页显示多少条记录
		page.setPageNum(Integer.parseInt(pageNum));//获得当前页
		Page p=ims.search(key, realname, Integer.parseInt(theid), page);
		request.setAttribute("page", page);
		request.getRequestDispatcher("admin/message.jsp").forward(request, response);

然后是jsp中显示。


代码1:上一页图标

<c:if test="${requestScope.page.pageNum<=1}">
			<li><a>上一页</a></li>
		</c:if>
		<c:if test="${requestScope.page.pageNum>1}">
			<li class="disabled"><a
				href="messageServlet?action=search&pageNum=${requestScope.page.pageNum-1}">上一页</a></li>
		</c:if>
代码2:中间显示第几页图标
<c:forEach var="i" begin="${requestScope.page.pageNum }" end="${requestScope.page.pageNum+2}" step="1">
			
			<c:if test="${i-1>0 }"> <!-- 下限 -->
			<c:if test="${i-1<requestScope.page.maxNum }"><!-- 上限 -->
				<c:if test="${i-1== requestScope.page.pageNum}"><!-- 当前页 -->
						<li class="active"><a>${i-1}</a></li><!-- 当前页显示蓝色选中 -->
				</c:if>
				<c:if test="${i-1!= requestScope.page.pageNum}"><!-- 非当前页显示其他色,并有连接 -->
					<li><a href="messageServlet?action=search&pageNum=${i-1}">${i-1}</a></li>
				</c:if>
					</c:if>
			</c:if>
		</c:forEach>

代码3:显示下一页图标

<c:if test="${requestScope.page.pageNum<requestScope.page.maxNum}"><!-- 上限 -->
			<li><a
				href="messageServlet?action=search&pageNum=${requestScope.page.pageNum+1}">下一页</a></li>
		</c:if>
		<c:if test="${requestScope.page.pageNum>=requestScope.page.maxNum}">
			<li><a>下一页</a></li>
		</c:if>

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 Java Web 中,如果你不想使用 JSP 来实现分页查询,你可以使用 Servlet + JDBC 来实现。 具体来说,你可以先通过 Servlet 接收用户提交的查询请求,然后将查询条件传递给 DAO 层(使用 JDBC 连接数据库),DAO 层通过查询数据库获取符合条件的数据,并计算出总记录数和总页数,最后将查询结果和分页信息返回给 ServletServlet 再将查询结果和分页信息封装成一个 JavaBean 对象(或者使用 Map),并将其存储到 request 或 session 中,最后转发到结果页面进行展示。 下面是一个简单的示例代码,假设我们要实现查询一个学生信息表(student)的分页查询功能: ``` // 在 Servlet 中接收查询请求并调用 DAO 层 public class StudentServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int currentPage = Integer.parseInt(request.getParameter("currentPage")); // 当前页数 int pageSize = Integer.parseInt(request.getParameter("pageSize")); // 每页记录数 String name = request.getParameter("name"); // 查询条件:姓名 String gender = request.getParameter("gender"); // 查询条件:性别 StudentDao dao = new StudentDao(); List<Student> students = dao.findStudents(name, gender, currentPage, pageSize); // 调用 DAO 层进行查询 int totalCount = dao.getTotalCount(name, gender); // 获取总记录数 int totalPage = (totalCount + pageSize - 1) / pageSize; // 计算总页数 // 将查询结果和分页信息封装成一个 JavaBean 对象,并存储到 request 中 PageBean pageBean = new PageBean(); pageBean.setCurrentPage(currentPage); pageBean.setPageSize(pageSize); pageBean.setTotalCount(totalCount); pageBean.setTotalPage(totalPage); pageBean.setStudents(students); request.setAttribute("pageBean", pageBean); // 转发到结果页面进行展示 request.getRequestDispatcher("/result.jsp").forward(request, response); } } // 在 DAO 层中实现分页查询功能 public class StudentDao { public List<Student> findStudents(String name, String gender, int currentPage, int pageSize) { List<Student> students = new ArrayList<>(); Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = DBUtil.getConnection(); // 获取数据库连接 String sql = "SELECT * FROM student WHERE 1=1"; if (name != null && !"".equals(name.trim())) { sql += " AND name LIKE ?"; } if (gender != null && !"".equals(gender.trim())) { sql += " AND gender = ?"; } sql += " LIMIT ?, ?"; pstmt = conn.prepareStatement(sql); int index = 1; if (name != null && !"".equals(name.trim())) { pstmt.setString(index++, "%" + name + "%"); } if (gender != null && !"".equals(gender.trim())) { pstmt.setString(index++, gender); } pstmt.setInt(index++, (currentPage - 1) * pageSize); pstmt.setInt(index++, pageSize); rs = pstmt.executeQuery(); while (rs.next()) { Student student = new Student(); student.setId(rs.getInt("id")); student.setName(rs.getString("name")); student.setGender(rs.getString("gender")); student.setAge(rs.getInt("age")); students.add(student); } } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(rs, pstmt, conn); // 释放资源 } return students; } public int getTotalCount(String name, String gender) { int totalCount = 0; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = DBUtil.getConnection(); // 获取数据库连接 String sql = "SELECT COUNT(*) FROM student WHERE 1=1"; if (name != null && !"".equals(name.trim())) { sql += " AND name LIKE ?"; } if (gender != null && !"".equals(gender.trim())) { sql += " AND gender = ?"; } pstmt = conn.prepareStatement(sql); int index = 1; if (name != null && !"".equals(name.trim())) { pstmt.setString(index++, "%" + name + "%"); } if (gender != null && !"".equals(gender.trim())) { pstmt.setString(index++, gender); } rs = pstmt.executeQuery(); if (rs.next()) { totalCount = rs.getInt(1); } } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(rs, pstmt, conn); // 释放资源 } return totalCount; } } // 封装分页信息和查询结果的 JavaBean public class PageBean { private int currentPage; // 当前页数 private int pageSize; // 每页记录数 private int totalCount; // 总记录数 private int totalPage; // 总页数 private List<Student> students; // 查询结果 // 省略 getter 和 setter 方法 } ``` 在上面的示例代码中,我们使用了一个名为 PageBean 的 JavaBean 来封装分页信息和查询结果。在 DAO 层中,我们分别实现了 findStudents() 方法和 getTotalCount() 方法来进行分页查询。在 Servlet 中,我们接收用户提交的查询请求,然后调用 DAO 层进行查询,并将查询结果和分页信息封装成一个 PageBean 对象,最后转发到结果页面进行展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值