最初写的:  

1、可以实现的功能: 
首页,末页,上一页,下一页以及指定页的跳转。 
首页末页有自动隐藏的功能。 
跳转下拉菜单动态显示当前页码和总页数。  

2、原理  

核心原理参考Codefusion MX 附带的Compass Travel例子 中tripdetail.cfm的翻页原理。即假设当前页为第6页,对数据库进行查询,返回数maxRows 定为1,查上一页就是对小于6的数进行倒序查询,得出的结果是5,4,3...,因为只返回一个值,所以就得到了5。其他的同理。  

3、使用方法  

将代码放入要实现pagelist的地方,用查找替换修改里面的cfsnippets,centers和center_ID,把他们换成实际使用的数据库名,表名和字段名。  

4、局限与不足  

因为学cf不到一个星期,对cfml还不是很熟悉,所以有些代码还是很繁琐,我觉得不足的地方有: 
(1)样式具有局限性,因为采用的是表单form,所以只能用button或图片来显示,不能用单纯的文字。 
(2)修改还得要用查找替换。原来设想只改前面数据库定义的三个变量就可以,但后来发现在<cfout>里面使用查询的结果,必须要是确定的值,比如#gotopage.currentrow#,而不能再在里面使用动态参数,请问高手有什么好的解决办法?  




<!--- 数据库定义 ---> 
<cfset databasename="cfsnippets"><!--- 数据库名 ---> 
<cfset tablename="centers"><!--- 表名 ---> 
<cfset targetname="center_ID"><!--- 字段名(一般为ID),定义这里的同时,还要用查找替换所有gotopage.center_ID里面的center_ID --->  

<!--- 处理跳转的动作 ---> 
<cfif IsDefined("Form.RecordID")><!--- 判断是否有跳转请求 ---> 
<cfquery name="pageQuery" datasource="#databasename#" maxrows="1"> 
SELECT #targetname# FROM #tablename#             
<cfif IsDefined("Form.btnPrev")><!--- 前一页页码 ---> 
WHERE #targetname# < #Form.RecordID# 
ORDER BY #targetname# DESC         
<cfelseif IsDefined("Form.btnNext")><!--- 后一页页码 ---> 
WHERE #targetname# > #Form.RecordID# 
ORDER BY #targetname#         
<cfelseif IsDefined("Form.btnFirst")><!--- 首页页码 ---> 
ORDER BY #targetname#         
<cfelseif IsDefined("Form.btnLast")><!--- 末页页码 ---> 
WHERE #targetname# > #Form.RecordID# 
ORDER BY #targetname# DESC 
<cfelseif IsDefined("Form.goto")><!--- 指定页码 ---> 
WHERE #targetname# = #Form.goto# 
</cfif> 
</cfquery> 
<cfif pageQuery.RecordCount is 1> 
<cflocation url="#cgi.SCRIPT_NAME#?ID=#pageQuery.center_ID#"><!--- 跳转 ---> 
<cfelse> 
<cflocation url="#cgi.SCRIPT_NAME#?ID=#page.RecordID#"> 
</cfif> 
</cfif>  

<!--- 获取首页与末页所对应的ID ---> 
<cfquery name="gotopage" datasource="#databasename#" > 
SELECT #targetname# FROM #tablename# 
</cfquery> 
<cfoutput query="gotopage"> 
<cfif gotopage.currentrow is 1> 
<cfset firstid=gotopage.center_ID><!--- 首页对应的ID ---> 
<cfelseif gotopage.currentrow is gotopage.recordcount> 
<cfset lastid=gotopage.center_ID><!--- 末页对应的ID ---> 
</cfif> 
</cfoutput>  

<!--- 获取本页所对应的ID,如没有传递,默认为首页ID ---> 
<cfif isdefined("url.id")> 
<cfset pageid=url.id> 
<cfelse> 
<cfset pageid=firstid> 
</cfif>  

<!--- 翻页主体部分 ---> 
<form action="#cgi.SCRIPT_NAME#" method="post"> 
<input type="hidden" name="RecordID" value="<cfoutput>#pageid#</cfoutput>"><!--- 隐藏字段传送本页ID --->  

<!-- 首页/上一页--> 
<cfif pageid neq firstid> 
<input type="submit" name="btnFirst" value="首页"> 
<input type="submit" name="btnPrev" value="上一页"> 
</cfif>  

<!-- 页数 ,跳转--> 
<B>跳转到: </B>第<select name="goto"> 
<cfoutput query="gotopage"> 
<cfif gotopage.center_ID is pageid> 
<option value="#gotopage.center_ID#" selected>#gotopage.currentrow#<!--- 使本页的数字处于被选择状态 ---> 
<cfelse> 
<option value="#gotopage.center_ID#">#gotopage.currentrow# 
</cfif> 
</cfoutput> 
</option></select>/<cfoutput >#gotopage.recordcount#</cfoutput>页 
<input name="Go" type="submit" value="GO">  

<!-- 末页/下一页--> 
<cfif pageid neq lastid> 
<input type="submit" name="btnNext" value="下一页"> 
<input type="submit" name="btnLast" value="末页"> 
</cfif> 
</form>  


后来发现不对劲,又进行了修改:  

上面的代码只能用来list每页只有一个记录的page,如果一页有多个记录,上面的方法是不行的。  

下面是我做了修改的代码,可以实现一个页面放多个记录了,每个页面放多少个记录可以在pagerow里面定义,此外也不需要通过查找替换来更改了,只要把初始化里面的四个参数定为自己相关的内容就行了,别的地方不需要改了。  

代码比原来的又精简了不少 :)  


<!--- 初始化 ---> 
<cfset databasename="cfsnippets"><!--- 数据库名 ---> 
<cfset tablename="centers"><!--- 表名 ---> 
<cfset targetname="center_ID"><!--- 字段名(一般为ID) ---> 
<cfset pagerow=1><!--- 每页记录数 ---> 
<!--- 处理跳转的动作 ---> 
<cfif IsDefined("Form.thispage")><!--- 判断是否有跳转请求 --->         
<cfif IsDefined("Form.btnPrev")><!--- 前一页页码 ---> 
<cfset pageQuery=#Form.thispage#-1>     
<cfelseif IsDefined("Form.btnNext")><!--- 后一页页码 ---> 
<cfset pageQuery=#Form.thispage#+1>         
<cfelseif IsDefined("Form.btnFirst")><!--- 首页页码 ---> 
<cfset pageQuery=1>         
<cfelseif IsDefined("Form.btnLast")><!--- 末页页码 ---> 
<cfset pageQuery=#Form.lastpage#> 
<cfelseif IsDefined("Form.goto")><!--- 指定页码 ---> 
<cfset pageQuery=#Form.goto#> 
</cfif> 
<cflocation url="#cgi.SCRIPT_NAME#?page=#pageQuery#"><!--- 跳转 ---> 
</cfif> 
<!--- 获取末页页码 ---> 
<cfquery name="gotopage" datasource="#databasename#" > 
SELECT #targetname# FROM #tablename# 
</cfquery> 
<cfset lastpage=#gotopage.recordcount#\pagerow><!--- 末页页码 ---> 
<!--- 获取本页页码,如没有传递,默认为1 ---> 
<cfif isdefined("url.page")> 
<cfset pageid=url.page> 
<cfelse> 
<cfset pageid=1> 
</cfif> 
<!--- 翻页主体部分 ---> 
<form action="" method="post"> 
<input type="hidden" name="thispage" value="<cfoutput>#pageid#</cfoutput>"><!--- 隐藏字段传送本页ID ---> 
<input type="hidden" name="lastpage" value="<cfoutput>#lastpage#</cfoutput>"><!--- 隐藏字段传送末页页码 ---> 
<!-- 首页/上一页--> 
<cfif pageid neq 1> 
<input type="submit" name="btnFirst" value="首页"> 
<input type="submit" name="btnPrev" value="上一页"> 
</cfif> 
<!-- 页数 ,跳转--> 
<B>跳转到: </B>第<select name="goto"> 
<cfloop index="pagenumber" from="1" to="#lastpage#"> 
<cfoutput> 
<cfif #pagenumber# is pageid> 
<option value="#pagenumber#" selected>#pagenumber#<!--- 使本页的数字处于被选择状态 ---> 
<cfelse> 
<option value="#pagenumber#">#pagenumber# 
</cfif> 
</cfoutput> 
</cfloop> 
</option></select>/<cfoutput >#lastpage#</cfoutput>页 
<input name="Go" type="submit" value="GO"> 
<!-- 末页/下一页--> 
<cfif pageid neq lastpage> 
<input type="submit" name="btnNext" value="下一页"> 
<input type="submit" name="btnLast" value="末页"> 
</cfif> 
</form>  


呵呵,一个菜鸟版的pagelist终于完成,十分简单,用的方法也挺笨的。