论坛首页 Java企业应用论坛

一种传递分页参数的方法

浏览 30768 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-03-01  
robbin 写道
反对这种做法,我一次web request过程中,可能牵涉n个Service的m个DAO调用,可能涉及x种domain对象的分页处理,你要在ThreadLocal里面分别传递好多个分页参数,而且还必须清楚的区分哪个参数是哪个DAO用到的。这种大量隐式契约的编程味道太坏了。

其实分页很简单,封装一个Pagination对象,所有需要传入传出的参数都封装在里面就OK了,Hibernate版我贴过代码的,用起来很方便。


我比较赞同robbin,代码狂少



public class ListPassengerAction extends BaseAction {
	
	private Pagination pagination = new Pagination();;

	private List passengers;

	private PassengerService passengerService;

	public String execute(); throws Exception {
		pagination = this.passengerService.findPassengerPagination(pagination);;
		if (null != pagination); {
			passengers = pagination.getItems();;
		}
		return SUCCESS;
	}
}



public class PassengerServiceImpl implements PassengerService {
	private PassengerDAO passengerDAO;
	public Pagination findPassengerPagination(Pagination pagination); {
		return passengerDAO.findPassengerPagination(pagination);;
	}
}


public class PassengerDAO extends BaseDAO {
	public Pagination findPassengerPagination(Pagination pagination); {
		return this.findPaginationByCriteria(Passenger.class, pagination);;
	}
}

public abstract class BaseDAO extends HibernateDaoSupport {
	public Pagination findPaginationByCriteria(final Class entity, final Pagination pagination); {
		DetachedCriteria detachedCriteria = DetachedCriteria.forClass(entity);;
		return (Pagination); getHibernateTemplate();.execute(new HibernateCallback(); {
			public Object doInHibernate(Session session); throws HibernateException {
				Criteria criteria = detachedCriteria.getExecutableCriteria(session);;
				if (null != pagination.getAscOrder(); && !"".equals(pagination.getAscOrder(););); {
					detachedCriteria.addOrder(Order.asc(pagination.getAscOrder();););;
				} else if (null != pagination.getDescOrder(); && !"".equals(pagination.getDescOrder(););); {
					detachedCriteria.addOrder(Order.desc(pagination.getDescOrder();););;
				}
				Integer count = (Integer); criteria.setProjection(Projections.rowCount(););.uniqueResult();;
				if (null != count); {
					criteria.setProjection(null);;
					pagination.setCount(count.intValue(););;
					List items = criteria.setFirstResult(pagination.getStart(););.setMaxResults(pagination.getSize(););.list();;
					pagination.setItems(items);;

				}
				return pagination;
			}
		}, true);;
	}
}








<div id="passengersListContainer" class="x_list_container" style="height: ${((pagination.size);?default(15);*22 + 23);}px;"><!-- write by JavaScript --></div>

<script language="JavaScript" type="text/JavaScript">
<!--
var passengersParam = 
[
	XL_CONST_ROWTYPE_EMPTY,
	true,
	'all_passengers',
	'id_passengers',
	'viewPassenger',
	'',
	'',
	'',
	'',
	30,
	true,
	'${(pagination.ascOrder);?if_exists}',
	'${(pagination.descOrder);?if_exists}',
	'listPassengerByOrder'
]

var passengersArrayRows = new Array();;

<#if passengers ? exists>
<#list passengers as passenger>
passengersArrayRows[passengersArrayRows.length] = 
[	
	'0',
	'0',
	'${(passenger.id);?if_exists}',
	'${(passenger.name);?if_exists}',
	'${(passenger.position);?if_exists}',
	'${action.getDictionaryText("PASSENGER", "GENDER", passenger.gender);}',
	'${(passenger.birth);?if_exists}',
	'${(passenger.age);?if_exists}',
	'${(passenger.tel);?if_exists}',
	'${(passenger.address);?if_exists}',
	'${(passenger.contact);?if_exists}',
	'${(passenger.cardNo);?if_exists}',
	'${action.html(passenger.sitCustom);}',
	'${action.html(passenger.boardCustom);}',
	'${action.html(passenger.dietCustom);}',
	'${action.html(passenger.specialDemand);}',
	'${action.html(passenger.growExperience);}',
	'${action.html(passenger.commit);}',
	'${(passenger.photo);?default("default.gif");}',
	'${(passenger.reserve1);?if_exists}',
	'${(passenger.reserve2);?if_exists}',
	'${(passenger.reserve3);?if_exists}',
	'${(passenger.reserve4);?if_exists}',
	'${(passenger.reserve5);?if_exists}'
]
</#list>
</#if>


var passengersArrayColumns = 
[
	['${action.getText("passenger.name");}', 			'1', '0', 'name'		],
	['${action.getText("passenger.position");}', 		'0', '0', 'position'	],
	['${action.getText("passenger.gender");}', 			'1', '0', 'gender'		],
	['${action.getText("passenger.birth");}', 			'0', '0', 'birth'		],
	['${action.getText("passenger.age");}', 				'1', '0', 'age'			],
	['${action.getText("passenger.tel");}', 				'1', '0', 'tel'			],
	['${action.getText("passenger.address");}', 			'1', '0', 'address'		],
	['${action.getText("passenger.contact");}', 			'1', '0', 'contact'		],
	['${action.getText("passenger.cardNo");}', 			'1', '0', 'cardNo'		],
	['${action.getText("passenger.sitCustom");}', 		'0', '0', 'sitCustom'	],
	['${action.getText("passenger.boardCustom");}', 		'0', '0', 'boardCustom'	],
	['${action.getText("passenger.dietCustom");}', 		'0', '0', 'dietCustom'	],
	['${action.getText("passenger.specialDemand");}', 	'0', '0', 'specialDemand'],
	['${action.getText("passenger.growExperience");}', 	'0', '0', 'growExperience'],
	['${action.getText("passenger.commit");}', 			'0', '0', 'commit'		],
	['${action.getText("passenger.photo");}', 			'1', '1', 'photo'		],
	['${action.getText("passenger.reserve1");}', 		'0', '0', 'reserve1'	],
	['${action.getText("passenger.reserve2");}', 		'0', '0', 'reserve2'	],
	['${action.getText("passenger.reserve3");}', 		'0', '0', 'reserve3'	],
	['${action.getText("passenger.reserve4");}', 		'0', '0', 'reserve4'	],
	['${action.getText("passenger.reserve5");}', 		'0', '1', 'reserve5'	]
]
//-->
</script>




<script language="JavaScript" type="text/JavaScript">
<!--
xListBuildAll('passengers', passengersParam,  passengersArrayColumns, passengersArrayRows);;
//-->
</script>










<script language="JavaScript" type="text/JavaScript">
<!--
xPageBarBuild(['800', ${(pagination.size);?default(15);}, ${(pagination.index);?default(1);}, ${(pagination.count);?default(0);}, 'listPassengerPagination']);; //['width', pageSize, pageIndex, totalCount,'eventName']
//-->
</script>











<form name="listForm" action="listPassenger.action" method="post">
<input name="pagination.index" type="hidden" value="${(pagination.index);?if_exists}" />
<input name="pagination.size" type="hidden" value="${(pagination.size);?if_exists}" />
<input name="pagination.ascOrder" type="hidden" value="${(pagination.ascOrder);?if_exists}" />
<input name="pagination.descOrder" type="hidden" value="${(pagination.descOrder);?if_exists}" />
<input name="entryName" type="hidden" value="${(entryName);?if_exists}" />
<input name="entryValue" type="hidden" value="${(entryValue);?if_exists}" />
</form>










<script language="JavaScript" type="text/JavaScript">
<!--
function listPassengerByOrder(ascOrder, descOrder); {
	document.listForm['pagination.ascOrder'].value = ascOrder;
	document.listForm['pagination.descOrder'].value = descOrder;
        document.listForm.submit();;
	return false;
}

function listPassengerPagination(index, size); {
	document.listForm['pagination.index'].value = index;
	document.listForm['pagination.size'].value = size;
	document.listForm.submit();;
	return false;
}

//-->
</script>



0 请登录后投票
   发表时间:2006-03-01  
一份代码把 以下都作了

分页(用户可定义分页大小)
排序(按某一个字段升/降排序)
列筛选(自定义js的组件)
行记录明细(自定义js的组件)
分页bar(自定义js的组件)
0 请登录后投票
   发表时间:2006-03-01  
public Pagination findPaginationByCriteria(final Class entity, final Pagination pagination); { 
...
                                Integer count = (Integer); criteria.setProjection(Projections.rowCount(););.uniqueResult();; 
                                if (null != count); {

...



记录数为0,就不继续查询了。。。

我觉得这个代码里面的count永远都不会为null。。。
0 请登录后投票
   发表时间:2006-03-01  
Prentice 写道
ajoo 写道
thread local说穿了,就是一全局变量.
其实,pagination可以作为显示层的对象,到dao这一层,你可以把它翻译成为query对象的。用threadlocal,接口上虽然dao不依赖分页,实现上也要依赖,掩耳盗铃罢了。


我同意不管怎么做Dao总是要对分页依赖的。我的想法是有许多情况下service的接口上出现Pagination只是为了传递给Dao,特别当系统中的许多service的接口上都有Pagination这样的参数时,觉得这样一个遍布整个系统的feature是不是可以用AOP这样的技术解决。

还有就是,我们往往在系统开始就考虑分页。如果不是这样,开发、使用后再添加分页的话,那就需要大量修改接口。这样,一个界面上的需求,就会使得整个系统的接口发生大的改变。

dao肯定是不需要pagination的。service需要么?
举个service接口需要pagination的例子?
0 请登录后投票
   发表时间:2006-03-01  
ajoo 写道
dao肯定是不需要pagination的。service需要么?
举个service接口需要pagination的例子?


想听听ajoo的做法,想看看ajoo的代码
0 请登录后投票
   发表时间:2006-03-01  
ajoo 写道

dao肯定是不需要pagination的。service需要么?
举个service接口需要pagination的例子?

我现在的做法是 Web层的Action调用service,servic调用dao 或是直接调用hibernateTemplate进行持久化操作。虽然有一些service操作代表的业务逻辑本身就是持久化操作,可以Action直接调用dao,但是我还是通过service调用Dao,这样一方面可以在service提供事务处理,另外就是统一得在service层建立一个业务逻辑的接口。这样就需要通过service将Pagination传递到Dao。

比如查询用户 UserDao 有一个方法 :
List findUser( Date birthday , Pagination p );
如果你选择直接在Action里调用UserDao的这个方法,那么就不需要用我说的方法。

而我的做法是 service层有个UserManager,他有一个同样的方法:
List findUser( Date birthday , Pagination p );
这个方法内,调用UserDao 的findUser,这样UserManager的接口上就要Pagination,这里出现Pagination的目的只是为了传递给Dao。

另一种情况,如果你把所有的查询操作从一个个service对象中抽取出来,有专门的QueryManager,那么Pagination出现在这些查询对象的接口上,我觉得也是正常的。
0 请登录后投票
   发表时间:2006-03-01  
hongliang 写道
partech 写道

赫赫,老师留作业时,通常是这样:“课后作业,135页6,7,8”。
然后老师会批改你的作业。
按照Prentice的说法,就成“明天交课后作业。”了...


我真的觉得它说的不无道理,你想想,老师留作业后,我们在书上做好标记,回家后,脑子里想的肯定是“明天交作业”,而不是“明天交作业,135页6、7、8”这么多详细的信息。等到坐在桌前,翻开书,寻找到标记后,才知道做哪些题。。。


可是我们无法对老师说,我今天做的是135页1 ,2 ,3, 4,5 ,老师你看着办吧。
0 请登录后投票
   发表时间:2006-03-01  
sorphi 写道
public Pagination findPaginationByCriteria(final Class entity, final Pagination pagination); { 
...
                                Integer count = (Integer); criteria.setProjection(Projections.rowCount(););.uniqueResult();; 
                                if (null != count); {

...



记录数为0,就不继续查询了。。。

我觉得这个代码里面的count永远都不会为null。。。


我也这么想
但出现count 就是出现了 NullPointerException
0 请登录后投票
   发表时间:2006-03-01  
hongliang 写道
ajoo 写道
dao肯定是不需要pagination的。service需要么?
举个service接口需要pagination的例子?


想听听ajoo的做法,想看看ajoo的代码


我也很想看看
0 请登录后投票
   发表时间:2006-03-01  
frogfool 写道
sorphi 写道
public Pagination findPaginationByCriteria(final Class entity, final Pagination pagination); { 
...
                                Integer count = (Integer); criteria.setProjection(Projections.rowCount(););.uniqueResult();; 
                                if (null != count); {

...



记录数为0,就不继续查询了。。。

我觉得这个代码里面的count永远都不会为null。。。


我也这么想
但出现count 就是出现了 NullPointerException


不可能吧。。。Hibernate的uniqueResult()不会返回null的啊
0 请登录后投票
论坛首页 Java企业应用版

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