jsp分页技术的例子实现和总结

在jsp开发中,在前台的数据展示页面,经常遇到这样的情况,很多条的数据,有几十上百条,而只显示10条,然后翻页显示下面的十条,如下图所示:

 

 

处理方式:一:首先sql语句,使用not in的方式处理,

在dao类里写一个方法

public List<> getAllByPage(int pageSize,pageNum){

......

 

String sql="select top"+pageSize +" * from 表名x where 字段A not in (select top "+pageSize*(pageNum-1)+"  字段A from 表名x)";

.......

rerun list;

}

其中,pageSize是页面要显示的条数,pageNum是要显示的页码,其中的sql语句基本是固定的,返回一个list对象。

二:在Biz里写一个方法,调用Dao里的这个getAllByPage方法,传入的也是两个参数,返回的也是list结果集。

三:在jsp页面以url传参的方式进行页面处理和数据的显示。

使用request对象获取传入的值,然后进行强制类型转换之后就可以作为参数,传入到Biz业务类的方法中去处理,返回的就是list结果集,然后使用表达式的方式在页面中进行显示就可以了。

综上:这就是分页显示数据的一个方法,

 

下面是一个小小的例子。


问题需求:开发一个小的留言板页面,页面能够以分页的形式显示所有留言信息,下放是一个发表留言的表单。

所有代码如下:

数据库如图:

 实体类(entity)如下:

package com.rz.entity;

import java.util.Date;

public class Message {
	private int id;				//留言id
	private String message;		//留言信息
	private String author;		//留言作者
	private Date postTime;		//留言时间
	
	
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public Date getPostTime() {
		return postTime;
	}
	public void setPostTime(Date postTime) {
		this.postTime = postTime;
	}
	
	
}


 

 

dao类如下:(包括链接jdbc数据库)

package com.rz.dao;

import com.rz.entity.*;
import java.sql.*;
import java.util.*;

public class MessageDao {
	private String driver="com.microsoft.sqlserver.jdbc.SQLServerDriver";
	private String url="jdbc:sqlserver://localhost:1433;DataBaseName=message";
	private String name="sa";
	private String password="lishiyuzuji";
	
	
	
	/**
	 * 保存一条记录
	 * @param message
	 * @return
	 */
	public int save(Message message){
		int line=0;				//保存记录的行数
		Connection con=null;
		PreparedStatement pstat=null;
		try{
			con=getConn();
			pstat=con.prepareStatement("insert into TBL_MESSAGE(message,author,postTime) values(?,?,getdate())");
			pstat.setString(1,message.getMessage());
			pstat.setString(2,message.getAuthor());
			line=pstat.executeUpdate();
			
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			closeAll(null,pstat,con);
		}
		return line;
	}
	
	/**
	 * 分页显示信息
	 * @param pageSize 每页显示的信息数量
	 * @param pageNum  定位到那一页
	 * @return
	 */
	public List<Message> listByPage(int pageSize,int pageNum){
		Connection con=null;
		PreparedStatement pstat=null;
		ResultSet res=null;
		List<Message> list=new ArrayList<Message>();
		try{
			con=getConn();
			pstat=con.prepareStatement("select top "+pageSize+
					" * from TBL_MESSAGE where id not in (select top "+pageSize*(pageNum-1)+
					" id from TBL_MESSAGE order by postTime) order by postTime");
			res=pstat.executeQuery();
			while(res.next()){
				Message message=new Message();
				message.setId(res.getInt(1));
				message.setMessage(res.getString(2));
				message.setAuthor(res.getString(3));
				message.setPostTime(res.getDate(4));
				list.add(message);
			}
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			closeAll(res,pstat,con);
		}
		return list;
	}
	
	/**
	 * 获得记录的总条数
	 * @return	返回查询到的所有记录的总条数
	 */
	public int getAllUserCount(){
		Connection con=null;
		PreparedStatement pstat=null;
		ResultSet res=null;
		int ret = 0;
		try{
			con=getConn();
			pstat=con.prepareStatement("select count(*) from TBL_MESSAGE");
			res=pstat.executeQuery();
			if(res.next()){
				ret=res.getInt(1);
			}
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			closeAll(res,pstat,con);
		}
		return ret;
	}
	
	
	
	/**
	 * 连接数据库
	 */
	public Connection getConn(){
		Connection con=null;
		try{
			Class.forName(driver);
			con=DriverManager.getConnection(url,name,password);
		}catch(ClassNotFoundException e){
			e.printStackTrace();
		}catch(SQLException e){
			e.printStackTrace();
		}
		return con;
	}
	
	
	
	/**
	 * 关闭数据库连接,而且三者是有顺序的,先关闭ResultSet连接,接着关闭Statement连接,最后关闭Connection连接
	 * 并且还要抛出异常。数据库连接使用完毕以后需要关闭连接的,否则,连接数据库的“通道”就会继续增加,而数据库的连接
	 * 能力也是有限的,大约是200个,因此需要在使用完数据库后将连接关闭掉。
	 * @param res
	 * @param stat
	 * @param conn
	 */
	public void closeAll(ResultSet res,PreparedStatement pstat,Connection con){
		try{
			if(res!=null){
				res.close();
				res=null;
			}
			if(pstat!=null){
				pstat.close();
				pstat=null;
			}
			if(con!=null){
				con.close();
			}
		}catch(SQLException e){
			e.printStackTrace();
		}
	
	}
	
}


 

Biz类如下(调用dao的相关方法来实现业务处理):

 

package com.rz.Biz;
import java.util.*;
import com.rz.dao.*;
import com.rz.entity.*;
public class MessageBiz {
	/**
	 * 保存一条信息
	 * @param message
	 */
	public void saveMessage(Message message){
		MessageDao messageDao=new MessageDao();
		messageDao.save(message);
	}
	/**
	 * 根据页码来查询数据
	 * @param page
	 * @return
	 */
	public List<Message> listByPage(int pageSize,int pageNum){
		MessageDao messageDao=new MessageDao();
		return messageDao.listByPage(pageSize,pageNum);
	}
	
	/**
	 * 返回查询到的记录的总条数
	 * @return
	 */
	public int getAllUserCount(){
		MessageDao messageDao=new MessageDao();
		return messageDao.getAllUserCount();
	}
}


测试index页面代码如下:

<%@ page language="java" import="java.util.*,com.rz.Biz.*, com.rz.entity.*" contentType="text/html; charset=utf-8"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>留言板系统</title>
     <script>
    	function check(){
    		var name=document.form.text.value;
    		var pass=document.form.textarea.value;
    		if(name.length==0){
    			alert("用户名不得为空!");
    			return false;
    		}
    		if(pass.length==0){
    			alert("留言信息不能为空!");
    			return false;
    		}
    		return true;
    	}
    </script>
  </head>
  
  <body style="text-align:center;">
  	<h1>Beta留言板</h1>
	<div style="width:800px; border:#CCCCCC solid 1px;">
		<%
			String p=request.getParameter("p");
			int pageNum=1;			//定义页数
			int pageSize=10;		//定义每一页显示的个数
			if(p!=null){			//判断传入的输入值是否为空,并且进行强制类型转换
			 	pageNum=Integer.parseInt(p);
		 	}
		 	
  			MessageBiz messageBiz=new MessageBiz();
  			List<Message> list=messageBiz.listByPage(pageSize,pageNum); //根据传入的两个参数,返回一个list集合
  	
  			for(int i=list.size()-1;i>=0;i--){
  				Message message=new Message();
  				message=(Message)list.get(i);
  		%>
  		
		<div style="width:800px;">
			<div style="background-color:#CCCCCC; text-align:left;">作者:<%=message.getAuthor() %>
				       <%=message.getPostTime() %>
			</div>
			<div style="text-align:right;"><%=i+1+(pageNum-1)*pageSize %>#</div>
			<div><%=message.getMessage() %>
			</div>
		</div>
		<%
			}
			//获得最大页码
			int maxPage;
			int reCount=messageBiz.getAllUserCount();
			if(reCount%pageSize==0)
				maxPage=reCount/pageSize;
			else
				maxPage=(reCount/pageSize)+1;
				
			int backPage=(pageNum==1) ? 1 :pageNum-1;
			int nextPage=(pageNum==maxPage) ? maxPage : pageNum+1;
  	 	%>
	</div>
	
	
	<div style="width:800px; height:30px; border:#000033 solid 0px; margin-top:12px; text-align:right;">
		<div style="width:50px; height:15px; border:#CCCCCC solid 1px; display:inline; cursor:pointer;">
			<a href="index.jsp?p=<%=backPage %>">上一页</a>
		</div>
		<div style="width:50px; height:15px; border:#CCCCCC solid 1px; display:inline; margin-left:12px; margin-right:20px; cursor:pointer;">
			<a href="index.jsp?p=<%=nextPage %>">下一页</a>
		</div>
	</div>
	<div style=" width:800px; height:300px; border:#333333 solid 0px;">
		<form name="form" action="doPost.jsp" method="post" onSubmit="return check()">
			<table>
		    		<tr>
		    			<td>用户名:</td>
		    			<td><input type="text" name="text"/></td>
		    		</tr>
		    		<tr>
		    			<td>留言信息:</td>
		    			<td><textarea name="textarea" style="width:400px; height:200px;"></textarea></td>
		    		</tr>
		    		<tr><td><input type="submit" value="提交"/></td></tr>
		       	</table>
		</form>
	</div>
  </body>
</html>


处理表单提交的jsp页面doPost.jsp如下:

<%@ page language="java" import="java.util.*,com.rz.Biz.*, com.rz.entity.*" contentType="text/html; charset=utf-8"%>
<%
	request.setCharacterEncoding("utf-8");
	String author=request.getParameter("text");
	String message=request.getParameter("textarea");
	
	Message messages=new Message();
	messages.setAuthor(author);
	messages.setMessage(message);
	MessageBiz messageBiz=new MessageBiz();
	messageBiz.saveMessage(messages);
	response.sendRedirect("index.jsp");
 %>


 页面效果如下:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值