現如今,在web系統項目中,分頁及綜合查詢幾乎成了不可缺少的功能,每一個實體列表幾乎都要要求帶有分頁及綜合查詢,前幾天做老師布置的作業,想著乾脆做一個通用點的,省得以後再每一次都要寫一遍了。下面我們就一起來看一下我用hibernate實現的通用分頁及綜合查詢。當然我這裡所屬的通用並不似絕對的,每到一個不同的場合,前台頁面和資料接收還是稍微的要改一下:
首先我們先來看一下列表的jsp頁面:list.jsp:
<body><!-- 綜合查詢操作層 --><div id="selectDiv"><s:form action="CourseListAction.action" theme="simple" target="mainFrame" ><fieldset style="width:80%" ><legend>查詢條件</legend><s:hidden name="flag" value="1"></s:hidden>課程名:<s:textfield name="course.name" cssClass="textStyle"/>課程號:<s:textfield name="course.id" cssClass="textStyle"/>開課學期:<s:textfield name="course.lessonTime" cssClass="textStyle"/>課時: 從<s:textfield name="startHour" cssClass="textStyle"/>至<s:textfield name="endHour" cssClass="textStyle" />課時<br/>課程學分:<s:textfield name="course.lessonPoints" cssClass="textStyle"/><s:submit value="查 詢" cssClass="buStyle"/></fieldset></s:form></div><table class="ta"><tr><th colspan="2">操作</th><th>課程號</th><th>課程名</th><th>開課學期</th><th>課時</th><th>學分</th></tr><c:forEach items="${sessionScope.list }" var="cour" varStatus="status"><tr bgColor="${status.index%2==0?'#e5fee2':'#d6fdd0' }"><td><img src="${path }/images/edit2.png" alt="編輯" onclick="showDialogForEdit(${cour.id})"/></td><td><a href="CourseAction!deleCourse?cour.id=${cour.id }"><img src="${path }/images/delete.png" alt="課程刪除"/></a></td><td>${cour.id}</td><td>${cour.name }</td><td>${cour.lessonTime }</td><td>${cour.lessonHour}</td><td>${cour.lessonPoints }</td></tr></c:forEach></table><br/><center><div id="pageDir"> <c:set var="pageCount" value="${(coucount-1)/10+1 }"/><fmt:formatNumber var="lastIndex" value="${pageCount}" pattern="#"/><ul><li style="margin-left:25%;">第${sessionScope.thisindex }/${lastIndex }頁</li><li style="margin-left:40px;"><a href="CourseListAction.action?index=1" target="mainFrame">首頁</a><!-- <c:set var="pageCount" value="${fn:length(userList)%10==0?fn:length(userList)/10:fn:length(userList)/10+1 }"/>--> <c:forEach var="i" begin="1" step="1" end="${lastIndex}"><a href="CourseListAction.action?index=${i } " target="mainFrame"><c:out value="${i }"/></a></c:forEach><a href="CourseListAction.action?index=${lastIndex}" target="mainFrame">尾頁</a></li> <li style="margin-left:40px;"><s:form action="CourseListAction.action" theme="simple" target="mainFrame">第<s:textfield name="index" cssStyle="width:25px;height:20px;"/>頁<s:submit value="Go" id="go"/></s:form></li></ul></div></center></body>
這個列表的jsp頁面下面的分頁層差不多可以說是通用的吧,直接修改一下action的名字就可以了。上面資料列表要因不同的資料列表而不同了。我們來看一下他的分頁層,首先看一下<c:set var="pageCount" value="${(coucount-1)/10+1 }"/>,根據在action中儲存的課程數目來獲得總共的頁數。這裡的頁數也就是最後一頁的頁數。然後獲得在action中儲存的當前是第幾頁。接下來就是首頁、尾頁以及頁數列表的連結了。並且還有一個可以輸入頁數進行查詢的。
最上面是綜合查詢層,這個層其實很簡單,就是一個form表單,根據輸入的內容進行查詢。
好了具體的頁面看完了,下一步我們來看一下在action中接收資料的的地方,是怎麼接收資料的。
public class CourseListAction extends ActionSupport {
private final int EVpAGECOUNT = 10;
private int index;
private Course course;
private int startHour;
private int endHour;
**************省略set。Get方法
下面我們來解釋一下這個action,首先來看一下它所定義的變數,index變數其實就是當前要查看的第幾頁,Course變數的是接收前面綜合查詢傳遞的資料的starthour和endHour其實是前面綜合查詢的生日的起始時間和終止時間。我們在來看一下一個常量,EVpAGECOUNT這個常量是定義每頁的資料量的。說完變數我們在大體看一下execute方法裡面的內容:首先前面是根據綜合查詢的每一項是否為空白來組裝這裡的hql語句,很簡單,不說了,然後就是根據查詢的對象、當前頁和hql語句進行綜合和分頁查詢了。最後就是儲存一些資料了。好了,最後我們來看一下dao層所寫的通用分頁和綜合查詢的一個方法:
這個方法應該是對所有的分頁和綜合查詢都是通用的,應該不需要改任何代碼,把相應的值傳過去就可以了。
運行: