`
dawuafang
  • 浏览: 1114155 次
文章分类
社区版块
存档分类
最新评论

struts2 分页

 
阅读更多
要实现分页,基本流程为JSP->PageTag->PageBean->Action,当然也可以反过来说。
1. 首先从Action说起吧,Action需要几个参数,其中pageNo(当前页),total(总共多少条记录)是必需的,查询的条件参数则是可选的。基本的Action代码如下:

Java代码收藏代码
  1. publicclassHelloWorldextendsActionSupport{
  2. privatestaticfinallongserialVersionUID=7046981255032101657L;
  3. //总共页数
  4. privateinttotal=40;
  5. //默认当前页为第一页
  6. privateintpageNo=1;
  7. //下面为条件参数
  8. privateStringtest="test";
  9. privatelongtest1=5L;
  10. privatefloattest2=9.8F;
  11. privateinttest3=8;
  12. publicStringexecute(){
  13. returnSUCCESS;
  14. }
  15. publicintgetTotal(){
  16. returntotal;
  17. }
  18. publicvoidsetTotal(inttotal){
  19. this.total=total;
  20. }
  21. publicintgetPageNo(){
  22. returnpageNo;
  23. }
  24. publicvoidsetPageNo(intpageNo){
  25. this.pageNo=pageNo;
  26. }
  27. publicStringgetTest(){
  28. returntest;
  29. }
  30. publicvoidsetTest(Stringtest){
  31. this.test=test;
  32. }
  33. publiclonggetTest1(){
  34. returntest1;
  35. }
  36. publicvoidsetTest1(longtest1){
  37. this.test1=test1;
  38. }
  39. publicfloatgetTest2(){
  40. returntest2;
  41. }
  42. publicvoidsetTest2(floattest2){
  43. this.test2=test2;
  44. }
  45. publicintgetTest3(){
  46. returntest3;
  47. }
  48. publicvoidsetTest3(inttest3){
  49. this.test3=test3;
  50. }
  51. }


需要说明的,上面的一些参数如pageNo,total对于每个需要分页的Action来说都是固定的,所以可以提取到一个抽象的类中。只要JSP页面的参数名与Action的变量名对应起来,ONGL就会把相应的值附给这些变量。如下:

Html代码收藏代码
  1. <p:pagespageNo="pageNo"total="total"
  2. includes="test,test1,test2,test3"/>


其中includes包含的就是查询的条件参数名,它们与Action查询变量相对应。通过上面的JSP页面,可以看出用到了一个tag,不过这个tag tld文件很简单,page.tld:

Xml代码收藏代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEtaglibPUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//EN"
  3. "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
  4. <taglib>
  5. <tlib-version>2.2.3</tlib-version>
  6. <jsp-version>1.2</jsp-version>
  7. <short-name>p</short-name>
  8. <uri>/p</uri>
  9. <display-name>"pagesTags"</display-name>
  10. <tag>
  11. <name>pages</name>
  12. <tag-class>com.page.PageTag</tag-class>
  13. <body-content>empty</body-content>
  14. <attribute>
  15. <name>pageNo</name>
  16. <required>true</required>
  17. <rtexprvalue>true</rtexprvalue>
  18. </attribute>
  19. <attribute>
  20. <name>total</name>
  21. <required>true</required>
  22. <rtexprvalue>true</rtexprvalue>
  23. </attribute>
  24. <attribute>
  25. <name>includes</name>
  26. <required>false</required>
  27. <rtexprvalue>true</rtexprvalue>
  28. </attribute>
  29. </tag>
  30. </taglib>


这个tag对应的tag类也很简单:

Java代码收藏代码
  1. publicclassPageTagextendsComponentTagSupport{
  2. privatestaticfinallongserialVersionUID=7242423813230124088L;
  3. //这里传递的参数需要用字符串的形式
  4. privateStringpageNo;
  5. privateStringtotal;
  6. privateStringincludes;
  7. publicvoidsetPageNo(StringpageNo){
  8. this.pageNo=pageNo;
  9. }
  10. publicvoidsetTotal(Stringtotal){
  11. this.total=total;
  12. }
  13. publicStringgetIncludes(){
  14. returnincludes;
  15. }
  16. publicvoidsetIncludes(Stringincludes){
  17. this.includes=includes;
  18. }
  19. @Override
  20. publicComponentgetBean(ValueStackarg0,HttpServletRequestarg1,
  21. HttpServletResponsearg2){
  22. returnnewPages(arg0);
  23. }
  24. protectedvoidpopulateParams(){
  25. super.populateParams();
  26. Pagespages=(Pages)component;
  27. pages.setPageNo(pageNo);
  28. pages.setIncludes(includes);
  29. pages.setTotal(total);
  30. }
  31. }


需要注意的是ongl对变量的获取方法findValue的形式并不多,只提供对String的支持,因此需要用字符串变量,这方面的确不是很完善。这个tag会把相应的值交给PageBean进行分页显示的处理。因此最重要的东西其实是PageBean类:

Java代码收藏代码
  1. publicclassPagesextendsComponent{
  2. privateStringpageNo;
  3. privateStringtotal;
  4. privateStringincludes;
  5. publicStringgetIncludes(){
  6. returnincludes;
  7. }
  8. publicvoidsetIncludes(Stringincludes){
  9. this.includes=includes;
  10. }
  11. publicStringgetPageNo(){
  12. returnpageNo;
  13. }
  14. publicvoidsetPageNo(StringpageNo){
  15. this.pageNo=pageNo;
  16. }
  17. publicStringgetTotal(){
  18. returntotal;
  19. }
  20. publicvoidsetTotal(Stringtotal){
  21. this.total=total;
  22. }
  23. publicPages(ValueStackarg0){
  24. super(arg0);
  25. }
  26. @Override
  27. publicbooleanstart(Writerwriter){
  28. booleanresult=super.start(writer);
  29. StringBuilderstr=newStringBuilder();
  30. Map<String,Object>cont=stack.getContext();
  31. StrutsRequestWrapperreq=(StrutsRequestWrapper)cont
  32. .get(StrutsStatics.HTTP_REQUEST);
  33. Stringurl=(String)req
  34. .getAttribute("javax.servlet.forward.request_uri");
  35. //从ValueStack中取出数值
  36. Objectobj=stack.findValue(pageNo);
  37. pageNo=String.valueOf(obj);
  38. obj=stack.findValue(total);
  39. total=String.valueOf(obj);
  40. StringBuilderperUrl=newStringBuilder("");
  41. if(includes!=null&&includes.trim().length()>0){
  42. String[]perm=includes.split(",");
  43. for(inti=0;i<perm.length;i++){
  44. StringpermName=perm[i];
  45. Objectobje=stack.findValue(permName);
  46. perUrl.append("&");
  47. perUrl.append(permName);
  48. perUrl.append("=");
  49. perUrl.append(obje);
  50. }
  51. }
  52. //用于计算的当前页整数形式
  53. intcpageInt=Integer.valueOf(pageNo);
  54. str.append("<divclass='pagination'>");
  55. IntegertotalInt=Integer.valueOf(total);
  56. //如果只有一页,则无需分页
  57. if(totalInt==1){
  58. str.append("<spanclass='current'>1</span>");
  59. }else{
  60. //显示上一页与第一页
  61. if(cpageInt==1){
  62. str.append("<spanclass='disabled'><<上一页</span>");
  63. str.append("<spanclass='current'>1</span>");
  64. }else{
  65. str.append("<ahref='");
  66. str.append(url);
  67. str.append("?pageNo=");
  68. str.append(cpageInt-1);
  69. str.append(perUrl);
  70. str.append("'>«上一页</a>");
  71. str.append("<ahref='");
  72. str.append(url);
  73. str.append("?pageNo=1");
  74. str.append(perUrl);
  75. str.append("'>1</a>");
  76. }
  77. //当前页超过5时第一页后面加点,因为中间相隔了第二页
  78. if(cpageInt-4>1)
  79. str.append("<spanclass='gap'>...</span>");
  80. //v,v1分别代表中间页数的最小值和最大值,3表示显示当前页的前后三页
  81. intv=(cpageInt-3)>1?(cpageInt-3):2;
  82. intv1=(cpageInt+3)<totalInt?(cpageInt+3):totalInt-1;
  83. if(v1==totalInt){
  84. v=totalInt-10;
  85. }elseif(v==1&&v1<totalInt){
  86. v1=totalInt>10?10:totalInt;
  87. }
  88. //
  89. for(inti=v;i<=v1;i++){
  90. if(cpageInt==i){//当前页要加粗显示
  91. str.append("<spanclass='current'>");
  92. str.append(i);
  93. str.append("</span>");
  94. }else{
  95. str.append("<ahref='");
  96. str.append(url);
  97. str.append("?pageNo=");
  98. str.append(i);
  99. str.append(perUrl);
  100. str.append("'>");
  101. str.append(i);
  102. str.append("</a>");
  103. }
  104. }
  105. if(cpageInt<totalInt-4)
  106. str.append("<spanclass='gap'>...</span>");
  107. //显示最后一页
  108. if(cpageInt==totalInt){//当前页要加粗显示
  109. str.append("<spanclass='current'>");
  110. str.append(totalInt);
  111. str.append("</span>");
  112. }else{
  113. str.append("<ahref='");
  114. str.append(url);
  115. str.append("?pageNo=");
  116. str.append(totalInt);
  117. str.append(perUrl);
  118. str.append("'>");
  119. str.append(totalInt);
  120. str.append("</a>");
  121. }
  122. if(cpageInt==totalInt){
  123. str.append("<spanclass='disabled'>下一页>></span>");
  124. }else{
  125. str.append("<ahref='");
  126. str.append(url);
  127. str.append("?pageNo=");
  128. str.append(cpageInt+1);
  129. str.append(perUrl);
  130. str.append("'>下一页>></a>");
  131. }
  132. }
  133. str.append("</div>");
  134. try{
  135. writer.write(str.toString());
  136. }catch(IOExceptione){
  137. //TODOAuto-generatedcatchblock
  138. e.printStackTrace();
  139. }
  140. returnresult;
  141. }
  142. }


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics