目的:
學習使用struts+hibernate實現一個通用的分頁程序。
內容:
分頁程序是網頁設計經常需要實現的基本功能。但有的分頁程序直接嵌在jsp頁面上,不僅工作量較大,代碼也難以重用。本次試驗將使用struts+hibernate來實現通用的分頁程序。不同功能的代碼盡量分離,以滿足通用性要求。
首先需要建立一個表,如下Product,各字段設計如下(可自由更改):
ID int primary key,
Typeid varchar(20),
Name varchar(50),
Price varchar(20),
Memo varchar(100).
步驟:
1 建立web工程,名字為”Fenye”.
2 添加hibernate,生成Product表的.hbm.xml和pojo類。這個很簡單,不再贅述。
3 接著寫數據訪問層,我們將其分為Dao和ProDao兩個類。其中Dao是個公共的基類;ProDao繼承它,并與action通信取得參數。這樣設計的好處是:如果需要對User這個表進行分頁顯示,只需添加一個UserDao類,并讓它繼承Dao類。
Dao類的代碼如下,可以根據需要添加:頭文件自己導入。
public class Dao {
private Session session=null;
public Dao() {
}
public Session getSession()
{
session = HibernateSessionFactory.getSession();
return session;
}
public int getCount(String pojo)
{
String sql="select count(*) from "+pojo ;
this.getSession();
try {
Query q = getSession().createQuery(sql);
List cc = q.list();
Integer rows = (Integer) cc.get(0);
return rows.intValue();
} catch (HibernateException ex) {
System.out.print("ex::"+ex.getMessage());
return 0;
}
}
public List getlist(Query query, String pojo,int pagesize,int currow) throws HibernateException
{
List list = null;
this.getSession();
query.setFirstResult(currow);
query.setMaxResults(pagesize);
list=query.list();
//session.flush();
if(session!=null)
session.close();
return list;
}
public List getlist(Query query,int pagesize,int currow)
{
String[] str = query.getQueryString().split("from");
String[] table =str[1].trim().split(" ");
System.out.println("table:"+table[0]);
return getlist(query,table[0],pagesize,currow);
}
}
ProDao類的代碼如下:
public class PinfoDao extends Dao{
private Session session;
public PinfoDao() {
super();
}
public List list(int pagesize,int currow)
{
Query query =getSession().createQuery("from PInfo");
List li=getlist(query, pagesize, currow);
return li;
}
public Session getSession()
{
// Configuration config=null;
session = HibernateSessionFactory.getSession();
return session;
}
public int getCount()
{
String sql="select count(*) from PInfo";
Query q = getSession().createQuery(sql);
List cc = q.list();
Integer a = (Integer) cc.get(0);
System.out.println("count:"+a.intValue());
return a.intValue();
}
}
4 下面寫頁面控制程序,同樣將代碼分離為兩個類Page類和Pagehelp類。
Page類處理頁面相關的一些設置,如一頁顯示多少條記錄,計算共有多少頁,共有多少記錄,當前頁碼等。
PageHelp類接收jsp頁面傳來的參數,并調用Page類處理。
Page類代碼:
public class Page {
private int totalRows; //總行數
private int pageSize = 3; //每頁顯示的行數
private int currentPage; //當前頁號
private int totalPages; //總頁數
private int startRow; //當前頁在數據庫中的起始行
public Page(int totalRows1) {
totalRows = totalRows1;
totalPages=totalRows/pageSize;
int mod=totalRows%pageSize;
if(mod>0){
totalPages++;
}
currentPage = 1;
startRow = 0;
}
public int getStartRow() {
return startRow;
}
public int getTotalPages() {
return totalPages;
}
public int getCurrentPage() {
return currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public void setStartRow(int startRow) {
this.startRow = startRow;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRows() {
return totalRows;
}
public void first() {
currentPage = 1;
startRow = 0;
}
public void previous() {
if (currentPage == 1) {
return;
}
currentPage--;
startRow = (currentPage - 1) * pageSize;
}
public void next() {
if (currentPage < totalPages) {
currentPage++;
}
startRow = (currentPage - 1) * pageSize;
}
public void last() {
currentPage = totalPages;
startRow = (currentPage - 1) * pageSize;
}
public void refresh(int _currentPage) {
currentPage = _currentPage;
if (currentPage > totalPages) {
last();
}
}
}
Pagehelp類代碼如下:
public class Pagehelp {
public static Page getPager(HttpServletRequest httpServletRequest,int totalRows) {
//定義pager對象,用于傳到頁面
Page pager = new Page(totalRows);
//從Request對象中獲取當前頁號
String currentPage = httpServletRequest.getParameter("currentPage");
//如果當前頁號為空,表示為首次查詢該頁
//如果不為空,則刷新page對象,輸入當前頁號等信息
if (currentPage != null) {
pager.refresh(Integer.parseInt(currentPage));
}
//獲取當前執行的方法,首頁,前一頁,后一頁,尾頁。
String pagerMethod = httpServletRequest.getParameter("pageMethod");
if (pagerMethod != null) {
if (pagerMethod.equals("first")) {
pager.first();
} else if (pagerMethod.equals("previous")) {
pager.previous();
} else if (pagerMethod.equals("next")) {
pager.next();
} else if (pagerMethod.equals("last")) {
pager.last();
}
}
return pager;
}
}
5 一切準備工作結束后,下面寫action來調用這些類。
List list = null;//用于輸出到頁面的記錄集合
int totalRows;//記錄總行數
PinfoDao dao=new PinfoDao();
totalRows=dao.getCount();
System.out.print("總行數=="+totalRows);
Page page=Pagehelp.getPager(request,totalRows);
try {
list= dao.list(page.getPageSize(), page.getStartRow());
} catch (HibernateException ex) {
System.out.print("action里的錯誤="+ex.getMessage());
}
request.setAttribute("page",page);
request.setAttribute("list",list);
return mapping.findForward("list");
6 最后是顯示頁面plist。在struts-config.xml文件中添加forward語句,<forward name="list" path="/plist.jsp"></forward>。
plist.jsp頁面部分代碼如下:
<table align="center" border="1">
<tr>
<td>產品類別</td>
<td>產品名稱</td>
<td>產品價格</td>
<td>產品備注</td>
</tr>
<!—下面打印list中的各屬性-->
<tr >
<td colspan="4">
第<bean:write name="page" property="currentPage"/>頁
共<bean:write name="page" property="totalPages" />頁
<html:link action="/page.do?pageMethod=first"
paramName="page" paramProperty="currentPage"
paramId="currentPage">首頁</html:link>
<html:link action="/page.do?pageMethod=previous"
paramName="page" paramProperty="currentPage"
paramId="currentPage">上一頁</html:link>
<html:link action="/page.do?pageMethod=next"
paramName="page" paramProperty="currentPage"
paramId="currentPage">下一頁</html:link>
<html:link action="/page.do?pageMethod=last"
paramName="page" paramProperty="currentPage"
paramId="currentPage">尾頁</html:link>
</td>
</tr>
</table>
7 測試:
按照上述步驟完成后,在瀏覽器中輸入http://localhost:8080/Fenye/page.do查看頁面。