专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » struts2整合spring:Hibernate+Spring+Struts2整合开发中的一个分页显示方案 »正文

struts2整合spring:Hibernate+Spring+Struts2整合开发中的一个分页显示方案

来源: 发布时间:星期五, 2009年1月23日 浏览:282次 评论:0
  分页显示直是web开发中大烦琐难题传统网页设计只在个JSP或者ASP页面中书写所有有关数据库操作代码那样做分页可能简单但当把网站WebSite分层开发后分页就比较困难了下面是我做Spring+Hibernate+Struts2项目时设计分页代码和大家分享交流

  1、DAO层接口设计在MemberDao接口中定义了如下两个思路方法:

public erface MemberDao{
  
  //省略了其他代码
  
  /** *//**
   * 分页查询
   * @param hql 查询条件
   * @param off 开始记录
   * @param length 次查询几条记录
   * @
   */
  public List queryForPage(final String hql,final off,final length);
  
  /** *//**
   * 查询所有记录数
   * @param hql 查询条件
   * @ 总记录数
   */
  public getAllRowCount(String hql);
  
}


  2、DAO层实现类MemberDaoImpl对上面两个思路方法实现如下:

public MemberDaoImpl extends HibernateDaoSupport implements MemberDao {
    //省略了其他代码  
  
  /** *//**
   * 分页查询
   * @param hql 查询条件
   * @param off 开始记录
   * @param length 次查询几条记录
   * @
   */
  public List queryForPage(final String hql,final off,final length){
    List list = getHibernateTemplate.executeFind( HibernateCallback{
      public Object doInHibernate(Session session) throws HibernateException,SQLException{
        Query query = session.createQuery(hql);
        query.FirstResult(off);
        query.MaxResults(length);
        List list = query.list;
         list;
      }
    });
     list;
  }
  
  
  /** *//**
   * 查询所有记录数
   * @ 总记录数
   */
  public getAllRowCount(String hql){
     getHibernateTemplate.find(hql).size;
  }
  
}


  细心读者会发现这个类继承了HibernateDaoSupport类HibernateDaoSupport是Spring提供对Hibernate支持getHibernateTemplate.executeFind( HibernateCallback{....})思路方法中参数我们使用了接口回调在其参数内我们能像原生Hibernatequery.FirstResult(off)和query.MaxResults(length)来实现分页查询功能

  3、下面我们来新建个保存分页信息类PageBean,具体代码如下:

public PageBean {
  
  private List list;    //要返回记录列表
  
  private allRow;     //总记录数
  private totalPage;    //总页数
  private currentPage;  //当前页
  private pageSize;    //每页记录数
  
  private boolean isFirstPage;  //是否为第
  private boolean isLastPage;    //是否为最后
  private boolean hasPreviousPage;  //是否有前
  private boolean hasNextPage;    //是否有下
  
  
  public List getList {
     list;
  }
  public void List(List list) {
    this.list = list;
  }
  public getAllRow {
     allRow;
  }
  public void AllRow( allRow) {
    this.allRow = allRow;
  }
  public getTotalPage {
     totalPage;
  }
  public void TotalPage( totalPage) {
    this.totalPage = totalPage;
  }
  public getCurrentPage {
     currentPage;
  }
  public void CurrentPage( currentPage) {
    this.currentPage = currentPage;
  }
  public getPageSize {
     pageSize;
  }
  public void PageSize( pageSize) {
    this.pageSize = pageSize;
  }
  
  /** *//**
   * 化分页信息
   */
  public void init{
    this.isFirstPage = isFirstPage;
    this.isLastPage = isLastPage;
    this.hasPreviousPage = isHasPreviousPage;
    this.hasNextPage = isHasNextPage;
  }
  
  /** *//**
   * 以下判断页信息,只需getter思路方法(is思路方法)即可
   * @
   */
  
  public boolean isFirstPage {
     currentPage 1;  // 如是当前页是第1页
  }
  public boolean isLastPage {
     currentPage totalPage;  //如果当前页是最后
  }
  public boolean isHasPreviousPage {
     currentPage != 1;    //只要当前页不是第1页
  }
  public boolean isHasNextPage {
     currentPage != totalPage;  //只要当前页不是最后1页
  }
  
  
  /** *//**
   * 计算总页数,静态思路方法,供外部直接通过类名
   * @param pageSize 每页记录数
   * @param allRow 总记录数
   * @ 总页数
   */
  public countTotalPage(final pageSize,final allRow){
     totalPage = allRow % pageSize 0 ? allRow/pageSize : allRow/pageSize+1;
     totalPage;
  }
  
  /** *//**
   * 计算当前页开始记录
   * @param pageSize 每页记录数
   * @param currentPage 当前第几页
   * @ 当前页开始记录号
   */
  public countOff(final pageSize,final currentPage){
    final off = pageSize*(currentPage-1);
     off;
  }
  
  /** *//**
   * 计算当前页,若为0或者请求URL中没有"?page=",则用1代替
   * @param page 传入参数(可能为空,即0,则返回1)
   * @ 当前页
   */
  public countCurrentPage( page){
    final curPage = (page0?1:page);
     curPage;
  }
}


  4、Service层接口设计:

public erface MemberService {
  //省略其他代码
  
  /** *//**
   * 分页查询
   * @param currentPage 当前第几页
   * @param pageSize 每页大小
   * @ 封闭了分页信息(包括记录集list)Bean
   */
  public PageBean queryForPage( pageSize, currentPage);
  
}


  5、Service层实现类部分内码如下:

public MemberServiceImpl implements MemberService {
 
 //通过applicationContext.xml配置文件注入MemberDao
  private MemberDao memberDao;
  public void MemberDao(MemberDao memberDao) {
    this.memberDao = memberDao;
  }
  
  /** *//**
   * 分页查询
   * @param currentPage 当前第几页
   * @param pageSize 每页大小
   * @ 封闭了分页信息(包括记录集list)Bean
   */
  public PageBean queryForPage( pageSize, page){
  
    final String hql = "from Member";    //查询语句
     allRow = memberDao.getAllRowCount(hql);  //总记录数
     totalPage = PageBean.countTotalPage(pageSize, allRow);  //总页数
    final off = PageBean.countOff(pageSize, page);  //当前页开始记录
    final length = pageSize;  //每页记录数
    final currentPage = PageBean.countCurrentPage(page);
    List<Member> list = memberDao.queryForPage(hql,off, length);    //"页"记录
    
    //把分页信息保存到Bean中
    PageBean pageBean = PageBean;
    pageBean.PageSize(pageSize);  
    pageBean.CurrentPage(currentPage);
    pageBean.AllRow(allRow);
    pageBean.TotalPage(totalPage);
    pageBean.List(list);
    pageBean.init;
     pageBean;
  }


  6、在Struts2中queryForPageMemberService层queryForPage()思路方法即可个包含分页信息、符合条件结果集list 代码如下:

public ListMember extends ActionSupport{
  //通过applicationContext.xml配置文件注入memberService
  private MemberService memberService;
  public void MemberService(MemberService memberService) {
    this.memberService = memberService;
  }
  
  private page;  //第几页
  
  private PageBean pageBean;  //包含分布信息bean
  
  public getPage {
     page;
  }
  
  public void Page( page) {    //若URL中无此参数,会默认为第1页
    this.page = page;
  }
  
  public PageBean getPageBean {
     pageBean;
  }
  
  public void PageBean(PageBean pageBean) {
    this.pageBean = pageBean;
  }
  
  @Override
  public String execute throws Exception {
    //分页pageBean,参数pageSize表示每页显示记录数,page为当前页
    this.pageBean = memberService.queryForPage(2, page);
     SUCCESS;
  }
}


  7、最后在listMember.jsp页面中用到了Struts2标签:

<s:iterator value="pageBean.list">
      <s:property value="title"/>
      <a href="getArticle.action?id=<s:property value="id"/>">mody</a>
      <a href="deleteArticle.action?id=<s:property value="id"/>" _disibledevent="http://www.blogjava.net/rongxh7">http://www.blogjava.net/rongxh7



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: