Struts分页讲解与代码实例

chuan014 2007-02-05 01:37:09


Struts分页讲解与化码实例

分享一下,大家找找错误,提提意见,有用的着的兄弟 ,别忘了顶一下啊,,,

1 建立与你要查询数据库中的表字段相对应的Bean。这部分由我们熟悉的javaBean来充当。并在其中建立数据库查询方法,该方法需要一个ResultSet类型的参数,是一个静态函数,把ResultSet 中的每条记录装添到一个Bean中,然后保存到ArrayList中返回。在本例中为 XueShengBean 。
2 建立一个页面数据控制器:PageController 传入由上面返回的Arraylist ,当前页 ,返回一个只包含当前页的ArrayList
3建立控制器组件,这部分由Struts 中的Action来实现。主要负责将实例化数据Bean ,并利用返回的ArrayList对象,接收由视图传递而来的当前页参数。构造PageController,用pc中的方法 来返回一个只包含当前页的ArrayLIst 并放到request 里,发送到视图显示。
4建立视图组件,这部分由jsp来充当,为了不出现java 代码,我们使用Struts提供的标签库,主要负责从request中取出刚刚放入的对象,而实现分页显示。本例中为show.jsp.


实例代码

1 数据bean
package kaka;

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;
}
}




...全文
1384 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongzhenni 2011-03-02
  • 打赏
  • 举报
回复
虽然我看这些有点吃力,但这个思想看起来不错!顶一下!
hyynet09 2010-02-04
  • 打赏
  • 举报
回复
不错!
suncheng_hong 2007-02-10
  • 打赏
  • 举报
回复
楼主,您这种是直接访问action,在action中得到数据集。
但是如果从form表单过来,也就是从jsp->action中。
怎么做额。
wanzyqyy 2007-02-10
  • 打赏
  • 举报
回复
不错,谢谢,帮顶!
suncheng_hong 2007-02-07
  • 打赏
  • 举报
回复
请问
jsValue是什么?
jianghuxiaoxiami 2007-02-07
  • 打赏
  • 举报
回复
mark
chuan014 2007-02-07
  • 打赏
  • 举报
回复
这个程序 用在记录不多的情况下,如果把ArrayLIst 写在sission 会更快,只是不能及时反应记录变化,,

记录要是很多的话,可以在取记录的时候做一下优化,只取需要的,,,我不想写了,
suncheng_hong 2007-02-07
  • 打赏
  • 举报
回复
学习一下。
syhan 2007-02-06
  • 打赏
  • 举报
回复
同意 s_topman(SQL love Linux! : )) 的,假想有上千万条记录¥……&%……&%……¥%……
liguiling_1986 2007-02-06
  • 打赏
  • 举报
回复
顶~~学习下
s_topman 2007-02-05
  • 打赏
  • 举报
回复
最好利用数据库驱动来做分页,你这样全部取出再选对应页面的数据,当数据量很大时会比较慢
ziyouzai 2007-02-05
  • 打赏
  • 举报
回复
学习
chuan014 2007-02-05
  • 打赏
  • 举报
回复
3 action 中部分代码

public ActionForward execute(ActionMapping mapping, ActionForm form,
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 显示部分

<logic:present name="pc" scope="request">
<logic:equal name="pc" property="hasTop" value="true">
<html:link page="/main.do" paramId="currentPage" property="1">第一页 </html:link>
</logic:equal>
<logic:equal name="pc" property="hasPrevious" value="true">
<html:link page="/main.do" paramId="currentPage" paramName="pc" paramProperty="nextPage">上一页 </html:link>
</logic:equal>
${pc.currentPage}

<logic:equal name="pc" property="hasNext" value="true">
<html:link page="/main.do" paramId="currentPage" paramName="pc" paramProperty="nextPage">下一页 </html:link>
</logic:equal>
<logic:equal name="pc" property="hasLast" value="true">
<html:link page="/main.do" paramId="currentPage" paramName="pc" paramProperty="totalPages">尾页 </html:link>
</logic:equal>
</logic:present>
chuan014 2007-02-05
  • 打赏
  • 举报
回复
2 PageController 控制器

package db;

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;
}

}


}






67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧