結合JSTL用配置來完成基於存儲過程的分頁顯示

     分頁顯示是WEB開發中都要用到的一種數據顯示方法,這裏介紹一種差不多全靠配置來完成分頁顯示功能的方式,運用這種方式來完成數據分頁顯示,你會發現原來分頁也可以做到如此簡單,不用再寫繁瑣的JSP代碼,你只需更改幾個特定參數就可以隨心所欲地進行分頁。本例大量採用JSTL標籤,代碼簡單整齊排列美觀,讀者不妨一試!
 
WEB服務器:Tomcat
數據庫:Microsoft SQL Server 2000
 
值得說明的一點是,在代碼較多的地方,有可能我不會將代碼全部列出來,而只是挑選關鍵地方加以說明,而後我會將完整代碼上傳到附件中,讀者朋友有不懂的地方可以參照附件。
 
爲節省篇幅,數據類DBConnect我就不列出代碼,其功能就是根據傳入的連接池名來完成數據庫連接及數據庫查詢和更新操作,有需要讀者朋友可以參考附件,下面提一下所用到的連接池爲proxool,而後只要將連接池別名(本例中爲bpDbCon)傳入連接類DBConnect即可實現連接和其它數據操作。
<?xml version="1.0" encoding="UTF-8"?>

<something-else-entirely>
  <proxool>
    <alias>bpDbCon</alias>
    <driver-url>jdbc:microsoft:sqlserver://192.168.39.62:1433;DatabaseName=bpdb</driver-url>
    <driver-class>com.microsoft.jdbc.sqlserver.SQLServerDriver</driver-class>
    <driver-properties>
      <property name="user" value="test"/>
      <property name="password" value="test"/>
      <property name="useUnicode" value="true"/>    
    </driver-properties>  
    <minimum-connection-count>6</minimum-connection-count>
    <maximum-connection-count>20</maximum-connection-count>
    <prototype-count>6</prototype-count>
    <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
  </proxool>  
</something-else-entirely>

 
1,數據表結構,這個是我用到的數據表。
CREATE TABLE [dbo].[recordsList] (
    [nId] [int] IDENTITY (1, 1) NOT NULL ,
    [strPoNo] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [strGrNo] [nvarchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
    [nItem] [int] NOT NULL ,
    [strMaterialDesc] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
    [strMaterialNo] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [strMaterialName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [strApplicant] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
    [fltUnitPrice] [float] NULL ,
    [nCount] [int] NOT NULL ,
    [strDate] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [strDeptName] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [strSignDate] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [strMaterialSort] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL  
) ON [PRIMARY]
 
2,要用到的分頁存儲過程P_viewPage,這個存儲過程在整個分頁顯示中起了關鍵作用,靠傳入的參數來獲得所需要的記錄集
CREATE PROC P_viewPage
/*
no_mIss 分頁存儲過程 2007.2.20 QQ:706716259
適用於單一主鍵或存在唯一值列的表或視圖  
*/

@TableName VARCHAR(200), --表名
@FieldList VARCHAR(2000), --顯示列名
@PrimaryKey VARCHAR(100), --單一主鍵或唯一值鍵
@Where VARCHAR(1000), --查詢條件 不含'where'字符
@Order VARCHAR(1000), --排序 不含'order by'字符,如id asc,userid desc,當@SortType=3時生效
@SortType INT, --排序規則 1:正序asc 2:倒序desc 3:多列排序
@RecorderCount INT, --記錄總數 0:會返回總記錄
@PageSize INT, --每頁輸出的記錄數
@PageIndex INT, --當前頁數
@TotalCount INTEGER OUTPUT, --返回記錄總數
@TotalPageCount INTEGER OUTPUT --返回總頁數

AS
SET NOCOUNT ON
IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = ''  
OR ISNULL(@PrimaryKey,'') = ''
OR @SortType < 1 OR @SortType >3
OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0
BEGIN  
    RETURN
END

DECLARE @new_where1 VARCHAR(1000)
DECLARE @new_where2 VARCHAR(1000)
DECLARE @new_order VARCHAR(1000)  
DECLARE @Sql VARCHAR(8000)
DECLARE @SqlCount NVARCHAR(4000)

IF ISNULL(@where,'') = ''
    BEGIN
  SET @new_where1 = ' '
  SET @new_where2 = ' WHERE '
    END
ELSE
    BEGIN
  SET @new_where1 = ' WHERE ' + @where  
  SET @new_where2 = ' WHERE ' + @where + ' AND '
    END
IF ISNULL(@order,'') = '' OR @SortType = 1 OR @SortType = 2  
    BEGIN
  IF @SortType = 1 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' ASC'
  IF @SortType = 2 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' DESC'
    END
ELSE
    BEGIN
  SET @new_order = ' ORDER BY ' + @Order
    END
SET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'
+ CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName + @new_where1
IF @RecorderCount = 0
    BEGIN
  EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',
  @TotalCount OUTPUT,@TotalPageCount OUTPUT
    END
ELSE
    BEGIN
  SELECT @TotalCount = @RecorderCount  
    END
IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)
    BEGIN
  SET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize)
  --這裏加一行測試
  --print '當前頁PageIndex爲'+str(@PageIndex)
    END
IF @PageIndex = 0 or @PageIndex = 1  
--IF @PageIndex = 1    --原始行
    BEGIN
  SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '  
  + @TableName + @new_where1 + @new_order
    END
ELSE
    BEGIN
  IF @SortType = 1
      BEGIN
    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '  
    + @TableName + @new_where2 + @PrimaryKey + ' > '
    + '(SELECT max(' + @PrimaryKey + ') FROM (SELECT TOP '
    + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey  
    + ' FROM ' + @TableName
    + @new_where1 + @new_order +' ) AS TMP) '+ @new_order
      END
  IF @SortType = 2
      BEGIN
    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '  
    + @TableName + @new_where2 + @PrimaryKey + ' < '
    + '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '
    + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey  
    +' FROM '+ @TableName
    + @new_where1 + @new_order + ') AS TMP) '+ @new_order  
      END  
  IF @SortType = 3
      BEGIN
      IF CHARINDEX(',',@Order) = 0 BEGIN RETURN END
      SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
      + @TableName + @new_where2 + @PrimaryKey + ' NOT IN (SELECT TOP '
      + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
      + ' FROM ' + @TableName + @new_where1 + @new_order + ')'
      + @new_order
      END
    END
EXEC(@Sql)
--print @Sql
 
3,分頁顯示類,兩個,父類Pagess,子類Listss,這兩個類接收Jsp頁面傳來的參數,並將參數整理後傳給所調用的分頁存儲過程,同時將存儲過程返回的記錄集結果封裝起來
父類Pages
package sqlDBconnect;

import java.util.Vector;

/**
* Title:        分頁類
* Description:
* Copyright:    Copyright (c) 2007
* Company:      USI
* @author:   LJ
* @version 1.0
*/


public class Pagess {
    protected Vector list;  //物品向量數組
    protected int page=1;  //當前頁數
    protected int recordCount=0;  //記錄總數 0:會返回總記錄
    protected int pageCount=1;      //返回總頁數
    protected int pageSize=15;  //每頁輸出的記錄數
    protected int recode=0;  
    protected int pageMaxCount=0;
    protected int listCount=0;
    protected boolean showAll=false;
  
    public Pagess() throws Exception{

    }
  
    public void setPage(int newPage) {
        this.page=newPage;
    }

    public int getPage() {
    if (page<=0)
     return 1;
    else
     return page;  
  
    }
  
    public void setPageSize(int newPageSize) {
    pageSize=newPageSize;
    }
  
    public void setShowAll() {
    showAll=true;
    }

    public int getPageSize() {
    return pageSize;
    }
    
    public int getPageCount() {
  return pageCount;
    }
    public int getRecordCount() {
  return recordCount;
    }
    public int getRecode() {
  return recode;
    }
  
    public void setListCount(int listCount){
  this.listCount=listCount;
    }
  
    public int getListCount() {
  return list.size();
    }
  
    
    public Vector getLists() {
  return list;
    }
  

    public void setShowPage(int newCount) throws Exception {
      listCount=newCount;
      list = new Vector();//PageMaxCount+1);
      list.clear();        
      recode=(page-1)*pageSize+1;
  
    }

    /**
  * @param pageCount 要設置的 pageCount
  */

    public void setPageCount(int pageCount) {
  this.pageCount = pageCount;
    }

    /**
  * @param recordCount 要設置的 recordCount
  */

    public void setRecordCount(int recordCount) {
  this.recordCount = recordCount;
    }
};

 
子類Listss,注意其中的excute方法,該方法就是用來根據傳入的參數返回所需記錄集,並將結果記錄集封裝以便在jsp頁面更容易地調用。
package sqlDBconnect;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
/**
* Title:        物品列表
* Description:
* Copyright:    Copyright (c) 2007
* Company:      USI
* @author:   LJ
* @version 1.0
*/


public class Listss extends Pagess {
    private String[]           columnNames = {};
    private ResultSetMetaData  metaData;
    int                        row=0;
    int                       columnCount=0;  
    String                    strSql="";  
    int        execute=0;
    String        sql="";
    private String     poolName;
  
    private String      tableName="";
    private String      fieldList="";
    private String      primaryKey="";
    private String      where="";
    private String      order="";
    private int      sortType=1;
    /**
  * @return fieldList
  */

    public String getFieldList() {
  return fieldList;
    }

    /**
  * @param fieldList 要設置的 fieldList
  */

    public void setFieldList(String fieldList) {
  this.fieldList = fieldList;
    }

    /**
  * @return order
  */

    public String getOrder() {
  return order;
    }

    /**
  * @param order 要設置的 order
  */

    public void setOrder(String order) {
  this.order = order;
    }

    /**
  * @return primaryKey
  */

    public String getPrimaryKey() {
  return primaryKey;
    }

    /**
  * @param primaryKey 要設置的 primaryKey
  */

    public void setPrimaryKey(String primaryKey) {
  this.primaryKey = primaryKey;
    }

    /**
  * @return sortType
  */

    public int getSortType() {
  return sortType;
    }

    /**
  * @param sortType 要設置的 sortType
  */

    public void setSortType(int sortType) {
  this.sortType = sortType;
  //System.out.println(this.sortType);
    }

    /**
  * @return tableName
  */

    public String getTableName() {
  return tableName;
    }

    /**
  * @param tableName 要設置的 tableName
  */

    public void setTableName(String tableName) {
  this.tableName = tableName;
    }

    /**
  * @return where
  */

    public String getWhere() {
  return where;
    }

    /**
  * @param where 要設置的 where
  */

    public void setWhere(String where) {
  this.where = where;
    }

    public Listss() throws Exception{
  super();
    }
  
    public String getColumnName(int column) {
        if (column>=columnCount)  
       column=columnCount-1;
        
        if (column<0)  
       column=0;  
              
        if (columnNames[column] != null) {
            return columnNames[column];
        } else  
            return "";
        
    }
    
    public int getColumnIndex(String name) {
      int ok=0;  
      if (name!=null) {
          for (int i=0;i<columnCount;i++) {
          String temp=columnNames[i].toLowerCase();
          name=name.toLowerCase();  
         if (name.equals(temp))
          {    
          ok= i;
          break;
        }

       }
   }
     return ok;  
   }
    
    public void setRow(int i) {
        row=i;
    }
    
    public int getRow(){
        return this.row;
    }
    
    public int getColumnCount() {
        return columnNames.length;
    }
    
     public Class getColumnClass(int column) {
        int type;
        try {
            type = metaData.getColumnType(column+1);
        }
        catch (SQLException e) {
            return null;
        }

        switch(type) {
        case Types.CHAR:
        case Types.VARCHAR:
        case Types.LONGVARCHAR:
            return String.class;

        case Types.BIT:
            return Boolean.class;

        case Types.TINYINT:
        case Types.SMALLINT:
        case Types.INTEGER:
            return Integer.class;

        case Types.BIGINT:
            return Long.class;

        case Types.FLOAT:
        case Types.DOUBLE:
            return Double.class;

        case Types.DATE:
            return java.sql.Date.class;

        default:
            return Object.class;
        }
    }
        
    public String getString(int aColumn) {
        String[] rowStr = (String[])list.elementAt(row);
        return rowStr[aColumn];
    //    Vector row = (Vector)list.elementAt(FRow);
    //    return row.elementAt(aColumn).toString();
        }
      
    public String getString(String aColumnName) {
        String[] rowStr = (String[])list.elementAt(row);
        return rowStr[getColumnIndex(aColumnName)];      
    //    Vector row = (Vector)list.elementAt(FRow);
    //    return row.elementAt(getColumnIndex(aColumnName)).toString();
        }
    
    public void setSql(String tableName) {
  String Str="";
  Str="select  * from "+tableName+" order by id desc";
  strSql=Str;
    }

    public void setStrSql(String Str) {
  strSql=Str;
    }
  
    public String getStrSql(){
  return this.strSql;
    }
  
    public String getSql() {
  return strSql;
    }

    public int getExecute() throws Exception{
  if(excute()) return 1;
  else return 0;
    }

    public boolean excute() throws Exception {
  int id = 0;
  try {
      DBConnect dbc  = new DBConnect(this.poolName,"CallableStatement");
      CallableStatement   cstmt   =   dbc.getConnection().prepareCall("{call P_viewPage(?,?,?,?,?,?,?,?,?,?,?)}",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
      cstmt.setString(1,this.tableName);
      cstmt.setString(2,this.fieldList);
      cstmt.setString(3,this.primaryKey);
      cstmt.setString(4,this.where);
      cstmt.setString(5,this.order);
      cstmt.setInt(6,this.sortType);
      cstmt.setInt(7,super.getRecordCount());
      cstmt.setInt(8,super.getPageSize());
      cstmt.setInt(9,super.getPage());
      cstmt.registerOutParameter(10,java.sql.Types.INTEGER);    
      cstmt.registerOutParameter(11,java.sql.Types.INTEGER);  
    
      //System.out.print(this.tableName+"  "+this.fieldList+"  "+this.primaryKey+"  "    +this.where+"  "+this.order+"  "+this.sortType+"  "+super.getRecordCount()+"  "+super.getPageSize()+"  "+super.getPage());    
      cstmt.executeUpdate();
      super.setRecordCount(cstmt.getInt(10));
      super.setPageCount(cstmt.getInt(11));
    
      //System.out.println(cstmt.getInt(10));
      //System.out.println(cstmt.getInt(11));
    
      ResultSet rs=cstmt.executeQuery();

      //設置當前頁
      if(super.getPage()>=super.getPageCount())    super.setPage(super.getPageCount());
    
      metaData = rs.getMetaData();
      columnCount =  metaData.getColumnCount();
      columnNames = new String[columnCount];
            // Get the column names and cache them.
            // Then we can close the connection.
        for(int column = 0; column < columnCount; column++) {
            columnNames[column] = metaData.getColumnLabel(column+1);
          }
     //rs.last();
        setShowPage(rs.getRow());
        //rs.absolute(getRecode());
  
        if(rs.next()){
      for (int i=0;i<getPageSize();i++){
         String[]            rsRow = {};
         rsRow = new String[columnCount];  
               for(int column = 0; column < columnCount; column++) {
                 rsRow[column] = rs.getString(column+1);
               }
                 list.addElement(rsRow);    
          //    list.addElement(rs.getObject(i));
                 if (!rs.next())
                     break;
          }          
        }
        
        
    
      rs.close();
      cstmt.close();
      dbc.close();
      return true;
  }
  catch (SQLException sqle){
      sqle.printStackTrace();
      return false;
  }
    }  
  

    /**
  * @return poolName
  */

    public String getPoolName() {
  return poolName;
    }

    /**
  * @param poolName 要設置的 poolName
  */

    public void setPoolName(String poolName) {
  this.poolName = poolName;
    }
}

 
4,條件查詢頁面recordsListSearch.jsp,主要是根據數據庫字段來組成查詢條件,值得注意的是:
          <select size="1" name="D2" onChange="javascript:onChangeText();">              
          <option value="strPoNo">P/O</option>
          <option value="strGrNo">收貨GR NO.</option>
          <option value="strMaterialNo">物料編號</option>
          <option value="strMaterialName">物料名稱</option>
          <option value="strDate">日期</option>
          <option value="nItem">Item</option>
          <option value="nCount">數量</option>
          <option value="strApplicant">請購人</option>
          <option value="strDeptName">所屬部門</option>
          </select>  
這裏option的值都完全是數據表中的字段名,因爲最終是靠這些字段來生成SQL語句中的Where查詢條件。
<%@ page contentType="text/html; charset=gb2312" language="java" errorPage="" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>查詢</title>
</head>
<style type="text/css">
<!--
BODY {
    FONT-SIZE: 12px; FONT-FAMILY: "宋體"
}
TD {
    FONT-SIZE: 12px; FONT-FAMILY: "宋體"  
}
-->
</style>
<script language="JavaScript" src="files/My97DatePicker/WdatePicker.js"></script>
<script language="javascript">
<!--
//日曆與普通輸入框切換
function onChangeText(){
    if(form2.D2.value=="strDate"){
  eval("document.getElementById('T2').style.display='block'");    
  eval("document.getElementById('T1').style.display='none'");    
    }else{  
  eval("document.getElementById('T2').style.display='none'");    
  eval("document.getElementById('T1').style.display='block'");      
    }
}

//根據條件組合生成SQL語句中的where條件
function query_item()
  {
      var str2="";
      var str3="";
      str2 += form2.D2.value + " ";
      str2 += form2.D3.value + " ";
      if (form2.D3.value=="like")
      str2 += "'%" + form2.T1.value + "%'" + " ";
   else {
    if (form2.D2.value=="nItem"||form2.D2.value=="nCount")
    str2 += "" + form2.T1.value + "" + " ";
    else{
    if(document.getElementById('T2').style.display=='block')  
        str2 += "'" + form2.T2.value + "'" + " ";
    else
        str2 += "'" + form2.T1.value + "'" + " "
    }  
   }
   str3 = form2.S2.value;
    
   if (str3.search(str2)<0)
   {
    if (form2.S2.value!="")
    str2 = form2.S2.value + form2.D1.value + " " + str2 + " ";
    else
    //str2 = "where" + " " + str2 + " "
    str2 =" " + str2 + " ";
      
   if(document.getElementById('T2').style.display=='block'){
    if (form2.T2.value!="")  
    {
     form2.S2.value = str2;
     form2.T2.value = "";
    }    
   }else{
    if (form2.T1.value!="")  
    {
     form2.S2.value = str2;
     form2.T1.value = "";
    }    
   }
   }
  }
  
  //清空對象
  function set_null()
  {
  form2.D1.options[0].selected
  form2.D2.options[0].selected
  form2.D3.options[0].selected
  form2.T1.value = ""
  form2.S2.value = ""
  }
//-->
</script>

<body>
<table align="left" width="102%">
    <tr>      
  <td width="24%" height="30" background="images/opbg.gif"><img src="images/a.gif">  
  當前位置:查詢
  </td>
    </tr>
    <tr>
  <td style="height:60px"></td>
    </tr>

    <tr>
  <td>
  <form method="post" action="recordsListResult.jsp" name="form2" >
  <table width="600" border="1" align="center" cellpadding="0" cellspacing="0" class="search">    
  <tbody>  
      <tr>
    <td height="30"  background="images/s_02.gif"><img src="images/s_01.gif" width="284" height="30"></td>
      </tr>      
      <tr>          
    <td  bgcolor="#f1f4f5" height="32">          
        <table>
      <tr>
          <td width="64">
          <select size="1" name="D1">              
          <option value="and">並且</option>          
          <option value="or">或者</option>          
          </select>    
          </td>
          <td width="39">
          字段:
          </td>
          <td width="83">
          <select size="1" name="D2" onChange="javascript:onChangeText();">              
          <option value="strPoNo">P/O</option>
          <option value="strGrNo">收貨GR NO.</option>
          <option value="strMaterialNo">物料編號</option>
          <option value="strMaterialName">物料名稱</option>
          <option value="strDate">日期</option>
          <option value="nItem">Item</option>
          <option value="nCount">數量</option>
          <option value="strApplicant">請購人</option>
          <option value="strDeptName">所屬部門</option>
          </select>        
          </td>
          <td width="61">
          查詢條件:                                            
          </td>  
          <td width="77">
          <select size="1" name="D3">              
          <option selected value="=">等於</option>              
          <option value=">">大於</option>              
          <option value="<">小於</option>              
          <option value="like">類似</option>              
          </select>        
          </td>
          <td width="145">
          <input type="text" name="T1" id="T1" size="20">      
          <input type="text" name="T2" id="T2" size="20" style="display:none" class="Wdate" onFocus="new WdatePicker(this)">
          </td>
          <td width="95">
          <input type=button value="確定" name="B1"
          <input type=button value="清除" name="B2"
          </td>          
      </tr>
        </table>  
    </td>
      </tr>    
      <tr>
    <td height="38">
    <textarea rows="3" name="S2" cols="80" style="font-family: 宋體; font-size: 9pt" readonly></textarea>
    <input type="image" src="images/sear1.gif" name="sm1">    
    </td>
      </tr>                        
  </tbody>                                                                  
  </table>
  </form>    
    </td>
</tr>
</table>

</body>
</html>
 
5,分頁顯示頁面recordsListResult.jsp,完成分頁,基本的參數也在這裏配置以最終傳入分頁存儲過程完成分頁。
由於這個頁面是我們配置的地方,所以這裏詳加說明:
比較重要的地方我會以
<!-----
------>
標出並加以詳細說明;
要進行更改和配置的地方以
<!--******
******-->
標出,同時會在前面配以編號顯示,讀者朋友可以根據編號逐一查閱。
<!-------------------------------------
    本頁功能說明
    該jsp模板是最簡單的view實現的一個例子,主要根據上個頁面查詢的得到的where條件進行數據的分頁顯示
    由於不含Form,實現起來較簡單,開發者可以直接通過“引入”及“配置”來完成頁面設計
    需要更改的地方以******標記標出
--------------------------------------->
<%@ page contentType="text/html; charset=gb2312" language="java" errorPage="" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<!----------------------------------------
    jsp:useBean id="list1" scope="request" class="sqlDBconnect.Listss"      的說明:
    javaBean,後臺用存儲過程實現分頁,該類完成分頁存儲過程參數的傳遞,且該類與應用無關!
------------------------------------------>
<jsp:useBean id="list1" scope="request" class="sqlDBconnect.Listss" />

<html:html lang="true">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>顯示</title>
<html:base/>
<style type="text/css">
<!--
BODY {
    FONT-SIZE: 12px; FONT-FAMILY: "宋體"
}
TD {
    FONT-SIZE: 12px; FONT-FAMILY: "宋體"  
}
-->
</style>
<link href="css/barStyle.css" rel="stylesheet" type="text/css">
<link href="css/search1.css" rel="stylesheet" type="text/css">
<link href="css/css1.css" rel="stylesheet" type="text/css">
<link href="css/ny.css" rel="stylesheet" type="text/css">
</head>

<body bgcolor="#fffff7" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
<script language="JavaScript">
//分頁跳轉
function Jumping(){
  document.PageForm.submit();
  return ;
}
</script>

<table align="left" width="102%">
    <tr>      
  <td width="24%" height="30" background="images/opbg.gif"><img src="images/a.gif">  
      當前位置:查詢結果
  </td>
    </tr>
    <tr>
  <td style="height:60px"></td>
    </tr>
    <tr>
  <td>

<!--1,****************************************
    c:set var="selfweb" value="recordsListResult" scope="request"  說明:
    JSP中JSTL標籤,生成request範圍內的一個對象,主要爲了指定devPage.jsp中的跳轉頁面,開發者應該根據不
    同的顯示頁面爲對象指定不同的值,一般是當前頁名,注意不要帶擴展名.
*******************************************-->
<c:set var="selfweb" value="recordsListResult" scope="request"/>
<table width="780" border="0" align="center" cellpadding="0" cellspacing="1" bordercolor="#b6bfdc" bgcolor="#b6bfdc" class="search">
<!--2,********************************************
    td height="21" colspan="12"  說明:
    首行應該顯示的列數,根據需要確定要顯示的列數,適時更改colspan的值
***********************************************-->
    <tr bgcolor="#FFFFFF" >    
        <td height="21" colspan="12"><img src="images/sea.gif" width="354" height="21"></td>
    </tr>
               <tr class="bar1">    
<!--3,*******************************************
    要顯示的列信息說明
    這是數據表中應該顯示出來給用戶查看的列名及相關信息,根據需要顯示,不必全部列出
*********************************************-->                      
    <td width="8%" align="center" >P/O</td>
    <td width="8%" align="center" >GR NO.</td>
    <td width="8%" align="center" >物料編號</td>
    <td width="9%" align="center" >物料名稱</td>
    <td width="9%" align="center" >日期</td>
    <td width="6%" align="center">Item</td>
    <td width="6%" align="center">數量</td>
    <td width="7%" align="center">單價</td>
    <td width="7%" align="center">請購人</td>
    <td width="8%" align="center">所屬部門</td>
    <td width="8%" align="center">簽收日期</td>
    <td width="16%" align="center">物料描述</td>    
              </tr>
<!--4,************************ 
    分頁存儲過程的一些參數
    PageSize  規定每頁應該顯示多少條記錄,默認20條,可以根據需要自行更改
    ShowPage    當前顯示第幾頁,初始化時默認顯示第一頁
    PageCount    應該顯示的頁數,該值會根據前兩個參數由系統自動更新
*************************-->      
<c:set var="PageSize" scope="request" value="20"/>
<c:set var="ShowPage" scope="request" value="1"/>
<c:set var="PageCount" scope="request" value="0"/>
<%
  //receive the parameter from the previousPage and nextPage
  String Page=request.getParameter("page");
  request.setAttribute("Page",Page);
%>  
<logic:notEmpty name="Page">
    <c:set var="ShowPage" scope="request">
  <c:out value="${Page}"/>
    </c:set>
</logic:notEmpty>
<!--set the property of List-->
<c:set target="${list1}" property="pageSize">
    <c:out value="${PageSize}"/>
</c:set>
<c:set target="${list1}" property="page">
    <c:out value="${ShowPage}"/>
</c:set>
<!--5,************************************ 
    由查詢頁面傳入的查詢條件的說明
    接收到的S2爲上一個查詢頁面傳入的查詢條件,可以將此查詢條件和其它信息進行組合生成最終的SQL
    Where條件。
**************************************-->  
<%
String S2=request.getParameter("S2")    ;
if(S2!=null)
    session.setAttribute("S2",S2);
%>

<!--6,************************************** 
    分頁類Listss參數的說明
    poolName  數據庫連接池名,爲proxool.xml配置的數據庫連接池的別名
    tableName  當前Jsp頁面要顯示的數據表名
    fieldList      要用到數據表中的哪些字段,列出這些字段名,以逗號作爲分隔符
    primaryKey  數據表中以哪個字段作爲主鍵
    order    排序 不含'order by'字符,如nId desc,strPoNo asc,當SortType=3時生效
    sortType      排序規則 1:正序asc  2:倒序desc      3:多列排序,如果取1或2則是對主鍵排序
******************************************-->  
<c:set target="${list1}" property="poolName" value="bpDbCon"/>
<c:set target="${list1}" property="tableName" value="recordsList"/>
<c:set target="${list1}" property="fieldList" value="strPoNo,strGrNo,strDate,nItem,nCount,fltUnitPrice,strApplicant,strMaterialDesc,strMaterialNo,strMaterialName,strDeptName,strSignDate"/>
<c:set target="${list1}" property="primaryKey" value="nId"/>
<!--if the "S2" var is not null,set the strSql property of List-->
<logic:notEmpty name="S2">
    <c:set target="${list1}" property="where">
  <c:out escapeXml="false" value="${S2}"/>
    </c:set>
</logic:notEmpty>
<c:set target="${list1}" property="order" value=""/>
<c:set target="${list1}" property="sortType" value="2"/>
    
<c:if test="${list1.execute==1}">
    <c:set var="ShowPage" scope="request">
  <c:out value="${list1.page}"/>
    </c:set>
    <c:set var="PageCount" scope="request">
  <c:out value="${list1.pageCount}"/>
    </c:set>
    <c:set var="PageSize" scope="request">
  <c:out value="${list1.pageSize}"/>
    </c:set>  
    <c:forEach var="i" begin="0" end="${list1.pageSize-1}" step="1">
  <c:set var="Class" value="search3"/>
  <c:if test="${i%2==0}">
  <c:set var="Class" value="search4"/>
  </c:if>  
  <c:if test="${i<list1.listCount}">
      <c:set target="${list1}" property="row">
    <c:out value="${i}"/>
      </c:set>    
<!--7,****************************************
    取出要顯示的列值
    不管是int,String,float,double等都可以list1.getString()來取值,傳入參數爲上面所列出的數據表中字段名
******************************************-->      
    <tr class='<c:out value="${Class}"/>' onmouseover="this.style.backgroundColor='#dae2ed'" onmouseout="this.style.backgroundColor=''">
      <td align="center"><%=list1.getString("strPoNo")%></td>
      <td align="center"><%=list1.getString("strGrNo")%></td>
      <td align="center"><%=list1.getString("strMaterialNo")%></td>
      <td align="center"><%=list1.getString("strMaterialName")%></td>
      <td align="center"><%=list1.getString("strDate")%></td>
      <td align="center"><%=list1.getString("nItem")%></td>
      <td align="center"><%=list1.getString("nCount")%></td>
      <td align="center"><%=list1.getString("fltUnitPrice")%></td>
      <td align="center"><%=list1.getString("strApplicant")%></td>
      <td align="center"><%=list1.getString("strDeptName")%></td>
      <td align="center"><%=list1.getString("strSignDate")%></td>
      <td align="center"><%=list1.getString("strMaterialDesc")%></td>
    </tr>
  </c:if>  
    </c:forEach>
</c:if>
    <tr onmouseover="this.style.backgroundColor='#dae2ed'" onmouseout="this.style.backgroundColor=''">
  <td colspan="12">
      <table width="100%" border="0" cellpadding="0" cellspacing="0">
    <!-------------------------------------
        引入分頁腳本
    --------------------------------------->    
    <%@ include file="devPage.jsp"%>
      </table>  
  </td>
    </tr>        
</table>  
  </td>
    </tr>
</table>  
</body>
</html:html>
 
6,分頁腳本devPage.jsp,提取的共用代碼段,完成翻頁
<%@page contentType="text/html; charset=gb2312" language="java"  errorPage=""%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<form method="post"  action='<c:out value="${selfweb}"/>.jsp' name="PageForm">
<tr>  
    <td class="search4" width="100%" height="100%">
    <img src="images/y1.gif" width="5" height="7">
    <a href='<c:out value="${selfweb}"/>.jsp?' target="_self">第一頁</a>
    <c:if test="${ShowPage==1}">  
  <img src="images/y2.gif" width="4" height="7">前一頁  
    </c:if>
    <c:if test="${ShowPage!=1}">  
  <img src="images/y2.gif" width="4" height="7">
  <%request.setAttribute("prev",String.valueOf(Integer.parseInt(request.getAttribute("ShowPage").toString())-1));%>
  <a href='<c:out value="${selfweb}"/>.jsp?page=<c:out value="${prev}"/>' target="_self">前一頁</a>  
    </c:if>
    <c:if test="${ShowPage==PageCount}"> <img src="images/y3.gif" width="4" height="7">下一頁  
    </c:if>
    <c:if test="${ShowPage!=PageCount}"> <img src="images/y3.gif" width="4" height="7">  
  <%request.setAttribute("next",String.valueOf(Integer.parseInt(request.getAttribute("ShowPage").toString())+1));%>
  <a href='<c:out value="${selfweb}"/>.jsp?page=<c:out value="${next}"/>' target="_self">下一頁</a>  
    </c:if>
    <img src="images/y4.gif" width="5" height="7"><a href='<c:out value="${selfweb}"/>.jsp?page=<c:out value="${list1.pageCount}"/>' target="_self">最後一頁</a>
    記錄總數<c:out value="${list1.recordCount}"/>
    每頁<c:out value="${PageSize}"/>
    當前頁[<c:out value="${ShowPage}"/>/<c:out value="${list1.pageCount}"/>頁]  
    頁數
    <select name="page" onchange="Jumping()" style="width:50px">
  <c:if test="${ShowPage!=0}">
      <option value='<c:out value="${ShowPage}"/>'><c:out value="${ShowPage}"/></option>
  </c:if>
  <c:if test="${list1.pageCount>=1}">
      <c:forEach var="i" begin="1" end="${list1.pageCount}" step="1">
    <option value='<c:out value="${i}"/>'><c:out value="${i}"/></option>
      </c:forEach>
  </c:if>
    </select>  
    </td>
</tr>
</form>
 
 
大功告成,不過你不要以爲前面講得那麼多就配起來很繁瑣,其它不然,前面所講的只是讓你對這種分頁架構有一個大體的瞭解,從細節方面你只需要注意以下幾個方面就可以:
1,配置Tomcat服務器(你別告訴我你不會,如果真不會,那沒辦法了你自行了斷吧,嘿嘿)
2,建立數據庫和結構表,對了還有分頁存儲過程P_viewPage.sql一併弄好
3,配置數據庫連接池,幾句話而已,你完全可以照我的例子弄
4,配查詢頁
一般情況下你只需更改下面這個地方:
       <select size="1" name="D2" onChange="javascript:onChangeText();">             
       <option value="strPoNo">P/O</option>
       <option value="strGrNo">收貨GR NO.</option>
       <option value="strMaterialNo">物料編號</option>
       <option value="strMaterialName">物料名稱</option>
       <option value="strDate">日期</option>
       <option value="nItem">Item</option>
       <option value="nCount">數量</option>
       <option value="strApplicant">請購人</option>
       <option value="strDeptName">所屬部門</option>
       </select>
根據自己的數據表顯示不同字段
5,配置分頁顯示
根據你自己的情況你最多隻需更改上面提到的recordsListResult.jsp中的7個地方
 
Job Done!爲你自己喝彩吧!
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章