|
锁定老贴子 主题:分享一个通用数据库分页方案
该帖已经被评为良好帖
|
|
|---|---|
| 作者 | 正文 |
|
时间:2006-09-21 关键字: struts 模式
subversion地址如下:
https://svn.sourceforge.net/svnroot/powerstone/ps_paging 技术架构: web层可以是任意的MVC框架,目前只实现了SpringMVC和Struts的版本(Struts版已经在weblogic7下跑通,tomcat5还不行); dao层也没有任何限制,只要按照范例中的模式来做既可; 最终页面上用一个标签来显示翻页按钮等。 btw:谁有兴趣想写个webwork版本的,可以和我联系,或直接发个patch给我 --------------------------------- 工作原理:想法很简单,就是应用设计模式里的"模板方法模式",把分页计算的逻辑封装在一个抽象父类(PagingController)里面,留下三个抽象方法:doHandleRequest(处理请求)、getTotalRecordsNumber(计算总记录数)、makeSearchCriteria(构造查询条件,可选)供子类型重写,使得子类型尽量的简单,让我们可以专注于业务逻辑而不需要处理分页逻辑。示例如下: public class UserPagingController extends PagingController {
private final Logger logger = Logger.getLogger(this.getClass());
private UserDAO userDAO;
protected ModelAndView doHandleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
Map map = super.getSearchCriteria(request);
int beginNo = super.computeRecordsBeginNo(request);
int recordsNumber = super.computeRecordsNumberToRead(request);
List usersList = userDAO.findUsers(map, beginNo, recordsNumber);
logger.debug(usersList);
return new ModelAndView("usersList", "usersList", usersList);
}
protected int getTotalRecordsNumber(HttpServletRequest request) {
int result = userDAO.countUsers(super.getSearchCriteria(request));
logger.debug("users number================:" + result);
return result;
}
protected Map makeSearchCriteria(HttpServletRequest request) {
HashMap map = new HashMap();
String firstName = request.getParameter("firstName");
if (firstName != null && firstName.trim().length() > 0) {
map.put("firstName", firstName);
}
logger.debug(map);
return map;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
Struts版原理相同。 在页面显示翻页链接只需一行代码: <page:pagebar url="/user_query.html?" bordercolor="#F4F9FF" bgcolor="#F4F9FF"/> 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2006-09-21
例子程序
|
|
| 返回顶楼 | |
|
时间:2006-09-21
不错,看看先,不知道有多通用?
|
|
| 返回顶楼 | |
|
时间:2006-09-21
楼主说说如何实现数据库间通用,又保证效率?
|
|
| 返回顶楼 | |
|
时间:2006-09-21
Ivan Li 写道 楼主说说如何实现数据库间通用,又保证效率?
这个分页方案只是用“模板方法”模式把分页逻辑封装在了前端控制器,因为我发现分页最麻烦的地方就是在action里面算页数、记录数这些东西。 所以说,这个方案与数据库访问方法无关,自燃就在数据库间通用了。 和效率相关的地方是:每显示一页数据都至少访问两次数据库,分别是计算总记录数和查询当前页记录 |
|
| 返回顶楼 | |
|
时间:2006-09-21
我认为分页封装在一个POJO里,最好!
层次定位在于PO,VO一个档次! |
|
| 返回顶楼 | |
|
时间:2006-09-21
有个问题
为什么必须查两次? 如果不知道总数会怎么样? 如果一个查询不需要总数可不可以完成? |
|
| 返回顶楼 | |
|
时间:2006-09-21
是的,需要查询2次,你可以把查询2次封装在一个方法里做啊!
写2个<select>后记下ID,传入方法!一个count,一个查询! |
|
| 返回顶楼 | |
|
时间:2006-09-21
抛出异常的爱 写道 有个问题
为什么必须查两次? 如果不知道总数会怎么样? 如果一个查询不需要总数可不可以完成? 不计算总数就没法计算总页数呀 |
|
| 返回顶楼 | |
|
时间:2006-09-21
galaxystar 写道 是的,需要查询2次,你可以把查询2次封装在一个方法里做啊!
写2个<select>后记下ID,传入方法!一个count,一个查询! 邪恶的EJB??? PS: 有必要让别人看到总页数么? 个人认为除了统计以外 很少人会用到总页数这种东西 大家关心的大多是头1-3页的东西 总页数需求多少来自程序员的过度设计。。。。 如果总页数不要可以提高查询的20%速度并减少30%的代码量 十在是大浪费啊 |
|
| 返回顶楼 | |











