自定义分页标签的使用.docx
- 文档编号:7068320
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:19
- 大小:36.77KB
自定义分页标签的使用.docx
《自定义分页标签的使用.docx》由会员分享,可在线阅读,更多相关《自定义分页标签的使用.docx(19页珍藏版)》请在冰豆网上搜索。
自定义分页标签的使用
JSP扩展制作自定义分页标签
●分页标签:
当查询数据的记录很多的时候,我们通过控制每页显示的记录数来对页面显示友好性进行控制。
●显示效果:
当第一次进入到该页面的时候,显示为首页记录,比如每页显示5条记录。
单击下一页图片时,可以翻转到下一页5条记录。
也操作的过程中,也可以直接跳转到最后一页和第一页。
●编码思路:
✓需要实现分页,首先我们需要知道在数据库中如何实现分页SQL语句的拼写:
selecttop5emp_id,fname,minit,lname,job_id,job_lvl,pub_id,hire_date
fromemployeewhereemp_idnotin
(selecttop5emp_idfromemployeeorderbyemp_iddesc)
orderbyemp_iddesc
select*from(selectrownumrn,isbn,title,editionnumber
copyright,publisherid,imagefile,pricefromtitles)
wherern>1*5andrn<=2*5(Oracle)
在该SQL语句中,关键的代码是红色代码部分,其中top5是指每页可以查询的记录条数,而主查询中的notin是指排除子查询中的记录条数。
如果每次进行查询时,都可以有规律的对子查询中的记录进行排除查询,那么我们就可以很快得到下一页,上一页,首页和尾页的5条记录了。
注意:
orderby非常重要,不管是在子查询还是在主查询中,都必须对记录进行排序,或则,当页数发生改变时,不能准确定位到下一页的5条记录。
✓代码实现思路
利用自定义标签实现分页标签的全部思路。
分页标签要定义的几个部分:
PageTag.java:
TagSupport的实现子类。
在该类的doStartTag()方法中,我们要实现对页面分页标签的所有涉及参数初始值的设置。
这些初始值包括:
//该变量存当前页码的值
StringpageIndexSessionName="";
//该变量存表的记录总数的值
StringrowCountSessionName="";
//该变量存有每页显示多少记录的值
StringpageNumberSessionName="";
//每页记录数
intpagePerNumber=0;
//表的总记录数
intpageAllNumber=1;
//当前页码
intpageCurrentIndex=0;
//首页索引
intpageFirstIndex=0;
//上一页索引
intpageUpIndex=0;
//下一页索引
intpageDownIndex=0;
//末页索引
intpageLastIndex=0;
//表的总页数
intpageShowNumber=0;
doAfterBody()方法中用输出流的方式为客户端输出标签样式,其中标签的主要实现的HTML代码如下:
SubmitButton(0)'style='COLOR: #336699'> SubmitButton(0)'style='COLOR: #336699'> SubmitButton (1)'style='COLOR: #336699'> SubmitButton(8)'style='COLOR: #336699'> 共 #336699'>43项 页次: #336699'>1/ #336699'>9
document.onkeydown=SubmitPress;
functionSubmitPress(){
if(event.keyCode==13)
{vartheInputNumber=document.forms[0].elements['pageIndexSessionName'].value;if(isNaN(theInputNumber)){
alert('请输入数字!
');returnfalse;}
elseif(parseFloat(theInputNumber)==0){
alert('请输入大于零的数字!
');
returnfalse;
}else{
document.forms[0].target="_self";
document.forms[0].submit();}}
}
functionSubmitButton(index){
document.forms[0].elements['pageIndexSessionName'].value=index;
document.forms[0].action=window.location;
document.forms[0].target="_self";
document.forms[0].submit();}
效果如下:
其中,只要我们每次提交的表单是指向同一个查询语句,我们就在页面动态的将计算好的页面编号传递给表单提交对象。
✓标签已经完成,结合前面说明的数据库查询语句,我们就可以进行分页标签的使用了。
●实现环节:
(全部代码)
✓第一步:
(1)建立一个标签文件:
PageTag.java,实现主要的分页数据计算,和页面分页样式的显示功能。
所有页面可以直接引用该分页标签。
该类实现TagSupport的继承。
publicclassPageTagextendsTagSupport
(2)在类中方法之前定义需要计算的所有页面数据成员变量:
//该变量存当前页码的值
StringpageIndexSessionName="";
//该变量存表的记录总数的值
StringrowCountSessionName="";
//该变量存有每页显示多少记录的值
StringpageNumberSessionName="";
//每页记录数
intpagePerNumber=0;
//表的总记录数
intpageAllNumber=1;
//当前页码
intpageCurrentIndex=0;
//首页索引
intpageFirstIndex=0;
//上一页索引
intpageUpIndex=0;
//下一页索引
intpageDownIndex=0;
//末页索引
intpageLastIndex=0;
//表的总页数
intpageShowNumber=0;
(3)在doStartTag()方法中定义所有页面参数的初始化过程。
//读取初始参数值
publicintdoStartTag()throwsJspException{
HttpSessionsession=pageContext.getSession();
//当前页码的值
StringcurrentPage=(String)session.getAttribute(
"pageIndexSessionName");
if(currentPage==null||currentPpareTo("")==0){
currentPage="0";
}
//转换当前页码的值给成员变量pageCurrentIndex(当前页面)
pageCurrentIndex=Integer.parseInt(currentPage);
//表的记录总数
StringrowCount=(String)session.getAttribute("rowCountSessionName");
if(rowCount==null||rowCpareTo("")==0){
rowCount="0";
}
//转换表的总记录数的值给成员变量pageAllNumber
pageAllNumber=Integer.parseInt(rowCount);
//每页页面记录数量
StringperRecordNumber=(String)session.getAttribute(
"pageNumberSessionName");
if(perRecordNumber==null||perRecordNpareTo("")==0){
perRecordNumber="0";
}
pagePerNumber=Integer.parseInt(perRecordNumber);
//显示的页数
if(pagePerNumber==0){
pageShowNumber=0;
}else{
pageShowNumber=pageAllNumber/pagePerNumber;
if(pageAllNumber%pagePerNumber!
=0){
pageShowNumber++;
}
}
if(pageShowNumber==0){
pageShowNumber=1;
}
if(pageShowNumber==0){
pageShowNumber=1;
}
//得到首页索引
pageFirstIndex=0;
//得到上一页索引
pageUpIndex=pageCurrentIndex-1;
if(pageUpIndex<0){
pageUpIndex=0;
}
//得到下一页索引
pageDownIndex=pageCurrentIndex+1;
if(pageDownIndex>pageShowNumber-1){
pageDownIndex=pageShowNumber-1;
}
if(pageDownIndex<0){
pageDownIndex=0;
}
//得到末页索引
pageLastIndex=pageShowNumber-1;
if(pageLastIndex<0){
pageLastIndex=0;
}
//返回EVAL_BODY_INCLUDE执行doAfterBody()方法
returnEVAL_BODY_INCLUDE;
}
(4)在doAfterBody()中声明好输出的标签组件。
publicintdoAfterBody()throwsJspException{
HttpServletRequestrequest=(HttpServletRequest)pageContext.
getRequest();
Stringcontext=request.getContextPath();
try{
StringBufferbuffer=newStringBuffer();
buffer.append("
buffer.append("
");buffer.append("
buffer.append("
buffer.append("
buffer.append(" "); buffer.append("SubmitButton("); buffer.append(pageFirstIndex); buffer.append(")'"); buffer.append("style='COLOR: #336699'> buffer.append(" "); buffer.append("SubmitButton("); buffer.append(pageUpIndex); buffer.append(")'"); buffer.append("style='COLOR: #336699'> buffer.append(" "); buffer.append("SubmitButton("); buffer.append(pageDownIndex); buffer.append(")'"); buffer.append("style='COLOR: #336699'> buffer.append(" "); buffer.append("SubmitButton("); buffer.append(pageLastIndex); buffer.append(")'"); buffer.append("style='COLOR: #336699'> buffer.append("共 #336699'>"); buffer.append(pageAllNumber); buffer.append("项 页次: #336699'>"); buffer.append(pageCurrentIndex+1); buffer.append("/ #336699'>"); buffer.append(pageShowNumber); //buffer.append("页跳到"); //buffer.append(" 30px'>页"); //buffer.append(" buffer.append("
buffer.append("
buffer.append("document.onkeydown=SubmitPress;functionSubmitPress(){if(event.keyCode==13){");
buffer.append("vartheInputNumber=document.forms[0].elements['pageIndexSessionName'].value;");
buffer.append("if(isNaN(theInputNumber)){alert('请输入数字!
');returnfalse;}");
buffer.append("elseif(parseFloat(theInputNumber)==0){alert('请输入大于零的数字!
');returnfalse;}else{");
buffer.append("document.forms[0].target=\"_self\";");//lb
buffer.append("document.forms[0].submit();}}}");
buffer.append("functionSubmitButton(index){document.forms[0].elements['pageIndexSessionName'].value=index;");
buffer.append("document.forms[0].action=window.location;");
buffer.append("document.forms[0].target=\"_self\";");
buffer.append("document.forms[0].submit();}");
buffer.append("");
JspWriterout=pageContext.getOut();
out.print(buffer.toString());
}catch(IOExceptionex){
ex.printStackTrace();
}
returnSKIP_BODY;
}
✓第二步:
写完标签类后,需要为该标签类申明好配置文件。
PageTag.tld:
xmlversion="1.0"encoding="ISO-8859-1"?
>
DOCTYPEtaglibPUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.1//EN"
"
✓第三步:
分页标签写完以后,就可以对查询的代码进行分页处理了。
我们分别创建一段标准的查询代码,并让其查询结果显示在一JSP页面上,这个部分一共由1个控制器:
QueryServlet.java,1一个数据持久对象JavaBean:
Employee.java和1个数据连接工厂类:
DBCon.java,一对业务逻辑实现接口QueryEmployee.java和QueryEmployeeImp.java
(1)数据库连接类DBCon.java
packageutil;
importjava.sql.*;
publicclassDBCon{
privateConnectionconn=null;
privateStatementstmt=null;
privateResultSetrs=null;
privatestaticDBCondbBasic;
//工厂方法
publicstaticDBCongetInstance(){
if(dbBasic==null){
dbBasic=newDBCon();
}
returndbBasic;
}
//连接数据库
privateConnectiongetConnection()throwsSQLException,
ClassNotFoundException{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
this.conn=DriverManager.getConnection(
"jdbc:
microsoft:
sqlserver:
//lo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自定义 分页 标签 使用
![提示](https://static.bdocx.com/images/bang_tan.gif)