主要基于JSP+Servlet+JavaBean+Dao模式

1、首先写个实体类Message:

public class Message {
	public static final int PAGE_SIZE=4;//分页当中每页记录数,不会经常修改,所以定义为final
	private int id;
	private String name;
	private String  datetime;
	private String content;

        public String getContent() {
		return content;
	}

	public int getId() {
		return id;
	}
	public String getName() {
		return name;
	}
	
	public void setContent(String content) {
		this.content = content;
	}


	public String getDatetime() {
		return datetime;
	}

	public void setDatetime(String datetime) {
		this.datetime = datetime;
	}

	public void setId(int id) {
		this.id = id;
	}
	public void setName(String name) {
		this.name = name;
	}

}

2、接着写PageFind类,其中find方法查询指定页码中的数据,findCount查询总记录数:

package com.xuan.util;
/*
 * find方法用于实现分页查询功能,此方法根据入口参数page传递的页码,查询指定页码中的记录
 * 
 * mysql数据库提供的limit关键字能够控制查询数据结果集的起始位置和返回记录的数量,使用方式:limit arg1,arg2;
 * 其中arg1用于指定查询记录的起始位置,arg2用于指定查询数据返回的记录数
 * 
 * */
import java.sql.Connection;
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 com.xuan.vo.Message;

/*分页查询方法find(),此方法包含一个page参数,用于传递要查询的页码*/
public class PageFind {
	public List<Message> find(int page){
		
		List<Message> list=new ArrayList<Message>();//创建List
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		String sql="select * from message order by id asc limit ?,?";
		try{
			conn=DbUtil.getConn();
			ps=DbUtil.getPreparedStatement(conn, sql);
			ps.setInt(1,(page-1)*Message.PAGE_SIZE);//对sql语句的第一个参数赋值,算法(page-1)*Message.PAGE_SIZE
			ps.setInt(2,Message.PAGE_SIZE);//对sql语句的第三个参数赋值
			rs=ps.executeQuery();//执行查询操作
			while(rs.next()){
				Message message=new Message();//实例化Message
				message.setName(rs.getString("name"));//对name属性赋值
				message.setContent(rs.getString("content"));
				message.setDatetime(rs.getString("datetime"));
				list.add(message);//将Message添加到List集合中
			}
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			DbUtil.closeRs(rs);
			DbUtil.closePs(ps);
			DbUtil.closeConn(conn);
		}
		
		return list;
	}
	

	public int findCount(){
		int count=0;//总记录数
		Connection conn=null;
		Statement stmt=null;
		ResultSet rs=null;
		String sql ="select count(*) from message";
		try{
			conn=DbUtil.getConn();
			stmt=DbUtil.getStatement(conn);
			rs=stmt.executeQuery(sql);
			if(rs.next()){//光标向后移动,并判断是否有效;由于所获取的数据是单一的一个数值,所以实例中通过if(next())进行调用,而没有使用while
				count=rs.getInt(1);//对总记录数赋值,因为此sql语句查询出来的“表”只有一条记录,于是取下标为1的值
			}
		}catch(SQLException e){
			throw new RuntimeException("查询数据库总记录数的时候出错了"+e.getMessage());
		}finally{
			DbUtil.closeRs(rs);
			DbUtil.closeStmt(stmt);
			DbUtil.closeConn(conn);
		}
		return count;//返回总记录数
	}

}



3、写servlet类,主要的分页逻辑,此处显示的是首先展现给用户的页面,也就是分页导航栏为1的逻辑代码:

package com.xuan.controller;
/*FindServlet类中的doPost()方法主要是获取查询结果集和构造分页导航条对象*/
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xuan.dao.UserDao;
import com.xuan.daoimpl.UserDaoImpl;
import com.xuan.util.PageFind;
import com.xuan.vo.Message;

public class FindServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			
		UserDao ud=new UserDaoImpl();
		
	
		
		int currPage=1;//当前页码
		if(request.getParameter("page")!=null){//判断传递的页码是否有效
			currPage=Integer.parseInt(request.getParameter("page"));//对当前页码赋值
			System.out.println(currPage);
		}
		    PageFind pf=new PageFind();
			List<Message> list=pf.find(currPage);//查询所有信息
			request.setAttribute("list", list);//将list放置在request中
			int pages;//总页数
			int count=pf.findCount();//查询总记录数
			if(count%Message.PAGE_SIZE==0){//计算总页数
				pages=count/Message.PAGE_SIZE;//对总页数赋值
			}else{
				pages=count/Message.PAGE_SIZE+1;//对总页数赋值
			} 
			StringBuffer sb=new StringBuffer();
			for(int i=1;i<=pages;i++){//通过循环构建分页导航条
				if(i==currPage){
					sb.append("["+i+"]");
				}else{
					//构建分页导航条
					sb.append("<a href='FindServlet?page="+i+"'>"+i+"</a>");
				}
			sb.append(" ");//构建分页导航条
			}
			request.setAttribute("bar", sb.toString());//将分页导航条的字符串放置在request中
			
			//转发显示页面
			request.getRequestDispatcher("pages/login/FindSuccess.jsp").forward(request, response);
		
		
	}
}



4、写Servlert类,关于回复之后,显示的分页页面逻辑代码,即显示最后一页的内容:

package com.xuan.controller;
/*FindServlet类中的doPost()方法主要是获取查询结果集和构造分页导航条对象*/
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xuan.dao.UserDao;
import com.xuan.daoimpl.UserDaoImpl;
import com.xuan.util.PageFind;
import com.xuan.vo.Message;

public class RplyServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			
		UserDao ud=new UserDaoImpl();
		
	
		
		int currPage=1;//当前页码
		if(request.getParameter("page")!=null){//判断传递的页码是否有效
			currPage=Integer.parseInt(request.getParameter("page"));//对当前页码赋值
			System.out.println(currPage);
		}
		    PageFind pf=new PageFind();
			
			
			int pages;//总页数
			int count=pf.findCount();//查询总记录数
			if(count%Message.PAGE_SIZE==0){//计算总页数
				pages=count/Message.PAGE_SIZE;//对总页数赋值
			}else{
				pages=count/Message.PAGE_SIZE+1;//对总页数赋值
			} 
			List<Message> list=pf.find(pages);//查询所有信息
			request.setAttribute("list", list);//将list放置在request中
			StringBuffer sb=new StringBuffer();
			for(int i=1;i<=pages-1;i++){//通过循环构建分页导航条
					//构建分页导航条
					sb.append("<a href='FindServlet?page="+i+"'>"+i+"</a>");
				    sb.append(" ");//构建分页导航条
			}
			sb.append("["+pages+"]");
			request.setAttribute("bar", sb.toString());//将分页导航条的字符串放置在request中
			
			//转发显示页面
			request.getRequestDispatcher("pages/login/FindSuccess.jsp").forward(request, response);
		
		
	}
}



5、页面显示:

<div id="messageBoxs">
<%
List<Message> list=(List<Message>)session.getAttribute("messageList");
System.out.print(list);
	if(list==null||list.size()<1){
		out.print("没有任何留言!");
	}else{
		for(Message m :list){
			
%>
<div id="item"><label >
<%
out.println("<div style='text-align:left;margin:0 auto;padding:0 auto'>"+"    "+m.getContent()+"</div>");
out.println("<br/><br/><div style='float:right'>"+m.getName()+"<br/>"+m.getDatetime()+"</div>");
%>
</label> </div>
<%		}
	}
%>
	<div width="98%" align="center" style="padding-top:10px;">
		<%=session.getAttribute("bar")%><!--  用于输出分页导航条-->

</div>
</div>



主要的代码都在上面了,回复的分页代码算法改写了一下,基本按照需求来修改代码即可,实现了简单的分页功能。