??? 通過Structs+Hibernate+MySQL數據數來實現分頁技術的應用.?
???
?? 源程序下載
?? 至于Hibernate, Structs, MySQL的具體用法我就不說了,你可以看源程序來查看詳細內容.我們來看看分頁應用的相關內容.
?架構上和Spring JPetStore沒多少區別, 只是沒用Spring框架所以Structs中的UserdisplayAction中必須new出各個對象并完成它們之間的關聯, 這就是Spring IOC可自動完成的功能. 它也是三層:表現層(Structs),?業務層(POJO), 數據層(Hibernate訪問MySQL).?同樣業務層通過DAO接口(UserDAO)來訪問數據庫, 訪問數據庫的通過Hibernate(在UserDAOImpl中實現).?這一次分頁要在業務層中來實現, 業務層同樣向表現層提供一個Facada(門面,? UserManager接口), 來訪問業務. 在UserManagerImpl中通過調用UserDAO來訪問數據, 調用POJO來實現分頁功能. 看以下關鍵代碼.
先看POJO的分布類吧:
Page.java
package org.flyware.util.page;
public class Page {?
????
??? private boolean hasPrePage;?
????
???? private boolean hasNextPage;?
????????
??? private int everyPage;?
????
??? private int totalPage;?
????????
??? private int currentPage;?
????
????? private int beginIndex;?
????
????
????? public Page(){
???????
??? }?
????
??????? public Page(int everyPage){
??????? this.everyPage = everyPage;
??? }
???
??? /** The whole constructor */
??? public Page(boolean hasPrePage, boolean hasNextPage,?
??????????????????? int everyPage, int totalPage,
??????????????????? int currentPage, int beginIndex) {
??????? this.hasPrePage = hasPrePage;
??????? this.hasNextPage = hasNextPage;
??????? this.everyPage = everyPage;
??????? this.totalPage = totalPage;
??????? this.currentPage = currentPage;
??????? this.beginIndex = beginIndex;
??? }
??????......????
??????
?? public int getTotalPage() {
??????? return totalPage;
??? }?
???
??? public void setTotalPage(int totalPage) {
??????? this.totalPage = totalPage;
??? }
???
}
PageUtil.java(用來構造Page實例 相當于page工廠)
package org.flyware.util.page;
public class PageUtil {
???
??? private static final Log logger = LogFactory.getLog(PageUtil.class);?
????
?????? public static Page createPage(Page page, int totalRecords){?
??????? return createPage(page.getEveryPage(), page.getCurrentPage(), totalRecords);
??? }?
????
??????? public static Page createPage(int everyPage, int currentPage, int totalRecords){
??????? everyPage = getEveryPage(everyPage);?
??????? currentPage = getCurrentPage(currentPage);?
??????? int beginIndex = getBeginIndex(everyPage, currentPage);?
??????? int totalPage = getTotalPage(everyPage, totalRecords);?
??????? boolean hasNextPage = hasNextPage(currentPage, totalPage);?
??????? boolean hasPrePage = hasPrePage(currentPage);
???????
??????? return new Page(hasPrePage, hasNextPage,?
??????????????????????????????? everyPage, totalPage,
??????????????????????????????? currentPage, beginIndex);
??? }
???
??? private static int getEveryPage(int everyPage){
??????? return everyPage == 0 ? 10 : everyPage;
??? }
???
??? private static int getCurrentPage(int currentPage){
??????? return currentPage == 0 ? 1 : currentPage;
??? }
???
??? private static int getBeginIndex(int everyPage, int currentPage){
??????? return (currentPage - 1) * everyPage;
??? }
???????
??? private static int getTotalPage(int everyPage, int totalRecords){
??????? int totalPage = 0;
???????????????
??????? if(totalRecords % everyPage == 0)
??????????? totalPage = totalRecords / everyPage;
??????? else
??????????? totalPage = totalRecords / everyPage + 1 ;
???????????????
??????? return totalPage;
??? }
???
??? private static boolean hasPrePage(int currentPage){
??????? return currentPage == 1 ? false : true;
??? }
???
??? private static boolean hasNextPage(int currentPage, int totalPage){
??????? return currentPage == totalPage || totalPage == 0 ? false : true;
??? }
???
}
業務實現類 UserManaerImpl.java
package com.linan.service.impl;
public class UserManagerImpl implements UserManager {
???
??? private UserDAO userDAO;
?????? public void setUserDAO(UserDAO userDAO) {?
??????? this.userDAO = userDAO;?
??? }?
??
//提供業務方法
public Result listUser(Page page) throws HibernateException,
ObjectNotFoundException {?
??????? int totalRecords = userDAO.getUserCount();?
??????? if(totalRecords == 0)?
??????????? throw new ObjectNotFoundException("userNotExist", null);
?
??????? page = PageUtil.createPage(page, totalRecords);?
??????? List users = userDAO.getUserByPage(page);???
???
??????? return new Result(page, users);?
??? }
}
DAO數據訪問實現類 UserDAOImpl.java
package com.linan.dao.impl;
public class UserDAOImpl? implements UserDAO {
??...........
????? public List getUserByPage(Page page) throws HibernateException {?
??????? String querySentence = "FROM user in class com.linan.bo.Userlist";?
??????? Query query = getSession().createQuery(querySentence);?
???????? //實現分頁功能
??????? query.setFirstResult(page.getBeginIndex())?
??????????????? .setMaxResults(page.getEveryPage());?
??????? return query.list();?
??? }
}
表現層Structs中的Action UserdisplayAction.java
package com.linan.struts.action;
public class UserdisplayAction extends Action {
?
?public ActionForward execute(
??ActionMapping mapping,
??ActionForm form,
??HttpServletRequest request,
??HttpServletResponse response) {
???Page page=new Page();?
??????? UserManagerImpl userManager=new UserManagerImpl();
??????? UserDAOImpl userDAO=new UserDAOImpl();
??????? userManager.setUserDAO(userDAO);
?????? //掉用業務代理完成分頁
??????? Result result=userManager.listUser(page);
??????? List list=result.getContent();
??????? HttpSession session=request.getSession();
??????? session.setAttribute("list",list);
??return mapping.findForward("displayGo");
?}
}
?