求助! Struts分页的实现例子
在google上搜索了,来回都是那几个, 想要一份比较成熟的解决方案 分不够可以再加
请帮忙 谢谢~!
问题点数:100、回复次数:15Top
1 楼chaoqunjiang(爱生活爱JAVA)回复于 2005-04-02 01:19:34 得分 0
自己先顶~
Top
2 楼chaoqunjiang(爱生活爱JAVA)回复于 2005-04-02 01:48:30 得分 0
或者发到我邮箱 chaoqunjiang@163.com 谢谢Top
3 楼taglib(不懂就是不懂,别不懂装懂)回复于 2005-04-02 02:49:34 得分 0
Paging long lists
http://www.javaworld.com/javaworld/jw-07-2004/jw-0726-pagination.htmlTop
4 楼chaoqunjiang(爱生活爱JAVA)回复于 2005-04-02 11:28:40 得分 0
上面这个是基于DAO的呀Top
5 楼wingtrace(虽然生活很艰苦,但是我们也不能做禽兽)回复于 2005-04-02 11:52:04 得分 0
一般都是采用PageController+数据库SQL方言特征的分页方案,其实很容易,自己写都没问题。
像Oracle是利用rownum伪列,Mysql是利用limit关键字,MsSql是利用top关键字等等。Top
6 楼chaoqunjiang(爱生活爱JAVA)回复于 2005-04-02 11:59:20 得分 0
谢谢楼上, 我尝试一下 :)Top
7 楼joybo()回复于 2005-04-02 12:15:16 得分 10
我这儿有以前用过的两个类,可以参考一下:
Pages.java:
package com.myproject.db;
import java.sql.*;
public abstract class Pages {
String filename = ""; //Jsp文件名
int pages = 1; //页号
int totals = 0; //记录总数
int perpagenum = 20; //每页显示记录数
int style = 0; //分页字符串样式
int allpage = 1; //总页数
int cpage = 1; //当前页
int spage = 1; //开始记录数
String sSQL = ""; //SQL语句
String listPageBreak = ""; //用于页面显示的html语句
String[] pagesign = {
"", "", "", "", "", "", "", ""}; //显示的字符列表(如:“首页”、“上一页”、“下一页”、“尾页”)
public Pages() {
}
public String getFileName() {
return this.filename;
}
public void setFileName(String aFileName) {
this.filename = aFileName;
}
public int getPages() {
return this.pages;
}
public void setPages(int aPages) {
this.pages = aPages;
}
public int getTotals() {
return this.totals;
}
public void setTotals(int aTotals) {
this.totals = aTotals;
}
public int getPerPageNum() {
return this.perpagenum;
}
public void setPerPageNum(int aperpagenum) {
this.perpagenum = aperpagenum;
}
public int getStyle() {
return this.style;
}
public void setStyle(int aStyle) {
this.style = aStyle;
}
public void setSQL(String SQL) {
this.sSQL = SQL;
}
public void setPagesign(String[] apagesign) {
this.pagesign = apagesign;
}
public void doPageBreak() {
this.allpage = (int) Math.ceil( (this.totals + this.perpagenum - 1) /
this.perpagenum);
int intPage = this.pages;
//如果输入的页号大于总页数 设置当前页为1,否则当前页设置为输入的页号
if (intPage > this.allpage) { // pages == 0
this.cpage = 1;
}
else {
this.cpage = intPage;
}
//开始记录数
this.spage = (this.cpage - 1) * this.perpagenum;
getPageBreakStr();
}
//用于页面显示的html语句
public String getListPageBreak() {
return this.listPageBreak;
}
//得到要显示的字符列表(如:“首页”、“上一页”、“下一页”、“尾页”)
public void getPageBreakStr() {
//style == 0时:显示如“上一页”、“下一页”(有链接)
if (this.style == 0) {
if (this.cpage > 1) {
this.listPageBreak += "[<a href='" + this.filename + "pages=" +
(cpage - 1) +
"'><font color=#FF0000>" +
pagesign[1] + "</font></a>]";
}
if (this.cpage < this.allpage) {
this.listPageBreak += "[<a href='" + this.filename + "pages=" +
(cpage + 1) +
"' ><font color=#FF0000>" +
pagesign[2] + "</font></a>]";
}
}
//style == 1时:显示带图片的“上一页”、“下一页”(有链接)
if (this.style == 1) {
if (this.cpage > 1) {
this.listPageBreak +=
"<img src=images/prepage.gif align=absmiddle><font color=#FF0000>[<a href='" +
this.filename + "pages=" +
(cpage - 1) + "'><font color=#FF0000>" +
pagesign[1] + "</font></a>]</font>";
}
if (this.cpage < this.allpage) {
this.listPageBreak +=
"<img src=images/nextpage.gif align=absmiddle><font color=#FF0000>[<a href='" +
this.filename + "pages=" +
(cpage + 1) + "'><font color=#FF0000>" +
pagesign[2] + "</font></a>]</font>";
}
}
//style == 2时:显示如“首页”、“上一页”、“下一页”、“尾页”(有链接)
if (this.style == 2) {
if (this.cpage > 1) {
this.listPageBreak +=
"[<a href='" + this.filename +
"pages=1'><font color=#FF0000>" +
pagesign[0] +
"</font></a>] [<a href='" + this.filename + "pages=" + (cpage - 1) +
"'><font color=#FF0000>" +
pagesign[1] + "</font></a>]";
}
if (this.cpage < this.allpage) {
this.listPageBreak += "[<a href='" + this.filename + "pages=" +
(cpage + 1) +
"'><font color=#FF0000>" +
pagesign[2] +
"</font></a>] [<a href='" + this.filename + "pages=" +
this.allpage +
"'><font color=#FF0000>" +
pagesign[3] + "</font></a>]";
}
}
//style == 3时:显示更多信息(有链接)
}
//得到一个sql字符串
public abstract String getSQLString(String pk);
//获得记录集
public abstract ResultSet getRs(TranContext DBSQL, String pk);
}
mysql数据库的分页:
MySQLPages.java:
package com.myproject.db;
import java.sql.ResultSet;
import org.apache.log4j.*;
public class MySQLPages
extends Pages {
static Logger logger = Logger.getLogger(MySQLPages.class.getName());
public MySQLPages() {
}
/**
* 重写父类的方法获得记录集
* @param DBSQL
* @param pk
* @return
*/
public ResultSet getRs(TranContext DBSQL, String pk) {
String SQL = "";
ResultSet rs = null;
try {
SQL = this.getSQLString(pk);
//logger.info(SQL);
DBSQL.prepareStatement(SQL);
rs = DBSQL.executeQuery();
return rs;
}
catch (Exception e) {
logger.error(e);
return null;
}
}
/**
* 重写父类的方法得到一个sql字符串
* @param pk
* @return
*/
public String getSQLString(String pk) {
String sql = this.sSQL;
//spage开始的记录数 perpagenum每页显示的记录数 该语句显示从spage开始的perpagenum条纪录
sql = sql + " limit " + spage + "," + perpagenum;
return sql;
}
}
Top
8 楼wingtrace(虽然生活很艰苦,但是我们也不能做禽兽)回复于 2005-04-02 12:18:57 得分 0
public static final String MYSQL_PAGING_APPEND =
" LIMIT ?, ?";
public static final String ORACLE_PAGING_HEADER =
"SELECT * FROM(SELECT ORI.*, rownum r FROM(";
public static final String ORACLE_PAGING_TAIL =
") ORI WHERE rownum <= ?) PAGED WHERE r >= ?";
-------------------------------------------
上面是经典的MySQL和Oracle分页SQL,这里就直接给你了。
假设你的查询SQL为 BUSINESS_SQL,那么,
对于MySQL,只要将你的 BUSINESS_SQL + MYSQL_PAGING_APPEND 然后再设置参数即可。
对于Oracle则是 ORACLE_PAGING_HEADER + BUSINESS_SQL + ORACLE_PAGING_TAIL 。
很easy吧?Top
9 楼chaoqunjiang(爱生活爱JAVA)回复于 2005-04-02 12:59:47 得分 0
有SQL SERVER 的么 ?呵呵Top
10 楼chaoqunjiang(爱生活爱JAVA)回复于 2005-04-04 22:05:46 得分 0
希望大家继续帮忙 谢谢Top
11 楼wingtrace(虽然生活很艰苦,但是我们也不能做禽兽)回复于 2005-04-04 23:58:37 得分 0
SQL SERVER一般都用存储过程做,google一下“sql server 分页 存储过程”,能找到许多。
btw,我个人不喜欢把html元素捆绑在分页控制器里面,一来分页类看起来很杂乱,二来也破坏了view和control分离的原则。Top
12 楼wingtrace(虽然生活很艰苦,但是我们也不能做禽兽)回复于 2005-04-05 00:06:28 得分 50
分页原理在数据库层面上都是一样的,无非是利用具体数据库提供的一些相关特性来实现而已。
分页真正难的地方还是在于mvc三个角色的定位和分离,如何降低耦合度,使程序结构明朗,扩展和维护方便。
我的做法是效仿entitybean类/实例与数据库表/记录的关系,把分页控制类作为每一个实际页面的抽象,每一个分页控制类的实例就是每个页面上所应该输出的数据(包括页面控制信息),在java代码里面不包含任何view元素。Top
13 楼discolt(枫)回复于 2005-04-05 00:41:39 得分 40
我做了一个Webwork的分页组件,比以前Struts的爽多了。
只需一个Action和创建自己的创建页面调用的接口即可。
// webwork的Action
public class UserPageAction implements Action {
TurnPageParam go = new TurnPageParam();
public TurnPageParam getGo() {
return go;
}
public String execute() {
PageService pageService = PageServiceFactory.forAction(this).getPageService();
pageService.setPageCreator(new UserPageCreator());
pageService.turnPage(go);
return SUCCESS;
}
}
// 页面创建器
public class UserPageCreator implements PageCreator {
public Page createPage(PageController pc) {
UserDao userDao = (UserDao) AppContext.getBean("userDaoImpl");
return userDao.listUsers(pc.getStartRow(), pc.getMaxRow());
}
}
// 最后用Spring 描述一下你创建页面,页面控制器放在session里的名称即可。
<beans>
<description>Spring Work - 页面组件</description>
<bean id="pageService"
class="orange.framework.page.webwork.PageService" singleton="false">
<property name="pageSize">
<value>15</value>
</property>
<property name="pageName">
<value>userPage</value>
</property>
<property name="pageControllerName">
<value>userPageController</value>
</property>
</bean>
</beans>
Webwork的Action由于脱离了http对象(request, response .),所以运用起来更灵活。Top
14 楼discolt(枫)回复于 2005-04-05 00:45:01 得分 0
userList.jsp
<%--
- 对应配置文件,取得session中的页面对象中的集合和
- 页面控制器对象,并将这两个对象置入request作用域.
--%>
<ww:set name="list" value="#session.userPage.list" scope="request"/>
<ww:set name="pageController" value="#session.userPageController" scope="request"/>
<ww:iterator value="#request.list">
userId: <ww:property value="userId" />
userName: <ww:property value="userName" />
<br>
</ww:iterator>
<%-- 传递翻页路径给分页控制器 --%>
<jsp:include page="pageController.jsp">
<jsp:param name="action" value="/user/list.action"/>
</jsp:include>
</html>
pageController.jsp
<%@ taglib uri="webwork" prefix="ww" %>
<%
String action = request.getContextPath()
+ request.getParameter("action")
+ "?go.viewPage=";
%>
<ww:iterator value="#request.pageController.currentRangePages">
<a href="<%= action%><ww:property/>">
<ww:property/>
</a>
</ww:iterator>Top
15 楼discolt(枫)回复于 2005-04-05 01:10:26 得分 0
输出结果像这样:
1: JOHN
2: COOL
3: JAKE
4: ROSE
...
12345
用1,2,3,4,5控制页面的跳转,当然可以加前一页后一页什么的,他们只是pageController的一个属性而已。Top




