JSP分页技术:怎样控制记录的输出?

os586 2006-03-17 09:40:41
我的数据库是MySQL,SQL语句是一个select * from table
并且把取得的全部记录都放入了一个ArrayList当中,这样做合理吗?是否需要控制一下SQL语句?

还有我想通过分页功能把ArrayList当中的记录取出来,当然每页要求只能显示10条,这有什么好的方法吗?我是通过在Servlet里面传递记录的起始数值来完成的,然后传递给JSTL的forEach标签的begin与end,这是自己的想法,能够实现,但是我感觉这样做效率不高

大家有没有更好的想法?一方面要在SQL上进行优化,另一方面在ArrayList当中的元素提取时也进行改观

请求大家能够帮助我,第一次做分页,感觉很陌生!
...全文
305 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
believefym 2006-03-17
同问楼主的问题,如果只是select的时候limit一下,怎么显示分页按钮的next、previous等按钮呢?

我也做过把记录全部取出存入arraylist,翻页的时候确定index的起始位置进行显示,但是浏览器后退之后index的值不会后退,再点下一页的话会问题,比如当前也为4,后退显示第三页内容,再点下一页直接跳到第五页而不经过第四页,而且很有可能第五页已经溢出了,这个问题不知道该如何解决
回复
boyu_song 2006-03-17
4楼,这么个问题不用那么大费周章吧?
在Sql文里加限制可以,在Sql外面加条件也可以,如if (rscount>500)
然后再JSP加段代码就可以了,分页不细说了
回复
minisun2000 2006-03-17
如果是单纯的MYSQL分页,1,2楼的都不错。3楼的方法不推荐,实际上只是一个显示的分页!
如果要适应各种数据库的话,比较难办;因为各种数据库的分页子句都不一样,不过可以考虑用框架来实现,比如Hiberate
回复
dreamlins 2006-03-17
jsp+javabean实现分页

此分页程序用到三个文件test.jsp和Pagination.java和DBConnect.java,和一个简单数据库test的表test,

测试用的web发布服务器为resin-2.1.6)其中test用于显示分页结果,DBConnect.java用于连接mysql数据库,

Pagination.java用于封装分页程序,而且DBConnect.java和Pagination.java放在WEB-INF下的classes(注意

,如果没有的话就新建一个),数据库用的是mysql.
1、create database test ----------建立数据库test
create table test(id int not null,name varchar(25));---------建立数据表test有两个字段,id和

name类型分别是整形 和 字符型(有关mysql的操作请注意本站的数据库方面)

2、DBConnect.java

import java.sql.*;
public class DBConnect{
String sDBDriver="org.gjt.mm.mysql.Driver";//设置驱动变量(jdbc的驱动程序放在WEB-INF下的lib目

录下)
String sConnStr="jdbc:mysql://127.0.0.1:3306/test?user=root&password=";//创建连接,数据库名

test,连接mysql的用户名是root,密码为空(如果你的mysql有用户名和密码请填上你的用户名和密码)
Connection conn=null;
ResultSet rs=null;

public DBConnect(){
try{
Class.forName(sDBDriver);// 创建数据库驱动
}
catch(java.lang.ClassNotFoundException e){
System.out.println("Jdbc_conn():"+e.getMessage());
}
}
// 数据更新,本文只用到查询。
public void executeUpdate(String sql)throws Exception{
sql=new String(sql.getBytes("GBK"),"ISO8859_1");
try{
conn=DriverManager.getConnection(sConnStr);
Statement stmt=conn.createStatement();
stmt.executeUpdate(sql);
conn.close();
stmt.close();
}
catch(SQLException ex){
System.out.println("sql.executeUpdate:"+ex.getMessage());
}
}
// 查询
public ResultSet executeQuery(String sql)throws Exception{
rs=null;
try{
sql=new String(sql.getBytes("GBK"),"ISO8859_1");// 字符的转换
conn=DriverManager.getConnection(sConnStr);// 创建连接
Statement stmt=conn.createStatement();// 数据操作对象
rs=stmt.executeQuery(sql);//执行sql
conn.close();// 关闭连接
stmt.close();// 关闭对象
}
catch(SQLException ex){
System.out.println("sql.executeQuery:"+ex.getMessage());
}
return rs;
}
}

用Pagination.java封装分页类,在test.jsp里显示
2、Pagination.java--------封装分页的类
import java.sql.*;
import javax.servlet.*;// 引入servlet包
import javax.servlet.http.*;
import java.math.*;

public class Pagination{
private String strPage = null;// page参数变量
private int curPages;// page参数内部的值
private int m_rows; // 设置每页显示的页数
private int pages;// 总页数
// 取得test.jsp里的test.jsp?page=<%=curPages-1%>或是page=<%=curPages+1%>的值给变量strPage
public String strPage(HttpServletRequest request, String page){
try{
strPage = request.getParameter(page);// request对象取得page的值
}
catch(Exception e){
System.out.println("delcolumn"+e.getMessage());
}
return strPage;// 返回这个值。
}
// 页面数
public int curPages(String strPage){
try{
if(strPage == null){// 默认没有就设置是第一页
curPages = 1;
}
else{
curPages = Integer.parseInt(strPage);// 取得strPage的整数值
if(curPages < 1)// 如果小于1,同样返回是第一页
curPages = 1;
}
}
catch(Exception e){
System.out.print("curPages");
}
return curPages;// 返回页面数
}
// 设置每页要显示的记录数
public void setRows(int rows){
m_rows=rows;
}
// 取得页数
public int getPages(int rowcounts){
int test;// 变量
test=rowcounts%m_rows;// 取得余数
if(test==0)
pages = rowcounts/m_rows;// 每页显示的整数
else
pages=rowcounts/m_rows+1;// 不是的话就加一
return pages;// 返回页数
}
// 结果集的返回
public ResultSet getPageSet(ResultSet rs,int curPages){
if(curPages==1){
return rs;// 如果是就一页的话,就返回这个rs
}
else{
int i=1;
try{
while(rs.next()){
i=i+1;
if(i>((curPages-1)*m_rows))
break;// 退出
}
return rs;// 从退出开始将结果集返回
}
catch(Exception e){
System.out.print(e.getMessage());
}
}
return rs;
}
}

3.test.jsp --------显示页面
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<jsp:useBean id="m_pages" scope="page" class="Pagination"/>
<jsp:useBean id="sql" scope="page" class="DBConnect"/>
<%
int curPages = Pagination.curPages(Pagination.strPage(request,"page"));//Pagination.strPage

(request,"page")取page值传递给curPages()方法
Pagination.setRows(10);//设置每页显示10条
%>

<%
ResultSet rs_count=sql.executeQuery("select count(*) as t from test");//传递进数据库处理的

javabean
rs_count.next();
int resultconts=rs_count.getInt("t");//取得总的数据数
int totalPages = Pagination.getPages(resultconts);//取出总页数
ResultSet rs=m_pages.getPageSet(sql.executeQuery("select * from test"),curPages);//获取指针

的结果集参数是(结果集,页数)
%>
<p>分类表</p>
<table border="1">
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<%int i=1;%>
<%while (rt.next()){%>
<tr>
<td><%=rt.getString("id")%> </td>
<td><%=rt.getString("name")%>  </td>
</tr>
<%
i=i+1;
if(i>10)
break;
}
%>
</table>
<p align="center"><%if(curPages>1){%><a href="testBean.jsp?page=<%=curPages-1%>">上一页

</a><%}%><%if(curPages<totalPages){%><a href="testBean.jsp?page=<%=curPages+1%>">下一页

</a><%}%></p>




--转载
回复
ZMFKPLJ 2006-03-17
up
回复
laoxing521 2006-03-17
这样做不合理
如果你有10W条,100W条记录,你的服务器吃得消吗

mysql:select * from table limit offset,rows
回复
xinxideyilian 2006-03-17
select name, birthday from employee order by birthday LIMIT 99,20
回复
wangx1949 2006-03-17
一个页面显示10条记录,那你就在数据库里只取10条记录,这样能显著提高效率
另外从数据库里取出的数据最好放在hashmap里面
回复
laoxing521 2006-03-17


在mysql用limit足够了
可以把offset保存在翻页的URL上,下一页就用前页的offset+rows

番页的URL:<a href="paging.jsp?offset=<%=offset+rows%>&size=rows">下一页</a>


分太少了,不写demo
~_~
回复
guo__peng 2006-03-17
用存储过程比较好,感觉如果一个分页就要用到select * from tableName这样的语句的话,如果有10W条记录就太没效率了,个人感觉还是用到哪些记录取哪些比较好,没用到的记录不用去理它
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2006-03-17 09:40
社区公告
暂无公告