论坛首页 Java企业应用论坛

消灭重复代码:利用泛型设计jsf分页

浏览 3408 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-10-14  
在使用jsf开发项目时,利用java5.0的泛型设计了一个分页的模式。
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";
	}

}
   发表时间:2007-10-16  
为什么AbstractPageAction是abstract的?
给个PageService实现类看看?
0 请登录后投票
   发表时间:2007-10-16  
eivenchan 写道
为什么AbstractPageAction是abstract的?
给个PageService实现类看看?

因为AbstractPageAction只是实现了一般的分页操作,是给需要实现分页的BackingBean继承使用的。
PageService里只有一个方法是查询使用的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics