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