拜讀了bibiye的《一個高效簡潔的Struts分頁方法(原創(chuàng))》后,根據(jù)bibiye的方法,自己修改了一下,也弄了一個struts下的分頁,大家見笑了!
我的方法是,根據(jù)用戶點擊導(dǎo)航條上的頁號(offset),到DB中讀取該頁的數(shù)據(jù)(不是一次全部讀出),點到哪頁讀哪頁的數(shù)據(jù),JBX + tomcat + oracle下測試通過,數(shù)據(jù)庫用的表是oracle的emp表。
********分頁類Pager.java,負(fù)責(zé)生成分頁導(dǎo)航條********
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;
}
/**
* 返回分頁導(dǎo)航條
* @param offset int 起始記錄的位置
* @param size int 總記錄數(shù)
* @param length int 步長
* @param url String .do的url
* @param pageHeader String 導(dǎo)航條的前綴文字提示
* @return String
*/
public String getPageNavigation() {
String pageNavigation = ""; //最終返回的分頁導(dǎo)航條
//記錄數(shù)超過一頁,需要分頁
if (size > length) {
String pref; //前綴
if (url.indexOf("?") > -1) {
//如果url中已經(jīng)包含了其他的參數(shù),就把offset參數(shù)接在后面
pref = "&";
}
else {
//如果url中沒有別的參數(shù)
pref = "?";
}
//如果導(dǎo)航條包含header
if (pageHeader != null && pageHeader.length() > 0) {
pageNavigation = pageHeader + " : ";
}
//如果不是第一頁,導(dǎo)航條將包含“<<”(第一頁)和“<”(前一頁)
if (offset > 0) {
pageNavigation += "<a href='" + url + pref + "offset=0'>[<<]</a>\n" +
"<a href='" + url + pref + "offset=" + (offset - length) +
"'>[<]</a>\n";
}
//導(dǎo)航條中,排頭的那一頁的offset值
int startOffset;
//位于導(dǎo)航條中間的那一頁的offset值(半徑)
int radius = constants.MAX_PAGE_INDEX / 2 * length;
//如果當(dāng)前的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) {
//當(dāng)前頁號,加粗顯示
pageNavigation += "<b>" + (i / length + 1) + "</b>\n";
}
else {
//其他頁號,包含超鏈接
pageNavigation += "<a href='" + url + pref + "offset=" + i + "'>" +
(i / length + 1) + "</a>\n";
}
}
//如果不是最后一頁,導(dǎo)航條將包含“>”(下一頁)和“>>”(最后一頁)
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 "";
}
}
/**
* 返回分頁后的總頁數(shù)
* @param size int 總記錄數(shù)
* @param length int 每頁的記錄數(shù)
* @return int
*/
public int pageCount() {
int pagecount = 0;
if (size % length == 0) {
pagecount = size / length;
}
else {
pagecount = size / length + 1;
}
return pagecount;
}
/**
* 返回最后一頁的記錄數(shù)
* @param size int 總記錄數(shù)
* @param length int 每頁的記錄數(shù)
* @return int
*/
public int lastPageSize() {
int lastpagesize = 0;
if (size % length == 0) {
lastpagesize = length;
}
else {
lastpagesize = size % length;
}
return lastpagesize;
}
/**
* 返回最后一頁的起始記錄位置
* @param size int 總記錄數(shù)
* @param length int 每頁的記錄數(shù)
* @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;
}
}
********數(shù)據(jù)處理類empDAO.java,負(fù)責(zé)訪問DB,獲取當(dāng)前頁面需要顯示的記錄********
package page;
import java.sql.*;
import java.util.*;
public class empDAO {
public empDAO() {
}
/**
* 從offset位置起始,返回length條記錄
* @param offset int 起始的記錄位置
* @param length int 步長
* @param conn Connection 數(shù)據(jù)庫連接
* @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;
}
/**
* 返回總的記錄數(shù)
* @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;
}
}
********業(yè)務(wù)類empBO.java,調(diào)用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;
}
/**
* 返回總的記錄數(shù)
* @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; //起始記錄的位置//每頁顯示的記錄數(shù)
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; //記錄默認(rèn)從第一條開始顯示
}
public int getOffset() {
return offset;
}
public void setOffset(int offset) {
this.offset = offset;
}
}
********Action類empAction.java,控制器,調(diào)用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();
//獲取外部傳進(jìn)來的起始記錄號
int offset = ( (empForm) actionForm).getOffset();
//獲取每頁的記錄數(shù)
int pagesize = constants.PAGE_SIZE;
//獲取記錄集合,從offset開始,取length條記錄
ArrayList emps = empbo.findAllEmp(offset, pagesize);
//計算所有記錄的條數(shù)(總記錄數(shù))
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");
//獲取分頁導(dǎo)航條
//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");
}
}
********數(shù)據(jù)庫連接池類DBPool.java,可以使用tomcat的連接池,也可以不用,這里關(guān)閉了********
package page;
import java.sql.*;
import javax.naming.*;
import javax.sql.*;
import org.apache.commons.logging.*;
/**
* 系統(tǒng)連接池類
* <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連接數(shù)據(jù)庫
* */
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("未找到數(shù)據(jù)源" + ex.getMessage());
}
catch (SQLException ex1) {
log.error("Error Connection! " + ex1.getMessage());
//System.out.println("錯誤的數(shù)據(jù)連接" + 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("連接關(guān)閉失敗" + 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; //每頁的記錄數(shù)
}
********測試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("當(dāng)前頁有 " + 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" "<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>
在網(wǎng)上看了幾個Structs分頁,感覺不是很完善,于是根據(jù)自己的經(jīng)驗,寫了一個相對高效簡潔的分頁方法。由于本人水平有限,如果大家有什么更好的想法,歡迎不吝賜教。
一、 開發(fā)環(huán)境
我的開發(fā)環(huán)境是:JBuilder x + Weblogic 8.1 + Oracle 9i + Windows 2003 ,如果朋友們的開發(fā)環(huán)境不一樣亦無妨。
二、開發(fā)思路
既然講的是Struts,那自然離不了MVC,分頁顯示也是如此。
1、 建立數(shù)據(jù)庫和對應(yīng)的表,本例的表是TCertificate。
2、 建立適當(dāng)?shù)哪P徒M件,對應(yīng)你要查詢數(shù)據(jù)庫中的表。這部分由DAO數(shù)據(jù)訪問層來實現(xiàn),如果有的朋友對DAO不熟悉可以查詢一下相關(guān)資料。本例由CertificateDAO.java來實現(xiàn)。
3 、建立分頁所需要的模型組件,由javaBean來充當(dāng),并與CertificateDAO實現(xiàn)分離。網(wǎng)上介紹的很多方法,都存在著數(shù)據(jù)與分頁組件藕合的現(xiàn)象,這也是本方法與其它分頁方法的主要不同之處。
4、建立控制器組件,這部分由Struts 中的Action來實現(xiàn)。主要負(fù)責(zé)將實例化CertificateDAO,只取要顯示的數(shù)據(jù)記錄,存入ArrayList對象然后返回,并放到request中。而分頁部分則根據(jù)分頁條件,單獨進(jìn)行構(gòu)造,避免了與DAO混在一起的情況發(fā)生。網(wǎng)上其它介紹的一些分頁方法中,基本上都是一次性讀出所有查詢的數(shù)據(jù),然后再由分頁相關(guān)組件進(jìn)行構(gòu)造。這樣,如果數(shù)據(jù)量大的話,很容易形成瓶頸。在本例中由于不是一次性地讀出查詢的所有數(shù)據(jù),而只是讀出一個頁面要顯示的數(shù)據(jù)記錄,這就節(jié)省了很多不必要的數(shù)據(jù)傳輸,提高了效率。本例中為CertificateAction.java。
5、建立視圖組件,這部分由jsp來充當(dāng),為了不出現(xiàn)java 代碼,我們使用Struts提供的標(biāo)簽庫,主要負(fù)責(zé)從request中取出剛剛放入的對象,通過反復(fù)調(diào)用CertificateAction以及action參數(shù),而實現(xiàn)分頁顯示。本例中為listcertificate.jsp。
6、 建立并配置struts-config.xml。
三、實例代碼
確定好上面的開發(fā)思路后,代碼的實現(xiàn)就有單可循了。
1、建數(shù)據(jù)庫和相應(yīng)的表。
2、數(shù)據(jù)邏輯層的相關(guān)代碼。
1)、通用的DAO類:CommonDAO.java
這是一個很多DAO都要繼承到的通用DAO類,是我根據(jù)實踐總結(jié)出來的,為了減少篇幅,這里只顯示和本例相關(guān)的代碼。
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;
/**
* 說明:取得當(dāng)前查詢的總記錄數(shù)
*/
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;
}
}
}
這個類主要是通過子類傳進(jìn)來的先進(jìn)結(jié)果集,取得查詢的記錄總數(shù),并對數(shù)據(jù)庫連接進(jìn)行簡單的管理。
2)、對數(shù)據(jù)庫進(jìn)行訪問: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();
/*對游標(biāo)進(jìn)行處理,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)是查得所有要顯示的數(shù)據(jù),并放入ArrayList中??催^網(wǎng)上有些例子,把數(shù)據(jù)記錄放入ArrayList的動作過程直接在while循環(huán)體里完成,如果字段多的話,會造成方法過于寵大,又不美觀。 這里,數(shù)據(jù)記錄放入ArrayList的動作過程由rs2VO方法完成,就比較整潔了。另外,if (rs != null && rs.next ()) 配合while ( (countRows++ < limit) && rs.next ()) 是為了程序的健壯性考慮的,稍分析一下不難得出結(jié)論。
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; //翻頁時的起始記錄所在游標(biāo)
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(); // 取得總記錄數(shù)
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主要是把數(shù)據(jù)從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、對應(yīng)的配置文件struts-config.xml。
java代碼:
代碼:
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" " <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、最后當(dāng)然是最重要的分頁代碼了: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 "";
}
}
}
這部分代碼的實現(xiàn)相當(dāng)簡潔,但已經(jīng)足夠完成所需了。