拜读了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: [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">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>
|