posts - 13,  comments - 8,  trackbacks - 0
               我是用Struts的,當然就要使用到MVC這個模式,分頁的時候也是這樣的。
                 首先要有一個和數據庫鏈接的bean,我們暫時叫DBUtil吧,這里面封裝了很多和數據庫有關的東西,比如有查詢,修改,插入等方法,這是一個基本的類,這里我們用到的是查詢,這個方法返回的數據類型是Object[][]。這里大家要注意一下,你也可以返回別的類型,但是一定要注意把后面對應的程序也修改一下。一下是這個類的部分代碼:
          package com.model;

          import com.attribute.Constants;

          import java.sql.*;
          import java.util.*;


          /**
           * Created by IntelliJ IDEA.
           * User: 7612CE
           * Date: 2005-6-2
           * Time: 21:41:38
           * To change this template use Options | File Templates.
           */
          public class DBUtil {

              String sDBDriver=Constants.DBDriver;
              String url=Constants.DBUrl;
              String dbUser=Constants.DBUser;
              String dbPassword=Constants.DBPassword;
              Connection conn=null;
              PreparedStatement stmt=null;
              ResultSet rs=null;

              public DBUtil()throws ClassNotFoundException{
                  try{
                      Class.forName(sDBDriver);
                      conn=DriverManager.getConnection(url,dbUser,dbPassword);
                  }catch(Exception e){
                     System.out.println("DBUtil():"+e.getMessage());
                  }
              }
          /**
               * Search some record in object table
               * @param sql sql segment
               * @ param map values for match
               * @return Collection
               */
              public Object[][] doSearch(String sql,Object [] data)throws SQLException{
                  PreparedStatement stmt = conn.prepareStatement(sql);
                  for(int i=0;data!=null&&i<data.length;i++){
                      System.out.print("the aql is ="+sql);
                      System.out.println("data is " + data[i]);
                      stmt.setObject(i+1,data[i]);
                  }
                  ResultSet rset = stmt.executeQuery();
                  ResultSetMetaData rsm = rset.getMetaData();
                  int col = rsm.getColumnCount();
                  ArrayList list = new ArrayList();
                  //Each element of list contains a record of resultset
                  while(rset.next()){
                      list.add(getLine(rset,col));
                  }

                  if(list.size()==0||col==0){
                      closePrepStmt();
                      return null;
                  }

                  closePrepStmt();
                  //Construct box as a data matrix
                  Object[][] box = new Object[list.size()][col];
                  for(int i=0;i<list.size();i++)
                      for(int j=0;j<col;j++)
                      {
                          box[i][j] =((Object[])list.get(i))[j];
                      }
                      return box;
              }
            由于是寫分頁的,當然也是要有一個page的類,具體代碼如下,由于有很多注釋,不用一一介紹了:
          package com.util;

              /**
               * Title: 分頁對象<br>
               * Description:  用于包含數據及分頁信息的對象<br>
               *Page類實現(xiàn)了用于顯示分頁信息的基本方法,但未指定所含數據的類型,
               *可根據需要實現(xiàn)以特定方式組織數據的子類,<br>
               *如RowSetPage以RowSet封裝數據,ListPage以List封裝數據<br>
               * Copyright:    Copyright (c) 2002 <br>
               * @author evan_zhao@hotmail.com <br>
               * @version 1.0
               */
              public  class Page implements java.io.Serializable {
                  public static final Page EMPTY_PAGE = new Page();
                  public static final int  DEFAULT_PAGE_SIZE = 2;
                  public static final  int MAX_PAGE_SIZE = 2;

                  private int myPageSize = DEFAULT_PAGE_SIZE;

                  private int start;
                  private int avaCount,totalSize;
                  private Object[][] data=null;

                  private int currentPageno;
                  private int totalPageCount;

                  /**
                   * 默認構造方法,只構造空頁
                   */
                 public Page(){
                      this.init(0,0,0,DEFAULT_PAGE_SIZE,null);
              }
                  /**
                        *構造分頁對象
                       *@param crs 包含一頁數據的OracleCachedRowSet
                         *@param start 該頁數據在數據庫中的起始位置
                        *@param totalSize 數據庫中包含的記錄總數
                       *@param pageSize 本頁能容納的記錄數
                       */
                       public Page(Object[][] crs, int start, int totalSize, int pageSize) {
                           try{
                               int avaCount=0;
                               if (crs!=null) {
                                       avaCount = crs.length;
                               }
                               data = crs;
                               this.init(start,avaCount,totalSize,pageSize,data);
                           }catch(Exception ex){
                               throw new RuntimeException(ex.toString());
                           }
                       }

              /**
                   * 分頁數據初始方法
                   * @param start 本頁數據在數據庫中的起始位置
                   * @param avaCount 本頁包含的數據條數
                   * @param totalSize 數據庫中總記錄條數
                   * @param pageSize 本頁容量
                   * @param data 本頁包含的數據
                   */
                  protected void init(int start, int avaCount, int totalSize, int pageSize, Object[][] data){

                      this.avaCount =avaCount;
                      this.myPageSize = pageSize;

                      this.start = start;
                      this.totalSize = totalSize;

                      this.data=data;

                      //System.out.println("avaCount:"+avaCount);
                      //System.out.println("totalSize:"+totalSize);
                      if (avaCount>totalSize) {
                          //throw new RuntimeException("記錄條數大于總條數?!");
                      }

                      this.currentPageno = (start -1)/pageSize +1;
                      this.totalPageCount = (totalSize + pageSize -1) / pageSize;

                  if (totalSize==0 && avaCount==0){
                          this.currentPageno = 1;
                          this.totalPageCount = 1;
                      }
                      //System.out.println("Start Index to Page No: " + start + "-" + currentPageno);
                  }

                  public  Object[][] getData(){
                      return this.data;
                  }

                  /**
                   * 取本頁數據容量(本頁能包含的記錄數)
                   * @return 本頁能包含的記錄數
                   */
                  public int getPageSize(){
                  return this.myPageSize;
                  }

                  /**
                   * 是否有下一頁
                   * @return 是否有下一頁
               */
                  public boolean hasNextPage() {
                    /*
                      if (avaCount==0 && totalSize==0){
                          return false;
                  }
                      return (start + avaCount -1) < totalSize;
                     */
                    return (this.getCurrentPageNo()<this.getTotalPageCount());
                  }

                  /**
                   * 是否有上一頁
                   * @return  是否有上一頁
                   */
                  public boolean hasPreviousPage() {
                    /*
                      return start > 1;
                     */
                    return (this.getCurrentPageNo()>1);
                  }

                  /**
                   * 獲取當前頁第一條數據在數據庫中的位置
                   * @return
                   */
                  public int getStart(){
                      return start;
                  }

                  /**
                   * 獲取當前頁最后一條數據在數據庫中的位置
                   * @return
                   */
                  public int getEnd(){
                      int end = this.getStart() + this.getSize() -1;
                      if (end<0) {
                          end = 0;
                      }
                      return end;
                  }

                  /**
                   * 獲取上一頁第一條數據在數據庫中的位置
                   * @return 記錄對應的rownum
                   */
                  public int getStartOfPreviousPage() {
                      return Math.max(start-myPageSize, 1);
                  }


                  /**
                   * 獲取下一頁第一條數據在數據庫中的位置
                   * @return 記錄對應的rownum
                   */
                  public int getStartOfNextPage() {
                      return start + avaCount;
                  }

                  /**
                   * 獲取任一頁第一條數據在數據庫中的位置,每頁條數使用默認值
                   * @param pageNo 頁號
                   * @return 記錄對應的rownum
                   */
                  public static int getStartOfAnyPage(int pageNo){
                      return getStartOfAnyPage(pageNo, DEFAULT_PAGE_SIZE);
                  }

                  /**
                   * 獲取任一頁第一條數據在數據庫中的位置
                   * @param pageNo 頁號
                   * @param pageSize 每頁包含的記錄數
                   * @return 記錄對應的rownum
                   */
                  public static int getStartOfAnyPage(int pageNo, int pageSize){
                      int startIndex = (pageNo-1) * pageSize + 1;
                      if ( startIndex < 1) startIndex = 1;
                      //System.out.println("Page No to Start Index: " + pageNo + "-" + startIndex);
                      return startIndex;
                  }

                  /**
                   * 取本頁包含的記錄數
                   * @return 本頁包含的記錄數
                   */
                  public int getSize() {
                      return avaCount;
                  }

                  /**
                   * 取數據庫中包含的總記錄數
                   * @return 數據庫中包含的總記錄數
                   */
                  public int getTotalSize() {
                      return this.totalSize;
                  }

                  /**
                   * 取當前頁碼
                   * @return 當前頁碼
                   */
                  public int getCurrentPageNo(){
                      return  this.currentPageno;
                  }

                  /**
                   * 取總頁碼
                   * @return 總頁碼
                   */
                  public int getTotalPageCount(){
                      return this.totalPageCount;
                  }

              }
            由于是用mvc這樣的框架,所以在c這一層僅僅起到一個轉向和收集頁面信息的作用,所以這里我有寫了一個分頁查詢的bean,暫時命名是PageCtBean,代碼如下:
           package com.util;

          import com.model.DBUtil;
          import java.sql.*;
          /**
           * Created by IntelliJ IDEA.
           * User: 7612ce
           * Date: 2005-6-23
           * Time: 10:36:57
           * To change this template use Options | File Templates.
           */
            public class  PageCtBean {
                 public final static int MAX_PAGE_SIZE = Page.MAX_PAGE_SIZE;
          protected String countSQL, querySQL;
          protected int pageNo,pageSize,startIndex,totalCount;
           protected javax.sql.RowSet rowSet;
           protected Page setPage;
                  protected Object[][] objTables=null;
                  protected Object[][] objCount=null;
                  protected Object[] obj=null;

                 public PageCtBean(){

                 }
              /**
                   * 構造一查詢出所有數據的PageStatement
          .         * @param sql  query sql
                   */
                  public PageCtBean(String sql){
                      this(sql,1,MAX_PAGE_SIZE);
              }
              /**
                   * 構造一查詢出當頁數據的PageStatement
                   * @param sql  query sql
                   * @param pageNo  頁碼
                   */
                  public PageCtBean(String sql, int pageNo){
                      this(sql, pageNo, Page.DEFAULT_PAGE_SIZE);
                  }

                  /**
                   * 構造一查詢出當頁數據的PageStatement,并指定每頁顯示記錄條數
                   * @param sql query sql
                   * @param pageNo 頁碼
                   * @param pageSize 每頁容量
                   */
                  public PageCtBean(String sql, int pageNo, int pageSize){
                      this.pageNo = pageNo;
                      this.pageSize = pageSize;
                      this.startIndex = Page.getStartOfAnyPage(pageNo, pageSize);
                      this.querySQL = intiQuerySQL(sql, this.startIndex, pageSize);
                  }


                /**
                   *生成查詢一頁數據的sql語句
                   *@param sql 原查詢語句
                   *@ startIndex 開始記錄位置
                   *@ size 需要獲取的記錄數
                   */
                  protected String intiQuerySQL(String sql, int startIndex, int size){
                      StringBuffer querySQL = new StringBuffer();
                          querySQL.append(sql)
                                  .append(" limit ")
                                  .append(startIndex-1 )
                                  .append(",").append(size);
                          return querySQL.toString();
                  }

                  /**
                   *使用給出的對象設置指定參數的值
                   *@param obj 包含參數值的對象
                   */
                  public void setObject(Object obj[]) throws SQLException{
                              this.obj=obj;
                          }

                  public void setCountSql(String sql){
                      this.countSQL=sql;
                  }
              /**
                   * 執(zhí)行查詢取得一頁數據,執(zhí)行結束后關閉數據庫連接
                   * @return RowSetPage
          .         * @throws SQLException
                   */
                  public  Page executeQuery() throws ClassNotFoundException{
                             System.out.println("executeQueryUsingPreparedStatement");
                          DBUtil DBean=new DBUtil();
                             try{
                              objCount = DBean.doSearch(this.countSQL,obj);
                                 if (!objCount.equals(null)){
                                  System.out.println("the count is ="+objCount[0][0].toString());
                                     totalCount =Integer.parseInt(objCount[0][0].toString()) ;
                                     System.out.println("the count is ="+totalCount);
                                 } else {
                                     totalCount = 0;
                                 }
                                 if (totalCount < 1 )
                                     return null;
                                 objTables= DBean.doSearch(this.querySQL,obj);
                              this.setPage = new Page(this.objTables,startIndex,totalCount,pageSize);
                                 return this.setPage;
                             }catch(SQLException sqle){
                                 //System.out.println("executeQuery SQLException");
                                 sqle.printStackTrace();

                             }catch(Exception e){
                                 e.printStackTrace();
                                 throw new RuntimeException(e.toString());
                             }
                     return null;
                         }
                  /**
                   *取封裝成Page的查詢結果
                   *@return Page
             */
                  public Page getPage() {
                      return this.setPage;
                  }
              }
          接下來是Action里面的代碼,暫時定義這個Action 是ComputerAction,代碼如下:
          package com.action;

          import org.apache.struts.action.Action;
          import org.apache.struts.action.ActionForward;
          import org.apache.struts.action.ActionMapping;
          import org.apache.struts.action.ActionForm;
          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;

          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import javax.servlet.http.HttpSession;

          import com.form.LoginForm;
          import com.util.LoginBean;
          import com.util.ComputerBean;
          import com.util.BaseView;
          import com.util.Page;
          import com.model.FunctionManager;
          import com.attribute.Constants;
          import com.attribute.SQLBook;

          import java.sql.ResultSet;

          /**
           * Created by IntelliJ IDEA.
           * User: 7612CE
           * Date: 2005-6-14
           * Time: 13:31:34
           * To change this template use Options | File Templates.
           */
          public class ComputerAction extends BaseAction {
              private Log log=LogFactory.getLog(this.getClass().getName());

               public ActionForward execute(ActionMapping mapping,
                               ActionForm Form,
                               HttpServletRequest request,
                               HttpServletResponse response){
                    boolean flag=false;
                   Object[][] obj=null;
                   Page page=new Page();
                   Integer id=new Integer(Constants.id);
                   String sql=SQLBook.Computer_select_SQL;
                   BaseView view=new BaseView();
                   String pageNo = request.getParameter("pageNo");
                   if (pageNo == null || pageNo.equals("null") || pageNo.length() <= 0) {
                              pageNo = "1";
                          }
                   try{
                       Object[] table={id};
                       ComputerBean computerBean=new ComputerBean();
                       computerBean.setBeanDate(sql,table);
                       computerBean.setPageNo(pageNo);
                       page=computerBean.getResult();
                       obj=page.getData();
                       if(!obj.equals(null)){
                           flag=true;
                           view.setObject(obj);
                           request.setAttribute(Constants.QUERY_RESULT,view);
                           request.setAttribute("page",page);
                       }

                   }catch(Exception ex){
                       ex.printStackTrace();
                   }
                   log.info("system print the flag ="+flag);
                   if(flag){
                     return(mapping.findForward(Constants.FORWARD_SUCCESS));
                   }else{
                       return(mapping.findForward(Constants.FORWARD_FAILURE));
                   }
                }

          由于Action里面用到了查詢的SQL語句,所有SQL語句寫在一個特定的類中,這個類名定義為SQLBook,代碼如下:
          public class SQLBook {

              public SQLBook(){}
          /**
               * computer sql
               */

              public static final String Computer_select_SQL=
                     "select a.id,a.bookname,a.bookclass,b.classname,"+
                     "a.author,a.publish,a.bookno,a.content,a.prince,a.amount,"+
                     "a.Leav_number,a.regtime,a.picture from book a,bookclass b"+
                     " where a.Bookclass = b.Id and a.bookclass=? "+
                     " order by a.Id desc ";
              public static final String Computer_select_count_sql=
                      "select count(*) from book a,bookclass b"+
                     " where a.Bookclass = b.Id and a.bookclass=? "+
                     " order by a.Id desc ";

          }
          到此為止,基本上分頁的代碼基本完成,為了使得分頁的代碼共用,我把他封裝成了一個標簽,這個方法是參考一個網友的文章上寫的,在這里表示感謝。這個自定義的標簽命名為PaginatorTag,代碼如下:
          package com.util;

          import java.io.IOException;
          import javax.servlet.jsp.JspException;
          import javax.servlet.jsp.tagext.BodyTagSupport;
          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;
          public class PaginatorTag extends BodyTagSupport {
              protected Log log = LogFactory.getLog(this.getClass());
          //以下是一標簽中的一些屬性,后面有較詳細的介紹
              int currentPage = 1;//當前頁碼
              String url = "";//轉向的地址
              int totalSize = 0;//總的記錄數
              int perPage = 20;//每頁顯示的記錄數目
              boolean showTotal = true;//是否顯示總數量
              boolean showAllPages = false;//是否顯示總頁碼
              String strUnit ="";//計數單位

              //得到當前頁碼
              public int getCurrentPage() {
                  return currentPage;
              }
              //設置當前頁碼
              public void setCurrentPage(int currentPage) {
                  this.currentPage = currentPage;
              }
              //得到每頁顯示記錄的數目
              public int getMaxPerPage() {
                  return perPage;
              }
              //設置每頁顯示的記錄數目
              public void setMaxPerPage(int perPage) {
                  this.perPage = perPage;
              }
              //判斷是否顯示總的頁碼數目
              public boolean isShowAllPages() {
                  return showAllPages;
              }
              //設置是否顯示總的頁碼數目
              public void setShowAllPages(boolean showAllPages) {
                  this.showAllPages = showAllPages;
              }
              //判斷是否顯示總的記錄數目
              public boolean isShowTotal() {
                  return showTotal;
              }
              //設置是否顯示總的記錄數目
              public void setShowTotal(boolean showTotal) {
                  this.showTotal = showTotal;
              }
              //得到計數單位
              public String getStrUnit() {
                  return strUnit;
              }
              //設置計數單位
              public void setStrUnit(String strUnit) {
                  this.strUnit = strUnit;
              }
              //得到總的記錄數目
              public int getTotalPut() {
                  return totalSize;
              }
              //設置總的記錄數目
              public void setTotalPut(int totalSize) {
                  this.totalSize = totalSize;
              }
              //得到轉向的鏈接地址
              public String getUrl() {
                  return url;
              }
              //設置鏈接地址
              public void setUrl(String url) {
                  this.url = url;
              }
              public int doStartTag() throws JspException {
                  return SKIP_BODY;
              }


              public int doEndTag() throws JspException {
                  String out = showPage(currentPage, url, totalSize, perPage, showTotal, showAllPages, strUnit);
                  try {
                      pageContext.getOut().print(out);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  return EVAL_PAGE;
              }


              /**
               * 作 用:顯示“上一頁 下一頁”等信息
               *
               * @param url
               *            ----鏈接地址
               * @ param totalSize
               *            ----總數量
               * @ param perPage
               *            ----每頁數量
               * @param showTotal
               *            ----是否顯示總數量
               * @param showAllPages
               *            ---是否用下拉列表顯示所有頁面以供跳轉。有某些頁面不能使用,否則會出現(xiàn)JS錯誤。
               * @param strUnit
               *            ----計數單位
               * @return .
               * @ throws IOException
               */
              protected String showPage(int currentPage,String url, int totalSize, int perPage,
                      boolean showTotal, boolean showAllPages, String strUnit){
                  int n = 0;
                  StringBuffer buf = new StringBuffer();
                  String strUrl;
                  n = (totalSize + perPage -1) / perPage;
                  buf.append("<table align='center'><tr><td>");
                  if (showTotal == true)
                      buf.append("共 <b>" + totalSize + "</b> " + strUnit
                              + "  ");
                  strUrl = JoinChar(url);
                  if (currentPage < 2) {
                      buf.append("首頁 上一頁 ");
                  } else {
                      buf.append("<a href='" + strUrl + "pageNo=1' title='首頁'>首頁</a> ");
                      buf.append("<a href='" + strUrl + "pageNo=" + (currentPage - 1)
                              + "' title='上一頁'>上一頁</a> ");
                  }
                  if (n - currentPage < 1)
                      buf.append("下一頁 尾頁");
                  else {
                      buf.append("<a href='" + strUrl + "pageNo=" + (currentPage + 1)
                              + "' title='下一頁'>下一頁</a> ");
                      buf.append("<a href='" + strUrl + "pageNo=" + n + "' title='尾頁'>尾頁</a>");
                  }
                  buf.append(" 頁次:<strong><font color=red>" + currentPage
                          + "</font>/" + n + "</strong>頁 ");
                  buf.append(" <b>" + perPage + "</b>" + strUnit + "/頁");
                  if (showAllPages == true) {
                      buf
                              .append(" 轉到:<select name='page' size='1' onchange=\"javascript:window.location='"
                                      + strUrl
                                      + "pageNo="
                                      + "'+this.options[this.selectedIndex].value;\">");
                      for (int i = 1; i <= n; i++) {
                          buf.append("<option value='" + i + "'");
                          if(currentPage == i)
                              buf.append(" selected ");
                          buf.append(">第" + i + "頁</option>");
                      }
                      buf.append("</select>");
                  }
                  buf.append("</td></tr></table>");
                  return (buf.toString());
              }


              /**
               *  向地址中加入 ? 或 &
               * @param strUrl
               *            ----網址.
               * @return 加了 ? 或 & 的網址.
               */
              protected String JoinChar(String strUrl) {
                  String result = "";
                  if (strUrl.equals("") || strUrl.length() <= 0) {
                      return result;
                  }
                  if (strUrl.indexOf("?") < strUrl.length()) {
                      if (strUrl.indexOf("?") > -1) {
                          if (strUrl.indexOf("&") < strUrl.length()) {
                              result = strUrl + "&";
                          } else {
                              result = strUrl;
                          }
                      } else {
                          result = strUrl + "?";
                      }
                  } else {
                      result = strUrl;
                  }
                  return result;
              }
          }
          有了自定義標簽,當然少不了用于處理標簽的tld,我們定義一個swsoft-struts.tld,代碼如下: 
          有了自定義標簽,當然少不了用于處理標簽的tld,我們定義一個swsoft-struts.tld,代碼如下: 
          <?xml version="1.0" encoding="UTF-8"?> 
          <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> 
          <taglib> 
          <tlibversion>1.0</tlibversion> 
          <jspversion>1.1</jspversion> 
          <shortname>out</shortname> 
          <uri>http://www.swsoftware.com/</uri> 
          <info>Tab Library for PaginatorTag</info> 
          <tag> 
              <name>paginator</name> 
              <tagclass>com.swsoftware.tags.PaginatorTag</tagclass> 
              <bodycontent>JSP</bodycontent> 
              <info>Returns a paginator</info> 
              <attribute> 
                  <name>currentPage</name> 
                  <required>true</required> 
                  <rtexprvalue>true</rtexprvalue> 
              </attribute> 
              <attribute> 
                  <name>url</name> 
                  <required>true</required> 
                  <rtexprvalue>true</rtexprvalue> 
              </attribute> 
              <attribute> 
                  <name>totalPut</name> 
                  <required>true</required> 
                  <rtexprvalue>true</rtexprvalue> 
              </attribute> 
              <attribute> 
                  <name>maxPerPage</name> 
                  <required>true</required> 
                  <rtexprvalue>true</rtexprvalue> 
              </attribute> 
              <attribute> 
                  <name>showTotal</name> 
                  <required>true</required> 
                  <rtexprvalue>false</rtexprvalue> 
              </attribute> 
              <attribute> 
                  <name>showAllPages</name> 
                  <required>true</required> 
                  <rtexprvalue>false</rtexprvalue> 
              </attribute> 
              <attribute> 
                  <name>strUnit</name> 
                  <required>true</required> 
                  <rtexprvalue>false</rtexprvalue> 
              </attribute> 
          </tag> 
          </taglib> 
          好了,到現(xiàn)在我們開始來真正看一下jsp中的處理,我們寫一個computer.jsp,代碼如下:
          <%@ page import="com.util.BaseView,
                           com.attribute.Constants,
                           com.util.Page"%>
          <%@ page contentType="text/html;charset=GB2312" language="java" errorPage=""%>
          <%@ taglib uri="/WEB-INF/swsoft-struts.tld"prefix="swtag"%>
          <html>
          <head>
          <title></title>

          </head>
          <body bgcolor="#e3edfc">
          <div id="Layer1" style="position:absolute; left:1px; top:2px; width:780px; height:406px; z-index:1; background-color: #e3edfc; layer-background-color: #e3edfc; border: 1px none #000000;">
            <table width="100%" cellpadding="1">
              <tr>
                <td colspan="6">
                <table width="100%"  cellpadding="1">
              <tr>
                <td width="20%" align="center">BOOKNAME</td>
                <td width="10%" align="center">AUTHOR</td>
                <td width="10%" align="center">TYPE</td>
                <td width="30%" align="center">PUBLISH</td>
                <td width="10%" align="center">PRINCE</td>
                <td colspan="2" align="center">SELECT</td>
              </tr>
            <%
               String contextPath = request.getContextPath();
               String url=contextPath+"/computer.do";
              BaseView view=(BaseView)request.getAttribute(Constants.QUERY_RESULT);
              Page setpage=(Page)request.getAttribute("page");
              int currentPage=setpage.getCurrentPageNo();
                System.out.println("this is currentPage="+currentPage);
              int totalPut=setpage.getTotalSize();
                System.out.println("this is totalPut="+totalPut);
              int maxPerPage=setpage.getPageSize();
                System.out.println("this is maxPerPage="+maxPerPage);
              if(view.haveRecord()){
                  String sBgcolor="";
                  int length=view.getRecordCount();
                  for(int i=0;i<length;i++){
                     String type =view.getValue(i,2);
                      if(type.equals("1")){
                          type="computer";
                      }
                      if(i%2!=0){
                          sBgcolor="#A5C6EB";
                      }
                      else{
                          sBgcolor="#B7D7EF";
                      }
          %>
              <tr bgcolor=<%=sBgcolor%> height="10">
                <td align="center" ><%=view.getValue(i,1)%></td>
                <td align="center"><%=view.getValue(i,4)%></td>
                <td align="center"><%=type%></td>
                <td align="center"><%=view.getValue(i,5)%></td>
                <td align="center"><%=view.getValue(i,8)%></td>
                <td width="20%" align="center">BUY PARTICULAR</td>

              </tr>
          <%}}%>
            </table>
            </td>
              </tr>

              <tr>
              <swtag:paginator url="<%=url%>"
              currentPage="<%=currentPage%>"
              totalPut="<%=totalPut%>"
              maxPerPage="<%=maxPerPage%>"
              showTotal="true"
              showAllPages="true"
              strUnit="頁" />
              </tr>
            </table>
          </div>

          </body>
          </html> 
          到此為止,分頁的類基本完成,這樣的話可以在別的模塊都可以用這個標簽,同時在開發(fā)別的系統(tǒng)的時候這個標簽也可以使用,具有比較好的可移植性。這個數據庫是mysql的,要是oracle的,僅僅在PageCtBean類中的intiQuerySQL方法里面改成
          protected String intiQuerySQL(String sql, int startIndex, int size){
                      StringBuffer querySQL = new StringBuffer();
                      if (size != this.MAX_PAGE_SIZE) {
                          querySQL.append("select * from (select my_table.*,rownum as my_rownum from(")
                                  .append(  sql)
                                  .append(") my_table where rownum<").append(startIndex + size)
                                  .append(") where my_rownum>=").append(startIndex);
                      } else {
                          querySQL.append("select * from (select my_table.*,rownum as my_rownum from(")
                                  .append(sql)
                                  .append(") my_table ")
                                  .append(") where my_rownum>=").append(startIndex);
                      }
                      return querySQL.toString();
                  }
          就可以了。
          同時在數據庫中,返回當前頁需要顯示的數據,主要有以下方法,。
          a.使用mysql控制:
          select * from user
          order by Host
          limit m, n
          結果返回的是第m+1行到第n行的數據集。
          比如
          select * from user
          order by Host
          limit 1, 5
          返回的是第2行到第5行的數據集
          b.使用sqlserver
          SELECT *
          FROM (SELECT TOP m *
                  FROM (SELECT TOP n *
                          FROM Customers) A
                  ORDER BY CustomerID DESC) B
          ORDER BY CustomerID
          獲得的結果集數據為第n-m+1行到第n行。
          對整個過程的解釋:
          首先按照升序得到前n行的結果集A,然后按照降序從A中得到后m行的結果集B,最后按照升序對B進行重新排序,返回結果集。
          其中CustomerID為主鍵
          比如:
          SELECT *
          FROM (SELECT TOP 5 *
                  FROM (SELECT TOP 10 *
                          FROM Customers) A
                  ORDER BY CustomerID DESC) B
          ORDER BY CustomerID
          的意思就是返回包含第6行到第10行的數據結果集。
          c.使用Oracle: 
          select * from (select rownum r ,* from test) tt 
          where tt.r > 50 and tt.r <= 100; 
          希望大家有好方法的話能說一下,大家共同進步.
          posted on 2005-10-26 18:40 YangRj 閱讀(441) 評論(0)  編輯  收藏 所屬分類: 精華文章
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(2)

          隨筆分類(5)

          隨筆檔案(13)

          文章分類(14)

          文章檔案(34)

          Apache - Tech Online

          BLOG 收集

          BLOG地址

          DB2

          Eclipse

          IBM - Tech Online

          JAVA

          ORACLE

          OS

          好網址

          文學網站

          累了 聽聽歌曲吧

          論壇

          積分與排名

          • 積分 - 25861
          • 排名 - 1511

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 高淳县| 新密市| 额济纳旗| 繁峙县| 平山县| 苗栗市| 丽水市| 申扎县| 资讯 | 孙吴县| 青田县| 焦作市| 宜昌市| 临邑县| 蕲春县| 沂水县| 崇义县| 晋城| 大埔区| 西充县| 武汉市| 丹阳市| 克什克腾旗| 泰安市| 扬州市| 榕江县| 洛阳市| 个旧市| 安庆市| 中山市| 于田县| 潼南县| 西城区| 通榆县| 珠海市| 南岸区| 东源县| 甘洛县| 武定县| 西昌市| 咸丰县|