struts.分頁

 --------------------------------------------------------------------------------
 ********分頁類Pager.java,負責生成分頁導航條********

package page;

/**
 * 分頁代碼
 * <p>Title: 分頁</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: BCS</p>
 * @author Alex
 * @version 1.0
 */
public class Pager {
  private int offset;
  private int size;
  private int length;
  private String url;
  private String pageHeader;
  public Pager(int offset, int size, int length, String url, String pageHeader) {
    this.offset = offset;
    this.size = size;
    this.length = length;
    this.url = url;
    this.pageHeader = pageHeader;
  }

  /**
   * 返回分頁導航條
   * @param offset int 起始記錄的位置
   * @param size int 總記錄數
   * @param length int 步長
   * @param url String .do的url
   * @param pageHeader String 導航條的前綴文字提示
   * @return String
   */
  public String getPageNavigation() {
    String pageNavigation = ""; //最終返回的分頁導航條
    //記錄數超過一頁,需要分頁
    if (size > length) {
      String pref; //前綴
      if (url.indexOf("?") > -1) {
        //如果url中已經包含了其他的參數,就把offset參數接在後面
        pref = "&";
      }
      else {
        //如果url中沒有別的參數
        pref = "?";
      }
      //如果導航條包含header
      if (pageHeader != null && pageHeader.length() > 0) {
        pageNavigation = pageHeader + " : ";
      }
      //如果不是第一頁,導航條將包含“<<”(第一頁)和“<”(前一頁)
      if (offset > 0) {
        pageNavigation += "<a href='" + url + pref + "offset=0'>[<<]</a>\n" +
            "<a href='" + url + pref + "offset=" + (offset - length) +
            "'>[<]</a>\n";
      }
      //導航條中,排頭的那一頁的offset值
      int startOffset;
      //位於導航條中間的那一頁的offset值(半徑)
      int radius = constants.MAX_PAGE_INDEX / 2 * length;
      //如果當前的offset值小於半徑
      if (offset < radius || this.pageCount() <= constants.MAX_PAGE_INDEX) {
        //那麼第一頁排頭
        startOffset = 0;
      }
      else if (offset < size - radius) {
        startOffset = offset - radius;
      }
      else {
        startOffset = (size / length - constants.MAX_PAGE_INDEX) * length;
      }
      for (int i = startOffset;
           i < size && i < startOffset + constants.MAX_PAGE_INDEX * length;
           i += length) {
        if (i == offset) {
          //當前頁號,加粗顯示
          pageNavigation += "<b>" + (i / length + 1) + "</b>\n";
        }
        else {
          //其他頁號,包含超鏈接
          pageNavigation += "<a href='" + url + pref + "offset=" + i + "'>" +
              (i / length + 1) + "</a>\n";
        }
      }
      //如果不是最後一頁,導航條將包含“>”(下一頁)和“>>”(最後一頁)
      if (offset < size - length) {
        pageNavigation += "<a href='" + url + pref + "offset=" +
            (offset + length) + "'>[>]</a>\n" +
            "<a href='" + url + pref + "offset=" + lastPageOffset() +
            "'>[>>]</a>\n";
      }
//      System.out.println("radius : " + radius);
//      System.out.println("start offset : " + startOffset);
      return pageNavigation;
    }
    //記錄不超過一頁,不需要分頁
    else {
      return "";
    }
  }

  /**
   * 返回分頁後的總頁數
   * @param size int 總記錄數
   * @param length int 每頁的記錄數
   * @return int
   */
  public int pageCount() {
    int pagecount = 0;
    if (size % length == 0) {
      pagecount = size / length;
    }
    else {
      pagecount = size / length + 1;
    }
    return pagecount;
  }

  /**
   * 返回最後一頁的記錄數
   * @param size int 總記錄數
   * @param length int 每頁的記錄數
   * @return int
   */
  public int lastPageSize() {
    int lastpagesize = 0;
    if (size % length == 0) {
      lastpagesize = length;
    }
    else {
      lastpagesize = size % length;
    }
    return lastpagesize;
  }

  /**
   * 返回最後一頁的起始記錄位置
   * @param size int 總記錄數
   * @param length int 每頁的記錄數
   * @return int
   */
  public int lastPageOffset() {
    return size - lastPageSize();
  }

  public int getOffset() {
    return offset;
  }

  public void setOffset(int offset) {
    this.offset = offset;
  }

  public int getSize() {
    return size;
  }

  public void setSize(int size) {
    this.size = size;
  }

  public int getLength() {
    return length;
  }

  public void setLength(int length) {
    this.length = length;
  }

  public String getUrl() {
    return url;
  }

  public void setUrl(String url) {
    this.url = url;
  }

  public String getPageHeader() {
    return pageHeader;
  }

  public void setPageHeader(String pageHeader) {
    this.pageHeader = pageHeader;
  }
}

********數據處理類empDAO.java,負責訪問DB,獲取當前頁面需要顯示的記錄********

package page;

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

public class empDAO {
  public empDAO() {
  }

  /**
   * 從offset位置起始,返回length條記錄
   * @param offset int 起始的記錄位置
   * @param length int 步長
   * @param conn Connection 數據庫連接
   * @return ArrayList
   */
  public ArrayList findAllEmp(int offset, int length, Connection conn) throws
      SQLException {
    PreparedStatement ps = null;
    ResultSet rs = null;
    ArrayList emps = new ArrayList();
    empVO empvo = null;
    String strSql = "select empno, ename from emp where rowid not in (select rowid from emp where rownum <= ?) and rownum <= ?";
    try {
      ps = conn.prepareStatement(strSql);
      ps.setInt(1, offset); //起始記錄的位置
      ps.setInt(2, length); //步長
      rs = ps.executeQuery();
      while (rs != null && rs.next()) {
        empvo = new empVO();
        empvo.setEmpno(rs.getInt("empno"));
        empvo.setEname(rs.getString("ename"));
        emps.add(empvo);
      }
    }
    catch (SQLException ex) {
      ex.printStackTrace();
      throw ex;
    }
    return emps;
  }

  /**
   * 返回總的記錄數
   * @param conn Connection
   * @throws SQLException
   * @return int
   */
  public int getRsTotalCount(Connection conn) throws SQLException {
    PreparedStatement ps = null;
    ResultSet rs = null;
    int rsCount = 0;
    String strSql = "select count(empno) as empCount from emp";
    try {
      ps = conn.prepareStatement(strSql);
      rs = ps.executeQuery();
      if (rs != null && rs.next()) {
        rsCount = rs.getInt("empCount");
      }
    }
    catch (SQLException ex) {
      ex.printStackTrace();
      throw ex;
    }
    return rsCount;
  }
}

********業務類empBO.java,調用empDAO類********

package page;

import java.util.*;

/**
 * BO類
 * <p>Title: 分頁</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: BCS</p>
 * @author Alex
 * @version 1.0
 */
public class empBO {
  private DBPool db = DBPool.newInstance();
  private empDAO empdao = new empDAO();

  public empBO() {
  }

  /**
   * 從offset位置起始,返回length條記錄
   * @param offset int 起始
   * @param length int 步長
   * @throws Exception
   * @return ArrayList
   */
  public ArrayList findAllEmp(int offset, int length) throws Exception {
    ArrayList emps = new ArrayList();
    try {
      emps = empdao.findAllEmp(offset, length, db.getConnection());
    }
    catch (Exception ex) {
      throw ex;
    }
    finally {
      db.release();
    }
    return emps;
  }

  /**
   * 返回總的記錄數
   * @throws Exception
   * @return int
   */
  public int getRsTotalCount() throws Exception {
    int rsCount = 0;
    try {
      rsCount = empdao.getRsTotalCount(db.getConnection());
    }
    catch (Exception ex) {
      throw ex;
    }
    finally {
      db.release();
    }
    return rsCount;
  }
}


********ActionForm類empForm.java********

package page;

import javax.servlet.http.*;

import org.apache.struts.action.*;

public class empForm
    extends ActionForm {
  private int offset; //起始記錄的位置//每頁顯示的記錄數
  public ActionErrors validate(ActionMapping actionMapping,
                               HttpServletRequest httpServletRequest) {
    /**@todo: finish this method, this is just the skeleton.*/
    return null;
  }

  public void reset(ActionMapping actionMapping,
                    HttpServletRequest httpServletRequest) {
    this.offset = 0; //記錄默認從第一條開始顯示
  }

  public int getOffset() {
    return offset;
  }

  public void setOffset(int offset) {
    this.offset = offset;
  }

}


********Action類empAction.java,控制器,調用BO類,Pager類********

package page;

import java.util.*;
import javax.servlet.http.*;

import org.apache.struts.action.*;

/**
 * 分頁測試的Action
 * <p>Title: 分頁</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: BCS</p>
 * @author Alex
 * @version 1.0
 */
public class empAction
    extends Action {

  public ActionForward execute(ActionMapping actionMapping,
                               ActionForm actionForm,
                               HttpServletRequest httpServletRequest,
                               HttpServletResponse httpServletResponse) {
    empForm empform = (empForm) actionForm;
    return performList(actionMapping, actionForm, httpServletRequest,
                       httpServletResponse);
  }

  private ActionForward performList(ActionMapping actionMapping,
                                    ActionForm actionForm,
                                    HttpServletRequest request,
                                    HttpServletResponse response) {
    try {
      empBO empbo = new empBO();
      //獲取外部傳進來的起始記錄號
      int offset = ( (empForm) actionForm).getOffset();
      //獲取每頁的記錄數
      int pagesize = constants.PAGE_SIZE;
      //獲取記錄集合,從offset開始,取length條記錄
      ArrayList emps = empbo.findAllEmp(offset, pagesize);
      //計算所有記錄的條數(總記錄數)
      int size = empbo.getRsTotalCount();
      //外部url地址,得到形如: http://localhost:8088/bugMIS/showlist.do 的String
      String url = request.getContextPath() + actionMapping.getPath() + ".do";
      //實例化分頁類
      Pager p = new Pager(offset, size, pagesize, url, "Page Navigation");
      //獲取分頁導航條
      //String pageNavigation = p.getPageNavigation();
      //將url字符串和記錄集合,存入request中
      request.setAttribute("pager", p);
      request.setAttribute("emps", emps);
    }
    catch (Exception e) {
      e.printStackTrace();
      return actionMapping.findForward("failure");
    }
    return actionMapping.findForward("success");
  }
}


********數據庫連接池類DBPool.java,可以使用tomcat的連接池,也可以不用,這裏關閉了********

package page;

import java.sql.*;
import javax.naming.*;
import javax.sql.*;

import org.apache.commons.logging.*;

/**
 * 系統連接池類
 * <p>Title: [email protected]</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: BCS</p>
 * @author Alex
 * @version 1.0
 */
public class DBPool {
  Log log = LogFactory.getLog("DBPool"); //日誌機
  private DBPool() {
  }

  private Connection conn = null;

  /* true:使用連接池
     false:不使用連接池,採用JDBC直接連接 */
  private final static boolean USE_DB_POOL = false;
  private final static String jndi_DataSource = "jdbc/BugMIS_ora";
  private final static String jdbcdriver =
      "oracle.jdbc.driver.OracleDriver";
  private final static String url =
      "jdbc:oracle:thin:@localhost:1521:myo9";
  private final static String user = "scott";
  private final static String pass = "tiger";

  public static DBPool newInstance() {
    return new DBPool();
  }

  /**
   * 切換是否使用連接池
   * */
  public Connection getConnection() {
    if (USE_DB_POOL) {
      conn = getConnectionByDBPool();
    }
    else {
      conn = getConnectionDirect();
    }
    return conn;
  }

  /**
   * 直接採用JDBC連接數據庫
   * */
  private Connection getConnectionDirect() {
    try {
      Class.forName(jdbcdriver).newInstance();
      conn = DriverManager.getConnection(url, user, pass);
    }
    catch (SQLException ex) {
      log.error("Error Connection! " + ex.getMessage());
    }
    catch (ClassNotFoundException ex) {
      log.error("Driver Not Found! " + ex.getMessage());
    }
    catch (IllegalAccessException ex) {
      log.error(ex.getMessage());
    }
    catch (InstantiationException ex) {
      log.error(ex.getMessage());
    }
    return conn;
  }

  /**
   * 採用連接池
   * */
  private Connection getConnectionByDBPool() {
    try {
      Context initCtx = new InitialContext();
      Context ctx = (Context) initCtx.lookup("java:/comp/env");
      DataSource ds = (DataSource) ctx.lookup(jndi_DataSource);
      conn = ds.getConnection();
    }
    catch (NamingException ex) {
      log.error("Data Source Not Found! " + ex.getMessage());
      //System.out.println("未找到數據源" + ex.getMessage());
    }
    catch (SQLException ex1) {
      log.error("Error Connection! " + ex1.getMessage());
      //System.out.println("錯誤的數據連接" + ex1.getMessage());
    }
    return conn;
  }

  /**
   * 釋放連接
   * */
  public void release() {
    try {
      if (!conn.isClosed()) {
        conn.close();
      }
    }
    catch (SQLException ex) {
      log.error("Connection Closing Error! " + ex.getMessage());
      //System.out.println("連接關閉失敗" + ex.getMessage());
    }
  }
}


********包含常量的類constants.java,常量********

package page;

/**
 * 定義工程中公用的常量
 * <p>Title: 分頁</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: BCS</p>
 * @author Alex
 * @version 1.0
 */
public final class constants {
  public static final int MAX_PAGE_INDEX = 5; //頁腳顯示多少頁
  public static final int PAGE_SIZE = 2; //每頁的記錄數
}


********測試jsp頁面index.jsp,爲了方便測試,嵌入了java代碼,能顯示就行********

<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ page contentType="text/html; charset=GBK" import="java.util.*,page.*"%>
<html:html>
<head>
<title></title>
<style type="text/css">
.pt9 {  font: 10pt "宋體"}
body { font: 10pt "宋體" ; margin: 15px}
td {  font-size: 10pt}
a:hover {  font-size: 10pt; color: red; text-decoration: underline}
a:link {  font-size: 10pt; color: blue; text-decoration: underline}
a:active {  font-size: 10pt; color: blue; text-decoration: underline}
a:visited { font-size: 10pt; color: blue; text-decoration: underline }
</style>
</head>
<body bgcolor="#ffffff">

<p><a href="http://localhost:8088/page/showEmp.do?offset=0">Show Me All Of The Emps</a></p>

<logic:present name="emps">
  <%
  ArrayList emps = (ArrayList)request.getAttribute("emps");
  Iterator it = emps.iterator();
  empVO empvo;
  while(it!=null && it.hasNext()){
    empvo = (empVO)it.next();
    out.print(empvo.getEmpno() + "  ");
    out.print(empvo.getEname() + "<br>");
  }
    out.print("當前頁有 " + emps.size() + " 條記錄<br>");
    out.print("<p>");
  %>
</logic:present>

<logic:present name="pager">
  <%
  Pager pager = (Pager)request.getAttribute("pager");
  out.print(pager.getPageNavigation() + "<p>");
  out.print("共有記錄 " + pager.getSize() + " 條<br>");
  out.print("每頁有 " + pager.getLength() + " 條記錄<br>");
  out.print("共分 " + pager.pageCount() + " 頁<br>");
  %>
</logic:present>
</body>
</html:html>

********配置文件struts-config.xml********

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
  <form-beans>
    <form-bean name="empForm" type="page.empForm" />
  </form-beans>
  <action-mappings>
    <action input="/index.jsp" name="empForm" path="/showEmp" scope="request" type="page.empAction" validate="false">
      <forward name="faiure" path="/index.jsp" />
      <forward name="success" path="/index.jsp" />
    </action>
  </action-mappings>
</struts-config>

 

 


在網上看了幾個Structs分頁,感覺不是很完善,於是根據自己的經驗,寫了一個相對高效簡潔的分頁方法。由於本人水平有限,如果大家有什麼更好的想法,歡迎不吝賜教。
  
  一、 開發環境
  
  我的開發環境是:JBuilder x + Weblogic 8.1 + Oracle 9i + Windows 2003 ,如果朋友們的開發環境不一樣亦無妨。
  
  二、開發思路
  
  既然講的是Struts,那自然離不了MVC,分頁顯示也是如此。
  
  1、 建立數據庫和對應的表,本例的表是TCertificate。
  
  2、 建立適當的模型組件,對應你要查詢數據庫中的表。這部分由DAO數據訪問層來實現,如果有的朋友對DAO不熟悉可以查詢一下相關資料。本例由CertificateDAO.java來實現。
  
  3 、建立分頁所需要的模型組件,由javaBean來充當,並與CertificateDAO實現分離。網上介紹的很多方法,都存在着數據與分頁組件藕合的現象,這也是本方法與其它分頁方法的主要不同之處。
  
  4、建立控制器組件,這部分由Struts 中的Action來實現。主要負責將實例化CertificateDAO,只取要顯示的數據記錄,存入ArrayList對象然後返回,並放到request中。而分頁部分則根據分頁條件,單獨進行構造,避免了與DAO混在一起的情況發生。網上其它介紹的一些分頁方法中,基本上都是一次性讀出所有查詢的數據,然後再由分頁相關組件進行構造。這樣,如果數據量大的話,很容易形成瓶頸。在本例中由於不是一次性地讀出查詢的所有數據,而只是讀出一個頁面要顯示的數據記錄,這就節省了很多不必要的數據傳輸,提高了效率。本例中爲CertificateAction.java。
  
  5、建立視圖組件,這部分由jsp來充當,爲了不出現java 代碼,我們使用Struts提供的標籤庫,主要負責從request中取出剛剛放入的對象,通過反覆調用CertificateAction以及action參數,而實現分頁顯示。本例中爲listcertificate.jsp。
  
  6、 建立並配置struts-config.xml。
  
  三、實例代碼
  
  確定好上面的開發思路後,代碼的實現就有單可循了。
  
  1、建數據庫和相應的表。
  
  2、數據邏輯層的相關代碼。
  
  1)、通用的DAO類:CommonDAO.java
  
  這是一個很多DAO都要繼承到的通用DAO類,是我根據實踐總結出來的,爲了減少篇幅,這裏只顯示和本例相關的代碼。
  
  java代碼:
  
  代碼:
  --------------------------------------------------------------------------------
  package com.xindeco.business ;
  import java.io.*;
  import java.sql.*;
  import java.util.*;
  import javax.sql.*;
  import java.lang.IllegalAccessException;
  import java.lang.reflect.InvocationTargetException;
  import org.apache.commons.beanutils.BeanUtils;
  public class DAO
  {
  protected DataSource ds;
  /**
  * 說明:取得當前查詢的總記錄數
  */
  public int getRows ()
  {
  return this.count;
  }
  public void rsHandler (ResultSet rs, int offset, int limit)
  {
  try
  {
  count = 0;
  rs.absolute ( -1) ;
  count = rs.getRow () ;
  if (offset <= 0)
  {
  rs.beforeFirst () ;
  }
  else
  {
  rs.absolute (offset) ;
  }
  }
  catch (Exception e)
  {
  e.printStackTrace () ;
  }
  }
  public DAO(DataSource ds) {
  this.ds = ds;
  }
  
  public void setDataSource(DataSource ds) {
  this.ds = ds;
  }
  
  protected void close(ResultSet rs) {
  if (rs != null) {
  try {
  rs.close();
  } catch (SQLException e) {
  }
  rs = null;
  }
  }
  
  protected void close(PreparedStatement pstmt) {
  if (pstmt != null) {
  try {
  pstmt.close();
  } catch (SQLException e) {
  }
  pstmt = null;
  }
  }
  protected void close(Connection conn) {
  if (conn != null) {
  try {
  conn.close();
  } catch (SQLException e) {
  e.printStackTrace();
  }
  conn = null;
  }
  }
  
  protected void rollback(Connection conn) {
  if (conn != null) {
  try {
  conn.rollback();
  } catch (SQLException e) {
  e.printStackTrace();
  }
  conn = null;
  }
  }
  }
  
  這個類主要是通過子類傳進來的先進結果集,取得查詢的記錄總數,並對數據庫連接進行簡單的管理。
  
  2)、對數據庫進行訪問:CertificateDAO.java
  
  java代碼:
  
  代碼:
  --------------------------------------------------------------------------------
  package com.xindeco.business;
  
  import java.io.*;
  import java.sql.*;
  import java.util.*;
  import javax.sql.*;
  
  import com.xindeco.common.dbconn.DbConn;
  
  public class CertificateDAO extends DAO
  {
  
  public NationDAO(DataSource ds) {
  super(ds);
  }
  
  public List findCertificateList(int offset,int limit) throws SQLException
  {
  int countRows = 0 ;
  ArrayList list = null ;
  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  try
  {
  conn = ds.getConnection();
  String sql =
  "SELECT certificateID, certificateCode,certificateName,photoURL,"
  + "description,graduateID FROM TCertificate " ;
  pstmt = conn.prepareStatement(sql);
  rs = pstmt.executeQuery();
  /*對遊標進行處理,rsHandler 方法在父類DAO中*/
  this.rsHandler(rs,offset,limit);
  if (rs != null && rs.next ())
  {
  list = new ArrayList () ;
  do
  {
  countRows++ ;
  list.add (rs2VO (rs)) ;
  }
  while ( (countRows++ < limit) && rs.next ()) ;
  }
  close(rs);
  close(pstmt);
  } catch (SQLException e) {
  close(rs);
  close(pstmt);
  rollback(conn);
  e.printStackTrace();
  }
  finally {
  close(conn);
  }
  return list ;
  }
  
  private CertificateVO rs2VO (ResultSet rs)
  {
  try
  {
  CertificateVO certificateVO = new CertificateVO () ;
  certificateVO.setCertificateID (rs.getInt ("certificateID")) ;
  certificateVO.setCertificateCode (rs.getString ("certificateCode")) ;
  certificateVO.setCertificateName (rs.getString ("certificateName")) ;
  certificateVO.setPhotoURL (rs.getString ("photoURL")) ;
  certificateVO.setDescription (rs.getString ("description")) ;
  certificateVO.setGraduateID (rs.getInt ("graduateID")) ;
  return certificateVO ;
  }
  catch (Exception ex)
  {
  ex.printStackTrace () ;
  return null ;
  }
  }
  }
  
  findCertificateList(int offset,int limit)是查得所有要顯示的數據,並放入ArrayList中。看過網上有些例子,把數據記錄放入ArrayList的動作過程直接在while循環體裏完成,如果字段多的話,會造成方法過於寵大,又不美觀。 這裏,數據記錄放入ArrayList的動作過程由rs2VO方法完成,就比較整潔了。另外,if (rs != null && rs.next ()) 配合while ( (countRows++ < limit) && rs.next ()) 是爲了程序的健壯性考慮的,稍分析一下不難得出結論。
  
  3、建立控制器組件:CertificateAction.java
  
  java代碼:
  
  代碼:
  --------------------------------------------------------------------------------
  package com.xindeco.presentation;
  
  import javax.sql.* ;
  import java.util.* ;
  
  import javax.servlet.http.* ;
  import javax.servlet.* ;
  
  import org.apache.struts.action.* ;
  import org.apache.struts.util.* ;
  
  import com.xindeco.common.Pager;
  import com.xindeco.business.graduatedata.CertificateDAO ;
  
  public class CertificateAction
  extends Action
  {
  private static final int PAGE_LENGTH = 5 ; //每頁顯示5條記錄
  public ActionForward execute (ActionMapping mapping, Actionform form,
  HttpServletRequest request,
  HttpServletResponse response)
  {
  ActionForward myforward = null ;
  String myaction = mapping.getParameter () ;
  
  if (isCancelled (request))
  {
  return mapping.findForward ("failure") ;
  }
  if ("".equalsIgnoreCase (myaction))
  {
  myforward = mapping.findForward ("failure") ;
  }
  else if    ("LIST".equalsIgnoreCase (myaction))
  {
  myforward = performList (mapping, form, request, response) ;
  }
  else
  {
  myforward = mapping.findForward ("failure") ;
  }
  return myforward ;
  }
  
  private ActionForward performList (ActionMapping mapping,
  Actionform actionform,
  HttpServletRequest request,
  HttpServletResponse response)
  {
  try
  {
  DataSource ds = (DataSource) servlet.getServletContext().getAttribute(Action.DATA_SOURCE_KEY);
  
  CertificateDAO  certificateDAO = new CertificateDAO (ds) ;
  
  int offset = 0;  //翻頁時的起始記錄所在遊標
  int length = PAGE_LENGTH;
  String pageOffset = request.getParameter("pager.offset");
  if (pageOffset == null || pageOffset.equals("")) {
  offset = 0;
  } else {
  offset = Integer.parseInt(pageOffset);
  }
  List certificateList = certificateDAO .findCertificateList (offset,length) ;
  int size = certificateDAO.getRows(); // 取得總記錄數
  String url = request.getContextPath()+"/"+mapping.getPath()+".do";
  String pagerHeader = Pager.generate(offset, size, length, url); //分頁處理
  
  request.setAttribute ("pager", pagerHeader) ;
  request.setAttribute ("list", certificateList) ;
  }
  catch (Exception e)
  {
  e.printStackTrace();
  return mapping.findForward ("error") ;
  }
  return mapping.findForward ("success") ;
  }
  }
  
  CertificateAction.java主要是把數據從DAO中取出,並放入一個ArrayList 中,然後通過配置文件再軟件View的JSP頁。
  
  5、建立視圖listcertificate.jsp文件。
  
  jsp代碼:
  
  代碼:
  --------------------------------------------------------------------------------
  
  <%@ page contentType="text/html; charset=GBK" %>
  <%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %>
  <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
  <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
  <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
  
  <table bgcolor="#666666" cellpadding="1" cellspacing="0" border="0" width="500">
  <tr>
  <td>
  <table cellpadding="0" cellspacing="0" border="0" width="500">
  <tr>
  <td bgcolor="#fecc51">&</td>
  </tr>
  </table>
  </td>
  </tr>
  <tr>
  <td>
  <table cellpadding="0" cellspacing="0" border="0" width="500">
  <tr>
  <td bgcolor="#d6e0ed">
  &&<bean:message key="label.list4certificate"/>
  </td>
  </tr>
  <tr bgcolor="#FFFFFF">
  <td width="5%"></td><td width="19%"></td><td width="76%"></td>
  </tr>
  <tr>
  <td>
  <table bgcolor="#f2f2f2" width="500" cellspacing="0" border="0">
  <tr bgcolor="#bacce1">
  <td><b><bean:message key="Certificate.select"/> </b></td>
  <td><b><bean:message key="Certificate.certificateID"/> </b></td>
  <td><b><bean:message key="Certificate.certificateCode"/></b></td>
  <td><b><bean:message key="Certificate.certificateName"/></b></td>
  <td><b><bean:message key="Certificate.view"/></b></td>
  </tr>
  
  <bean:write name="pager" property="description"/>
  <logic:equal name="pager" property="hasPrevious" value="true">
  <a href="/graduatedata/list.do?viewPage=<bean:write name="pager" property="previousPage"/>" class="a02">
  Previous
  </a>
  </logic:equal>
  <logic:equal name="pager" property="hasNext" value="true">
  <a href="/graduatedata/list.do?viewPage=<bean:write name="pager" property="nextPage"/>" class="a02">
  Next
  </a>
  </logic:equal>
  
  <logic:notEmpty name="list" scope="request">
  <logic:iterate id="certificate" name="list" type="com.xindeco.business.graduatedata.CertificateVO"scope="request">
  <tr bgcolor="#FFFFFF">
  <td><html:text property="name" value="<bean:write name="certificate" property="certificateID" scope="page"/>"/>
  </td>
  <td> <bean:write name="certificate" property="certificateID" scope="page"/></td>
  <td> <bean:write name="certificate" property="certificateCode" scope="page"/></td>
  <td> <bean:write name="certificate" property="certificateName" scope="page"/></td>
  <td> <bean:write name="certificate" property="photoURL" scope="page"/></td>
  </tr>
  </logic:iterate>
  </logic:notEmpty>
  </table>
  </td>
  </tr>
  </table>
  </td>
  </tr>
  </table>
  
  6、對應的配置文件struts-config.xml。
  
  java代碼:
  
  代碼:
  --------------------------------------------------------------------------------
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
  <struts-config>
  <form-beans>
  <form-bean name="certificateform" type="com.xindeco.presentation.graduatedata.Certificateform" />
  </form-beans>
  <global-forwards>
  <forward name="error" path="/error/error.jsp" />
  </global-forwards>
  <action-mappings>
  <action name="certificateform" parameter="LIST" path="/graduatedata/list" scope="request" type="com.xindeco.presentation.graduatedata.CertificateAction" validate="true">
  <forward name="success" path="/graduatedata/listcertificate.jsp" />
  </action>
  </action-mappings>
  ……
  </struts-config>
  
  7、最後當然是最重要的分頁代碼了:Pager.java
  
  java代碼:
  
  代碼:
  --------------------------------------------------------------------------------
  package com.xindeco.common;
  
  import java.util.* ;
  public class Pager {
  private static int MAX_PAGE_INDEX = 10; //頁腳顯示多少頁
  private static String HEADER = "Result page";
  
  public static String generate(int offset, int length, int size, String url) {
  if (length > size) {
  String pref;
  if (url.indexOf("?") > -1) {
  pref = "&";
  } else {
  pref = "?";
  }
  String header = "<font face='Helvetica' size='-1'>"+HEADER+": ";
  if (offset > 0) {
  header += "&<a href=\""+url+pref+"pager.offset="+(offset-size)+"\">[<< Prev]</a>\n";
  }
  int start;
  int radius = MAX_PAGE_INDEX/2*size;
  if (offset < radius) {
  start = 0;
  } else if(offset < length-radius) {
  start = offset - radius;
  } else {
  start = (length/size-MAX_PAGE_INDEX)*size;
  }
  for(int i=start;i<length && i < start + MAX_PAGE_INDEX*size;i+=size) {
  if (i == offset) {
  header += "<b>"+(i/size+1)+"</b>\n";
  } else {
  header += "&<a href=\""+url+pref+"pager.offset="+i+"\">"+(i/size+1)+"</a>\n";
  }
  }
  if(offset < length - size) {
  header += "&<a href=\""+url+pref+"pager.offset="+((int)offset+(int)size)+"\">[Next >>]</a>\n";
  }
  header += "</font>";
  return header;
  } else {
  return "";
  }
  }
  }
  
  這部分代碼的實現相當簡潔,但已經足夠完成所需了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章