使用扩展HibernateDaoSupport实现分页技术总结

1.定义MyHibernateDaoSupport 扩展HibernateSupport

mport java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class MyHibernateDaoSupport extends HibernateDaoSupport {
public List findByPage(final String hql,final int offset,final int pageSize)
{
   List list=this.getHibernateTemplate().executeFind(new HibernateCallback()
   {
    public Object doInHibernate(Session session)
      throws HibernateException, SQLException {
     List result=session.createQuery(hql).setFirstResult(offset).setMaxResults(pageSize).list();
     return result;
    }
   }
   );
   return list;
}
public List findByPage(final String hql,final String value,final int offset,final int pageSize)
{
   List list=this.getHibernateTemplate().executeFind(new HibernateCallback()
   {
    public Object doInHibernate(Session session)
      throws HibernateException, SQLException {
     List result=session.createQuery(hql).setParameter(0,value).setFirstResult(offset).setMaxResults(pageSize).list();
     return result;
    }
   }
   );
   return list;
}
public List findByPage(final String hql,final Object[] values,final int offset,final int pageSize){
   List list=this.getHibernateTemplate().executeFind(new HibernateCallback()
   {
    public Object doInHibernate(Session session)
      throws HibernateException, SQLException {
     Query query=session.createQuery(hql);
     for(int i=0;i<values.length;i++)
     {
      query.setParameter(i,values[i]);
     }
     List result=query.setFirstResult(offset).setMaxResults(pageSize).list();
     return result;
    }
   }
   );
   return list;
}
}


2.定义要分页的实体的Dao接口
如:
public interface StudentDao {
Student get(int id);
void save(Student student);
void update(Student student);
void delete(int id);
void delete(Student student);
List<Student> findAll();
List<Student> findAllByPage(int pageNo,int pageSize);
int getStudentCount();

List<Student> findStudentByNameAndNumber(String stuName,String stuNumber);
}
3.定义实现类
主要写出两个分页中要用到的方法
public List<Student> findAllByPage(int pageNo, int pageSize) {
   if(pageNo<1){
    return null;
   }
   int offset=(pageNo-1)*pageSize;
   return findByPage("from Student", offset, pageSize);
}
public int getStudentCount() {
   List<Student> listStudent=this.getHibernateTemplate().find("from Student");
   return listStudent.size();
}

4.定义Service接口
public interface ExamService {
int STUDENT_PAGE_SIZE=3;
int QUESTION_PAGE_SIZE=3;
int addStudent(String stuNumber,String name,String className,String humanId,String email,String address,String phone) throws Exception;
void deleteStudent(int id) throws Exception;
List<Student> listStudent(int pageNo) throws Exception;
int addQuestion(String quTitle,String quHard,String quScore,String quAnswer,String quType,String selectOption,int typeid) throws Exception;
void deleteQuestion(int id) throws Exception;
List<Question> listQuestion(int pageNo) throws Exception;
void deleteExamtype(int typeid) throws Exception;
int addExamtype(String textName,String testTime)throws Exception;
List<Examtype> getAllExamtype()throws Exception;
boolean adminLogin(String admName,String admPwd)throws Exception;
int getStudentCount()throws Exception;
int getQuestionCount()throws Exception;
int getPageCount(int count,int pageSize);
String studentLogin(String stuName,String stuNumber)throws Exception;
Question getNextQuestion(List<Integer> alreadys,int typeid)throws Exception;
Question getQuestionById(int id)throws Exception;
String getExamtypeName(int typeid)throws Exception;;
}
5.定义实现类
public int getPageCount(int count, int pageSize) {
   return (count+pageSize-1)/pageSize;
}
public int getStudentCount() throws Exception {
   return studentDao.getStudentCount();
}

public List<Student> listStudent(int pageNo) throws Exception {

   return studentDao.findAllByPage(pageNo, STUDENT_PAGE_SIZE);

}

6.ListStudentAction.java
int studentCount=examService.getStudentCount();
   ActionMessages errors=new ActionMessages();
   if(studentCount<1)
   {
    errors.add("studentCount",new ActionMessage("studentCount.null"));
    mapping.findForward("success");
   }
   int pageCount=examService.getPageCount(studentCount,examService.STUDENT_PAGE_SIZE);
   int pageNo;
   if(request.getParameter("pageNo")==null || request.getParameter("pageNo").trim().equals(""))
   {
    pageNo=1;
   }
   try {
    pageNo=Integer.parseInt(request.getParameter("pageNo").trim());
   } catch (Exception e) {
    pageNo=1;
   }
   if(pageNo>pageCount){
    pageNo=pageCount;
   }
   request.setAttribute("pageCount",pageCount);
   request.setAttribute("currentPage",pageNo);
   request.setAttribute("studentList", examService.listStudent(pageNo));
   return mapping.findForward("success");
7.listStudent.jsp

<table cellspacing="0" cellpadding="0" border="1" width="700">
   <tr>
    <th>
     <bean:message key="student.shenfenzheng" />
    </th>
    <th>
     <bean:message key="student.mingzi" />
    </th>
    <th>
     <bean:message key="student.banji" />
    </th>
    <th>
     <bean:message key="student.xuehao" />
    </th>
    <th>
     <bean:message key="student.youjian" />
    </th>
    <th>
     <bean:message key="student.dianhua" />
    </th>
    <th>
     <bean:message key="student.address" />
    </th>
    <th>
     <bean:message key="student.isdelete" />
    </th>
   </tr>
   <c:forEach items="${requestScope.studentList}" var="students">
    <tr>
     <td align="center">
      ${students.humanId}
     </td>
     <td align="center">
      ${students.stuName}
     </td>
     <td align="center">
      ${students.stuClassName}
     </td>
     <td align="center">
      ${students.stuNumber}
     </td>
     <td align="center">
      ${students.email}
     </td>
     <td align="center">
      ${students.phone}
     </td>
     <td align="center">
      ${students.address}
     </td>
     <td align="center">
      <a href="deleteStudent.do?delStuid=${students.id}"
       onclick='return confirm("<bean:message key="confirm.del.student"/>");' target="center"><bean:message
        key="student.delete" />
      </a>
     </td>
    </tr>
   </c:forEach>
   <br />
   <tr>
    <td colspan="7" align="center">
     第${requestScope.currentPage}页 &nbsp;共${requestScope.pageCount}页
     <a href="listStudent.do?pageNo=1">首页</a>&nbsp;
     <logic:greaterThan value="1" name="currentPage" scope="request">
      <a href="listStudent.do?pageNo=${requestScope.currentPage-1}">
     </logic:greaterThan>
     上一页
     <logic:greaterThan value="1" name="currentPage" scope="request">
      </a>
     </logic:greaterThan>

     <logic:lessThan value="${requestScope.pageCount}" name="currentPage"
      scope="request">
      <a href="listStudent.do?pageNo=${requestScope.currentPage+1}">
     </logic:lessThan>
     下一页
     <logic:lessThan value="${requestScope.pageCount}" name="currentPage"
      scope="request">
      </a>
     </logic:lessThan>
     <a href="listStudent.do?pageNo=${requestScope.pageCount}">尾页</a>&nbsp;
    </td>
   </tr>
</table>

posted @ 2008-10-31 19:40  Earl_86  阅读(425)  评论(0编辑  收藏  举报