关于含有复合查询条件的分页显示问题?(已搜索完以前帖子,无好办法,解决了给200分)

superaf 2003-03-26 09:38:53
现在有个项目中牵涉到一个复合查询条件的分页问题,看了以前的帖子,有两类:
1,在jsp中直接些数据库操作,不用javabean,
2,利用javabean来操作数据库执行语句.
其中在方法一中的下面语句中:
第<%=intPage%>页  共<%=intPageCount%>页  <%if(intPage<intPageCount){%><a href="jdbc20-oracle.jsp?page=<%=intPage+1%>">下一页</a><%}%>  <%if(intPage>1){%><a href="jdbc20-oracle.jsp?page=<%=intPage-1%>">上一页</a><%}%>
传递的参数只需要传递一个page页码就可以(经测试过)
但在方法二中,在上面的语句中,就需要传递查询条件,但我现在的页面中有复合查询条件,参数的传递十分麻烦,问题就出在这里,现在贴出源码中的关键代码,请各位分析下:


<%@include file="newHead.inc"%>
<jsp:useBean id='sqlbean' scope='page' class='wisfile.sql_file'/>

<%//取得用户登录信息,判断用户是否已登录,以便后面的数据查询;
String sUsername;
boolean loginOK = false;

sUsername = (String)session.getAttribute("username");

if( sUsername!="" && sUsername!=null )
loginOK = true;
else
response.sendRedirect("index.jsp");
%>

<script>
lastobj=null;

function setbg(obj)
{
if(lastobj!=null)
lastobj.bgColor="";
obj.bgColor="yellow";
lastobj=obj;
}

var oWindow;
var iDialogHeight = 600;
var iDialogWidth = 800;
function showIt(sPage,sTitle)
{
window.open (sPage, sTitle, 'toolbar=no, menubar=no, scrollbars=yes, resizable=yes,location=no, status=no');
}
</script>


<div align="center"><center>
<table align="center" border="0" width="760" cellspacing="0" cellpadding="0">
<tr>
<td valign="top" width="160">
<%@include file="newLeft_1.inc"%>
</td>
<td width="3" height="100%" bgcolor="#800000"></td>
<td width="10" height="100%"></td>
<td width="587" valign="top">

<table align="center" width="98%" border="1" cellpadding="0" cellspacing="0" bgcolor="#FFFFF0" bordercolor="#000000" >
<TBODY bgcolor="#9CCF9C" text="#000000" leftmargin="4" topmargin="2">
<tr>
<td colspan="15" height="36" width="100%">
<div align="center"><b><font color="#0000FF">要素查询列表</font></b></div>
</td>
</tr>
<tr bgcolor="bddfff">
<td width="180" height="36">
<div align="center"><font size="2">日期</font></div>
</td>
<td width="120" height="36">
<div align="center"><font size="2">序号</font></div>
</td>
<td width="112" height="36">
<div align="center"><font size="2">部门号</font></div>
</td>
<td width="200" height="36">
<div align="center"><font size="2">金额</font></div>
</td>
<td width="224" height="36">
<div align="center"><font size="2">交易代码</font></div>
</td>
<td width="224" height="36">
<div align="center"><font size="2">地址</font></div>
</td>
</tr>
<%
...全文
49 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
superaf 2003-03-28
  • 打赏
  • 举报
回复
好了,兄弟,买单了,特别感谢jcq(疯子弟)短消息的帮助和关注!
再开一贴散分
superaf 2003-03-27
  • 打赏
  • 举报
回复
楼上的都讲的不错,我的那个问题解决了,是因为一个语法的错误.现已修正.
今天我看书发现和xmpp(火狐狸)讲的雷同的一个分页方法,我把思路也说说:

1.使用一个javabean类来记录分页page的各个属性,如下:
public class page
{
public int pageCount ; // 一共有多少页
public int recordCount; // 查询的记录条总数
public int pageId ; // 将要显示的页码
public int pageSize; // 每页规定的显示记录条数
}
2.然后在jsp里面利用Vector 创建一个数组
Vector idList=net Vector();
.......
......
......
然后把各个属性值填进去.
3.在每次分页的时候,从session里面取出idList里面的pageId来作为开始的记录号,顺序取出记录数就ok了.
见<jsp程序设计精彩百例>

ps:大家都是同行,讨论问题只是为了更好解决问题,却勿大火气 :)

remanwang 2003-03-26
  • 打赏
  • 举报
回复
他们说的办法都正确,我说另外两个方法,参考一下吧.
1.将sql语句生成后作为一个参数传递.
2.如果参数太多都放在后面太麻烦,比如我做的系统还要排序,排序还有正序和倒序等,我在页面上加了一些<input type=hidden>把这些值放在里面,翻页时将form提交
yzxasd 2003-03-26
  • 打赏
  • 举报
回复

只要你提交查询的时候将信息跟在url上,以后分页的时候都取location,然后替换页码,就一切轻松搞定,就是上面的js
jcq 2003-03-26
  • 打赏
  • 举报
回复
其实就是你的.jsp页多带几个参数就可以吧,你的查询条件输入应该对应很多的text之类吧,作为直接使用“上一页”等进行翻页时将参数带进去不就可以了。
比如:
有两个输入框分别是:txta,txtb
在使用查询时:String a = reqeust.getParameter("txta");String b = request.getParameter("txtb");
然后在生成“上一页”的时候用
test.jsp?txta=<%=a%>&txtb=<%=b%>&page=...
不就可以了吗
yzxasd 2003-03-26
  • 打赏
  • 举报
回复
你这种方法可以啊
我是这么做的:
我将所有查询条件都放在url中,在翻页时,利用javascript将url做一些小的改动,以下是我的一个javascript函数,主要的是其中我标记的一句:
function TurnToXPage(a)
{
if (parent.rightFrame.form1)
{
if (!parent.rightFrame.form1.PageCount)
{alert(" 浏览页面没载入完成,请重试!");return false;}
}
else
{
alert(" 浏览页面没载入完成,请重试!"); return false;
}

var mystring=new String(parent.rightFrame.location);
mystring=mystring.toUpperCase();
a=a.toUpperCase();
if (mystring.indexOf("NODEID=")==-1 && mystring.indexOf("PAGENO=")==-1)
{alert("当前的页面不能翻页,请选择资源范围!");return false;}
else
{ var pagenum=1;
var CurrentPage=parseInt(parent.rightFrame.form1.PageNo.value);
var TotalPage=parseInt(parent.rightFrame.form1.PageCount.value);
if (TotalPage=="0")
{
alert("仅有一页!");return false;
}
switch(a)
{
case "N":
if (CurrentPage<TotalPage)
{ pagenum=CurrentPage+1;
}
else
{ alert("已经是最后一页了!");return false;}
break;
case "L":
if (CurrentPage==TotalPage)
{alert("已经是最后一页了!");return false;}
else
pagenum=TotalPage;
break;
case "F":
if (CurrentPage<2 )
{alert("已经是第一页了!");return false;}
else
pagenum=1;
break;
case "P":
if (CurrentPage>1)
{ pagenum=CurrentPage-1;}
else
{ alert("已经是第一页了!");return false;}
break;
default:
alert("翻页参数错误!(TurnToXPage:a="+a+")");
return false;
}


mystring=mystring.replace("PAGENO="+CurrentPage,"PAGENO="+pagenum);
这句就是你要的解决方法:用新的页码数代替原来的页码数

//alert(mystring)
if (mystring.search("TFLAG=1")!=-1){
mystring=mystring.replace("TFLAG=1","TFLAG=0");
}else if (mystring.search("TFLAG=0")==-1)
{
mystring = mystring+"&TFLAG=0"
}
var FolderC=parent.TypeFrame.form1.FolderC.value
var RecordC=parent.TypeFrame.form1.RecordC.value
if (mystring.search("FOLDERC=")==-1)
{
mystring = mystring+"&FolderC="+FolderC+"&RecordC="+RecordC
}
//alert(mystring)
parent.rightFrame.location=mystring;
}
}

看看可以帮你不
superaf 2003-03-26
  • 打赏
  • 举报
回复
String sdocdate,sbankno,sbatchno,sitemno,sserialsno,sproof,samount,svchnum,ssubset,sacsynum,spicpt,sImageAddress,sImageAddressDir,sImageAddressFile;
String items_input_docdatebegin,items_input_docdateend; //这是从页面接收的查询条件
String items_input_moneybegin,items_input_moneyend,items_input_subset,items_input_accountno; //这是从页面接收的查询条件

String sql;
boolean loginAttempt = false;
int iacsyno;
int rowcnt = 0;
int rowno = 0;

int intPageSize; //一页显示的记录数
int intRowCount; //记录总数
int intPageCount; //总页数
int intPage; //待显示页码
String strPage; //请求的页码
int i; //循环控制参数
ResultSet rs; //返回数据集

boolean firstCondition=true;

loginAttempt = true;

strPage = request.getParameter("page"); //取得请求显示的页码
if (loginAttempt)
{
//取得页面上的查询条件
items_input_docdatebegin= (String)request.getParameter("textfield2")+(String)request.getParameter("textfield3")+(String)request.getParameter("textfield4");
items_input_docdateend=(String)request.getParameter("textfield22")+(String)request.getParameter("textfield32")+(String)request.getParameter("textfield42");
items_input_moneybegin = (String)request.getParameter("textmoney1");
items_input_moneyend = (String)request.getParameter("textmoney2");
items_input_subset=(String)request.getParameter("textsubset");
items_input_accountno=(String)request.getParameter("textaccountno");

//下面含有复合查询语句,麻烦就在这
sql="select v.DocDate DocDate1,v.BankNo BankNo1,v.BatchNo BatchNo1,v.ItemNo ItemNo1,v.SerialsNo SerialNo1,v.Proof Proof1,v.Amount Amount1,v.VchNum VchNum1,v.Subset Subset1,v.AcsyNum AcsyNum1,p.PicPt PicPt1,p.AcsyNo AcsyNo1,p.ReceiptNo ReceiptNo1,p.WritedCD ,p.HDPath,p.CDPath,p.PicVolume,p.IdxDir IdxDir1,p.fName fName1 ,p.bName bName1 from VchRecords v,PicInfs p";

if (!items_input_docdatebegin.trim().equalsIgnoreCase(""))
{
if (firstCondition)
{
firstCondition=false;
sql=sql+" where v.DocDate>='"+items_input_docdatebegin+"'";
}
else
{
sql=sql+" and v.DocDate>='"+items_input_docdatebegin+"'";
}
}

if (!items_input_docdateend.trim().equalsIgnoreCase(""))
{
if (firstCondition)
{
firstCondition=false;
sql=sql+" where v.DocDate<='"+items_input_docdateend+"'";
}
else
{
sql=sql+" and v.DocDate<='"+items_input_docdateend+"'";
}
}

if (!items_input_moneybegin.trim().equalsIgnoreCase(""))
{
if (firstCondition)
{
firstCondition=false;
sql=sql+" where v.Amount>=$"+items_input_moneybegin;
}
else
{
sql=sql+" and v.Amount>=$"+items_input_moneybegin;
}
}

if (!items_input_moneyend.trim().equalsIgnoreCase(""))
{
if (firstCondition)
{
firstCondition=false;
sql=sql+" where v.Amount<=$"+items_input_moneyend;
}
else
{
sql=sql+" and v.Amount<=$"+items_input_moneyend;
}
}

if (!items_input_subset.trim().equalsIgnoreCase(""))
{
if (firstCondition)
{
firstCondition=false;
sql=sql+" where Subset='"+items_input_subset+"'";
}
else
{
sql=sql+" and Subset='"+items_input_subset+"'";
}
}
if (firstCondition)
{
firstCondition=false;
sql=sql+" where v.DocDate = p.DocDate and v.BankNo = p.BankNo and v.BatchNo=p.BatchNo and v.PicPt = p.PicPt and v.AcsyNum=p.AcsyNo and p.AcsyNo=0 order by v.RecordID";
}
else
{
sql=sql+" and v.DocDate = p.DocDate and v.BankNo = p.BankNo and v.BatchNo=p.BatchNo and v.PicPt = p.PicPt and v.AcsyNum=p.AcsyNo and p.AcsyNo=0 order by v.RecordID";
}

//设置一页显示的记录数
intPageSize = 1; //默认为10条记录

//取得待显示页码
//strPage = request.getParameter("page");

if(strPage == null)
{
intPage = 1;
}
else
{//将字符串转换成整型
intPage = Integer.parseInt(strPage);
if(intPage < 1)
intPage = 1;
}
rs = sqlbean.executeQuery(sql);
//0325 modified 分页功能修改 yjb
//获取记录总数
rs.last();
intRowCount = rs.getRow();

//记算总页数
intPageCount = (intRowCount+intPageSize-1) / intPageSize;

//调整待显示的页码
if(intPage>intPageCount) intPage = intPageCount;
if(intPageCount>0)
{
rs.absolute((intPage-1) * intPageSize + 1);
i = 0;
while(i<intPageSize && !rs.isAfterLast())
{
sdocdate= rs.getString("DocDate1");
sbankno= rs.getString("BankNo1");
sbatchno= rs.getString("BatchNo1");
sitemno= rs.getString("ItemNo1");
sserialsno= rs.getString("SerialNo1");
sproof= rs.getString("Proof1");
samount= rs.getString("Amount1");
svchnum= rs.getString("VchNum1");
ssubset= rs.getString("Subset1");
sacsynum= rs.getString("AcsyNum1");
spicpt= rs.getString("Picpt1");
sImageAddressDir= rs.getString("IdxDir1");
sImageAddressFile=rs.getString("fName1");

rowno = rs.getRow();

%>
<tr onclick=setbg(this)>
<td width="180">
<div align="center"><%=sdocdate%></div></td>
<td width="50">
<div align="center"><%=sbankno%></div></td>
<td width="50">
<div align="center"><%=sitemno%></div></td>
<td width="50">
<div align="center"><%=samount%></div></td>
<td width="50">
<div align="center"><%=ssubset%></div></td>
<%
if (!sImageAddressFile.trim().equalsIgnoreCase("") && !sImageAddressDir.trim().equalsIgnoreCase("") )
{
sImageAddress = sImageAddressDir+sImageAddressFile;
sImageAddress = replaceStr(sImageAddress,"\\","_______");
%>
<td width="112" align="center">
<a href="javascript:showIt('\showImg.jsp?imageaddress=<%=sImageAddress%>&docdate=<%=sdocdate%>&bankno=<%=sbankno%>&itemno=<%=sitemno%>&amount=<%=samount%>&subset=<%=ssubset%>','查询结果<%=rowno%>')">显示图片</a>
</td>
<%
}
else
{
sImageAddress = "无相应图片";%>
<td width="112" align="center"><%=sImageAddress%></a>
</td>
<% }
%>

</tr> <%
rs.next();
i++;
}

%>
</TBODY>
</table>
第<%=intPage%>页 共<%=intPageCount%>页
<%
out.print(intPage);
if(intPage<intPageCount)
{
%>
<a href="testpage.jsp?page=<%=intPage+1%>">下一页</a>
<%
}
%>
<%
if(intPage>1)
{
%>
<a href="testpage.jsp?page=<%=intPage-1%>">上一页</a>
<%
}
%>
<%
//关闭结果集
sqlRst.close();
</center></div>
<%@include file="newFoot.inc"%>

meizizi 2003-03-26
  • 打赏
  • 举报
回复
to jcq(疯子弟) 鄙人刚来此地,全为讨论技术问题,不会发表偏见!
meizizi 2003-03-26
  • 打赏
  • 举报
回复
to xmpp(火狐狸) 是个很好的思路!
meizizi 2003-03-26
  • 打赏
  • 举报
回复
to jcq(疯子弟) 我说的应用并不是在Struts中用的, 你说的对啊,如果你用完了这个页面connection是可以释放的啊,但如果你不离开这个页面,因为你的rs在页面中,所以你就不能关闭connection,完全可以做到翻业还在继续,但我的connection已经可以为它用,或是释放了。
而且这和把connection释放到什么地方没有关系。有特定的应用连接是不要关闭的呢,因为得到一个连接要花费的资源也是很可观的。 是可以把一个连接给另一个操作用的。

taglib 是好东西,但我说的还用不到呢,因为没有必要!jsp中的代码不多!
xmpp 2003-03-26
  • 打赏
  • 举报
回复
使用JavaBean,利用属性存入每页的记录数据,默认状态下是以那个字段的什么方式排序等。
在jsp文件中通过setter方法来改变bean中的属性来完成整个操作。
jcq 2003-03-26
  • 打赏
  • 举报
回复
to meizizi(怪怪):
jsp中越清晰越好,这个我同意,我还用taglib写过呢,不过这应该跟用什么方法分页应该没有什么关系吧。关于Connection不能关闭,我不同意呢,一次request后调用完这个页面后,我想connection应该就可以释放了吧,当然我想你释放到连接池就可以了。是不是看struts及jive看太多了。不是什么都一定要这样的,要看是不是适合呢。
meizizi 2003-03-26
  • 打赏
  • 举报
回复
思路倒是没有,可以发表一点拙见: 首先在jsp中java代码越少越好,越清晰越好好,翻页功能有个特点,就是要在很多的数据中进行来回的滚动,RS就不适合来当这个对象了,应该用Iterator 这个对象来做是最佳的选择。因为你用RS那你的Connecton就不能关闭,也不可它用。对连接资源是很大的浪费,connection是很宝贵的资源。
还有很多在此不一一说明了。
meizizi 2003-03-26
  • 打赏
  • 举报
回复
首先你在jsp中用了大量的java代码,这不符合做程序的标准!
在jsp中直接写代码也就限制了你要在jsp中直接操作结果集。
java该用的比较精华的东西都不去用。
.......
jcq 2003-03-26
  • 打赏
  • 举报
回复
to meizizi(怪怪):
说来听听。
jcq 2003-03-26
  • 打赏
  • 举报
回复
说说你的大致的思路吧。
meizizi 2003-03-26
  • 打赏
  • 举报
回复
现在还用这样的方法在做分页吗??我个人觉得你们的解决方法都不好,给个mail我发给你代码,相信你会喜欢的。
superaf 2003-03-26
  • 打赏
  • 举报
回复
这样啊,我按你上面的方法再试试,我不是这么写的.....等等`````
jcq 2003-03-26
  • 打赏
  • 举报
回复
<a href="jdbc20-oracle.jsp?page=<%=intPage+1%>">下一页</a>
就是这个地方你应该是这样:
<a href="jdbc20-oracle.jsp?page=<%=intPage+1%>&textfield2=<%=request.getParameter("textfield2")%>&textfield3=<%request.getParameter("textfield3")%>&.....">下一页</a>
jcq 2003-03-26
  • 打赏
  • 举报
回复
你有在上一页,下一页的<a> 中的url设置正确吗?有把这些参数带上吗
加载更多回复(3)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧