這是代碼最少且最簡(jiǎn)潔的一種Hibernate分頁(yè)技術(shù)了,拼命減少代碼量,呵呵。下面用人能看得懂的語(yǔ)言細(xì)說(shuō)一下,關(guān)于Hibernate的分頁(yè)技術(shù),無(wú)外乎兩種:
1. 從數(shù)據(jù)庫(kù)中取得記錄,在內(nèi)存中再劃分。但如果遇到記錄數(shù)很大的時(shí)候效率很成問(wèn)題。
2. 采用Hibernate的物理分頁(yè),每次只是取一頁(yè)。從客戶端傳進(jìn)來(lái)的是第幾頁(yè)和每頁(yè)多少條記錄,要首先查詢符合記錄的總記錄數(shù),再根據(jù)總記錄數(shù)和當(dāng)前頁(yè),每頁(yè)記錄數(shù)可以算出要取的是數(shù)據(jù)庫(kù)中的第幾條記錄。但2次查詢不可避免了。
所以總結(jié)了兩種方式的優(yōu)劣,如果數(shù)據(jù)量不是非常大的話(百萬(wàn)以上),采用第一種方法,否則可選擇第二種。
由于我要操作的數(shù)據(jù)庫(kù)信息量沒(méi)有達(dá)到大的標(biāo)準(zhǔn),所以我采用了第一種方法,下面細(xì)說(shuō)。
首先看一下我的一個(gè)action:
public ActionForward queryZcDoc(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
IZcDocService zcDocService=(IZcDocService)
Application.getInstance().getBean("zcDocServiceProxy");
List docList=zcDocService.queryZcDoc();
request.setAttribute("doc", subMessList);
return mapping.findForward("queryDoc");
}
很簡(jiǎn)單的代碼,就是查詢數(shù)據(jù),扔到一個(gè)List里面,然后setAttribute,再在jsp頁(yè)面顯示就可以了。
接下來(lái)談分頁(yè),考慮到了簡(jiǎn)潔性和通用性,我把分頁(yè)的代碼單獨(dú)封裝到了一個(gè)類里面去,下面看看這個(gè)類:
public class Fenye {
public List fenye(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response){
List list=(ArrayList) request.getAttribute("list");
/*
這里有人可能就看不懂了,為什么要帶這些參數(shù)?因?yàn)槲疑厦娴腶ction方法是分頁(yè)之前的方法,所以不能看出來(lái)。
下面貼一下用到分頁(yè)之后的action方法:
public ActionForward queryZcDoc(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
IZcDocService zcDocService=(IZcDocService)Application.getInstance().
getBean("zcDocServiceProxy");
List docList=zcDocService.queryZcDoc();
request.setAttribute("list", docList);
List subMessList=new Fenye().fenye(mapping, form, request, response);
request.setAttribute("doc", subMessList);
return mapping.findForward("queryDoc");
}
和上面的一比較,其實(shí)就多了兩行代碼,為的就是保持頁(yè)面的簡(jiǎn)潔性而使用調(diào)用的方法,然后再將需要的數(shù)據(jù)返回。
那接著往下看:
*/
List subMessList=null; //這個(gè)到時(shí)候存的是用分頁(yè)技術(shù)之后的要顯示的記錄
int showCount =5; //每頁(yè)顯示的記錄數(shù)。
int showPage = 1; //當(dāng)前顯示頁(yè)碼數(shù)。
int size =list.size(); //所取得的數(shù)據(jù)的總條數(shù)。
int pageCount = (size-1)/showCount + 1; //需要顯示的總頁(yè)數(shù)
if(size
到了這里,java代碼就寫完了,不多吧加括號(hào)一共33行。接下來(lái)就要到j(luò)sp里面去顯示了。也是為了頁(yè)面的整潔和通用性,我把分頁(yè)顯示的東東放到了一個(gè)jsp里面。下面看這個(gè)jsp:
<%@ page language="java" pageEncoding="gb18030"%>
<div align=center>
<br>
<%
String method=request.getParameter("method");
method這個(gè)參數(shù)呢,是要區(qū)別對(duì)待具體那個(gè)action的那個(gè)方法
String action=request.getParameter("action");
action這個(gè)參數(shù)的作用,看下面就知道了
int showPage = ((Integer)(request.getAttribute("showPage"))).intValue();
int size = ((Integer)(request.getAttribute("size"))).intValue();
int pageCount = ((Integer)(request.getAttribute("pageCount"))).intValue();
int page1=showPage-1;
int page2=showPage+1;
int LastPage=pageCount;
%>
<%
out.println("總共有"+size+"條記錄 ");
out.println("總共有"+pageCount+"頁(yè) ");
out.println("當(dāng)前是第"+showPage+"頁(yè) ");
if(showPage > 1)
{
out.println("<a href=’"+action+".do?method="+method+"&page=1’>第一頁(yè)</a>");
}
else
{
out.println("第一頁(yè)");
}
%>
<%
if(showPage > 1)
{
out.println("<a href=’"+action+".do?method="+method+"&page="+page1+"’>上一頁(yè)</a>");
}
else
{
out.println("上一頁(yè)");
}
%>
<%
if(showPage < pageCount)
{
out.println("<a href=’"+action+".do?method="+method+"&page="+page2+"’>下一頁(yè)</a>");
}
else
{
out.println("下一頁(yè)");
}
%>
<%
if(showPage<pageCount)
{
out.println("<a href=’"+action+".do?method="+method+"&page="+LastPage+"’>尾頁(yè)</a>");
}
else
{
out.println("尾頁(yè)");
}
%>
</div>
關(guān)于這個(gè)jsp的代碼,不用解釋太多了吧。再有就是具體的顯示頁(yè)面中,用<jsp:include page="../fenye.jsp?action=link"></jsp:include>語(yǔ)句將它包含到相應(yīng)為止就可以了。
1. 從數(shù)據(jù)庫(kù)中取得記錄,在內(nèi)存中再劃分。但如果遇到記錄數(shù)很大的時(shí)候效率很成問(wèn)題。
2. 采用Hibernate的物理分頁(yè),每次只是取一頁(yè)。從客戶端傳進(jìn)來(lái)的是第幾頁(yè)和每頁(yè)多少條記錄,要首先查詢符合記錄的總記錄數(shù),再根據(jù)總記錄數(shù)和當(dāng)前頁(yè),每頁(yè)記錄數(shù)可以算出要取的是數(shù)據(jù)庫(kù)中的第幾條記錄。但2次查詢不可避免了。
所以總結(jié)了兩種方式的優(yōu)劣,如果數(shù)據(jù)量不是非常大的話(百萬(wàn)以上),采用第一種方法,否則可選擇第二種。
由于我要操作的數(shù)據(jù)庫(kù)信息量沒(méi)有達(dá)到大的標(biāo)準(zhǔn),所以我采用了第一種方法,下面細(xì)說(shuō)。
首先看一下我的一個(gè)action:
public ActionForward queryZcDoc(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
IZcDocService zcDocService=(IZcDocService)
Application.getInstance().getBean("zcDocServiceProxy");
List docList=zcDocService.queryZcDoc();
request.setAttribute("doc", subMessList);
return mapping.findForward("queryDoc");
}
很簡(jiǎn)單的代碼,就是查詢數(shù)據(jù),扔到一個(gè)List里面,然后setAttribute,再在jsp頁(yè)面顯示就可以了。
接下來(lái)談分頁(yè),考慮到了簡(jiǎn)潔性和通用性,我把分頁(yè)的代碼單獨(dú)封裝到了一個(gè)類里面去,下面看看這個(gè)類:
public class Fenye {
public List fenye(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response){
List list=(ArrayList) request.getAttribute("list");
/*
這里有人可能就看不懂了,為什么要帶這些參數(shù)?因?yàn)槲疑厦娴腶ction方法是分頁(yè)之前的方法,所以不能看出來(lái)。
下面貼一下用到分頁(yè)之后的action方法:
public ActionForward queryZcDoc(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
IZcDocService zcDocService=(IZcDocService)Application.getInstance().
getBean("zcDocServiceProxy");
List docList=zcDocService.queryZcDoc();
request.setAttribute("list", docList);
List subMessList=new Fenye().fenye(mapping, form, request, response);
request.setAttribute("doc", subMessList);
return mapping.findForward("queryDoc");
}
和上面的一比較,其實(shí)就多了兩行代碼,為的就是保持頁(yè)面的簡(jiǎn)潔性而使用調(diào)用的方法,然后再將需要的數(shù)據(jù)返回。
那接著往下看:
*/
List subMessList=null; //這個(gè)到時(shí)候存的是用分頁(yè)技術(shù)之后的要顯示的記錄
int showCount =5; //每頁(yè)顯示的記錄數(shù)。
int showPage = 1; //當(dāng)前顯示頁(yè)碼數(shù)。
int size =list.size(); //所取得的數(shù)據(jù)的總條數(shù)。
int pageCount = (size-1)/showCount + 1; //需要顯示的總頁(yè)數(shù)
if(size
到了這里,java代碼就寫完了,不多吧加括號(hào)一共33行。接下來(lái)就要到j(luò)sp里面去顯示了。也是為了頁(yè)面的整潔和通用性,我把分頁(yè)顯示的東東放到了一個(gè)jsp里面。下面看這個(gè)jsp:
<%@ page language="java" pageEncoding="gb18030"%>
<div align=center>
<br>
<%
String method=request.getParameter("method");
method這個(gè)參數(shù)呢,是要區(qū)別對(duì)待具體那個(gè)action的那個(gè)方法
String action=request.getParameter("action");
action這個(gè)參數(shù)的作用,看下面就知道了
int showPage = ((Integer)(request.getAttribute("showPage"))).intValue();
int size = ((Integer)(request.getAttribute("size"))).intValue();
int pageCount = ((Integer)(request.getAttribute("pageCount"))).intValue();
int page1=showPage-1;
int page2=showPage+1;
int LastPage=pageCount;
%>
<%
out.println("總共有"+size+"條記錄 ");
out.println("總共有"+pageCount+"頁(yè) ");
out.println("當(dāng)前是第"+showPage+"頁(yè) ");
if(showPage > 1)
{
out.println("<a href=’"+action+".do?method="+method+"&page=1’>第一頁(yè)</a>");
}
else
{
out.println("第一頁(yè)");
}
%>
<%
if(showPage > 1)
{
out.println("<a href=’"+action+".do?method="+method+"&page="+page1+"’>上一頁(yè)</a>");
}
else
{
out.println("上一頁(yè)");
}
%>
<%
if(showPage < pageCount)
{
out.println("<a href=’"+action+".do?method="+method+"&page="+page2+"’>下一頁(yè)</a>");
}
else
{
out.println("下一頁(yè)");
}
%>
<%
if(showPage<pageCount)
{
out.println("<a href=’"+action+".do?method="+method+"&page="+LastPage+"’>尾頁(yè)</a>");
}
else
{
out.println("尾頁(yè)");
}
%>
</div>
關(guān)于這個(gè)jsp的代碼,不用解釋太多了吧。再有就是具體的顯示頁(yè)面中,用<jsp:include page="../fenye.jsp?action=link"></jsp:include>語(yǔ)句將它包含到相應(yīng)為止就可以了。

