OMG,到底在尋找什么..................
          (構造一個完美的J2EE系統(tǒng)所需要的完整知識體系)
          posts - 198,  comments - 37,  trackbacks - 0
          原貼地址:http://www.aygfsteel.com/Jkallen/archive/2006/03/13/35110.html

          發(fā)現(xiàn)在系統(tǒng)中有好多寫得很好的代碼,也不知道是哪位前輩留下來的.整理一下...
          自定義分頁標簽庫

          1:在配置文件中配置
          <!--?self?Tag?Library?Descriptors?-->
          ??
          <taglib>
          ????
          <taglib-uri>/WEB-INF/self-html.tld</taglib-uri>
          ????
          <taglib-location>/WEB-INF/self-html.tld</taglib-location>
          ??
          </taglib>

          2:在self-html.tld中page標簽的配置
          <tag>
          ????????
          <name>page</name>
          ????????
          <tagclass>com.jbbis.netedu.common.util.taglib.PageTag</tagclass>
          ????????
          <bodycontent>empty</bodycontent>
          ????????
          <info>tag?here</info>
          ????????
          <attribute>
          ????????
          <name>name</name>
          ????????
          <required>true</required>
          ????????
          <rtexprvalue>false</rtexprvalue>
          ????????
          </attribute>????
          ????????
          <attribute>
          ????????
          <name>pageNum</name>
          ????????
          <required>false</required>
          ????????
          <rtexprvalue>false</rtexprvalue>
          ????????
          </attribute>????????
          ????????
          <attribute>
          ????????
          <name>method</name>
          ????????
          <required>false</required>
          ????????
          <rtexprvalue>false</rtexprvalue>
          ????????
          </attribute>????
          ????????
          <attribute>
          ????????
          <name>methodValue</name>
          ????????
          <required>false</required>
          ????????
          <rtexprvalue>true</rtexprvalue>
          ????????
          </attribute>????
          ????????
          <attribute>
          ????????
          <name>form</name>
          ????????
          <required>true</required>
          ????????
          <rtexprvalue>false</rtexprvalue>
          ????????
          </attribute>????????
          ????????
          <attribute>
          ????????
          <name>action</name>
          ????????
          <required>flase</required>
          ????????
          <rtexprvalue>true</rtexprvalue>
          ????????
          </attribute>
          ????????
          <attribute>
          ????????
          <name>returnLevel</name>
          ????????
          <required>flase</required>
          ????????
          <rtexprvalue>true</rtexprvalue>
          ????????
          </attribute>????????????????????????????????????
          ????
          </tag>

          其實從這兒也可以看到在PageTag文件中是一些什么值了...

          3:PageTag中的具體操作(精華全部在這兒啦)
          /*
          ?*?Created?on?2004-6-25
          ?*
          ?
          */

          package?com.jbbis.netedu.common.util.taglib;

          import?java.io.IOException;

          import?javax.servlet.jsp.JspException;
          import?javax.servlet.jsp.JspWriter;
          import?javax.servlet.jsp.tagext.TagSupport;

          import?com.jbbis.netedu.common.page.NullPage;
          import?com.jbbis.netedu.common.page.Page;

          /**
          ?*?
          @author?leo_deng
          ?*
          ?
          */

          public?class?PageTag?extends?TagSupport?{
          ????

          ????
          /*?(non-Javadoc)
          ?????*?@see?javax.servlet.jsp.tagext.Tag#doStartTag()
          ?????
          */

          ????
          private?String?name;
          ????
          private?String?pageNum="pageNum";
          ????
          private?String?method="method";
          ????
          private?String?methodValue;
          ????
          private?String?form="mainForm";
          ????
          private?String?action;
          ????
          private?String?returnLevel;
          ????
          ????
          private?final?int?CONST_FIRST=1;
          ????
          private?final?int?CONST_NEXT=2;
          ????
          private?final?int?CONST_PRIOR=3;
          ????
          private?final?int?CONST_LAST=4;
          ????
          ????
          ????
          ????
          ????
          public?int?doStartTag()?throws?JspException?{
          ????????
          //?TODO?Auto-generated?method?stub
          ????????try{
          ????????????JspWriter?out?
          =?pageContext.getOut()?;
          ????????????Page?page
          =(Page)pageContext.getRequest().getAttribute(name);
          ????????????
          if(page==null)
          ????????????????page
          =NullPage.instance();
          ????????????out.print(getHtml(page.getPageNumber(),page.getPageCount()));
          ????????????out.print(getJs(page.getPageNumber(),page.getPageCount()));
          ????????????
          //jspwriter是一個隱含對象,用于向jsp網(wǎng)頁輸出內(nèi)容。輸出的目標由
          ????????????
          //?pagecontext.getout提供
          ????????????
          ????????????
          //向jsp網(wǎng)頁上下文輸出
          ??????????}
          catch(IOException?ioException){
          ????????????
          throw?new?JspException(ioException.getMessage()?);
          ??????????}
          //catch
          ??????????return(SKIP_BODY);
          ????}

          ????
          /*
          ?????*?<
          ?????*?<!--
          ?????*?function?page_next(){
          ?????*??form.action=""
          ?????*?????form.pageNum=""
          ?????*?????form.method.value=""
          ?????*?????form.submit;
          ?????*?
          ?????*?}
          ?????*?function?page_prior()
          ?????*?function?page_first()
          ?????*?funciotn?page_last()
          ?????*?
          ?????*?//-->
          ?????*?<div?class="listbox_page">
          ????????????<a?class="page"?><img?src="public/icon/first.gif"?alt="首頁"?align="absmiddle"?border="0"?onclick="page_first()"/></a>
          ????????????<a?class="page"?><img?src="public/icon/previous.gif"?alt="上頁"?align="absmiddle"?border="0"?onclick="page_first()"/></a>
          ????????????第<input?class="page_number"?name="pageNum"?value="">????<img?src="page_go.gif"?class="page_go">頁
          ????????????<a?class="page"?><img?src="public/icon/next.gif"?alt="下頁"?align="absmiddle"?border="0"/?onclick="page_next()"></a>
          ????????????<a?class="page"?><img?src="public/icon/last.gif"?alt="末頁"?align="absmiddle"?border="0"/?onclick="page_prior()"></a>
          ????????????共?<span?class="page_sum">1000</span>?頁?
          ????????</div>
          ?????*
          ?????*?
          */

          ????
          private?String?getJs(int?pageNum,int?totalNum){
          ????????StringBuffer?sb
          =new?StringBuffer();
          ????????sb.append(
          "\n<script?language=\"JavaScript\">\n<!--");
          ????????????sb.append(printFunction(
          "page_first",pageNum,totalNum,CONST_FIRST));
          ????????????sb.append(printFunction(
          "page_next",pageNum,totalNum,CONST_NEXT));
          ????????????sb.append(printFunction(
          "page_prior",pageNum,totalNum,CONST_PRIOR));
          ????????????sb.append(printFunction(
          "page_last",pageNum,totalNum,CONST_LAST));
          ????????????getGoJs(sb,pageNum,totalNum);
          ????????sb.append(
          "\n?//-->\n</script>");

          ????????
          return?sb.toString();
          ????}

          ????
          private?void?getGoJs(StringBuffer?sb,int?pageNum,int?totalNum){
          ????????sb.append(
          "function?page_go(obj){\n");
          ????????sb.append(
          "var?page_number=document.getElementById(\"page_number\");\n");
          ????????sb.append(
          "if(?page_number.value?!=?new?Number(page_number.value))return?alert(\"請輸入正確的頁數(shù)\");\n");
          ????????sb.append(
          "if(page_number.value<1)?page_number.value=1;if(page_number.value>");
          ????????sb.append(totalNum);
          ????????sb.append(
          ")page_number.value=");
          ????????sb.append(totalNum);
          ????????sb.append(
          ";\n");
          ????????sb.append(
          "if(page_number.value!="+pageNum+")");
          ????????sb.append(
          "submitForPageNum(obj);\n");
          ????????sb.append(
          "}");
          ????}

          ????
          private?StringBuffer?printFunction(String?function,int?pageNumber,int?totalNumber,int?pageConst){
          ????????StringBuffer?sb
          =new?StringBuffer();
          ????????sb.append(
          "\nfunction?"+function+"(){");
          ????????sb.append(
          "\nevent.returnValue=false;");
          ????????sb.append(printAction());
          ????????sb.append(printMethod());
          ????????
          //sb.append("\n"+this.form+".submit();\n}");
          ????????if(totalNumber>1){
          ????????????
          switch(pageConst){
          ????????????????
          case?CONST_FIRST:
          ????????????????????
          if(pageNumber>1){
          ????????????????????????sb.append(printPageNum(String.valueOf(
          1)));
          ????????????????????????sb.append(
          "\n?submitForPageNum("+this.form+");");
          ????????????????????}

          ????????????????????
          break;
          ????????????????
          case?CONST_LAST:
          ????????????????????
          if(pageNumber<totalNumber){
          ????????????????????????sb.append(printPageNum(String.valueOf(totalNumber)));
          ????????????????????????sb.append(
          "\n?submitForPageNum("+this.form+");");
          ????????????????????}

          ????????????????????
          break;
          ????????????????
          case?CONST_PRIOR:
          ????????????????????
          if(pageNumber>1){
          ????????????????????????sb.append(printPageNum(String.valueOf(pageNumber
          -1)));
          ????????????????????????sb.append(
          "\n?submitForPageNum("+this.form+");");
          ????????????????????}

          ????????????????????
          break;????????????????????????
          ????????????????
          case?CONST_NEXT:
          ????????????????????
          if(pageNumber<totalNumber){
          ????????????????????????sb.append(printPageNum(String.valueOf(pageNumber
          +1)));
          ????????????????????????sb.append(
          "\n?submitForPageNum("+this.form+");");
          ????????????????????}

          ????????????????????
          break;
          ????????????}

          ????????}

          ????????
          ????????sb.append(
          "\n}");
          ????????
          return?sb;????????
          ????}

          ????
          /*
          ????private?StringBuffer?printFunction(String?function,String?pageNum,int?pageConst){
          ????????StringBuffer?sb=new?StringBuffer();
          ????????sb.append("\nfunction?"+function+"(){");
          ????????sb.append("\nevent.returnValue=false;");
          ????????sb.append(printAction());
          ????????sb.append(printMethod());
          ????????sb.append(printPageNum(pageNum));
          ????????//sb.append("\n"+this.form+".submit();\n}");

          ????????????????
          ????????????????sb.append("\n?submitForPageNum("+this.form+");\n}");

          ????????
          ????????sb.append("\n}");
          ????????
          ????????return?sb;
          ????}
          ????
          */

          ????
          private?String?printAction(){
          ????????
          if(this.action!=null)
          ????????????
          return?("\n"+this.form+".action=\""+action+"\";");
          ????????
          else
          ????????????
          return?"";
          ????}

          ????
          private?String?printMethod(){
          ????????
          if(this.methodValue!=null)
          ????????????
          return?("\n"+this.form+"."+this.method+".value=\""+this.methodValue+"\";");
          ????????
          else
          ????????????
          return?"";
          ????}
          ????
          ????
          private?String?printPageNum(String?num){
          ????????
          return?"\n"+this.form+"."+this.pageNum+".value=\""+num+"\";";
          ????}

          ????
          private?String?getHtml(int?pageNum,int?totalNum){
          ????????StringBuffer?sb
          =new?StringBuffer();
          ????????sb.append(
          "\n<a?class=\"page\"?href=\"javascript:void(0)\"?onclick=\"page_first()\"?><img?src=\"public/icon/first.gif\"?alt=\"首頁\"?align=\"absmiddle\"?border=\"0\"?/></a>");
          ????????sb.append(
          "\n<a?class=\"page\"?href='javascript:void(0)'?onclick='page_prior()'?><img?src=\"public/icon/previous.gif\"?alt=\"上頁\"?align=\"absmiddle\"?border=\"0\"?/></a>");
          ????????sb.append(
          "\n第<input?id=\"page_number\"?class=\"page_number\"?name=\"pageNum\"?value=\"");
          ????????sb.append(String.valueOf(pageNum));
          ????????sb.append(
          "\"><button?class='page_go'?onclick='page_go(this.form);'></button>頁????");
          ????????//sb.append(""<img?src=\"page_go.gif\"?class=\"page_go\">");
          ????????sb.append("\n<a?class=\"page\"?href=\"javascript:void(0)\"?onclick=\"page_next()\"><img?src=\"public/icon/next_page.gif\"?alt=\"下頁\"?align=\"absmiddle\"?border=\"0\"/></a>");
          ????????sb.append(
          "\n<a?class=\"page\"?href=\"javascript:void(0)\"?onclick=\"page_last()\"><img?src=\"public/icon/last.gif\"?alt=\"末頁\"?align=\"absmiddle\"?border=\"0\"/></a>");
          ????????sb.append(
          "\n共?<span?class=\"page_sum\">");
          ????????sb.append(String.valueOf(totalNum));
          ????????sb.append(
          "</span>?頁");
          ????????
          return?sb.toString();
          ????}


          ????
          /**
          ?????*?
          @return?Returns?the?pageNum.
          ?????
          */

          ????
          public?String?getPageNum()?{
          ????????
          return?pageNum;
          ????}

          ... ....(other getter and setter method ^_^)????
          }


          4:在JSP布面中導入:
          <%@?taglib?uri="/WEB-INF/self-html.tld"?prefix="netedu"?%>

          5:在JSP頁面中引用:
          <form?name="newsForm"?method="post"?action="<%=request.getContextPath()?%>/portal/newsAction.page"?id="newsForm">
          <!--?TIP008:
          ??翻頁部分
          ?
          -->
          ???
          <div?class="listbox_page">
          ????
          <netedu:page?name="page"?form="newsForm"?/>
          ???
          </div>
          <!--?TIP008:END-->
          ?
          </form>

          6:page文件

          7:其它
          7.1
          可以注意到在標簽的定義文件中用到了名為page_go的css層來美化界面,可能是出于滿足不同用戶對界面的不同要求所以在此沒有對此css定義,你可以在JSP布面中重寫此css.這兒有個可以參考一下.下載
          7.2
          根據(jù)標簽的定義可以看到,此page應該放到form中.
          7.3
          根據(jù)在標簽庫中的
          Page?page=(Page)pageContext.getRequest().getAttribute(name);

          語句,可見page應該在request.setAttribute("pageattribute",page);中定義.

          7.4
          如何通過對DB的操作得到了page ?通過DB操作可以獲得一系統(tǒng)的data(應該注意到了在page文件夾中有個data屬性,高人就是高人^_^),當然在得到這些data之前,先可能得進行一系統(tǒng)邏輯處理,比如說當前頁碼(pagenum),頁長(pagesize)等等.通過這些數(shù)據(jù)就可以得到一個page實例了! ~ ~ :?)




          上一個介紹里面主要講到了分頁標簽的配置,邏輯處理,引用。
          我們在action中:

          //JSP中引用此attribute分頁處理

          request.setAttribute(
          "page",page);


          然后在JSP中引用此page。
          這次主要看如何能過對DB操作實現(xiàn)此page。

          處理邏輯:
          1:根據(jù)SQL語句,當前頁面,頁面大小等參數(shù),得到一系統(tǒng)data。
          2:根據(jù)得到的data,再加上當前頁面,頁面大小可以實例化一個page類實體。
          3:將此實體轉換成便于到前臺顯示的DTO。

          具體如下:

          首先,我們根據(jù)查詢語句從DB中得到一系列相關數(shù)據(jù)

          ......

          Query?query?=?getSession().createQuery(sql);
          ????????????setParams(query,?paramNames,?params);
          ????????????
          if?(pageSize?>?-1)?{
          ????????????????query.setFirstResult(PageManager.getStartIndex(pageNumber,
          ????????????????????????totalCount,?pageSize));
          ????????????????query.setMaxResults(pageSize);
          ????????????}

          ????????????List?data?
          =?doQuery(query);
          ????????????
          ????????????
          if?(pageSize?<?0)?{
          ????????????????totalCount?
          =?data.size();
          ????????????}

          ......


          可以看到其中除了createQuery,setFirstResult,setMaxResults外其實都是用戶自定義的一些函數(shù)。
          其它函數(shù),顧名思義應該知道它想實現(xiàn)一個什么功能,象doQuery(query)就是得到一個結果集也許是得到一個按列表方式抽取結果集?query.list(),or 按迭代方式抽取結果集query.iterate().函數(shù)getStartIndex(args[])返回數(shù)據(jù)第一條記錄的起點位置。其它的也都差不多!

          其次得到一個page的實體類(entity),或者說得到其DAO對象。
          其實得到一個DTO的page對象比較簡單。前面列出了page,而上面已經(jīng)從DB中得到了一系列數(shù)據(jù)(data),再加上頁面的相關信息就可以實例化一個page實體了:

          .

          public?DefaultPage(int?pageSize,?int?pagesCount,?int?pageNumber,?Collection?data,
          ?????????????????????
          int?totalSize)?{
          ????
          this.pageSize?=?pageSize;
          ????
          this.pagesCount?=?pagesCount;
          ????
          this.pageNumber?=?pageNumber;
          ????
          this.totalSize?=?totalSize;
          ????
          this.data?=?data;
          ??}


          .


          當然在此前,對面頁數(shù)據(jù)得處理一下,象pageNumber可能如下:

          /**
          ?????*?
          @param?pageNumber
          ?????*?
          @param?pageSize
          ?????*?
          @param?totalCount
          ?????*?Return?PageNumber
          ?????
          */

          ????
          protected?static?int?calcPageNumber(int?pageNumber,?int?pageSize,?int?totalCount)?{
          ????????
          int?maxPageNumber?=?calcMaxPageNumber(pageSize,?totalCount);
          ????????
          ????????pageNumber?
          =?pageNumber>maxPageNumber?maxPageNumber:pageNumber;
          ????????
          ????????
          if(pageNumber<=0)
          ????????????pageNumber
          =1;
          ????????
          ????????
          return?pageNumber;
          ????}


          easy吧!

          最后將此實體轉換成適合前臺顯示的DTO對象。
          這個側是依據(jù)不同的需求去做相應的轉換了,一般來說從DB取出來的實體(DAO)直接與DB中的數(shù)據(jù)對應。而在DTO中我們可以提供許多更加符合實際的字段與方法,使得我們的JSP頁面顯示更加得心應手!同時也避免了直與DB交互。它們之間的關系,
          我亂七八糟寫過些東西(歡迎指正!

          “一般人的標簽我不看,高手寫的東西真的值得借鑒,學習!”

          posted on 2006-08-09 11:11 OMG 閱讀(438) 評論(0)  編輯  收藏 所屬分類: J2EE

          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          IT風云人物

          文檔

          朋友

          相冊

          經(jīng)典網(wǎng)站

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 武夷山市| 闵行区| 芦山县| 秀山| 柘城县| 漯河市| 临高县| 徐闻县| 社旗县| 禄劝| 同德县| 上饶市| 通州区| 雷波县| 永新县| 呼和浩特市| 怀柔区| 虞城县| 武功县| 盱眙县| 乐都县| 岳西县| 南溪县| 黄大仙区| 五大连池市| 五台县| 平阴县| 蒲江县| 馆陶县| 阳原县| 阿尔山市| 犍为县| 渑池县| 东安县| 临颍县| 津市市| 寿阳县| 达孜县| 湘乡市| 泰兴市| 日土县|