欢迎光临
我们一直在努力

一个Jsp初学者的学习过程(五)-JSP教程,Jsp/Servlet

建站超值云服务器,限时71元/月

一个jsp初学者的学习过程(五)

theunforgiven

第五章 分页功能的实现

在我逐步把我的留言板的功能完善的同时,我渐渐熟悉了对数据库的操作,这时我发现留言信息的目录越来越长了,我需要实现一个分页功能了,最初我尝试自己解决这个问题:

1、我应该把它的关键部分封装成一个bean,使它尽可能的能够重用;

2、通过资料了解有两种数据库查询方案:一、一次取得所有资料,然后在指定的页显示指定的资料;二、分次查询数据库,每次只获得本页的数据。考虑到数据库中记录数越多,方案一所占的服务器资源就越多(将所有的记录都放到内存中,假如有50万条记录的话……@$^*%@#),所以应该采用方案二;

3、首先要知道目标数据库里共有多少条记录(select count(*) from 表名),然后确定每页显示多少条记录,再根据它计算一共分多少页(最大页数)显示,这部分由bean1(在我的代码里就随便起个名叫pagebean)实现;获取当前要显示第几页的请求,查询本页要显示哪些条记录,将每条记录的内容作为一组数据返回给显示页面,这部分由bean2(countbean)实现;显示页面(.jsp文件)显示各条记录的内容。

到这里我发现有两个难点:(1)查询从第m条到第n条记录的sql语句不会写,通过在网上查找资料,这个问题得到解决;(2)bean2返回给显示页面的值是个二维的数组,这个数组怎么传呢?于是不得不上网翻书查找资料,最终发现由vector(向量)来解决,由于没有工具书,无法针对vector进一步学习,就只好分析代码,好在最后分析明白了——到目前为止,也只是明白了那段代码,仍然无法做到能够应用。

下面是这三个文件的代码:

—————————————–pagebean.java———————————————–

//该bean用于实现分页功能时得到总的记录数和最大的页数

package ringz.javabeans;

import java.io.*;

import java.sql.*;

public class pagebean

{

private int maxrowcount;//最大记录数

private int onepagerowcount;//每页显示的记录数

private int maxpagecount;//最大页数

private string classforname;

private string servanddb;

private string sql;

//

//得到关于目标数据库的搜索条件

public void setsql(string s1,string s2,string sql)

{

this.classforname=s1;

this.servanddb=s2;

this.sql=sql;

}

//得到onepagerowcount

public void setonepagerowcount(int counts)

{

onepagerowcount=counts;

}

//计算maxrowcount并返回

public int getmaxrowcount()throws exception

{

try

{

class.forname(classforname);//载入驱动程式类别

connection con=drivermanager.getconnection(servanddb);//建立数据库连接

statement stmt=con.createstatement();//建立statement变量

resultset rs=stmt.executequery(sql);

if (rs.next())

maxrowcount=rs.getint(1);

rs.close();

stmt.close();

con.close();

return maxrowcount;

}//try

catch (exception e)

{

e.printstacktrace();

throw e;

}

}//getmaxrowcount()

//根据maxrowcount和onepagerowcount计算出maxpagecount并返回

public int getmaxpagecount()

{

if (maxrowcount%onepagerowcount==0)

maxpagecount=maxrowcount/onepagerowcount;

else

maxpagecount=maxrowcount/onepagerowcount+1;

return maxpagecount;

}

}

———————————————————————————

—————————-countbean.java————————————

//该bean用于接收具体页数然后返回该页应显示的记录

package ringz.javabeans;

import java.util.*;

import java.io.*;

import java.sql.*;

public class countbean

{

private int pagenum;//当前是第几页

private string classforname;

private string servanddb;

private string sql;

vector v=new vector();

//得到关于目标数据库的搜索条件

public void setsql(string s1,string s2,string sqlstr)

{

this.classforname=s1;

this.servanddb=s2;

this.sql=sqlstr;

}

//得到pagenum

public void setpagenum(int pagenum)

{

this.pagenum=pagenum;

}

//返回结果

public vector getresult(string listname[])throws exception

{

int num=listname.length;//得到数组的长度

string listname[]=new string[num];//定义一个大小为num的string型数组

for(int i=0;i<num;i++)

listname[i]=listname[i];//将目标数组的内容传给listname数组

try

{

class.forname(classforname);

connection con=drivermanager.getconnection(servanddb);

statement stmt=con.createstatement();

resultset rs=stmt.executequery(sql);

int i=1;

while(rs.next())

{

object[] obj=new object[num];

for(int j=0;j<num;j++)

obj[j]=rs.getstring(listname[j]);

v.add(obj);

i++;

}//while

rs.close();

stmt.close();

con.close();

return v;

}//try

catch(exception e)

{

e.printstacktrace();

throw e;

}//catch

}

}

———————————————————————————-

编译上面这两个文件的时候,发现如果不把“错误”扔掉(throw e),就无法编译成功,我不明白具体原因。

———————————–page.jsp—————————————

<%@ include file="include.inc"%>

<%@ page contenttype="text/html;charset=gb2312"%>

<jsp:usebean id="page1" scope="page" class="ringz.javabeans.pagebean"/>

<jsp:usebean id="page2" scope="page" class="ringz.javabeans.countbean"/>

<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">

<html>

<head>

<meta http-equiv="content-type" content="text/html; charset=gb2312">

<title>分页的实现</title>

<style type="text/css">

<!–

body {

margin-left: 10%;

margin-right: 10%;

}

–>

</style>

<script language="javascript" type="text/javascript">

<!–

function jumping(jump){ //v3.0 ***用于页面跳转

var pageid=jump.value;

var url=pageid;

window.location.href = url;

}

//–>

</script>

</head>

<body>

<%

int pagenum;

try

{

pagenum=integer.parseint(request.getparameter("page"));//得到“要显示第几页”

}

catch(exception e)

{

pagenum=1;//如果出错说明pagenum没有接收到"page",那么就把pagenum初始为1

}

int onepagerowcount=10;//每页的条数************按需要改变

string s1="oracle.jdbc.driver.oracledriver";//定义载入驱动程式的字符串

string s2="jdbc:oracle:thin:name/password@ringz:1521:rock";//定义建立数据库连接的字符串************按需要改变

string sql="select count(*) from article";//确定记录总数的查询语句************按需要改变

page1.setsql(s1,s2,sql);

page1.setonepagerowcount(onepagerowcount);

int maxrowcount=page1.getmaxrowcount();//获得记录总数

int maxpagecount=page1.getmaxpagecount();//获得总的页数

page2.setpagenum(pagenum);

string listname[]={"id","author","time","title"};//要查询的字段名************按需要改变

int max=pagenum*onepagerowcount;//本页最后一条记录的行号

int min=(pagenum-1)*onepagerowcount+1;//本页第一条记录的行号

string sqlstr="select b.* from (select a.*,rownum row_num from (select * from article order by time desc) a where rownum<="+max+") b where row_num>="+min+"";//************按需要改变

page2.setsql(s1,s2,sqlstr);

if(maxrowcount>0)

out.println("<div align=left>共有"+maxrowcount+"条记录,每页显示"+onepagerowcount+"条。</div>");

%>

<table width="100%" border="1" align="center" cellpadding="0" cellspacing="0" bordercolorlight="#000000">

<tr bgcolor="#00ccff">

<td align="center">标题</td>

<td align="center">作者</td>

<td align="center">日期</td>

</tr>

<%

java.util.vector v=page2.getresult(listname);

java.util.enumeration e=v.elements();

while(e.hasmoreelements())

{

object[] obj=(object[])e.nextelement();//****************注意修改下面的几行

string id=obj[0].tostring();

string name=obj[1].tostring();

string time=obj[2].tostring();

string title=obj[3].tostring();

out.println("<tr>");

out.println("<td bgcolor=#eeeeee><div align=left><font color=#eeeeee><a href=view.jsp?id="+id+">"+title+"</a></font></div></td>");

out.println("<td width=15% bgcolor=#ffff99><div align=center>"+name+"</div></td>");

out.println("<td width=30% bgcolor=#9999ff><div align=center>"+time+"</div></td>");

out.println("</tr>");

}

%>

</table>

<div align="right">

<%

string filename="page";//**************************将文件名作为变量***********************

out.print("第<font color=red>"+pagenum+"</font>页 共"+maxpagecount+"页&nbsp;&nbsp;&nbsp;");

if (maxpagecount>1)//不只有一页

{

if (pagenum==1)//当前页是首页

{

out.print("首页 | 上一页 | <a href="+filename+".jsp?page="+(pagenum+1)+">下一页</a> | ");

out.print("<a href="+filename+".jsp?page="+maxpagecount+">尾页</a> ");

}//if (pagenum==1)

else

{

if (pagenum==maxpagecount)//当前页是尾页

{

out.print("<a href="+filename+".jsp?page=1>首页</a> | ");

out.print("<a href="+filename+".jsp?page="+(pagenum-1)+">上一页</a> | 下一页 | 尾页 ");

}//if (pagenum==maxpagecount)

else//当前页不是上面的2种情况

{

out.print("<a href="+filename+".jsp?page=1>首页</a> | ");

out.print("<a href="+filename+".jsp?page="+(pagenum-1)+">上一页</a> | ");

out.print("<a href="+filename+".jsp?page="+(pagenum+1)+">下一页</a> | ");

out.print("<a href="+filename+".jsp?page="+maxpagecount+">尾页</a> ");

}

}

%>

跳转到第

<select name="jumps" onchange="jumping(this)">

<%

for (int i=1;i<=maxpagecount;i++)

{

if (i==pagenum)

{%>

<option value="<%=filename%>.jsp?page=<%=i%>" selected><%=i%></option>

<%} else {%>

<option value="<%=filename%>.jsp?page=<%=i%>"><%=i%></option>

<%} } %>

</select>



<%

}//if (maxpagecount!=1)

%>

</div>

</body>

</html>

———————————————————————————-

整个的分页功能写完后,我发现还是有很大的不足:显示分页的页面(page.jsp)代码太多,其他页面引用该功能的时候还是要从这里复制大段的代码,而且其中需要根据实际情况改动的地方多达七处(标注很多*的地方),这很容易出错,不利于管理使用,但是至今我仍找不到一个合适的方法解决这个问题——希望高手们扔玉。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 一个Jsp初学者的学习过程(五)-JSP教程,Jsp/Servlet
分享到: 更多 (0)