Struts 数据分页讲解与代码实例
作者 杨川 www.efine66.com
重点:本分页代码重点有两个,一个是数据封装的bean ,有一个与自身段相适应的静态方法,自动实例化多个自身实例,添加到ArrayList中。二是PageController页面控制器,实例化后,有一个根据 全部数据的ArrayList 和当前页 两个参数 返回 只含有当前页要显示记录的ArrayList . 在Action中怎么写,就要看你自己了,可灵活使用。大家直接使用的是PageController这个类,这是这个程序的精华, 不知道大家能不能理解我的意思,哈哈。
1 建立与你要查询数据库中的表字段相对应的Bean。并在其中建立数据库查询方法,该方法需要一个ResultSet类型的参数,是一个静态函数,把ResultSet 中的每条记录装添到一个Bean中,然后保存到ArrayList中返回。在本例中为 XueShengBean 。
2 建立一个页面数据控制器:PageController 传入由上面返回的Arraylist ,当前页 ,返回一个只包含当前页的ArrayList
3建立控制器组件,这部分由Struts 中的Action来实现。主要负责将实例化数据Bean ,并利用返回的ArrayList对象,接收由视图传递而来的当前页参数。构造PageController,用PageController中的方法 来返回一个只包含当前页的ArrayLIst 并放到request 里,发送到视图显示。
4建立视图组件 ,使用Struts提供的标签库,主要负责从request中取出刚刚放入的对象,而实现分页显示。
实例代码
1 数据bean
import java.util.ArrayList;
import java.sql.ResultSet;
import org.apache.struts.action.ActionMessage;
import java.sql.SQLException;
public class XueShengBean {
private String xingming;
private String id;
private String xingbie;
private String beizhu;
private String xuehao;
public XueShengBean() {
}
public static ArrayList getArrayList(ResultSet rs) {
ArrayList al = new ArrayList();
try {
while (rs.next()) {
XueShengBean xSB = new XueShengBean();
xSB.setXuehao(rs.getString( " xuehao " ));
xSB.setXingming(rs.getString( " xingming " ));
xSB.setXingbie(rs.getString( " xingbie " ));
xSB.setBeizhu(rs.getString( " beizhu " ));
xSB.setId(rs.getString( " id " ));
al.add(xSB);
}
} catch (SQLException ex) {
System.out.println(ex.getMessage() + " 读数据时出错 " );
}
return al;
}
public void setXingming(String xingming) {
this .xingming = xingming;
}
public void setId(String id) {
this .id = id;
}
public void setXingbie(String xingbie) {
this .xingbie = xingbie;
}
public void setBeizhu(String beizhu) {
this .beizhu = beizhu;
}
public void setXuehao(String xuehao) {
this .xuehao = xuehao;
}
public String getXingming() {
return xingming;
}
public String getId() {
return id;
}
public String getXingbie() {
return xingbie;
}
public String getBeizhu() {
return beizhu;
}
public String getXuehao() {
return xuehao;
}
}
2 PageController 控制器 这个是本文的重点,在此中注意这个唯一需要我们调用的方法public ArrayList getPageArrayList(ArrayList al, int cp) 在控制器被实例化后,我们只使用这个方法即可,返回一个只有当前页所需要的ArrayList,非常方便
import java.util.ArrayList;
import java.sql.ResultSet;
import java.util.HashMap;
/**
* <p>Title:分页代码—页面控制 </p>
*
* <p>Description:struts 分页代码—页面控制 </p>
* <p>Description:2007年2月4号凌晨写下此分页代码。
* 在Bean的使用上本来想用DynaBean,不过显示的时候,就不好办了。
* 感觉数据库字段改变不是太大吧,况且一个自己写一个封装数据的Bean
* 在程序别的地方,会省很多事。
*
* </p>
* <p>Copyright:www.efine66.com Copyright (c) 2007</p>
*
* <p>Company:efine </p>
* @author 杨川 www.efine66.com
* @version 1.0
*/
public class PageController {
public PageController() {
}
//////////////////////////////////////////////
int totalRows; // 总行数
int pageSize = 1 ; //
int currentPage = 10 ; // 当前页
int totalPages;
int nextPage;
int previousPage;
int pageStartRow; // 请求记录开始位置
int pageEndRow; //
boolean hasNext = true ; //
boolean hasPrevious = true ; //
boolean hasTop = true ; //
boolean hasLast = true ; //
//////////////////////////////////////////////
/**
* getPageArrayList
* 实例化后,真接执行此函数,正确传递参数,即可完成所有设置,与页面控制
* 返回根据分面计算得到的ArrayList
* @param al ArrayList
* @param cp int
* @return ArrayList
*/
public ArrayList getPageArrayList(ArrayList al, int cp) {
setPageController(al, cp);
ArrayList alt = new ArrayList();
if (pageStartRow > 0 ) {
for ( int i = pageStartRow; i <= pageEndRow; i ++ ) {
System.out.println( " al.get " + (i - 1 ));
alt.add(al.get(i - 1 ));
}
} else {
return null ;
}
return alt;
}
/**
* getPageArrayList
* 多一条页面设置参数
* 实例化后,真接执行此函数,正确传递参数,即可完成所有设置,与页面控制,
* 返回根据分面计算得到的ArrayList
* @param al ArrayList
* @param cp int
* @param pageSize int
* @return ArrayList
*/
public ArrayList getPageArrayList(ArrayList al, int cp, int pageSize) {
setPageController(al, cp, pageSize);
ArrayList alt = new ArrayList();
if (pageStartRow > 0 ) {
for ( int i = pageStartRow; i <= pageEndRow; i ++ ) {
System.out.println( " al.get " + (i - 1 ));
alt.add(al.get(i - 1 ));
}
} else {
return null ;
}
return alt;
}
//////////////////////////// /以下公有获取页面状态的函数 ////////////////////////
public int getCurrentPage() {
return currentPage;
}
public boolean getHasNext() {
return hasNext;
}
public boolean getHasPrevious() {
return hasPrevious;
}
public boolean getHasTop() {
return hasTop;
}
public boolean getHasLast() {
return hasLast;
}
public int getNextPage() {
return nextPage;
}
public int getPreviousPage() {
return previousPage;
}
public int getTotalPages() {
return totalPages;
}
public String getD() {
String description = " Total: " + totalRows +
" items " + totalPages +
" pages,Current page: " +
this .currentPage + " Previous " +
this .hasPrevious +
" Next: " + this .hasNext +
" start row: " + this .pageStartRow +
" end row: " + this .pageEndRow;
return description;
}
//////////////////////////// /以下私用工具函数 ////////////////////////
/**
* setPageController
* 设置本类的所有参数
* @param al ArrayList
* @param cp int
*/
private void setPageController(ArrayList al, int cp) {
// 以下几条程序顺序不可改变
setTotal_Rows_Pages(al.size()); // 设置记录总数,总页数
setCurrentPage(cp); // 设置当前页数
setPageStart_EndRow(); // 生成开始记录位置,结束记录位置
set_Next_Previous_Top_Last(); // 生成 下一页 上一页 第一页 最后一页 标志
}
/**
* setPageController
* 多一条,页面大小的设置
* @param al ArrayList
* @param cp int
* @param pageSize int
*/
private void setPageController(ArrayList al, int cp, int pageSize) {
this .pageSize = pageSize;
setPageController(al, cp);
}
private void setCurrentPage( int i) {
if (i < 1 ) {
i = 1 ;
}
if (i > totalPages) {
i = totalPages;
}
currentPage = i;
nextPage = currentPage + 1 ;
previousPage = currentPage - 1 ;
}
private void setTotal_Rows_Pages( int size) {
totalRows = size;
if (size % pageSize == 0 ) {
totalPages = size / pageSize;
} else {
totalPages = size / pageSize + 1 ;
}
}
private void setPageStart_EndRow() {
if (currentPage * pageSize <= totalRows) {
pageEndRow = currentPage * pageSize;
pageStartRow = pageEndRow - pageSize + 1 ;
} else {
pageEndRow = totalRows;
pageStartRow = currentPage * pageSize - pageSize + 1 ;
}
}
private void set_Next_Previous_Top_Last() {
if (nextPage > totalPages) {
hasNext = false ;
}
if (previousPage < 1 ) {
hasPrevious = false ;
}
if (currentPage == 1 ) {
hasTop = false ;
}
if (currentPage == totalPages) {
hasLast = false ;
}
}
}
3 action 中部分代码 这个大家看一下大体的步骤就可以了,我写的这个为了大家看明白,以上的bean ,和 pagecontroller 的调用方法。具体到你的应用中时,可以灵活应用。
HttpServletRequest request,
HttpServletResponse response) {
DataSource dataSource = null ;
Connection conn = null ;
ActionErrors ae = new ActionErrors();
ResultSet rs = null ;
Statement stmt = null ;
ArrayList v_al = new ArrayList();
Object myObject = null ;
int currentPage = 1 ;
////////////////////////////////////////////////////////////////////////////// /
try {
// 取得数据库连接
dataSource = getDataSource(request, " A " );
conn = dataSource.getConnection();
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
String sql = " select * from QGZX_xueshengshenqing " ;
rs = stmt.executeQuery(sql);
v_al = XueShengBean.getArrayList(rs);
} catch (Exception e) {
System.out.println( " 获得连接出错 " + e.toString());
return (mapping.findForward( " conniserror " ));
} finally {
try {
rs.close();
stmt.close();
conn.close();
} catch (SQLException ex) {
}
}
////////////////////////////////////////////////////////////////////
currentPage = ut.TypeConver.stringToInt(request.getParameter(
" currentPage " ));
System.out.println( " 当前页是 " + currentPage);
db.PageController pageCon = new db.PageController();
v_al = pageCon.getPageArrayList(v_al, currentPage);
HttpSession js = request.getSession();
Integer jsVaule = (Integer) js.getAttribute( " linkC " );
if (jsVaule == null ) {
jsVaule = new Integer( 0 );
} else {
jsVaule = new Integer(jsVaule.intValue() + 1 );
}
js.setAttribute( " linkC " , jsVaule);
request.setAttribute( " XueSheng " , v_al);
request.setAttribute( " pc " , pageCon);
System.out.println( " 设置完,开始转移到 show " );
return (mapping.findForward( " show " ));
}
4 显示部分 ,大家一看就明白了吧,可以再美工一下。
共有${pc.totalPages}页 |
< logic:equal name = " pc " property = " hasTop " value = " true " >
< html:link page = " /main.do " paramId = " currentPage " property = " 1 " > 首页 </ html:link >
</ logic:equal >
< logic:notEqual name = " pc " property = " hasTop " value = " true " >
首页
</ logic:notEqual >
|
< logic:equal name = " pc " property = " hasPrevious " value = " true " >
< html:link page = " /main.do " paramId = " currentPage " paramName = " pc " paramProperty = " previousPage " > 上一页 </ html:link >
</ logic:equal >
< logic:notEqual name = " pc " property = " hasPrevious " value = " true " >
上一页
</ logic:notEqual >
《《 < font color = " bule " > ${pc.currentPage} </ font > 》》
< logic:equal name = " pc " property = " hasNext " value = " true " >
< html:link page = " /main.do " paramId = " currentPage " paramName = " pc " paramProperty = " nextPage " > 下一页 </ html:link >
</ logic:equal >
< logic:notEqual name = " pc " property = " hasNext " value = " true " >
下一页
</ logic:notEqual >
|
< logic:equal name = " pc " property = " hasLast " value = " true " >
< html:link page = " /main.do " paramId = " currentPage " paramName = " pc " paramProperty = " totalPages " > 尾页 </ html:link >
</ logic:equal >
< logic:notEqual name = " pc " property = " hasLast " value = " true " >
尾页
</ logic:notEqual >
</ logic:present >