您的位置:首页 > Web前端 > JavaScript

学习笔记_用hibernateQBC动态查询+jsp的jstl标签库实现的动态查询以及分页特效

2014-03-23 18:43 706 查看
本次为升级动态查询效果

新增了分页效果

实现技术 hibernate Criteria QBC 查询 + jsp el,jstl表达式


后台代码简单。难点在于如何运用到界面中。

session = util.getSession();
cri = session.createCriteria(MobilephoneInfo.class);// 创建cri
cri.createCriteria("dealer", "d"); // 添加 查询对象非主键属性支持
//...动态查询省略
//分页
//总计条数
Integer totalRow = cri.list().size();

//总计页码
int totalPages = 0;
if (totalRow % bo.getPageSize() == 0) {
totalPages = (totalRow / bo.getPageSize());
} else {
totalPages = ((totalRow / bo.getPageSize() + 1));
}

cri.setFirstResult((bo.getCurrentPage() - 1) * bo.getPageSize());
cri.setMaxResults(bo.getPageSize());
cri.addOrder(Order.asc("id")); //最好有默认排序
return new Pager(bo.getCurrentPage(), bo.getPageSize(), totalPages,
totalRow, cri.list());


遇到技术难题:

·如何在动态查询条件下分页?

具体实现: 在BO对象加入属性:currentPage 当前页码 与 pageSize 每页显示条数

在dao方法里加入Criteria 的setMaxResults(pageSize )

setFirstResult((currentPage-1)*pageSize)

这样就可以完成了为业务调用的后台方法代码

·如何实现上一页 下一页 以及显示总页数?

上一个方法完成了 就可以实现手动设置当前页以及每页显示多少了。但是如何实现淘宝可以选择的样式呢?

要实现上一页 下一页 必须知道的是当前页码currentPage 以及总页码totalPages

我们的dao返回的是一个 list 因为java 不支持多个返回值 那只能封装成对象了、Pager 对象

Pager 里有list ,currentPage TotalPages,totalRow,pageSize属性

这让我们就可以获取一些分页相关的属性值了。上一个下一个 就可以在sevlet里做逻辑判断了。然后在封装bo
对象。调用后台代码 返回下一个pager
再传入web页面、

还有一点要说明 就是servlet 里分页与动态查询 ,可以分开写方法,如果已经查询好的bo对象 无需再次判断一次直接分页 显示即可。

特别说明 :在做下一页的逻辑判断时 totalPages 的值因为是 后台代码的返回值需要在前台返回servlet一个值进行判断


如果实现 淘宝里的特效?123 ...100 1..34567..100 1...97 98 99 100?


实现这个效果我觉得得得分两个大的方向:1.当总页码(totalPages)小于 10 可以全部循环展示

2.当总页码(totalPages)大于10 再细分情况



大于10的情况:

1.当前页码(currentPage)<5 循环输出 第1页到currentPage页....最后加上最后一页(totalPages)

2.当前页码(currentPage)>=5 且小于等于totalPages-3 先输出 第1页... 在循环输出currentPage-2到
currentpage+2 ...最后输出最
后一页(totalPages)

3.当前页码(currentPage)>=totalPages-3 输出第一页 然后循环输出totalPages-3 到totalPages页码

<div id="page">

<a class="floatPage"
href="CoreServlet?ctrl=findByPage&pageCtrl=upPage">上一页</a>

<!-- 当总页数小于10 全部展示即可 -->
<c:if test="${TOTALPAGES <=10}">

<c:forEach begin="1" end="${TOTALPAGES }" var="temp">
<!-- 这是判断是否为当前页  引用一个class-->
<c:if test="${temp eq CURRENTPAGE }">
<a class="pages currentPage"
href="CoreServlet?ctrl=findByPage¤tPage=${temp}">${temp}</a>

</c:if>
<c:if test="${temp ne CURRENTPAGE }">
<a class="pages"
href="CoreServlet?ctrl=findByPage¤tPage=${temp}">${temp}</a>

</c:if>

</c:forEach>

</c:if>
<!-- 当总页数大于10 就要分情况咯-->
<c:if test="${TOTALPAGES >10}">
<!-- 效果:1 2 3 4 5...100-->
<c:if test="${CURRENTPAGE<5 }">
<c:forEach begin="1" end="5" var="temp">

<c:if test="${temp eq CURRENTPAGE }">
<a class="pages currentPage"
href="CoreServlet?ctrl=findByPage¤tPage=${temp}">${temp}</a>

</c:if>
<c:if test="${temp ne CURRENTPAGE }">
<a class="pages"
href="CoreServlet?ctrl=findByPage¤tPage=${temp}">${temp}</a>

</c:if>

</c:forEach>
<div style="float: left">
...
</div>
<a class="pages"
href="CoreServlet?ctrl=findByPage¤tPage=${TOTALPAGES}">${TOTALPAGES}</a>

</c:if>
<!-- 效果:1..3 4 5 6 7...100-->
<c:if test="${CURRENTPAGE>=5 and CURRENTPAGE<(TOTALPAGES-3) }">
<a class="pages" href="CoreServlet?ctrl=findByPage¤tPage=1">1</a>
<div style="float: left">
...
</div>
<c:forEach begin="${CURRENTPAGE-2}" end="${CURRENTPAGE+2}"
var="temp">

<c:if test="${temp eq CURRENTPAGE }">
<a class="pages currentPage"
href="CoreServlet?ctrl=findByPage¤tPage=${temp}">${temp}</a>

</c:if>
<c:if test="${temp ne CURRENTPAGE }">
<a class="pages"
href="CoreServlet?ctrl=findByPage¤tPage=${temp}">${temp}</a>

</c:if>

</c:forEach>
<div style="float: left">
...
</div>
<a class="pages"
href="CoreServlet?ctrl=findByPage¤tPage=${TOTALPAGES}">${TOTALPAGES}</a>

</c:if>
<!-- 效果:1...97 98 99 100-->
<c:if test="${CURRENTPAGE>=(TOTALPAGES-3) }">
<a class="pages" href="CoreServlet?ctrl=findByPage¤tPage=1">1</a>
<div style="float: left">
...
</div>
<c:forEach begin="${TOTALPAGES-3}" end="${TOTALPAGES}" var="temp">

<c:if test="${temp eq CURRENTPAGE }">
<a class="pages currentPage"
href="CoreServlet?ctrl=findByPage¤tPage=${temp}">${temp}</a>

</c:if>
<c:if test="${temp ne CURRENTPAGE }">
<a class="pages"
href="CoreServlet?ctrl=findByPage¤tPage=${temp}">${temp}</a>

</c:if>

</c:forEach>

</c:if>

</c:if>

<a class="floatPage"
href="CoreServlet?ctrl=findByPage&pageCtrl=nextPage&totalPage=${TOTALPAGES}">下一页</a>
<form action="CoreServlet?ctrl=findByPage" method="post">
去第
<input name="currentPage" style="width: 23px" />
页
<input type="submit" value="确定">
</form>

<div style="float: left; margin-left: 100px;">
当前页码:${CURRENTPAGE}--- 总页数:${TOTALPAGES }页
</div>
<div style="float: left; width: 190px; margin: -10px 0px 0px 131px">
<form action="CoreServlet?ctrl=findByPage" method="post">
每页显示:
<input name="pageSize" style="width: 23px" />
条
<input type="submit" value="确定">
</form>
</div>
</div>


注意:在动态查询中 每次需要给BO对象 setCurrentpage(1)。这样能保证每次换条件时都是第一页 。也体现了分页与动
态查询写不同方法的好处

Criteria 分页查询时最好给定一个默认排序, 否则可能有bug,如第一页与第二页有重复数据 显示不全等问题

--第一次发博客。


--Terrfly 親筆。


--2014-3-23.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐