浏览 3407 次
锁定老帖子 主题:消灭重复代码:利用泛型设计jsf分页
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-10-14
BackingBean通过继承AbstractPageAction就可以实现一般的分页操作。 PageAction接口如下,其申明了一般的分页操作: package cn.ccb.oms.util; public interface PageAction { public String first(); public String last(); public String next(); public String previous(); public String gotoPage(); } AbstractPageAction代码如下,其中T定义了需要的pojo类,E代表了需要的Service类,每个Service必须实现PageService接口: package cn.ccb.oms.util; import java.util.List; public abstract class AbstractPageAction<T, E extends PageService<T>> implements PageAction { protected E service; protected Page page; protected List<T> objs; protected T obj; public AbstractPageAction() { } public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } public Page getPage() { return page; } public void setPage(Page page) { this.page = page; } public String gotoPage() { return findByPage(); } public String first() { page.first(); return findByPage(); } public String last() { page.last(); return findByPage(); } public String next() { page.next(); return findByPage(); } public String previous() { page.previous(); return findByPage(); } public String findByPage() { objs = service.findByInstance(obj, page); return "success"; } public E getService() { return service; } public void setService(E service) { this.service = service; } public List<T> getObjs() { if (objs == null) objs = service.findByInstance(obj, page); return objs; } public void setObjs(List<T> objs) { this.objs = objs; } } PageService接口如下,其中T定义了需要的pojo类: package cn.ccb.oms.util; import java.util.List; public interface PageService<T> { public List<T> findByInstance(T instance, Page page); } Page类如下: package cn.ccb.oms.util; public class Page { public static final Integer PAGESIZE = 20; public static final Integer PAGESIZE_BIG = 50; public static final Integer PAGESIZE_SMALL = 10; /** * 当前记录序号 */ private Integer index; /** * 最大页数 */ private Integer maxPage; /** * 当前页数 */ private Integer currentPage; /** * 每页记录数 */ private Integer pageSize; /** * 总条数 */ private Integer totelCount; /** * 是否第一条 * @return */ public Boolean getIsFirst() { return getCurrentPage() == 1; } /** * 是否是最后一条 * @return */ public Boolean getIsLast() { return getCurrentPage() >= getMaxPage(); } /** * 构造函数 * */ public Page() { init(); } /** * 构造函数 * @param totelCount 总记录数 * @param currentPage 当前页数 */ public Page(Integer totelCount, Integer currentPage) { init(); this.totelCount = totelCount; this.currentPage = currentPage; } /** * 数据初始化 * */ protected void init() { pageSize = PAGESIZE; index = 0; currentPage = 1; totelCount = 0; } /** * 去下一页 * @return */ public Integer next() { return currentPage = getCurrentPage() >= maxPage ? maxPage : getCurrentPage() + 1; } /** * 去上一页 * @return */ public Integer previous() { return currentPage = getCurrentPage() <= 1 ? 1 : getCurrentPage() - 1; } /** * 去第一页 * @return */ public Integer first() { return currentPage = 1; } /** * 去最后一页 * @return */ public Integer last() { return currentPage = maxPage == null ? 1 : maxPage; } /** * 返回最大页数 * @return */ public Integer getMaxPage() { if (totelCount < pageSize) maxPage = 1; else if (totelCount % pageSize != 0) maxPage = (totelCount - (totelCount % pageSize)) / pageSize + 1; else maxPage = totelCount / pageSize; return maxPage; } /** * 设置最大页数 * @param countPage */ public void setMaxPage(Integer countPage) { this.maxPage = countPage; } /** * 返回当前页数 * @return */ public Integer getCurrentPage() { if (currentPage > getMaxPage()) return maxPage; if (currentPage < 1) return 1; return currentPage; } /** * 设置最大页数 * @param currentPage */ public void setCurrentPage(Integer currentPage) { if (currentPage < 1) currentPage = 1; if (currentPage > getMaxPage()) currentPage = getMaxPage(); this.currentPage = currentPage; } /** * 返回每页记录数 * @return */ public Integer getPageSize() { return pageSize; } /** * 设置每页记录数 * @param pageSize */ public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } /** * 返回当前记录序号 * @return */ public Integer getIndex() { index = (getCurrentPage() - 1) * pageSize; return index; } /** * 设置当前记录序号 * @param index */ public void setIndex(Integer index) { this.index = index; } /** * 返回总记录数 * @return */ public Integer getTotelCount() { return totelCount; } /** * 设置总记录数 * @param totelCount */ public void setTotelCount(Integer totelCount) { this.totelCount = totelCount; } } 一个BackingBean的例子: package cn.ccb.oms.sysmanage.jsfbean; import java.util.Date; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import cn.ccb.oms.sysmanage.dao.BaseUnitLevel; import cn.ccb.oms.sysmanage.service.BaseUnitLevelService; import cn.ccb.oms.util.AbstractPageAction; public class BaseUnitLevelBackingBean extends AbstractPageAction<BaseUnitLevel, BaseUnitLevelService> { private static final Log log = LogFactory .getLog(BaseUnitLevelBackingBean.class); private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } public String save() { log.debug("BaseUnitLevelBackingBean begain save"); obj.setJobDate(new Date(System.currentTimeMillis())); service.save(obj); log.debug("BaseUnitLevelBackingBean save success"); return "go_list"; } public String delete() { BaseUnitLevel level = service.findById(id); service.delete(level); log.debug("delete BaseUnitLevel's name: " + level.getLevelCode()); return "success"; } public String prepareForEdit() { obj = service.findById(id); log.debug("prepare for edit BaseFlowPara's name: " + obj.getLevelCode()); return "success"; } public String update() { log.debug("BaseFlowPara need update: " + obj.getLevelCode()); obj.setJobDate(new Date(System.currentTimeMillis())); service.update(obj); return "go_list"; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-10-16
为什么AbstractPageAction是abstract的?
给个PageService实现类看看? |
|
返回顶楼 | |
发表时间:2007-10-16
eivenchan 写道 为什么AbstractPageAction是abstract的?
给个PageService实现类看看? 因为AbstractPageAction只是实现了一般的分页操作,是给需要实现分页的BackingBean继承使用的。 PageService里只有一个方法是查询使用的。 |
|
返回顶楼 | |