<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

    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網頁輸出內容。輸出的目標由
    ????????????
    //?pagecontext.getout提供
    ????????????
    ????????????
    //向jsp網頁上下文輸出
    ??????????}
    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(\"請輸入正確的頁數\");\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
    根據標簽的定義可以看到,此page應該放到form中.
    7.3
    根據在標簽庫中的
    Page?page=(Page)pageContext.getRequest().getAttribute(name);

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

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




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

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

    request.setAttribute(
    "page",page);


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

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

    具體如下:

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

    ......

    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外其實都是用戶自定義的一些函數。
    其它函數,顧名思義應該知道它想實現一個什么功能,象doQuery(query)就是得到一個結果集也許是得到一個按列表方式抽取結果集?query.list(),or 按迭代方式抽取結果集query.iterate().函數getStartIndex(args[])返回數據第一條記錄的起點位置。其它的也都差不多!

    其次得到一個page的實體類(entity),或者說得到其DAO對象。
    其實得到一個DTO的page對象比較簡單。前面列出了page,而上面已經從DB中得到了一系列數據(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;
    ??}


    .


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

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

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

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

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    IT風云人物

    文檔

    朋友

    相冊

    經典網站

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费毛片毛片网址| 亚洲中文字幕在线第六区| 99久久成人国产精品免费| 亚洲成a人无码亚洲成av无码| 日本亚洲成高清一区二区三区| 免费a级毛片视频| 国产免费久久精品99re丫y| 日韩精品免费视频| 9久久免费国产精品特黄| 美女一级毛片免费观看| 午夜免费1000部| 久久久久国色AV免费观看性色 | 国外成人免费高清激情视频| 日韩在线不卡免费视频一区| 中文在线免费观看| 日本高清免费中文在线看| 亚洲一区二区观看播放| 色在线亚洲视频www| 亚洲大片免费观看| 亚洲欧洲精品一区二区三区| 亚洲色四在线视频观看| 久久精品国产99精品国产亚洲性色| 中文字幕日韩亚洲| 亚洲一区二区三区自拍公司| jlzzjlzz亚洲乱熟在线播放| 亚洲精品无码av天堂| 亚洲阿v天堂在线2017免费| 免费在线黄色网址| 亚洲国产精品激情在线观看 | 精品久久久久亚洲| 国产亚洲美女精品久久| 国产精品亚洲综合| 日韩在线观看免费| 国产黄色免费观看| 国精产品一区一区三区免费视频| 两性色午夜免费视频| 亚洲精品免费视频| 18禁免费无码无遮挡不卡网站 | 亚洲日韩久久综合中文字幕| 亚洲日本人成中文字幕| 亚洲熟妇丰满xxxxx|