要实现分页,基本流程为JSP->PageTag->PageBean->Action,当然也可以反过来说。
1. 首先从Action说起吧,Action需要几个参数,其中pageNo(当前页),total(总共多少条记录)是必需的,查询的条件参数则是可选的。基本的Action代码如下:
需要说明的,上面的一些参数如pageNo,total对于每个需要分页的Action来说都是固定的,所以可以提取到一个抽象的类中。只要JSP页面的参数名与Action的变量名对应起来,ONGL就会把相应的值附给这些变量。如下:
其中includes包含的就是查询的条件参数名,它们与Action查询变量相对应。通过上面的JSP页面,可以看出用到了一个tag,不过这个tag tld文件很简单,page.tld:
这个tag对应的tag类也很简单:
需要注意的是ongl对变量的获取方法findValue的形式并不多,只提供对String的支持,因此需要用字符串变量,这方面的确不是很完善。这个tag会把相应的值交给PageBean进行分页显示的处理。因此最重要的东西其实是PageBean类:
1. 首先从Action说起吧,Action需要几个参数,其中pageNo(当前页),total(总共多少条记录)是必需的,查询的条件参数则是可选的。基本的Action代码如下:
- publicclassHelloWorldextendsActionSupport{
- privatestaticfinallongserialVersionUID=7046981255032101657L;
- //总共页数
- privateinttotal=40;
- //默认当前页为第一页
- privateintpageNo=1;
- //下面为条件参数
- privateStringtest="test";
- privatelongtest1=5L;
- privatefloattest2=9.8F;
- privateinttest3=8;
- publicStringexecute(){
- returnSUCCESS;
- }
- publicintgetTotal(){
- returntotal;
- }
- publicvoidsetTotal(inttotal){
- this.total=total;
- }
- publicintgetPageNo(){
- returnpageNo;
- }
- publicvoidsetPageNo(intpageNo){
- this.pageNo=pageNo;
- }
- publicStringgetTest(){
- returntest;
- }
- publicvoidsetTest(Stringtest){
- this.test=test;
- }
- publiclonggetTest1(){
- returntest1;
- }
- publicvoidsetTest1(longtest1){
- this.test1=test1;
- }
- publicfloatgetTest2(){
- returntest2;
- }
- publicvoidsetTest2(floattest2){
- this.test2=test2;
- }
- publicintgetTest3(){
- returntest3;
- }
- publicvoidsetTest3(inttest3){
- this.test3=test3;
- }
- }
需要说明的,上面的一些参数如pageNo,total对于每个需要分页的Action来说都是固定的,所以可以提取到一个抽象的类中。只要JSP页面的参数名与Action的变量名对应起来,ONGL就会把相应的值附给这些变量。如下:
- <p:pagespageNo="pageNo"total="total"
- includes="test,test1,test2,test3"/>
其中includes包含的就是查询的条件参数名,它们与Action查询变量相对应。通过上面的JSP页面,可以看出用到了一个tag,不过这个tag tld文件很简单,page.tld:
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPEtaglibPUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//EN"
- "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
- <taglib>
- <tlib-version>2.2.3</tlib-version>
- <jsp-version>1.2</jsp-version>
- <short-name>p</short-name>
- <uri>/p</uri>
- <display-name>"pagesTags"</display-name>
- <tag>
- <name>pages</name>
- <tag-class>com.page.PageTag</tag-class>
- <body-content>empty</body-content>
- <attribute>
- <name>pageNo</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- <attribute>
- <name>total</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- <attribute>
- <name>includes</name>
- <required>false</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- </tag>
- </taglib>
这个tag对应的tag类也很简单:
- publicclassPageTagextendsComponentTagSupport{
- privatestaticfinallongserialVersionUID=7242423813230124088L;
- //这里传递的参数需要用字符串的形式
- privateStringpageNo;
- privateStringtotal;
- privateStringincludes;
- publicvoidsetPageNo(StringpageNo){
- this.pageNo=pageNo;
- }
- publicvoidsetTotal(Stringtotal){
- this.total=total;
- }
- publicStringgetIncludes(){
- returnincludes;
- }
- publicvoidsetIncludes(Stringincludes){
- this.includes=includes;
- }
- @Override
- publicComponentgetBean(ValueStackarg0,HttpServletRequestarg1,
- HttpServletResponsearg2){
- returnnewPages(arg0);
- }
- protectedvoidpopulateParams(){
- super.populateParams();
- Pagespages=(Pages)component;
- pages.setPageNo(pageNo);
- pages.setIncludes(includes);
- pages.setTotal(total);
- }
- }
需要注意的是ongl对变量的获取方法findValue的形式并不多,只提供对String的支持,因此需要用字符串变量,这方面的确不是很完善。这个tag会把相应的值交给PageBean进行分页显示的处理。因此最重要的东西其实是PageBean类:
- publicclassPagesextendsComponent{
- privateStringpageNo;
- privateStringtotal;
- privateStringincludes;
- publicStringgetIncludes(){
- returnincludes;
- }
- publicvoidsetIncludes(Stringincludes){
- this.includes=includes;
- }
- publicStringgetPageNo(){
- returnpageNo;
- }
- publicvoidsetPageNo(StringpageNo){
- this.pageNo=pageNo;
- }
- publicStringgetTotal(){
- returntotal;
- }
- publicvoidsetTotal(Stringtotal){
- this.total=total;
- }
- publicPages(ValueStackarg0){
- super(arg0);
- }
- @Override
- publicbooleanstart(Writerwriter){
- booleanresult=super.start(writer);
- StringBuilderstr=newStringBuilder();
- Map<String,Object>cont=stack.getContext();
- StrutsRequestWrapperreq=(StrutsRequestWrapper)cont
- .get(StrutsStatics.HTTP_REQUEST);
- Stringurl=(String)req
- .getAttribute("javax.servlet.forward.request_uri");
- //从ValueStack中取出数值
- Objectobj=stack.findValue(pageNo);
- pageNo=String.valueOf(obj);
- obj=stack.findValue(total);
- total=String.valueOf(obj);
- StringBuilderperUrl=newStringBuilder("");
- if(includes!=null&&includes.trim().length()>0){
- String[]perm=includes.split(",");
- for(inti=0;i<perm.length;i++){
- StringpermName=perm[i];
- Objectobje=stack.findValue(permName);
- perUrl.append("&");
- perUrl.append(permName);
- perUrl.append("=");
- perUrl.append(obje);
- }
- }
- //用于计算的当前页整数形式
- intcpageInt=Integer.valueOf(pageNo);
- str.append("<divclass='pagination'>");
- IntegertotalInt=Integer.valueOf(total);
- //如果只有一页,则无需分页
- if(totalInt==1){
- str.append("<spanclass='current'>1</span>");
- }else{
- //显示上一页与第一页
- if(cpageInt==1){
- str.append("<spanclass='disabled'><<上一页</span>");
- str.append("<spanclass='current'>1</span>");
- }else{
- str.append("<ahref='");
- str.append(url);
- str.append("?pageNo=");
- str.append(cpageInt-1);
- str.append(perUrl);
- str.append("'>«上一页</a>");
- str.append("<ahref='");
- str.append(url);
- str.append("?pageNo=1");
- str.append(perUrl);
- str.append("'>1</a>");
- }
- //当前页超过5时第一页后面加点,因为中间相隔了第二页
- if(cpageInt-4>1)
- str.append("<spanclass='gap'>...</span>");
- //v,v1分别代表中间页数的最小值和最大值,3表示显示当前页的前后三页
- intv=(cpageInt-3)>1?(cpageInt-3):2;
- intv1=(cpageInt+3)<totalInt?(cpageInt+3):totalInt-1;
- if(v1==totalInt){
- v=totalInt-10;
- }elseif(v==1&&v1<totalInt){
- v1=totalInt>10?10:totalInt;
- }
- //
- for(inti=v;i<=v1;i++){
- if(cpageInt==i){//当前页要加粗显示
- str.append("<spanclass='current'>");
- str.append(i);
- str.append("</span>");
- }else{
- str.append("<ahref='");
- str.append(url);
- str.append("?pageNo=");
- str.append(i);
- str.append(perUrl);
- str.append("'>");
- str.append(i);
- str.append("</a>");
- }
- }
- if(cpageInt<totalInt-4)
- str.append("<spanclass='gap'>...</span>");
- //显示最后一页
- if(cpageInt==totalInt){//当前页要加粗显示
- str.append("<spanclass='current'>");
- str.append(totalInt);
- str.append("</span>");
- }else{
- str.append("<ahref='");
- str.append(url);
- str.append("?pageNo=");
- str.append(totalInt);
- str.append(perUrl);
- str.append("'>");
- str.append(totalInt);
- str.append("</a>");
- }
- if(cpageInt==totalInt){
- str.append("<spanclass='disabled'>下一页>></span>");
- }else{
- str.append("<ahref='");
- str.append(url);
- str.append("?pageNo=");
- str.append(cpageInt+1);
- str.append(perUrl);
- str.append("'>下一页>></a>");
- }
- }
- str.append("</div>");
- try{
- writer.write(str.toString());
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- returnresult;
- }
- }