Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2320969
  • 博文数量: 252
  • 博客积分: 5472
  • 博客等级: 大校
  • 技术积分: 3107
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-17 18:39
文章分类

全部博文(252)

文章存档

2012年(96)

2011年(156)

分类: Java

2012-01-11 21:15:48

 
 
 
系统提升一:开发分页栏通用模块
 
为列表页开发分页框 该部分的代码将会在以后其他的列表页面中复用
1 新建并配置分页栏表单类PageForm.java
2 新建分页器类Pager.java
3 在AddressDAO.java中新建分页函数
4 修改AddressAction.java调用分页函数
5 修改address.jsp页面添加分页栏
6 分页栏参数的维持
 
1 新建并配置分页栏表单类PageForm.java
在列表页面中添加分页栏 就是需要使用表单来进行响应的跳转 这就会需要一个表单来保存分页栏各个字段的数据 因此我们需要新建一个表单类PageForm.java 该类中定义了分页的蚕食 pageSize保存了每页显示的数据条数 pageNo保存了当前显示的是第几页 这两个参数是最基本的分页栏参数 然后为每一个变量添加getter/setter的函数
  1. package com.demo.struts.forms;

  2. import org.apache.struts.action.ActionForm;

  3. import com.demo.struts.util.Constants;

  4. public class PageForm extends ActionForm {


  5.     protected int pageSize = Constants.pageSize;
  6.     
  7.     protected int pageNo = Constants.pageNo;

  8.     public int getPageNo() {
  9.         return pageNo;
  10.     }

  11.     public void setPageNo(int pageNo) {
  12.         this.pageNo = pageNo;
  13.     }

  14.     public int getPageSize() {
  15.         return pageSize;
  16.     }

  17.     public void setPageSize(int pageSize) {
  18.         this.pageSize = pageSize;
  19.     }    
  20. }
默认的数值常量 保存在Constants.java类中
在struts-config.xml中添加一个 命名为pageForm 指向上面新建的表单类com.demo.struts.forms.PageForm.java
  1. <form-bean name="pageForm"
  2.             type="com.demo.struts.forms.PageForm">
  3.         </form-bean>
为了取得列表页的分页栏数据 需要在列表页的配置中指定表单参数pageForm 添加了name属性指向pageForm
  1. <action path="/address" parameter="method" name="pageForm" scope="request"
  2.             type="org.springframework.web.struts.DelegatingActionProxy">
  3.             <forward name="list" path="/address.jsp" />
  4.         </action>
2 新建分页器类Pager.java
pageForm.java的租用是保存页面中分页栏的参数 为了实现分页 我们还需要新建一个分页的专用类Pager.java  它的作用是保存列表页面分也是所需要的所有数据
三个函数:
构造函数Pager() 根据每页显示的记录数pageSize 当前页面pageNo 总记录数rowCount 结果集列表resultList初始化所有的变量
getPageSizeIndexs() 用于输出每页显示记录数的数值列表
getPageNoIindexs() 用于输出页码的数值列表
  1. package com.demo.struts.util;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. public class Pager {

  5.     // 页面大小

  6.     protected int[] pageSizeList = { 10, 25, 50, 100, 200, 300, 500 };

  7.     // 一页显示的记录数

  8.     protected int pageSize = Constants.pageSize;

  9.     // 当前页码

  10.     protected int pageNo = Constants.pageNo;

  11.     // 记录总数

  12.     protected int rowCount = 0;

  13.     // 总页数

  14.     protected int pageCount = 1;

  15.     // 起始行数

  16.     protected int startIndex = 1;

  17.     // 结束行数

  18.     protected int endIndex = 1;

  19.     protected int firstPageNo = 1;
  20.     protected int prePageNo = 1;
  21.     protected int nextPageNo = 1;
  22.     protected int lastPageNo = 1;

  23.     // 结果集存放List

  24.     protected List resultList;
  25.     
  26.     public Pager(int pageSize, int pageNo, int rowCount, List resultList) {
  27.         this.pageSize = pageSize;
  28.         this.pageNo = pageNo;
  29.         this.rowCount = rowCount;
  30.         this.resultList = resultList;
  31.         
  32.         if (rowCount % pageSize == 0) {
  33.             this.pageCount = rowCount / pageSize;
  34.         } else {
  35.             this.pageCount = rowCount / pageSize + 1;
  36.         }
  37.         this.startIndex = pageSize * (pageNo - 1);
  38.         this.endIndex = this.startIndex + resultList.size();
  39.         
  40.         this.lastPageNo = this.pageCount;
  41.         if (this.pageNo > 1) this.prePageNo = this.pageNo -1;
  42.         if (this.pageNo == this.lastPageNo){
  43.             this.nextPageNo = this.lastPageNo;
  44.         } else {
  45.             this.nextPageNo = this.pageNo + 1;
  46.         }
  47.     }
  48.     
  49.     public Object[] getPageSizeIndexs() {
  50.         List result = new ArrayList(pageSizeList.length);
  51.         for (int i = 0; i < pageSizeList.length; i++) {
  52.             result.add(String.valueOf(pageSizeList[i]));
  53.         }
  54.         Object[] indexs = (result.toArray());
  55.         return indexs;
  56.     }
  57.     
  58.     public Object[] getPageNoIndexs() {
  59.         List result = new ArrayList(pageCount);
  60.         for (int i = 0; i < pageCount; i++) {
  61.             result.add(String.valueOf(i + 1));
  62.         }
  63.         Object[] indexs = (result.toArray());
  64.         return indexs;
  65.     }

  66.     public int getEndIndex() {
  67.         return endIndex;
  68.     }

  69.     public void setEndIndex(int endIndex) {
  70.         this.endIndex = endIndex;
  71.     }

  72.     public int getPageCount() {
  73.         return pageCount;
  74.     }

  75.     public void setPageCount(int pageCount) {
  76.         this.pageCount = pageCount;
  77.     }

  78.     public int getPageNo() {
  79.         return pageNo;
  80.     }

  81.     public void setPageNo(int pageNo) {
  82.         this.pageNo = pageNo;
  83.     }

  84.     public int getPageSize() {
  85.         return pageSize;
  86.     }

  87.     public void setPageSize(int pageSize) {
  88.         this.pageSize = pageSize;
  89.     }

  90.     public int[] getPageSizeList() {
  91.         return pageSizeList;
  92.     }

  93.     public void setPageSizeList(int[] pageSizeList) {
  94.         this.pageSizeList = pageSizeList;
  95.     }

  96.     public List getResultList() {
  97.         return resultList;
  98.     }

  99.     public void setResultList(List resultList) {
  100.         this.resultList = resultList;
  101.     }

  102.     public int getRowCount() {
  103.         return rowCount;
  104.     }

  105.     public void setRowCount(int rowCount) {
  106.         this.rowCount = rowCount;
  107.     }

  108.     public int getStartIndex() {
  109.         return startIndex;
  110.     }

  111.     public void setStartIndex(int startIndex) {
  112.         this.startIndex = startIndex;
  113.     }

  114.     public int getFirstPageNo() {
  115.         return firstPageNo;
  116.     }

  117.     public void setFirstPageNo(int firstPageNo) {
  118.         this.firstPageNo = firstPageNo;
  119.     }

  120.     public int getLastPageNo() {
  121.         return lastPageNo;
  122.     }

  123.     public void setLastPageNo(int lastPageNo) {
  124.         this.lastPageNo = lastPageNo;
  125.     }

  126.     public int getNextPageNo() {
  127.         return nextPageNo;
  128.     }

  129.     public void setNextPageNo(int nextPageNo) {
  130.         this.nextPageNo = nextPageNo;
  131.     }

  132.     public int getPrePageNo() {
  133.         return prePageNo;
  134.     }

  135.     public void setPrePageNo(int prePageNo) {
  136.         this.prePageNo = prePageNo;
  137.     }

  138.     
  139. }
3 在AddressDAO.java中新建分页函数
首先需要在AddressDAO.java 中增加分页查询的函数
首先需要在接口类IAddressADO.java中增加两个接口
    //默认的分页函数 显示第一页 页面显示的记录数为25
  1. public Pager findPagerByUsername(final String username);

//通用的分页函数 可以设置显示第几页和每页显示的记录数

  1. public Pager findPagerByUsername(final String username, final int pageNo,
  2.             final int pageSize);
然后再AddressDAO.java中编写这两个接口的实现代码 第一个函数只需要传入Constants.java中的默认常量 调用第二个函数即可
我们需要根据pageSize来进行分页 并取出第pageNo页的数据即可。
首先使用getHibernateTemplate()取得当前Session对象session 然后创建条件查询对象criteria 并为该对象增加一个参数username 表示要查询的是当前用户的结果集 然后取出总的记录数rowCount 根据pageSize pageNo 和rowCount计算出当前页面要查询数据的起始行号 使用getFirstResult()函数来设置起始行号 使用setMaxResults()函数设置从该起始行要查询的最大结果集数为pageSize  调用list()函数即可查询当前页的结果集 关闭session对象  最后根据取得的参数创建一个Pager对象并返回
  1. /**
  2.      * if not pageSize and pageNo parameters, use default parameters
  3.      */
  4.     public Pager findPagerByUsername(final String username) {
  5.         return findPagerByUsername(username, Constants.pageSize, Constants.pageNo);
  6.     }
  7.     
  8.     /**
  9.      * when have pageSize and pageNo parameters
  10.      */
  11.     public Pager findPagerByUsername(final String username, final int pageSize,
  12.             final int pageNo) {        
  13.         Session session = getHibernateTemplate().getSessionFactory().openSession();
  14.         
  15.         // set query condition

  16.         Criteria criteria = session.createCriteria(Address.class);
  17.         criteria.add(Restrictions.eq("username", username));
  18.         
  19.         // get total count

  20.         int rowCount = ((Integer) criteria.setProjection(
  21.                 Projections.rowCount()).uniqueResult()).intValue();
  22.         criteria.setProjection(null);
  23.         
  24.         // get current page list

  25.         int startIndex = pageSize * (pageNo - 1);
  26.         criteria.addOrder(Order.asc("username"));
  27.         criteria.setFirstResult(startIndex);
  28.         criteria.setMaxResults(pageSize);
  29.         List result = criteria.list();
  30.         
  31.         session.close();

  32.         return new Pager(pageSize, pageNo, rowCount, result);
  33.     }
 
 
4 修改AddressAction.java调用分页函数
在AddressDAO.java中创建了分页的查询函数后 下面就可以在AddressAction.java的列表页请求处理函数list() 中来调用该分页函数 进行分页数据查询了
由于在的配置中已经添加了属性name=“pageForm” 因此在list()函数中就可以取得pageForm对象了 通过强制类型转换取得pageForm对象 然后从Session中取得当前登录的用户名 根据username pageForm中用户选择的pageSize pageNo属性值 即可调用AddressDAO.java的findPagerByUsername()的分页函数来返回当前页的数据列表 其中pageSize pageNo是页面中传递过来的参数 属于用户当前选择的分页栏的参数值  然后将pager中的结果集保存在request中 保存的对象名为addressList 这样在address.jsp中就可以取得该列表进行显示了 将pager页保存在request中 可以通过该对象显示分页栏的信息 最后返回到列表页面
  1. public ActionForward list(ActionMapping mapping, ActionForm form,
  2.             HttpServletRequest request, HttpServletResponse response)
  3.             throws Exception {
  4.         String username = (String)request.getSession().getAttribute(Constants.USERNAME_KEY);
  5.         
  6.         PageForm pageForm = (PageForm) form;
  7.         
  8.         // get pager

  9.         Pager pager = addressDAO.findPagerByUsername(username, pageForm
  10.                 .getPageSize(), pageForm.getPageNo());
  11.         
  12.         // set addressList

  13.         request.setAttribute("addressList", pager.getResultList());
  14.         
  15.         // set pager

  16.         request.setAttribute("pager", pager);
  17.         
  18.         // save session

  19.         setSession(request, Constants.PAGER_ADDRESS, pageForm);
  20.         
  21.         ActionForward forward = mapping.findForward(Constants.LIST_KEY);
  22.         return (forward);
  23.     }
由于在新增 修改 及删除一个联系人时也会返回到列表页面 因此在insert() update() delete
()这三个函数中 在要返回到列表页面时也需要产寻当前页的数据 此时就可以调用AddressDAO.java的第一个分页函数来查询第一页的数据了
  1. Pager pager = addressDAO.findPagerByUsername(username);        
  2. request.setAttribute("addressList", pager.getResultList());
  3. request.setAttribute("pager", pager);
 
5 修改address.jsp页面添加分页栏
 
  1. <body>
  2. <TABLE width="100%" class="position">
  3.     <TR>
  4.         <TD><bean:message key="address.page.position" /></TD>
  5.         <TD align="right"><a href="address_add.do?method=add"><bean:message key="address.page.add" /></a></TD>
  6.         <TD width="20"></TD>
  7.     </TR>
  8. </TABLE>
  9. <b><html:errors property="org.apache.struts.action.GLOBAL_MESSAGE" /></b>
  10. <TABLE border="0" width="100%">
  11.     <TR class="tableheader">
  12.         <TD><bean:message key="address.page.name" /></TD>
  13.         <TD><bean:message key="address.page.***" /></TD>
  14.         <TD><bean:message key="address.page.mobile" /></TD>
  15.         <TD><bean:message key="address.page.email" /></TD>
  16.         <TD><bean:message key="address.page.qq" /></TD>
  17.         <TD><bean:message key="address.page.company" /></TD>
  18.         <TD><bean:message key="address.page.address" /></TD>
  19.         <TD><bean:message key="address.page.postcode" /></TD>
  20.         <TD><bean:message key="button.operation" /></TD>
  21.     </TR>
  22.     <logic:present name="addressList">
  23.     <logic:iterate id="address" name="addressList" scope="request">
  24.     <TR>
  25.         <TD><bean:write name="address" property="name" scope="page"/></TD>
  26.         <TD><bean:write name="address" property="***" scope="page"/></TD>
  27.         <TD><bean:write name="address" property="mobile" scope="page"/></TD>
  28.         <TD><bean:write name="address" property="email" scope="page"/></TD>
  29.         <TD><bean:write name="address" property="qq" scope="page"/></TD>
  30.         <TD><bean:write name="address" property="company" scope="page"/></TD>
  31.         <TD><bean:write name="address" property="address" scope="page"/></TD>
  32.         <TD><bean:write name="address" property="postcode" scope="page"/></TD>
  33.         <TD><a href='address_edit.do?method=edit&id='><bean:message key="button.edit" /></a>
  34.         <a href="address.do?method=delete&id=address" property="id" scope="page"/>"><bean:message key="button.delete" /></a></TD>
  35.     </TR>
  36.     </logic:iterate>
  37.     </logic:present>
  38. </TABLE>

  39. <logic:present name="pager">
  40.     <form name="form1" action="address.do?method=list" method="post">
  41. <TABLE border="0" width="100%" class="pager">
  42.     <TR>
  43.         <TD align="left"><bean:message key="pager.pageSize" />
  44.             <html:select name="pager" property="pageSize" onchange="document.all.pageNo.value='1';document.all.form1.submit();">
  45.                 <logic:notEmpty name="pager" scope="request">
  46.                     <html:options name="pager" property="pageSizeIndexs" />
  47.                 </logic:notEmpty>
  48.             </html:select>
  49.         </TD>
  50.         <TD align="center">
  51.         <bean:message key="pager.rowCount" /><bean:write name="pager" property="rowCount" />
  52.         </TD>
  53.         <TD align="right">
  54.             <a href="javascript:document.all.pageNo.value='" property="firstPageNo" />';document.all.form1.submit();"><bean:message key="pager.firstPageNo" /></a>
  55.             <a href="javascript:document.all.pageNo.value='" property="prePageNo" />';document.all.form1.submit();"><bean:message key="pager.prePageNo" /></a>
  56.             <a href="javascript:document.all.pageNo.value='" property="nextPageNo" />';document.all.form1.submit();"><bean:message key="pager.nextPageNo" /></a>
  57.             <a href="javascript:document.all.pageNo.value='" property="lastPageNo" />';document.all.form1.submit();"><bean:message key="pager.lastPageNo" /></a>
  58.             <html:select name="pager" property="pageNo" onchange="document.all.form1.submit();">
  59.                 <logic:notEmpty name="pager" scope="request">
  60.                     <html:options name="pager" property="pageNoIndexs" />
  61.                 </logic:notEmpty>
  62.             </html:select>
  63.         </TD>
  64.         <TD width="20"></TD>
  65.     </TR>
  66. </TABLE>
  67. </form>
  68. </logic:present>
  69. </body>
 
6 分页栏参数的维持
两个问题
[1]insert update delete都是调用了默认的分页函数进行查询 如果用户不是从第一页的数据列表中单击修改按钮 那么用户在修改完成后返回的页面就会显示第一页的数据  而不是之前显示的那一页 问题的原因是在执行增加 修改 删除操作时没有保存用户在列表页中选择的分页栏的参数
为了解决这个问题 我们在需要为增加 修改 删除的代码维持分页的参数
首先在Constants中定义一个Session常量  用作在Session中保存用户分页的信息
  1. public final static String PAGER_ADDRESS = "pager_address";
然后 在AddressAction.java的list()函数中保存用户的分页信息pageForm到Session中
  1. request.getSession().setAttribute(Constants.PAGER_ADDRESS,pageForm);
这样 就可以从Session中取得分页信息 在insert update delete中取出用户在列表页中设置的pageSize pageNo的数值 改用调用AddressDAO.java中的第二个分页函数进行查询
           
  1.          // get pageForm from session

  2.         PageForm pageForm = (PageForm)getSession(request, Constants.PAGER_ADDRESS);
  3.         
  4.         // get pager form list page

  5.         Pager pager = addressDAO.findPagerByUsername(username, pageForm
  6.                 .getPageSize(), pageForm.getPageNo());
  7.         request.setAttribute("addressList", pager.getResultList());
  8.         request.setAttribute("pager", pager);
 
[2]在增加 修改界面中单击 返回 时的分页参数丢失
在执行增加 修改操作后 若直接返回择业没有保持分页设置信息 此时我们需要新定义一个函数back() 以与list()函数区分 首先在address_add.jsp和address_edit.jsp页面中返回地址
  1. <a href="address.do?method=list">

  2. 改为

  3. <a href="address.do?method=back">

在AddressAction.java增加一个函数back() 用于执行返回时的页面请求  首先从Session中取得当前登录的用户名及分页信息pageForm 根据这两个对象的参数值 调用ActionDAO.java的第二个分页查询函数执行数据查询 然会返回列表页即可

 

  1. public ActionForward back(ActionMapping mapping, ActionForm form,
  2.             HttpServletRequest request, HttpServletResponse response)
  3.             throws Exception {
  4.         if (isTimeout(request)) {
  5.          return mapping.findForward(Constants.INDEX_KEY);
  6.         }

  7.         String username = getUsername(request);
  8.         
  9.         PageForm pageForm = (PageForm)getSession(request, Constants.PAGER_ADDRESS);
  10.         
  11.         // get pager

  12.         Pager pager = addressDAO.findPagerByUsername(username, pageForm
  13.                 .getPageSize(), pageForm.getPageNo());
  14.         
  15.         // set addressList

  16.         request.setAttribute("addressList", pager.getResultList());
  17.         
  18.         // set pager

  19.         request.setAttribute("pager", pager);
  20.         
  21.         // save session

  22.         setSession(request, Constants.PAGER_ADDRESS, pageForm);
  23.         
  24.         ActionForward forward = mapping.findForward(Constants.LIST_KEY);
  25.         return (forward);
  26.     }
与list()不同的是 back()函数的pageForm是从Session中取得对象 list()是从用户的输入表单中取得的 这就是添加back()函数的原因
阅读(2958) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~