posts - 4,comments - 30,trackbacks - 0

拜读了 bibiye 的《一个高效简洁的 Struts 分页方法 ( 原创 ) 》后,根据 bibiye 的方法,自己修改了一下,也弄了一个 struts 下的分页,大家见笑了!

 

我的方法是,根据用户点击导航条上的页号 (offset) ,到 DB 中读取该页的数据 ( 不是一次全部读出 ) ,点到哪页读哪页的数据, JBX + tomcat + oracle 下测试通过,数据库用的表是 oracle emp 表。

 

******** 分页类 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: Gantoo@91.com</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="Show">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>

 

posted on 2007-08-10 11:42 蛮哥♂枫 阅读(280) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: