§封Ja葬va§

          自定義分頁(yè)標(biāo)簽

          近期在做的S2SH項(xiàng)目,因?yàn)槎嗵幱玫椒猪?yè),BOSS要求小弟將其抽象出來。小弟不才,實(shí)際參與開發(fā)的經(jīng)驗(yàn)也就1年。
          于是花了點(diǎn)時(shí)間將其做成自定義標(biāo)簽供所有需要分頁(yè)的業(yè)務(wù)調(diào)用。小結(jié)一下,供新手參考

          自定義標(biāo)簽使用如下:
          JSP頁(yè)面引入:
          <%@ taglib uri="/htdz-tag" prefix="htdz-tag"%>
          在需要擺放翻頁(yè)的相關(guān)按鈕處使用:
          <htdz-tag:PagerTag pagesize="${pagesize}" rowcount="${rowcount}" currpagenum="${currpagenum}" action="${action}"/>

          以下介紹如何自定義標(biāo)簽:

          1.首先是針對(duì)自定義標(biāo)簽的描述:
          創(chuàng)建WEB-INF/tags/htdz-tag.tld標(biāo)簽描述文件:
          <?xml version="1.0" encoding="UTF-8" ?>
          <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
           version="2.0">
              <description>htdz tag</description>
              <display-name>htdz tag</display-name>
              <tlib-version>1.0</tlib-version>
              <short-name>htdz-tag</short-name>
              <uri>/htdz-tag</uri>
           
              <tag>
                    <!--分頁(yè)控件使用說明:
                    1.最全參數(shù)用法:<htdz-tag:PagerTag pagesize="${pagesize}" rowcount="${rowcount}" currpagenum="${currpagenum}" action="${action}" className="button_small"/>
                    1.最簡(jiǎn)參數(shù)用法:<htdz-tag:PagerTag pagesize="${pagesize}" rowcount="${rowcount}" currpagenum="${currpagenum}" action="${action}"/>
                    參數(shù)說明:
                    1. pagesize為每頁(yè)記錄數(shù)(必寫)
                    2. rowcount為總記錄數(shù)(必寫)
                    3. currpagenum為當(dāng)前頁(yè)數(shù)(必寫)
                    4. className為分頁(yè)按鈕樣式,如果不寫,則為默認(rèn)樣式
                    5. action為URL請(qǐng)求路徑(必寫)
                    -->
                    <description>分頁(yè)控件</description>
                    <!--JSP里使用時(shí)的標(biāo)簽名-->
                    <name>PagerTag</name>
                    <!--用以將自定義標(biāo)簽解析成控件的Java類-->
                    <tag-class>com.htdz.util.tag.PagerTag</tag-class>
                    <body-content>JSP</body-content>
                    <!--每個(gè)attribute代表標(biāo)簽的一個(gè)屬性-->
                    <attribute>
                         <description>pagesize:每頁(yè)條數(shù)</description>
                         <!--屬性名-->
                         <name>pagesize</name>
                         <!--是否必填屬性-->
                         <required>true</required>
                         <!--此屬性值是否接受EL,<%= 之類的形式-->
                         <rtexprvalue>true</rtexprvalue>
                   </attribute>
                   <attribute>
                       <description>rowcount:總記錄數(shù)</description>
                       <name>rowcount</name>
                       <required>true</required>
                       <rtexprvalue>true</rtexprvalue>
                   </attribute>
                   <attribute>
                       <description>currpagenum:當(dāng)前頁(yè)數(shù)</description>
                       <name>currpagenum</name>
                       <required>true</required>
                       <rtexprvalue>true</rtexprvalue>
                   </attribute>
                   <attribute>
                       <description>action:URL請(qǐng)求路徑</description>
                       <name>action</name>
                       <required>true</required>
                       <rtexprvalue>true</rtexprvalue>
                   </attribute>
                   <attribute>
                       <description>className:用于客戶端確定分頁(yè)按鈕的樣式</description>
                       <name>className</name>
                       <required>false</required>
                   </attribute>
               </tag>

          </taglib>

          2.創(chuàng)建用于將標(biāo)簽解析為頁(yè)面翻頁(yè)控件的類
          PagerTag.java

          public class PagerTag extends TagSupport {

              public static final int USER_PAGESIZE = 5;// 禮品搜索--每頁(yè)記錄數(shù)
              private static final String DEFAULT_BUTTON_CLASS= "button_small"; //翻頁(yè)按鈕默認(rèn)樣式
              private static final String DISABLE_BUTTON_CLASS= "button_small_disable"; //失效按鈕默認(rèn)樣式
           
              private int pagesize;
              private int rowcount;
              private int currpagenum;
              private String action;
              private String className;

              public PagerTag() {

              }

              public void setPagesize(int pagesize) {
                  this.pagesize = pagesize;
              }
              public void setRowcount(int rowcount) {
                  this.rowcount = rowcount;
              }
             public void setCurrpagenum(int currpagenum) {
                  this.currpagenum = currpagenum;
              }
              public void setClassName(String className) {
                  this.className = className;
              }
              public void setAction(String action) {
                  this.action = action;
              }

              public int doStartTag() throws JspException {
           
                  if (new Integer(pagesize) == null) {
                      throw new JspException("PagerTag標(biāo)簽中缺乏pagesize屬性!");
                  }else if(pagesize==0){
                      throw new JspException("PagerTag標(biāo)簽中的pagesize屬性無值!");
                  }
                  if (new Integer(rowcount) == null) {
                      throw new JspException("PagerTag標(biāo)簽中缺乏rowcount屬性!");
                  }
                  if (new Integer(currpagenum) == null) {
                      throw new JspException("PagerTag標(biāo)簽中缺乏currpagenum屬性!");
                  }
                  if (action == null) {
                      throw new JspException("PagerTag標(biāo)簽中缺乏action屬性!");
                  }else if(action.length()==0){
                      throw new JspException("PagerTag標(biāo)簽中的action屬性無值!");
                  }

                  //如果頁(yè)面標(biāo)簽中沒寫className屬性,則讓翻頁(yè)按鈕應(yīng)用默認(rèn)的按鈕樣式
                  if(className==null||className.length()==0){
                      className = DEFAULT_BUTTON_CLASS;
                  }
                  //獲取總頁(yè)數(shù)
                  int totalpagesize = getTotalpagesize(rowcount);

                  //用以標(biāo)志是否能上翻
                  boolean noUp = false;
                  //用以標(biāo)志是否能下翻
                  boolean noDown = false;

                  //聲明應(yīng)用于'首頁(yè)','上一頁(yè)'按鈕的樣式(因?yàn)榇藗z按鈕要么同時(shí)失效,要么同時(shí)可用)
                  String buttonClass1 = className;
                  //聲明應(yīng)用于'下一頁(yè)','尾頁(yè)'按鈕的樣式(同上)
                  String buttonClass2 = className;
           
                  //如果無記錄,則設(shè)置總頁(yè)數(shù)與當(dāng)前頁(yè)數(shù)都為1
                  if(rowcount==0){
                      currpagenum = 1;
                      totalpagesize = 1;
                  }
           
                  //如果當(dāng)前頁(yè)是第一頁(yè)
                  if(currpagenum==1){
                      noUp = true;
                      //設(shè)置'首頁(yè)','上一頁(yè)'按鈕失效樣式
                      buttonClass1 = DISABLE_BUTTON_CLASS;
                  }
                  //如果當(dāng)前頁(yè)是最大頁(yè)
                  if(currpagenum==totalpagesize){
                      noDown = true;
                      //設(shè)置'下一頁(yè)','尾頁(yè)'按鈕失效樣式
                      buttonClass2 = DISABLE_BUTTON_CLASS;
                  }
           

                  try {
                      StringBuffer html = new StringBuffer();
            
                      html.append(currpagenum+"/"+totalpagesize+"頁(yè)");

                      html.append("<input class="+buttonClass1+" type=\"button\" value=\"首頁(yè)\" onclick=\"turnPage('first','"+currpagenum+"','"+totalpagesize+"','"+action+"')\" ");
                      if(noUp){
                          html.append("disabled=\"true\"");
                      }
                      html.append("/>");

                      html.append("<input class="+buttonClass1+" type=\"button\" value=\"上一頁(yè)\" onclick=\"turnPage('up','"+currpagenum+"','"+totalpagesize+"','"+action+"')\" ");
                      if(noUp){
                          html.append("disabled=\"true\"");
                      }
                      html.append("/>");
            
                      html.append("<input class="+buttonClass2+" type=\"button\" value=\"下一頁(yè)\" onclick=\"turnPage('down','"+currpagenum+"','"+totalpagesize+"','"+action+"')\"");
                      if(noDown){
                          html.append("disabled=\"true\"");
                      }
                      html.append("/>");

                      html.append("<input class="+buttonClass2+" type=\"button\" value=\"尾頁(yè)\" onclick=\"turnPage('last','"+currpagenum+"','"+totalpagesize+"','"+action+"')\" ");
                      if(noDown){
                          html.append("disabled=\"true\"");
                      }
                      html.append("/>");

                      html.append(currpagenum+"/"+totalpagesize+"頁(yè)&nbsp;&nbsp;");

                      html.append("<input type=\"text\" maxlength=\"3\" id=\"text\" size=\"3\" onkeypress=\"return checkInput(event);\" />頁(yè)");
                      html.append("<input class="+className+" type=\"button\" value=\"GO\" onclick=\"turnPage('to','"+currpagenum+"','"+totalpagesize+"','"+action+"')\" />");
                      pageContext.getOut().println(html.toString());
                  } catch (Exception e) {
                      throw new JspException(e.getMessage());
                  }
                   return this.SKIP_BODY;
              }

               /**
                * 根據(jù)總記錄數(shù)得到總頁(yè)數(shù)
                *
                * @param rowcount
                *            總記錄數(shù)
                * @return 總頁(yè)數(shù)
                */
              public int getTotalpagesize(int rowcount) {
                  int totalpagesize = 0;
           
                  if (rowcount % pagesize == 0) {
                      totalpagesize = rowcount / pagesize;
                  } else {
                      totalpagesize = rowcount / pagesize + 1;
                  }
                  return totalpagesize;
              }
          }

          到此為止,自定義標(biāo)簽書已完成。
          可應(yīng)用于項(xiàng)目各處,
          只要頁(yè)面上遵循標(biāo)簽描述規(guī)則,后臺(tái)該給標(biāo)簽屬性傳值的時(shí)候記得傳就行了。
          以下用一個(gè)簡(jiǎn)單的例子來說明一下,紅色字體顯示的部分別忘記寫就行了。

          UserAction.java:
          public class UserAction extends ActionSupport {

              private UserService userService;
              private List<User> users;

              public String findUser(){
                  String str = null;
                  HttpServletRequest request = ServletActionContext.getRequest();
                  Map sessionMap = ActionContext.getContext().getSession();
           
                  String currpagenum= "1";
                  try {
                      String pagenum = request.getParameter("pagenum ");
                      if(pagenum != null && pagenum .length()!=0){
                          currpagenum= pagenum ;
                      }
                  } catch (Exception e) {

                  }
           
                  //查詢用戶記錄
                  users= userService.findUser(pageNum);
                  if(users.size!=0){
                      request.setAttribute("users", users);

                      int rowcount = userService.getCount();

                      request.setAttribute("rowcount ",rowcount );
                      request.setAttribute("currpagenum",currpagenum);

                      str = "success";//成功視圖
                  }else{
                      message = "無記錄!"               
                      str = "failure";//失敗視圖
                  }
            
                  request.setAttribute("pagesize", PagerTag.USER_PAGESIZE);
                  request.setAttribute("action", "findUser.action);

                  //返回視圖
                  return str;
              }


              public UserService getUserService() {
                  return userService;
              }
              public void setUserService(UserService userService) {
                  this.userService = userService;
              }
             
              public List<User> getUsers(){
                  return users;
              }
              public void setUsers(List<User> users){
                  this.users = users;   
              }

          }

           
          UserService.java:

          public class UserService {

              private UserDao userDao;

              public List<User> findUser(String pageNum){
                  List<User> userList = userDao.findUser(pageNum);
                  return userList;
              }

              public int getCount(){
                  int count = userDao.getCount();
                  return count;
              }

              public UserDao getUserDao() {
                  return userDao;
              }
              public void setUserDao(UserDao userDao) {
                  this.userDao = userDao;
              }
          }


          UserDao.java:

          public class UserDao extends HibernateDaoSupport {

              /**
               * 查詢用戶
               * @return User對(duì)象集合
               */
              public List<User> findUser(String pagenum) {
                  List<User> users = null;
                  Session session = null;
                  try {
                      int myPagenum= Integer.parseInt(pagenum);
                      String hql = "from User";
                      session = this.getSession();
                      Query query = session.createQuery(hql);
                      query.setFirstResult(Pager.USER_PAGESIZE * (myPagenum - 1));
                      query.setMaxResults(Pager.USER_PAGESIZE);
                      users = query.list();
                      session.flush();
                  } catch (Exception e) {
                      e.printStackTrace();
                  } finally {
                  if (session != null) {
                      session.close();
                  }
              }
              return users;
          }


              /**
               * 獲取用戶總記錄數(shù)
               * @return 用戶總記錄數(shù)
               */
              public int getCount(){
                  String hql ="select count(id) from User";
                  Session session = null;
                  int count =0;
                  try {
                      session = this.getSession();
                      Query query = session.createQuery(hql);
                      List list = query.list();
                      session.flush();
                      count = Integer.parseInt(list.get(0).toString());
                  } catch (Exception e) {
                      e.printStackTrace();
                  } finally{
                  session.close();
                  }
                  return count;
              }

          }

          posted on 2009-04-04 00:23 §朱家二少§ 閱讀(3484) 評(píng)論(5)  編輯  收藏 所屬分類: J2SE

          Feedback

          # re: 自定義分頁(yè)標(biāo)簽 2009-04-04 18:40 popoer

          為什么要重新發(fā)明輪子呢,我覺得DisplayTag很好用!  回復(fù)  更多評(píng)論   

          # re: 自定義分頁(yè)標(biāo)簽 2009-04-04 20:01 獨(dú)孤行

          太過于復(fù)雜,一個(gè)存儲(chǔ)過程,一個(gè)自定義標(biāo)簽類,一個(gè)控制器,然后配置一下tld,xml文件即可  回復(fù)  更多評(píng)論   

          # re: 自定義分頁(yè)標(biāo)簽 2009-04-18 13:52 Wolftotem

          我想問一下,如果是多條件組合查詢時(shí),當(dāng)點(diǎn)擊下一頁(yè)時(shí)怎樣使url記住查詢頁(yè)面的查詢參數(shù)?  回復(fù)  更多評(píng)論   

          # re: 自定義分頁(yè)標(biāo)簽 2009-04-19 23:23 §朱家二少§

          @Wolftotem
          用request.setAttribute("abc",abc);
          <form>
          <input type="hidden" name="abc" value="${abc}"/>
          </form>

            回復(fù)  更多評(píng)論   

          # re: 自定義分頁(yè)標(biāo)簽 2011-08-22 17:22 cyang

          String pagenum = request.getParameter("pagenum ");
          中的pagenum哪里來的?請(qǐng)問  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 浪卡子县| 江孜县| 临泉县| 辽宁省| 鞍山市| 普宁市| 勐海县| 瑞丽市| 宜川县| 廉江市| 娄底市| 砀山县| 邯郸县| 龙南县| 石嘴山市| 青川县| 额济纳旗| 敦煌市| 永修县| 施秉县| 巴林右旗| 綦江县| 行唐县| 萍乡市| 德令哈市| 青龙| 洪泽县| 祥云县| 湟源县| 永年县| 武安市| 搜索| 包头市| 农安县| 长海县| 图片| 大宁县| 甘德县| 沂源县| 潢川县| 通辽市|